Cost of one Sume agent thread or turn: /v1/usage thread_id and job_id
Pass thread_id to GET /v1/usage to sum one Studio Agent thread, or a turn's job id as job_id for that turn plus every job it commissioned. Fields and a request.

To get what one Studio Agent thread cost on Sume, call GET /v1/usage?thread_id=.... The summary.debited_usd field is the dollar figure the docs tell you to quote. To get one agent turn, pass the turn's job id as job_id: it sums the turn's own row plus every job the turn commissioned.
All of this is in the Usage docs and the OpenAPI schema for /v1/usage.
What does each scope parameter sum?
Each scope parameter folds a different set of ledger rows, and the three can be used one at a time. Choose the narrowest one that matches the thing you want to price, because the summary covers the whole scope.
| Parameter | What it sums |
|---|---|
thread_id | Every ledger row the Studio Agent thread caused: turns, sidecars, Browser sessions and generation jobs, script_run children included. |
run_id | A Format, Action or Agent run (arun_...): its generation jobs plus the run thread's own turn rows. |
job_id | One generation job's row, or an agent turn's job id: the turn's row plus every job it commissioned. |
Which row fields link a job back to a turn?
Rows carry thread_id, run_id, turn_job_id (the agent turn that commissioned the job), and, for jobs dispatched by an MCP script_run call, script_run_id and script_run_call_index. The summary's includes field counts rows by kind, including script_run_children, and by_operation_type splits the same money by operation.
A thread-bound credential may name only its own thread, according to the schema, so a scoped key cannot read another thread's cost.
curl "https://api.sume.com/v1/usage?thread_id=$SUME_THREAD_ID&limit=1" \
-H "Authorization: Bearer $SUME_API_KEY"Is the number spend yet?
Only debited_usd_micros is spend. held_usd_micros is holds still open and refunded_usd_micros is money given back after a failure or cancellation, and neither is spend. final turns true once no hold is open. If a thread is still running, read the figure again later.
What should I do with it?
Keep the thread figure and the cap apart in whatever you report.
- Log
debited_usdandfinalnext to each thread you bill. - Use
job_idwith a turn id when you need the cost of one prompt. - Keep the cap and the cost apart: for a run,
summary.capshows what counts against its generation cap, and the docs say it is never a cost.
Sources
Related posts
More in Developers
- Sume /v1/balance: next_expires_at and the expiring-soon fields
GET /v1/balance returns USD micros and cents, a funded or empty state, and an expiration block with the next expiry and the amount expiring soon. Field list.
- Sume /v1/usage limit: it caps rows, not the summary total
On GET /v1/usage, limit (1 to 100) only caps the rows listed. With thread_id, run_id or job_id the summary folds every row, up to 5,000.
- Sume webhook signature fails: compare the secret fingerprint
When a sume-v1 signature does not verify, one header tells you if the wrong secret signed it. A 24-line Node check reads the fingerprint and names the cause.
- Sume webhook never arrived: a sweeper that settles pending jobs
Run a small timer job that reads status for jobs still pending after ten minutes and settles them with the same guarded update your webhook route uses.
Written by Sume