Publications API
- Base URL
https://api.samsar.one/v1- Route prefix
/publications- Authentication
- Bearer API key/auth token, or customer sub-account key
- Execution
- Synchronous publication controls
- Billing
- No additional charge for CRUD and archive
- Content type
application/json
Use these endpoints when an external application needs to publish, edit, or revoke a public publication for a completed samsar-js video session. The authenticated account must own the target video session. A singular session needs its final video URL; a branched session needs every path render finalized.
Singular sessions create the existing single-video Publication. A finalized branched session creates an InteractivePublication instead. Interactive publication output contains only the public path videos, a first-frame thumbnail for every path, and the media-relative choice graph needed by an interactive player; it does not contain generation diagnostics or billing data.
Publication fields
Samsar infers the final video URL and many defaults from the session. Send the fields your app owns or cannot infer from the session:
{
"session_id": "66ff...",
"title": "Running shoe teaser",
"description": "Launch-day vertical cut",
"tags": ["launch", "footwear"],
"creator_handle": "acme",
"slug": "running-shoe-teaser",
"image_hash": "optional-image-hash",
"splash_image": "https://cdn.example.com/splash.png",
"image_model": "GPTIMAGE2",
"video_model": "RUNWAYML",
"original_prompt": "A fast launch video for a new running shoe",
"aspect_ratio": "9:16",
"has_subtitles": true,
"session_language": "en",
"language_string": "English"
}
Alias support:
session_id,sessionId,video_session_id,videoSessionId, oridaspect_ratiooraspectRatiocreator_handleorcreatorHandleimage_hashorimageHashsplash_imageorsplashImageimage_modelorimageModelvideo_modelorvideoModeloriginal_prompt,originalPrompt, orpromptsession_language,sessionLanguage,language, orlanguage_codelanguage_stringorlanguageStringhas_subtitles,hasSubtitles,enable_subtitles, orenableSubtitles
Request bodies can be sent flat or nested under input.
POST /publications/publish
Create or update a public publication for a completed session.
curl -X POST https://api.samsar.one/v1/publications/publish \
-H "Authorization: Bearer $SAMSAR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"session_id": "66ff...",
"title": "Running shoe teaser",
"description": "Launch-day vertical cut",
"tags": ["launch", "footwear"],
"creator_handle": "acme"
}'
Success response:
{
"created": true,
"publication": {
"publication_id": "67aa...",
"session_id": "66ff...",
"video_url": "https://static.samsar.one/video/66ff/final.mp4",
"title": "Running shoe teaser",
"description": "Launch-day vertical cut",
"tags": ["launch", "footwear"],
"creator_handle": "acme",
"aspect_ratio": "9:16",
"has_subtitles": true,
"language": "en",
"session_language": "en",
"language_string": "English"
},
"session": {
"session_id": "66ff...",
"is_published": true,
"published_publication_id": "67aa...",
"published_video_url": "https://static.samsar.one/video/66ff/final.mp4"
}
}
POST /publications/edit
Edit an existing publication for a session. Omitted fields keep their current publication values.
curl -X POST https://api.samsar.one/v1/publications/edit \
-H "Authorization: Bearer $SAMSAR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"session_id": "66ff...",
"title": "Running shoe teaser - updated",
"tags": ["launch", "footwear", "campaign"]
}'
404 is returned when the session exists but has no publication yet.
POST /publications/revoke
Remove a session publication from the public feed and clear the published fields on the session.
curl -X POST https://api.samsar.one/v1/publications/revoke \
-H "Authorization: Bearer $SAMSAR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"session_id": "66ff..."
}'
Success response:
{
"revoked": true,
"publication_id": "67aa...",
"session": {
"session_id": "66ff...",
"is_published": false
}
}
REST aliases
The same operations are also available as session-centric routes:
POST /publications/session/:sessionIdPATCH /publications/session/:sessionIdDELETE /publications/session/:sessionId
Public interactive publication feed
These read routes are unauthenticated and free:
GET https://api.samsar.one/interactive_publicationsGET https://api.samsar.one/interactive_publications/:publicationId- Versioned aliases are available under
/v1/interactive_publications.
The list supports limit (default 50, maximum 200) and an opaque cursor returned by the previous page:
curl "https://api.samsar.one/interactive_publications?limit=20"
{
"items": [{
"id": "67ab...",
"type": "InteractiveVideo",
"schema": "interactive_publication.v1",
"title": "Fork in the road",
"description": "Choose the hero's next move.",
"tags": ["interactive", "adventure"],
"creatorHandle": "acme",
"datePublished": "2026-07-19T00:00:00.000Z",
"thumbnailUrl": "https://static.samsar.one/published/66ff/interactive/revisions/8f4d.../paths/cm9vdC4x/thumbnail.png",
"aspectRatio": "16:9",
"inLanguage": "en",
"hasSubtitles": true,
"manifest": {
"schema": "interactive_video_manifest.v1",
"default_path_id": "root.1",
"timing": {
"origin": "media",
"unit": "seconds"
},
"tree": {
"root_node_id": "root",
"choice_points": [{
"branch_point_id": "choice-root",
"parent_node_id": "root",
"switch_at_seconds": 8,
"options": [{
"child_node_id": "root.1",
"path_name": "Open the door",
"path_description": "Continue through the doorway.",
"leaf_path_ids": ["root.1"]
}]
}]
},
"outputs": {
"paths": [{
"path_id": "root.1",
"contentUrl": "https://static.samsar.one/published/66ff/interactive/revisions/8f4d.../paths/cm9vdC4x/video.mp4",
"thumbnailUrl": "https://static.samsar.one/published/66ff/interactive/revisions/8f4d.../paths/cm9vdC4x/thumbnail.png",
"encodingFormat": "video/mp4",
"duration": 24,
"is_default": true
}]
}
}
}],
"nextCursor": null,
"hasMore": false,
"totalCount": 1
}
The timing, tree, and outputs.paths layout follows the completed branched response from status_detailed, so clients can reuse the same choice-graph logic. contentUrl, thumbnailUrl, and encodingFormat use standard media-resource field names. duration and switch_at_seconds are media-relative seconds. A publication is withheld if any path video or thumbnail is unavailable publicly; clients never receive a partial choice graph.
Error responses
400missing or invalidsession_id401invalid API key, customer sub-account key, or auth token403the session does not belong to the authenticated actor404session or publication not found409the session has no final video URL yet
samsar-js
import SamsarClient from 'samsar-js';
const samsar = new SamsarClient({ apiKey: process.env.SAMSAR_API_KEY! });
await samsar.publishPublication({
session_id: '66ff...',
title: 'Running shoe teaser',
tags: ['launch', 'footwear'],
});
await samsar.editPublication({
session_id: '66ff...',
title: 'Running shoe teaser - updated',
});
await samsar.revokePublication('66ff...');
const page = await samsar.listInteractivePublications({ limit: 20 });
const interactivePublication = await samsar.getInteractivePublication(page.data.items[0].id);