One Click Videos · Developers
Video status
GET /api/v1/videos/{jobId} — follow a job from creation to its finished video.
Read one job
curl --fail-with-body "https://app.jemsu.ai/api/v1/videos/$JEMSU_JOB_ID" \
-H "Authorization: Bearer $JEMSU_API_KEY"
Use the job ID returned by create. Requests are scoped to the key owner; an unknown job or one owned by another account returns 404 not_found.
Interpret the result
| Field | Meaning |
|---|---|
| jobId / status | Job identifier and current state. Treat unfamiliar states as nonterminal. |
| videoUrl / thumbnailUrl | Result links, which may be null until ready. |
| videoTitle / videoDescription | Generated or saved video metadata. |
| creditsReserved | The reservation recorded for this job. |
| error | Null or an object with code and message. |
| createdAt / completedAt / failedAt | ISO timestamps or null. |
| pipeline | The current director pipeline is v2. |
| progress | Optional stage and detail; it may lag the final status. |
| plannerSummary / actualModel | Optional production summary and model information. |
| voiceScript / voiceScriptSource | Optional spoken script and its source. |
Poll responsibly
- Save the job ID as soon as the create call succeeds.
- Start with a 15-second polling interval; this is client guidance, not a server quota.
- On completed, verify videoUrl exists before using it. On failed, show the error.
- Set a bounded polling window and keep the job ID so another worker can resume.
- Back off on transient GET failures. Do not automatically repeat the create request.
List recent videos
curl --fail-with-body https://app.jemsu.ai/api/v1/videos \
-H "Authorization: Bearer $JEMSU_API_KEY"
The list response is {"videos": [...]} and contains up to 25 recent jobs. Use it to help reconcile an interrupted create call.
Status progression
The documented progression is pending → processing → running → completed, with failed as a terminal failure state. A poll can skip intermediate states. Director jobs identify pipeline: v2 and can include progress.stage and progress.detail while rendering.
{
"pipeline": "v2",
"progress": {
"stage": "rendering",
"detail": "segment 2 of 3"
}
}
Completed response example
Illustrative result; media URLs and job IDs are placeholders. Progress text can lag the final status, so use status as the completion signal.
{
"jobId": "YOUR_JOB_ID",
"status": "completed",
"videoUrl": "https://YOUR-RESULT-HOST/video.mp4",
"videoTitle": "A morning at the bakery",
"videoDescription": "Fresh bread, warm morning light.",
"thumbnailUrl": "https://YOUR-RESULT-HOST/thumb.jpg",
"creditsReserved": 1440,
"error": null,
"createdAt": "2026-09-12T18:00:00.000Z",
"completedAt": "2026-09-12T18:09:12.000Z",
"failedAt": null,
"pipeline": "v2",
"plannerSummary": "Three segments: the oven, the crust and the sign.",
"actualModel": "seedance",
"voiceScript": "Fresh bread, every morning.",
"voiceScriptSource": "planner"
}
voiceScriptSource is brief when the words came from your brief and planner when the director wrote them. plannerSummary describes production; actualModel reports the model used. The completed result includes videoUrl.
Credit reconciliation
After delivery, the charge is reconciled to what was actually rendered and any difference is refunded. A failed job refunds its entire reservation. Read GET /credits when reconciling your own account records.