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

  1. Save the job ID as soon as the create call succeeds.
  2. Start with a 15-second polling interval; this is client guidance, not a server quota.
  3. On completed, verify videoUrl exists before using it. On failed, show the error.
  4. Set a bounded polling window and keep the job ID so another worker can resume.
  5. 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.