Track AI video spend per job: Synthesia Billing API vs Sume job cost
Synthesia added a Billing API and auto top-up. On Sume, every finished job reports usage.cost, so you can keep a per-job ledger without a billing endpoint.

Synthesia's September 9, 2026 update says a new Billing API gives a breakdown of credit usage, and that auto top-up purchasing prevents job failures. On Sume, the finished job reports usage.cost in dollars, so you can record spend per job yourself. When the balance is too low the API returns 402 insufficient_credits.
What Synthesia added
The update lists two things: a breakdown of credit usage through a Billing API, and auto top-up so a job does not fail for lack of credits. This post does not claim anything further about how Synthesia's API works.
Per-job cost on Sume
Sume bills in dollars from a workspace balance. The amount is reserved at submit, at provider list times 1.25, and the completed job reports the billed amount as usage.cost. Image responses carry the same field. Store the job id and the cost together and you have a ledger.
import os
import requests
def job_cost(job_id):
r = requests.get(
f"https://api.sume.com/v1/videos/{job_id}",
headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"]},
timeout=30,
)
r.raise_for_status()
body = r.json()
if body["status"] != "completed":
return None
return body["usage"]["cost"]
print(job_cost("job_01HXYZ"))Failure modes
402 insufficient_credits means the balance is not sufficient for the requested generation. The error category for a failed job is quota, and the next action is to add funds or lower the cost. Do not retry a 402 in a loop. A queue_full is different: it means workspace capacity, not money.
| Signal | Meaning |
|---|---|
usage.cost | Billed USD amount for a finished job |
402 insufficient_credits | Balance not sufficient for the generation |
queue_full (429) | Concurrency plus queue capacity is full |
dry_run on MCP | Preflights cost without submitting |
What is different
Sume does not describe an auto top-up in the docs read for this post. A job that cannot be reserved fails with a 402 and you decide what happens next. If you need a spending ceiling, set one in your own code: sum usage.cost over a day and stop submitting when it passes a number you pick. On MCP, max_spend_usd caps a call when you pass it.
Sources
Related posts
More in Developers
- Transcribe two minutes of a long video: audio detach range, then STT
Streaming transcribers charge by the hour; you may only need one segment. Detach a range as 16 kHz mono wav, then run one STT job. Caps and codes included.
- Trigger.dev Node 21 warning: which Node runs the Sume SDK
Trigger.dev v4.6.1 added Node.js 21 deprecation warnings. The Sume TypeScript SDK needs Node 18 or later, so tasks on Node 22 or newer are fine.
- Trigger.dev public tokens: keep the Sume key server-side
Trigger.dev v4.6.2 hardened authorization for public tokens. Whatever token your browser holds, a Sume API key must never be one of them. Here is the split.
- Voice replication API audit checklist before you switch
Gemini 3.8 Flash TTS is GA with voice replication and 150+ voices. Before switching providers, audit these items against Sume's live catalog.
Written by Sume