What is measured
Every figure in this section is built from one record: the model call, sent by your gateway for every call it makes. Nothing is sampled.
One model call
Section titled “One model call”| Field | What it is |
|---|---|
input_tokens |
Input tokens not read from the cache |
cache_read_tokens |
Input tokens read from the prompt cache |
cache_write_tokens, cache_write_1h_tokens |
Input tokens written to the cache; the second is the one-hour share where the provider reports it |
output_tokens |
Output tokens, including any reasoning tokens the provider bills as output |
cost_usd |
What the call cost, on your deployment’s price card |
estimated |
true where the cost was worked out from the price card rather than reported with a price by the provider |
model, backend |
The model, and the platform that served it (for example Bedrock in the EU) |
pack, task, agent, run_id_hash |
Which agent, task and run the call belongs to |
latency_ms, paced_ms, throttled |
How long it took, how long it waited for a rate limit, and whether the provider throttled it |
outcome, reason |
ok, refused or error, with a fixed reason code |
All input is the sum of the first three: uncached input, cache reads and cache writes. The same convention runs through every page and every API read.
No prompt, answer or document text is in the record. See the telemetry contract.
Reasoning tokens
Section titled “Reasoning tokens”A thinking model’s reasoning tokens are billed as output, and are counted in output_tokens and its cost. They are measured separately by the Token Value Benchmark, which reports input, output, cached and reasoning tokens per task as four figures. A separate reasoning count on every model call: Coming
Currency
Section titled “Currency”Model costs are recorded in US dollars today. Every read also carries each money figure in your display currency (*_money), converted at the European Central Bank’s rate for that amount’s own day, and never adds two currencies’ raw amounts together. Set the display currency in Settings → Preferences for yourself, or for the whole tenant in Settings → Organisation.
The benchmark records each result in the provider’s own currency (currency and cost_native) beside its dollar figure. Carrying a provider’s own currency through on every model call: Coming
Grouped the way you need it
Section titled “Grouped the way you need it”| Grouping | Read |
|---|---|
| Per call | Each model_call record, in your tenant’s export |
| Per run | GET /api/v1/runs/{run_id_hash} and its run map: tokens and cost of every step |
| Per agent | GET /api/v1/billing/usage?group_by=agent, and the agent’s own page |
| Per pack | GET /api/v1/usage?group_by=pack. A pack is a department’s set of agents, which is how most clients see spend by team |
| Per model, task or day | GET /api/v1/usage?group_by=model (or task, or day) |
| Per connection | GET /api/v1/billing/usage?group_by=connection: each provider connection, direct or through Atlantic |
| Caching, by model, agent, pack, deployment or provider | GET /api/v1/caching |
# Tokens and cost by pack for Octobercurl "https://$AAL_TENANT.atlanticagenticlabs.com/api/v1/usage?since=2026-10-01&until=2026-10-31&group_by=pack" \ -H "Authorization: Bearer $AAL_KEY" \ -H "CF-Access-Client-Id: $CF_ACCESS_CLIENT_ID" \ -H "CF-Access-Client-Secret: $CF_ACCESS_CLIENT_SECRET"import os
import httpx
headers = { "Authorization": f"Bearer {os.environ['AAL_KEY']}", "CF-Access-Client-Id": os.environ["CF_ACCESS_CLIENT_ID"], "CF-Access-Client-Secret": os.environ["CF_ACCESS_CLIENT_SECRET"],}r = httpx.get( f"https://{os.environ['AAL_TENANT']}.atlanticagenticlabs.com/api/v1/usage", params={"since": "2026-10-01", "until": "2026-10-31", "group_by": "pack"}, headers=headers,)r.raise_for_status()print(r.json())const q = new URLSearchParams({ since: "2026-10-01", until: "2026-10-31", group_by: "pack" });const res = await fetch(`https://${process.env.AAL_TENANT}.atlanticagenticlabs.com/api/v1/usage?${q}`, { headers: { Authorization: `Bearer ${process.env.AAL_KEY}`, "CF-Access-Client-Id": process.env.CF_ACCESS_CLIENT_ID!, "CF-Access-Client-Secret": process.env.CF_ACCESS_CLIENT_SECRET!, },});console.log(await res.json());Each group carries calls, input_tokens, cache_read_tokens, cache_write_tokens, output_tokens, cost_usd, estimated_calls, refused and errors. See the Usage reference.
Spend is not broken out per person: a model call carries no person, and a person appears elsewhere in telemetry only as a keyed hash. Per-person limits do exist; see Limits and alerts.
Checked against the provider’s bill
Section titled “Checked against the provider’s bill”The gateway’s figure is what your software reported. Where LightHouse can read the provider’s own figure (AWS Cost Explorer for Bedrock, Anthropic’s cost report for the Claude API), Spend → Reconciliation shows both per day and connection, and the difference, without smoothing it. GET /api/v1/billing/reconciliation?month=YYYY-MM.