---
title: "List metered usage events (the A2 usage ledger)"
method: GET
path: "/v1/usage"
tags: ["billing"]
---

# List metered usage events (the A2 usage ledger)

`GET /v1/usage`

## Request

- Base URL: `https://api.cueframe.ai`
- URL: `https://api.cueframe.ai/v1/usage`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.cueframe.ai/api/auth/mcp/authorize`, token URL `https://api.cueframe.ai/api/auth/mcp/token`, scopes: `billing:read`)
  - API key in header `PAYMENT-SIGNATURE`

Every metered billing event, newest-first, with attribution: featureId, amount, the project/job that produced it, and the event's LIST price in USD (the invoice may zero it inside a plan allowance). Filter by projectId, jobId, and/or a [from, to) epoch-ms period. Events appear moments after the job's success terminal (the meter is scheduler-dispatched).

## Query parameters

- `limit` integer
- `after` string
- `projectId` string
- `jobId` string
- `from` integer
- `to` integer

## Response `200`

Paginated usage events.

- UsageListResponse
  - `data` UsageEventResponse[], required
    - `featureId` string, required: The metered plan feature (exports, compose, compose_verify, …).
    - `value` number: Metered amount, in the feature's own unit (exports = render-minutes, storage = GB). Absent for a discrete single use, AND deliberately absent on the cost-plus lines (compose, generate, ai_tokens, compose_verify) whose internal metered unit is not a quantity — read `listUsd` for what those events cost you.
    - `projectId` string
    - `jobId` string: The job that produced the meter: a render/compose/preview job id, a media id (transcription, generate), or a clip-suggestion run id (jobKind `suggestions` — see `mediaItemId` for the media it analyzed).
    - `jobKind` string: render | compose | consult_* | verify | preview | generate | suggestions | session_uptime | …
    - `mediaItemId` string: The media item the job ran over, when it ran over one (suggestions, transcription). Resolve it with GET /v1/media/{id}.
    - `listUsd` number: LIST price of this metered event, USD. Honest naming: the invoice may zero it inside a plan allowance — this is the event's list price, not a Stripe line item.
    - `createdAt` number, required: Epoch-ms when the meter landed.
  - `pagination` PaginationMeta, required: Cursor pagination metadata.
    - `hasMore` boolean, required
    - `nextCursor` string, nullable, required
    - `prevCursor` string, nullable, required

## Other responses

- `400`: Bad request — validation_error / invalid_cursor / invalid_query.
- `401`: Missing or invalid Authorization header.
- `402`: Payment required. Returned when the caller presents no API key on a priced operation: the body AND the `Payment-Required` header carry the x402 v2 challenge (accepted scheme, network, USDC asset, amount, payTo). Sign the EIP-3009 authorization and retry with a `PAYMENT-SIGNATURE` header. A KEYED caller sees this status instead when their plan lacks or has exhausted the feature (`billing_required`).
- `403`: Forbidden — permission insufficient.
- `429`: Rate limited. Retry-After header present.
- `500`: Internal error.

---

[API](https://skmtc.dev/cueframe/apis/cueframe-api.md) · [All operations](https://skmtc.dev/cueframe/apis/cueframe-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cueframe/apis/cueframe-api/revisions/8f9bfe362b4a?raw)
