Create faceless short-form videos from your own apps, automations and AI agents. The API uses the same pipeline, voices and allowances as the dashboard. Machine-readable spec: OpenAPI 3.1.
The API is available on the Plus and Creator plans. Create a key in Settings → API. Keys look like rsm_live_… and are shown once — store them as a secret, never in browser code. Send the key as a bearer token:
curl https://reelsomat.com/api/v1/me \
-H "Authorization: Bearer $REELSOMAT_API_KEY"Revoking a key in Settings stops it working immediately. You can have up to 10 active keys.
1. Find the channel to post to:
curl https://reelsomat.com/api/v1/channels -H "Authorization: Bearer $REELSOMAT_API_KEY"2. Create a video from a topic (or send script, or voiceover_path from POST /uploads, with a duration):
curl -X POST https://reelsomat.com/api/v1/videos \
-H "Authorization: Bearer $REELSOMAT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"channel_id": "CHANNEL_ID",
"topic": "Why octopuses have three hearts",
"duration": 45,
"language": "en",
"voice": "Kore"
}'
# 202 Accepted
{ "id": "VIDEO_ID", "status": "queued", "channel_id": "CHANNEL_ID", "publish": "review" }3. Poll until it is ready_for_review (a few minutes). The response includes a short-lived preview_url to the MP4:
curl https://reelsomat.com/api/v1/videos/VIDEO_ID -H "Authorization: Bearer $REELSOMAT_API_KEY"
{ "id": "VIDEO_ID", "status": "ready_for_review", "title": "…", "script": "…",
"preview_url": "https://storage.googleapis.com/…", "youtube_url": null, "error": null, … }4. Publish it to the channel's connected YouTube account:
curl -X POST https://reelsomat.com/api/v1/videos/VIDEO_ID/publish -H "Authorization: Bearer $REELSOMAT_API_KEY"When the upload finishes the video's status becomes published with a youtube_url.
Using your own voiceover:
# 1) get a signed upload URL
curl -X POST https://reelsomat.com/api/v1/uploads -H "Authorization: Bearer $REELSOMAT_API_KEY" \
-H "Content-Type: application/json" -d '{"content_type":"audio/mpeg","size":482133}'
# 2) PUT the file to upload_url with the same Content-Type (within 15 minutes)
curl -X PUT "$UPLOAD_URL" -H "Content-Type: audio/mpeg" --data-binary @voiceover.mp3
# 3) create the video with the returned voiceover_path
curl -X POST https://reelsomat.com/api/v1/videos -H "Authorization: Bearer $REELSOMAT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"channel_id":"CHANNEL_ID","voiceover_path":"users/…/uploads/….mp3","duration":45}'Base URL https://reelsomat.com/api/v1. Requests and responses are JSON.
POST /videos fields: channel_id (required); at most one of topic, script, voiceover_path (none = Reelsomat picks a topic from the channel's content source); duration in seconds (required with a script or voiceover; must be on your plan — see GET /me); language; voice; title_hint (used as the video title); publish — "review" (default) holds the video for review, "auto" publishes straight to YouTube when the channel has YouTube connected (otherwise it is saved for review); webhook_url.
Video statuses: queued → generating → ready_for_review → (after publish) generating → published, or failed with an error message. Lists are newest first; pass next_cursor as cursor for the next page.
Errors share one shape:
{ "error": { "code": "limit_reached", "message": "Daily limit reached (10 videos per day on your plan). Try again tomorrow." } }429 rate_limited with a Retry-After header.You can already pass webhook_url (https) when creating a video; it is stored with the job. Delivery of status events with signed requests is coming soon — until then, poll GET /videos/{id} (every 15–30 seconds is plenty).