---
title: "Usage Summary Csv"
method: GET
path: "/v1/usage/summary.csv"
tags: ["usage"]
---

# Usage Summary Csv

`GET /v1/usage/summary.csv`

Download every breakdown the summary reports, as one CSV.

One row per (dimension, key): model, user, API key, source, session
(``source_label``), endpoint, and provider. A dedicated route rather than a
``format=csv`` flag on ``/summary`` so that endpoint keeps a single JSON
response model and a clean OpenAPI schema. The export is **uncapped** (no
top-N fold): finance wants every row. ``tokens`` is the billed total (fresh
input, both cache buckets, and output), matching the dashboard's analytics.
Kept separate from the bare-array ``/v1/usage`` contract, which is untouched.

## Query parameters

- `start_date` string, date-time, nullable — Return logs with timestamp >= start_date (ISO 8601 or Unix epoch seconds)
- `end_date` string, date-time, nullable — Return logs with timestamp < end_date (ISO 8601 or Unix epoch seconds)
- `user_id` string, nullable — Filter to a single user
- `status` string, nullable — Filter to a single status: 'success', 'error', or 'absorbed' (an attempt a routing policy recovered from, excluded from error_count and request_count)
- `status_code` integer, nullable — Filter to a single failure status code (e.g. 429 for provider rate limits, 402 for missing-pricing rejections). Only error rows carry one, so this filter also restricts to status='error' unless 'status' is given explicitly
- `model` string, nullable — Filter to a single model
- `endpoint` string, nullable — Filter to a single endpoint (e.g. '/v1/chat/completions')
- `provider` string, nullable — Filter to a single provider (e.g. 'openai')
- `source` string, nullable — Filter to a single provenance source (e.g. 'gateway' or 'claude_code')
- `source_label` string, nullable — Filter to a single session/project label (the source_label carried by imported usage)
- `api_key_id` string, nullable — Filter to a single API key id
- `priced` boolean, nullable — Filter by pricing state: true = only rows with a cost, false = only unpriced rows (cost is null)
- `counts_toward_budget` boolean, nullable — Filter by budget participation: true = only enforced gateway rows, false = only imported rows that never touch a budget

## Response `200`

Successful Response

- unknown

## Other responses

- `422` — Validation Error

## Changes

- **2026-08-03** `99e3bf1e28d3` — 1 info
  - added the new optional `query` request parameter `status_code`
- **2026-08-03** `18e6c426d62c` — 2 info
  - added the new optional `query` request parameter `provider`
  - added the new optional `query` request parameter `source_label`
- **2026-07-24** `fa738a5ab2a5` — 2 info
  - added the new optional `query` request parameter `counts_toward_budget`
  - added the new optional `query` request parameter `priced`
- **2026-07-23** `2a163c690f59` — 2 info
  - added the new optional `query` request parameter `api_key_id`
  - added the new optional `query` request parameter `source`
- **2026-07-21** `b58ece3074c8` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/mozilla-ai/apis/otari/changes/v1/usage/summary.csv/get.md)

---

[API](https://skmtc.dev/mozilla-ai/apis/otari.md) · [All operations](https://skmtc.dev/mozilla-ai/apis/otari/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/mozilla-ai/otari/revisions/00866b0c5407/schema)
