Usage export
GET /v1/usage/export — row-level metered usage in JSON or CSV.
GET https://api.inference.runatlas.com/v1/usage/exportAuthenticated with a read-scoped key (atl_read_) or a console session. One row
per request, each carrying the price stamped on it.
curl "https://api.inference.runatlas.com/v1/usage/export?format=csv&start=2026-09-01&end=2026-10-01" \
-H "Authorization: Bearer $ATLAS_READ_KEY" \
-o atlas-usage-september.csvQuery parameters
Accepts the same start, end, model, and api_key_id filters as
GET /v1/usage, with the same 93-day period ceiling,
plus:
formatstringdefault: jsonjson or csv.
limitintegerdefault: 1000JSON only. Rows per page, 1 – 10,000.
cursorstringJSON only. A next_cursor from a previous page. Refused on CSV with
cursor_not_supported.
JSON response
{
"columns": ["occurred_at", "request_id", "organization_id", "..."],
"rows": [
{
"occurred_at": "2026-09-08T10:14:02.411Z",
"request_id": "req_01k4v9m2...",
"organization_id": "...",
"api_key_id": "8f2c1d5e-...",
"model_identifier": "atlas-mid-1",
"model_id": "...",
"model_version_id": "...",
"outcome": "completed",
"streamed": true,
"shape": "plain",
"http_status": 200,
"error_code": null,
"backend_reported_input_tokens": 284,
"backend_reported_output_tokens": 57,
"backend_reported_reasoning_tokens": 0,
"generated_output_tokens": 57,
"delivered_output_tokens": 57,
"atlas_counted_input_tokens": null,
"atlas_counted_output_tokens": null,
"reconciliation": null,
"reconciliation_divergence": null,
"system_fingerprint": null,
"input_price_per_mtok": "0.50",
"output_price_per_mtok": "1.50",
"price_currency": "USD",
"input_cost": "0.00014200000000",
"output_cost": "0.00008550000000",
"total_cost": "0.00022750000000",
"cost_provisional": true,
"time_to_first_token_ms": 212,
"total_duration_ms": 1841
}
],
"next_cursor": "MjAyNi0wOS0wOFQxMDoxNDowMi40MTFafHJlcV8..."
}next_cursor is null on the last page. columns is the CSV header in the
same order — both formats are generated from one row definition, so a figure
that reconciles in one reconciles in the other.
CSV response
text/csv; charset=utf-8, streamed as it is generated, with the filename set
from the organization and period. It walks the whole period internally, so there
is no cursor to manage — and passing one is refused.
Columns
occurred_at · request_id · organization_id · api_key_id ·
model_identifier · model_id · model_version_id · outcome ·
streamed · shape · http_status · error_code
model_version_id pins the exact weights served. shape is plain,
tool_calling, or structured_output.
backend_reported_input_tokens · backend_reported_output_tokens ·
backend_reported_reasoning_tokens · generated_output_tokens ·
delivered_output_tokens · atlas_counted_input_tokens ·
atlas_counted_output_tokens · reconciliation ·
reconciliation_divergence · system_fingerprint
The backend_reported_* pair is the meter of record. Reasoning tokens are
counted inside the output figure. The atlas_counted_* columns are
null unless the row was sampled.
input_price_per_mtok · output_price_per_mtok · price_currency ·
input_cost · output_cost · total_cost · cost_provisional
The prices are those in force when the row was written, so the cost columns can be recomputed rather than believed.
time_to_first_token_ms · total_duration_ms
Recomputing cost
input_cost == backend_reported_input_tokens / 1e6 * input_price_per_mtok
output_cost == backend_reported_output_tokens / 1e6 * output_price_per_mtokDo not add the reasoning column to the output figure, do not price on the
generated_ or delivered_ columns, and do not reprice with today's published
price.
Cursors
A cursor encodes a position — a timestamp and a request id — and nothing about
who is reading, so one handed between accounts selects a position and no data.
Rows are ordered by occurred_at then request_id, making paging stable as new
rows arrive behind you.
Errors
| Status | Code | |
|---|---|---|
| 400 | invalid_cursor | The cursor did not decode. |
| 400 | cursor_not_supported | A cursor was passed with format=csv. |
| 400 | invalid_query, period_inverted, period_too_long | As for /v1/usage. |
| 401 | — | Missing, invalid, or wrong-scope key. |