Generate branded video programmatically on the Series-X VPS. Remotion-backed, queue-backed, async.
Base URL: https://video-api.series-x.ai (planned) or http://127.0.0.1:8800 (VPS-local)
Auth: X-API-Key header. Key distribution: ask Colin/Alex.
Service: video-api.service on server1.series-x.ai
# Submit a render (returns immediately)
curl -X POST https://video-api.series-x.ai/render \
-H "X-API-Key: $VIDEO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"composition":"SeriesXIntro","props":{"title":"Welcome to AdvisorPro","subtitle":"AI systems, documented and verified"},"codec":"h264"}'
# => {"jobId":"job_x7k2m9a1p3","state":"queued"}
# Poll progress
curl -H "X-API-Key: $VIDEO_API_KEY" https://video-api.series-x.ai/status/job_x7k2m9a1p3
# => {"id":"job_x7k2m9a1p3","state":"rendering","progress":57}
# Download when state=done (200) - mp4, H.264 yuv420p
curl -o out.mp4 -H "X-API-Key: $VIDEO_API_KEY" https://video-api.series-x.ai/download/job_x7k2m9a1p3
| Field | Type | Required | Notes |
|---|---|---|---|
composition |
string | yes | Composition id from the Root registry (see below) |
props |
object | no | Props passed to the composition (titles, colours, data) |
codec |
string | no | h264 (default), vp8, vp9, prores |
Returns {jobId, state}. Renders run 3-at-a-time; extra jobs queue FIFO.
Returns {id, state, progress, composition, error}. state is one of queued, rendering, done, error. On error, error carries a short message.
Streams the mp4. Only valid once state=done. 404 otherwise.
No auth. {ok, activeJobs, queued, maxConcurrent}.
| Id | Duration | Purpose | Key props |
|---|---|---|---|
SeriesXIntro |
4s | Branded intro card (navy, serif title, teal-gold bar) | title, subtitle |
SetuPatientVideo |
66s | Setu Dental patient explainer (8 scenes) | read-only demo |
SetuBumper |
6s | Setu Dental ad bumper | read-only demo |
New compositions: add to /opt/motion-graphics/src/Root.tsx in the git repo (series-a-uk/series-x-crm), then systemctl restart video-api.
VO (edge-tts) and music beds are generated per-project, not yet part of the API surface. For API-scale VO, cache by script hash or supply an ElevenLabs key. Music is synthesised in-house (licence-free).
| Status | Meaning |
|---|---|
| 400 | Missing composition or malformed JSON |
| 401 | Missing/wrong X-API-Key |
| 404 | Unknown job, or download before done |
| 500/502 | Render failed; check error in /status |