Skip to content
Hardcount
Run it locally
Pre-1.0 · one maintainer · Stripe and cards only · no SDKs (client libraries) yet · no production users yet. Docs describe v0.9.1 (29 Oct 2026) · What’s new →

Export usage events as CSV

GET
/v1/exports/usage-events.csv
curl --request GET \
--url 'http://localhost:8080/v1/exports/usage-events.csv?from=example&to=example' \
--header 'Authorization: Bearer <token>'

Streams usage events whose timestamp falls in the window, newest first, from one consistent snapshot. from and to are both required and may span at most 366 days. customer_id, meter_id and dimensions narrow it like the event list. Columns: id, customer_id, meter_id, quantity, timestamp, idempotency_key, origin, dimensions_json, provider_cost_cents (US cents, a decimal), provider_cost_source.

Audit row, EXPORT_INCOMPLETE marker and formula escaping work as in the customers export.

from
required
string

Lower bound on the event timestamp, inclusive. RFC 3339 or YYYY-MM-DD.

to
required
string

Upper bound on the event timestamp, inclusive. RFC 3339 or YYYY-MM-DD (end of that day, UTC).

customer_id
string

Only this customer’s events.

meter_id
string

Only this meter’s events.

dimensions
string

Comma-separated key=value pairs, same syntax as GET /v1/usage-events.

CSV file (sent as an attachment).

Media typetext/csv
string

from or to is missing, or the window is longer than 366 days.

Media typeapplication/json
object
error
object
type

One of invalid_request_error, authentication_error, rate_limit_error or api_error. Every error the API answers has this shape, including an unknown path (404, code route_not_found) and a method the path does not take (405, code method_not_allowed, with an Allow header). The few exceptions are listed in docs/api-surface.md.

string
code
string
message
string
request_id
string
param

The request field the error is about. Sent only when the error names one. A request body may hold only the fields its operation lists, spelled and cased as listed: any other field, or one the server sets (such as id), is refused with 422 and param naming it. An operation with no request body lists no fields: send no body, {} or null. The Stripe and Postmark webhooks and the LiteLLM callback take their sender’s body as it comes.

string

Example

{
"error": {
"type": "invalid_request_error"
}
}

from or to is malformed, to is before from, or a dimensions pair is malformed.

Media typeapplication/json
object
error
object
type

One of invalid_request_error, authentication_error, rate_limit_error or api_error. Every error the API answers has this shape, including an unknown path (404, code route_not_found) and a method the path does not take (405, code method_not_allowed, with an Allow header). The few exceptions are listed in docs/api-surface.md.

string
code
string
message
string
request_id
string
param

The request field the error is about. Sent only when the error names one. A request body may hold only the fields its operation lists, spelled and cased as listed: any other field, or one the server sets (such as id), is refused with 422 and param naming it. An operation with no request body lists no fields: send no body, {} or null. The Stripe and Postmark webhooks and the LiteLLM callback take their sender’s body as it comes.

string

Example

{
"error": {
"type": "invalid_request_error"
}
}

The export’s audit row could not be written; nothing was sent.

Media typeapplication/json
object
error
object
type

One of invalid_request_error, authentication_error, rate_limit_error or api_error. Every error the API answers has this shape, including an unknown path (404, code route_not_found) and a method the path does not take (405, code method_not_allowed, with an Allow header). The few exceptions are listed in docs/api-surface.md.

string
code
string
message
string
request_id
string
param

The request field the error is about. Sent only when the error names one. A request body may hold only the fields its operation lists, spelled and cased as listed: any other field, or one the server sets (such as id), is refused with 422 and param naming it. An operation with no request body lists no fields: send no body, {} or null. The Stripe and Postmark webhooks and the LiteLLM callback take their sender’s body as it comes.

string

Example

{
"error": {
"type": "invalid_request_error"
}
}