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 a 30-minute file: OpenAI 25 MB cap vs Sume 10-minute jobs
A 30-minute file hits OpenAI's 25 MB upload limit and Sume's 10-minute duration hint. How to split once, transcribe in pieces, and re-base the word timings.
- Transcribe a 30-minute recording in three 600-second STT jobs: $0.33
Sume STT takes at most 600 seconds per job. Cut a 30-minute video into three 10-minute mp3 pieces with audio detach and transcribe each: $0.33 total.
- Transcribe a clip when you do not know the language: STT auto-detect
Omit language_code on Sume speech-to-text and the job auto-detects the language. What the result returns, the 10-minute cap, and the $0.01 a minute rate.
- Transcribe audio from a private bucket: Sume STT needs a public URL
Sume STT takes a public HTTPS audio_url. If your files sit in a private bucket, here is how to hand them over without opening the whole bucket.
Written by Sume