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.

4 min readSume
All posts

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.

Spend-related signals on Sume (read 2026-10-03)
SignalMeaning
usage.costBilled USD amount for a finished job
402 insufficient_creditsBalance not sufficient for the generation
queue_full (429)Concurrency plus queue capacity is full
dry_run on MCPPreflights 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

All Developers posts

Written by Sume