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.
- 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.
- MiniMax H3 768p: why 720p is refused and what to send instead
MiniMax H3 renders natively at 768p, not 720p. Sume refuses resolution 720p on H3 and H3 Max and tells you to use 768p. The accepted values per id.
Written by Sume