Task budgets
One job, many calls, one ceiling. Every row is a task_ref burning down.
Suggested ceilings
A pick fills the ceiling field with that agent's label; sample data, so nothing here is saved. Each figure is the p50, p90 or max of that agent's last 20 finished jobs: one real job's total, in dollars at list price when every call of those jobs was priced, and in the jobs' own unit otherwise. How the suggestion is computed.
One job, one budget, in dollars, tokens or units of your own, chosen when the job opens and fixed after. A ceiling in dollars is the list-price estimate of the tokens each call reports: preflight reserves the job's recent median call (its largest recent call once the job is at 80% of its ceiling), or $0.10 before its first priced call, and each record settles to what the call cost. A call with no list price is charged its reservation, never $0. The ceiling saved here is the one preflight uses. Your code can open a job with task_ceiling on its first call; once the job exists, a task_ceiling on preflight is not applied, and the ceiling changes only here or through PUT /tasks/:task_ref/ceiling: last save wins. The agent label is read only when a save opens the job. When the job has no room left, preflight answers approved: false and your code decides what next.
| Task | Used | Burn-down | State |
|---|---|---|---|
| 492 / 500 units | close | ||
| 1,025 / 1,000 units | leaked | ||
job-8870summarizer
92 units left · 12 reserved in flight · 3h ago
25m, first to last preflight on record
|
96 / 200 units | running | |
nightly-crawlcrawler
100 units left · 60 reserved in flight · 5h ago
5h 56m, first to last preflight on record
|
1,840 / 2,000 units | close | |
| 118 / 500 units | running |
5 tasks, most recently touched first. Used is what your code reported: tokens on a job wrap() opened, your own count on a job in units, and a dollar figure is the list-price estimate of the job's priced calls. The time on a row runs from the first to the last preflight on record for that job, approved or refused; it is not the job's own duration, and a record() does not move it. Those records begin 2026-09-03, so a job older than that shows only its preflights since then. The same rows, without that time, are on GET /tasks (?sort=used for this ranking) and GET /tasks/:task_ref.
GET /decisions for refusals, /tasks for budgets and /tasks/:task_ref for a job's list-price estimate, /usage?by=event_type for the split by event_type and its estimate, /customers for balances, /keys for keys, each with Authorization: Bearer <your key>. A suggested ceiling is one job's used_units, or its breakdown.list_price_usd_estimate when every call was priced, as GET /tasks/:task_ref returns it: the p50, p90 or max over one agent's 20 most recently updated finished jobs, worked out on this page.