Read twelve narration takes at once: jobs_result partial success
Over MCP, jobs_result takes up to 20 job ids and returns one ok-or-error entry each. How to read a wave of TTS takes when one is still running.

To read twelve finished narration takes in one call over Sume's MCP server, pass their ids to jobs_result as job_ids. It accepts 1 to 20 ids and returns a job_result_batch with results[] in request order, each entry carrying ok plus either a value or a typed error. Partial success is normal, so check ok on every entry and never treat one failure as a verdict on the rest. This follows the jobs and results docs, read 2026-10-03.
What does a batch result look like?
Per entry, a TTS take's value is the job result; read the audio artifact from it as you would a single jobs_result.
| Field | Meaning |
|---|---|
results[] | One entry per id, in request order |
ok | True with a value, or false with a typed error |
job_not_completed | That id is still running; others still return |
partial_failure.failed_job_ids | Exactly the ids worth reading again |
How do I handle the unfinished one?
Re-read only partial_failure.failed_job_ids, or wait again with jobs_wait on those ids. Never resubmit the paid tts_create because one entry was not completed. The snippet below shows the split between ready and retry on a sample batch; the data is made up to show the shape.
results = [
{"ok": True, "value": {"job_id": "job_a", "audio_url": "https://media.sume.com/artifacts/a.wav"}},
{"ok": False, "error": {"code": "job_not_completed", "job_id": "job_b"}},
{"ok": True, "value": {"job_id": "job_c", "audio_url": "https://media.sume.com/artifacts/c.wav"}},
]
done = [r["value"]["audio_url"] for r in results if r["ok"]]
retry = [r["error"]["job_id"] for r in results if not r["ok"]]
print("ready:", done)
print("read again:", retry)
Where should I stop?
jobs_waitwithinclude_results: truereturns the results of every id that completed, so a wave often needs no separate read. Ids whose results are too large for one answer come back inresults_omitted.job_ids.- The 20-id ceiling applies to both calls; twelve sentences fit, but a 30-sentence script needs two batches.
- I did not test large batches against a client's output limit, so size your batch to what your client can display.
Sources
Related posts
More in Developers
- Recast request timed out: retry with the same Idempotency-Key
A timeout on POST /v1/video-router/generate does not tell you whether the job exists. Derive a stable Idempotency-Key so a retry returns the original job.
- Recast sync wait caps at 30 seconds: use a webhook for long sources
Sync and subscribe modes wait at most 30 seconds, so submit h3-max-recast jobs as async or webhook and poll /v1/jobs/{id}/status as a fallback.
- Recraft V4 on Sume returns WebP only: convert to PNG or JPEG in Python
Recraft V4 on Sume outputs WebP and takes no references. A Pillow converter for PNG or JPEG, with transparency flattened onto white for JPEG delivery.
- Reel judders after mixing 24 and 30 fps clips: set Timeline output fps
Timeline repeats or drops frames when output fps differs from a source. Learn output_fps_resamples_sources, how the default is chosen, and when to pin 30.
Written by Sume