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.

4 min readSume
All posts

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.

Spend at the Sume TTS rate for common script sizes (read 2026-10-04)
CharactersCostFits under $1
500$0.02375yes
1,500$0.07125yes
10,000$0.475yes
20,000$0.95yes, the per-request maximum
21,000 (two calls)$0.9975yes, 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

All Agents posts

Written by Sume