Sume STT: omit duration_seconds and you reserve one minute, not 570 s
The catalog says omitting duration_seconds reserves 1 minute; the maximum is 10 minutes ($0.10). A 570-second file lists at $0.095. Hold table, read 2026-10-08.

When you send a Sume STT request without duration_seconds, the catalog says the usage reservation is for one minute ($0.01), and the maximum estimate is 10 minutes ($0.10). A 570-second file lists at 9.5 minutes x $0.01 = $0.095, so the default reservation is about a tenth of the work. Send duration_seconds so the hold matches the audio.
The hold and the list price
The catalog's pricing_basis for STT reads: reserve from audio-minute estimates, omit duration_seconds to reserve 1 minute, maximum 10 minutes. The list column below is seconds / 60 x $0.01, and the catalog also shows a minimum of 1 cent per request. I have not tested what happens when the actual audio runs longer than an omitted-duration hold, so this post makes no claim about settlement.
| Audio length | List price (seconds / 60 x $0.01) | Hold if duration_seconds omitted | 1-cent minimum |
|---|---|---|---|
| 25 s | $0.0042 | $0.01 | $0.01 |
| 61 s | $0.0102 | $0.01 | $0.01 |
| 300 s | $0.05 | $0.01 | $0.01 |
| 570 s | $0.095 | $0.01 | $0.01 |
| 600 s | $0.10 | $0.01 | $0.01 |
Why it matters in code
Admission checks the balance against the hold, and the failure case is a balance that covers the hold but not the real cost. For batches, compute the sum of the real durations first (from a probe or from the file metadata) and send them. The video inspect docs say the same for the transcript option: omit duration_seconds to reserve one minute (Video inspect).
A 600-second chunk has a list price of exactly $0.10, which equals the maximum estimate in the catalog. A chunk longer than 600 seconds is outside the public STT range, so cut it first (audio detach with a range is one way, at $0.01 per job).
Checklist
- Set duration_seconds from the real audio length, 1 to 600.
- Add up list prices per chunk, not per file: a 25-second chunk is under the 1-cent floor.
- Use a distinct idempotency_key per chunk.
A batch example with 31 files
Take 31 interview excerpts that add up to 4 hours 22 minutes (262 minutes). If every request omits duration_seconds, the combined hold is 31 x $0.01 = $0.31 while the list price of the work is 262 x $0.01 = $2.62, so the holds cover 11.8 percent of the work. With the real durations set the holds add up to the list price, and the account needs to cover $2.62 plus whatever else is running at the same time. If your balance is $1.00, the first plan would admit all 31 requests and the second would not, which is a reason to set the values and to top up first.
None of this changes the price. It changes what the platform thinks you are about to spend when it decides whether to admit a request, and what you see held on the account while jobs run. The catalog describes the reservation as an estimate that is captured on completion and refunded if a job fails or is canceled before generation.
Where the numbers come from
Every figure in this post is the catalog entry's STT price ($0.01 per audio minute), its stated default reservation (1 minute), its stated maximum (10 minutes, $0.10) and its stated minimum (1 cent). The only arithmetic is seconds divided by 60 times $0.01.
Sources
Related posts
More in Developers
- Sume submit: request_id is the job id you poll (curl, jq)
After an async submit, data.request_id is the id for GET /v1/jobs/:id. error.request_id is for support tickets. A curl and jq check.
- Sume TTS word timestamps to caption cues for a narrated 60-second clip
Ask Sume TTS for timestamps.words, group them into cues and send them to video-captions so no recognition runs. About 25 cents for a 60-second narration.
- Sume TypeScript SDK waitForJob: 20-minute timeout, job keeps billing
How @sume-com/sdk waitForJob polls a generation job, what SumeJobTimeoutError means, and why a client timeout does not cancel or refund the job.
- Webhook endpoint down: redeliver a Sume video job after the retries
Sume retries a job webhook 10 times, 30 seconds apart. If your receiver was down longer, POST /v1/jobs/{id}/webhook/redeliver re-sends the terminal payload.
Written by Sume