409 job_not_completed: why the result call fails and what to poll
GET /v1/jobs/:id/result answers 409 job_not_completed until the job completes. Poll status for terminal, read failures from the job record, and never resubmit.

409 job_not_completed means you asked for GET /v1/jobs/:id/result before the job finished, or after it failed. The result route is only for completed jobs. Poll GET /v1/jobs/:id/status until terminal is true, then fetch the result only if sume_status is completed.
This follows the Jobs and results docs, read 2026-09-29.
Which statuses are terminal?
| Status | Meaning | Terminal |
|---|---|---|
queued | Accepted, waiting to run | No |
processing | Running or being finalized | No |
completed | Result is ready | Yes |
failed | Terminal failure with a public error | Yes |
canceled | Cancellation requested and terminal | Yes |
What should the polling loop do?
Poll on the booleans terminal and result_ready, or on sume_status. Honor next_poll_after_seconds when present and back off exponentially otherwise. Stop on completed, failed or canceled.
A failed or canceled job has no result to fetch, so read the failure from the job record with GET /v1/jobs/:id (the error is on job.error) instead of the result route.
curl https://api.sume.com/v1/jobs/job_123/status \
-H "Authorization: Bearer $SUME_API_KEY"
# when "result_ready": true
curl https://api.sume.com/v1/jobs/job_123/result \
-H "Authorization: Bearer $SUME_API_KEY"Should I resubmit if my client times out?
No. A 2xx on submit means the job exists and paid work is in flight. In sync mode the wait is at most 30 seconds; if it ends before a terminal state, keep polling. If you must retry the submit itself, reuse the same Idempotency-Key so you get the original job back and are not billed twice.
Does this hold over MCP?
Yes in spirit: jobs_wait holds at most about 55 seconds per call, and on wait_slice_expired you call it again with the same ids rather than resubmitting. A 524, 522, 523 or 525 on jobs_wait is a transport failure, not a job outcome.
Sources
Related posts
More in Developers
- JSON to video API: render an MP4 from a timeline document
A JSON to video API renders one MP4 from a document that says which clips play when, over which audio. How Sume's Timeline 1.0 does it, and costs.
- Kling API rate limit: concurrency by package and error 1303
Kling's API limits concurrent tasks by resource package, not requests per second. Over the cap, a create fails with HTTP 429, code 1303.
- Lip sync longer than 15 seconds: split the audio first
MiniMax H3 Max lip sync on Sume takes 5 to 14.8 s of audio. For a longer line, use VEED Fabric up to 300 s, or split the audio into ranges and sync each piece.
- MCP 2026-07-28 spec: which version does Sume's hosted server speak?
The 2026-07-28 MCP revision is out and Claude Code speaks it. Sume's hosted server negotiates 2025-03-26, 2025-06-18 and 2025-11-25, not 2026-07-28.
Written by Sume