Atlas Inference

Usage export

GET /v1/usage/export — row-level metered usage in JSON or CSV.

GET https://api.inference.runatlas.com/v1/usage/export

Authenticated 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.csv

Query 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: json

json or csv.

limitintegerdefault: 1000

JSON only. Rows per page, 1 – 10,000.

cursorstring

JSON 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

Recomputing cost

input_cost  == backend_reported_input_tokens  / 1e6 * input_price_per_mtok
output_cost == backend_reported_output_tokens / 1e6 * output_price_per_mtok

Do 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

StatusCode
400invalid_cursorThe cursor did not decode.
400cursor_not_supportedA cursor was passed with format=csv.
400invalid_query, period_inverted, period_too_longAs for /v1/usage.
401Missing, invalid, or wrong-scope key.

On this page