Cap a voiceover batch at $1: tts_create dry_run and max_spend_usd
Preview what a Sume TTS call will cost before it runs, and cap the spend. How dry_run and max_spend_usd work on tts_create, with a 20-line cost example.

To keep a voiceover batch under a dollar, call the hosted MCP tool tts_create with dry_run: true first, then with max_spend_usd set on the real call. dry_run previews admission and cost without submitting a job, and max_spend_usd is enforced only when you provide it (MCP gates). idempotency_key is required on the paid call either way.
The input shape
The tool takes idempotency_key, a payload holding the TTS fields, and the two optional guards. All generation fields live inside payload, as the tool description puts it. Exactly one of transcript or transcript_source goes in.
{
"idempotency_key": "launch-voiceover-v1",
"dry_run": true,
"max_spend_usd": 1.0,
"payload": {
"transcript": "Welcome to the October release.",
"avatar_handle": "your-voice-handle",
"language": "en"
}
}How to size the cap
TTS is $0.0475 per 1,000 characters, spaces and punctuation included, and one request is capped at 20,000 characters, so the most one call can cost is $0.95. That is why a $1 cap fits a single maximum-length call. A batch of 12 scripts at 1,500 characters each is 18,000 characters, or $0.855, which still fits under $1.
| Characters | Cost | Fits under $1 |
|---|---|---|
| 500 | $0.02375 | yes |
| 1,500 | $0.07125 | yes |
| 10,000 | $0.475 | yes |
| 20,000 | $0.95 | yes, the per-request maximum |
| 21,000 (two calls) | $0.9975 | yes, barely |
Why bother with a preview
Per-character list prices have fallen across the market. Microsoft prices MAI-Voice-2.1 at $22 per million characters and the Flash tier at $15 per million (Microsoft AI, read 2026-10-04). Cheap units make it easy to loop an agent over a long script without noticing the total. A guard on the call is the guard that does not depend on the agent remembering to check.
What the guards do not do
dry_run previews admission and cost and does not submit the job, so the real call is still a separate step. And max_spend_usd does not replace the idempotency key. If a call times out, re-send the same key instead of a new one, so you do not pay twice. The sync wait guide covers that case.
A good routine is three lines: dry run, read the cost, submit with the cap set a few percent above the preview.
Sources
Related posts
More in Agents
- Claude Code 2.1.289 agent.spawn: teammates share one Sume queue
Claude Code 2.1.289 adds agent.spawn for teammates. Teammates sharing a Sume workspace share its concurrency limit and queue, so plan the width of the fan-out.
- Claude Desktop catch-up run after wake: idempotency key for Sume
Desktop runs one catch-up task after sleep, maybe hours late. Use a date-based idempotency_key, dry_run and max_spend_usd so Sume bills once.
- Claude Desktop scheduled task skipped? Computer asleep vs Sume cron
Desktop scheduled tasks only fire while the app is open and the computer is awake. Where a Sume Scheduled cron run differs and when to use each.
- Claude Desktop task can reschedule itself; a Sume schedule cannot
Desktop tasks can edit their own cadence with update_scheduled_task. A Sume schedule has a fixed trigger and no write API. What to do instead.
Written by Sume