Reelsomat

Reelsomat API

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.

Authentication

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.

Quickstart

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}'

Endpoints

Base URL https://reelsomat.com/api/v1. Requests and responses are JSON.

GET/meYour plan and remaining allowance
GET/channelsYour channels and which platforms are connected
POST/videosCreate a video from a topic, your script, or your voiceover
GET/videosList videos (channel_id, status, limit, cursor)
GET/videos/{id}Status, title, script, preview and YouTube links
POST/videos/{id}/publishPublish a video that is ready for review
POST/uploadsSigned URL to upload a voiceover (mp3, m4a, wav, webm, ogg; 15 MB)

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

Errors share one shape:

{ "error": { "code": "limit_reached", "message": "Daily limit reached (10 videos per day on your plan). Try again tomorrow." } }
400invalid_request / invalid_jsonThe body or query is invalid — the message says what to fix.
401missing_api_key / invalid_api_keyNo key, a malformed key, or a revoked key.
403plan_required / plan_restrictedYour plan doesn't include the API, or the option (e.g. a duration) isn't on your plan.
404not_foundThe channel or video doesn't exist on your account.
409conflictA video for this channel was just queued, or it is already publishing.
429rate_limited / limit_reachedToo many requests (see Retry-After), or your video allowance/cooldown is used up.
502upstream_unavailableA dependency is temporarily unavailable — retry.

Limits & plans

  • API access: Plus ($19/mo, 60 videos a month, up to 10 a day) and Creator ($39/mo, 150 a month, up to 25 a day).
  • Videos created through the API share your plan's monthly and daily allowance with the dashboard and schedules.
  • A short cooldown applies between new videos (3 minutes on Plus, 2 on Creator), as in the dashboard.
  • Rate limits per key: 60 requests a minute overall; 10 video creations a minute. Over the limit you get 429 rate_limited with a Retry-After header.
  • Voiceover uploads: up to 15 MB, 30 upload URLs an hour.

Webhooks (coming soon)

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).