What did one transcription job cost? GET /v1/usage by job_id
Read GET /v1/usage?job_id= and sum data.summary.debited_usd_micros to see what one Sume STT job really cost. Holds and refunds are not counted as spend.

To see what one Sume transcription job cost, call GET https://api.sume.com/v1/usage?job_id=<job id> and read data.summary.debited_usd_micros. That field is captured spend in millionths of a US dollar, so 2,000 micros is $0.002. Ledger rows are in data.usage[]. Amounts that were only held, or were held and then refunded, do not count as debited. Source: the Sume API reference and the usage fold described in the public API docs, read 2026-10-06.
Why the debited number can differ from your estimate
At submit time Sume reserves an estimate. For STT 1.0 that estimate comes from duration_seconds at $0.01 per audio minute, prorated by the second, with a one-second minimum. If you leave the field out, the hold is one full minute ($0.01) even for a 6-second clip, and the capture follows the settled usage. Always compare the ledger, not the hold.
| Clip length | Per-second estimate | Micros |
|---|---|---|
| 2 s | $0.000333 | 333 |
| 6 s | $0.001000 | 1,000 |
| 12 s | $0.002000 | 2,000 |
| 60 s | $0.010000 | 10,000 |
Reading the ledger for a list of jobs
Run it for each job id after the batch finishes and total the result. Treat a missing summary as zero captured so far, not as an error.
import os, requests
API = "https://api.sume.com"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
def job_cost_usd(job_id):
r = requests.get(f"{API}/v1/usage", headers=H, params={"job_id": job_id}, timeout=30)
r.raise_for_status()
body = r.json()
data = body.get("data", body)
micros = (data.get("summary") or {}).get("debited_usd_micros", 0)
return micros / 1_000_000
def batch_cost_usd(job_ids):
return sum(job_cost_usd(j) for j in job_ids)Standalone STT versus STT inside another job
A transcript that comes from transcribe: true on a video inspect job, or from the caption job, is billed inside that job. Query those job ids the same way. Do not expect a separate STT row to appear for them.
Sources
Related posts
More in Developers
- User closed the tab mid-render: cancel the Sume job or let it finish?
Cancel works only before generation starts; after that you get 409 job_generation_already_started and the job bills. A tested tab-close handler.
- Verify a Sume TTS transcript_receipt SHA-256 yourself in Python
Recompute submitted_transcript_sha256 from your script with NFC and LF canonicalization and compare it to the transcript_receipt on a finished Sume TTS job.
- 4K vertical Short in Timeline: the 2160 cap and 1214x2160
Timeline output width and height top out at 2160 and must be even, so 2160x3840 is refused. What the largest 9:16 frame is and whether a Short needs it.
- Voice one script in six languages: Sume TTS loop and 409 guard
MAI-Voice-2.1 sells one voice across 23 languages. On Sume, set language per line, handle the 409 voice-language guard and price a six-language batch.
Written by Sume