---
title: "Export usage data for billing"
method: GET
path: "/usage/export"
tags: ["Usage"]
---

# Export usage data for billing

`GET /usage/export`

Export usage data for all tenants in a format suitable for billing systems.

**Use cases:**
- Import into billing systems (Stripe, Chargebee, etc.)
- Generate invoices
- Archive usage data

**Export formats:**
- `csv` - Comma-separated values (default)
- `jsonl` - JSON Lines (one JSON object per line)
- `json` - JSON array

**Response headers:**
- `X-Total-Tenants` - Total number of tenants in export
- `X-Total-Sent` - Total emails sent across all tenants
- `Content-Disposition` - Suggested filename for download

This endpoint returns up to 10,000 tenants per request. For organizations
with more tenants, use the `/usage/by-tenant` endpoint with pagination.

## Query parameters

- `period` string
- `format` 'csv' | 'jsonl' | 'json'
- `status` 'active' | 'suspended' | 'archived'
- `min_sent` integer
- `timezone` string

## Response `200`

Usage export data

- TenantUsageExportRow[]
  - `tenant_id` string, required — Unique tenant identifier
  - `tenant_name` string, required — Tenant display name
  - `external_id` string, nullable — Your external ID for this tenant
  - `status` 'active' | 'suspended' | 'archived', required — Current tenant status
  - `sent` integer, required — Total emails sent
  - `delivered` integer, required — Emails successfully delivered
  - `soft_failed` integer, required — Emails that soft-failed
  - `hard_failed` integer, required — Emails that hard-failed
  - `bounced` integer, required — Emails that bounced
  - `held` integer, required — Emails currently held
  - `delivery_rate` number, float, required — Delivery rate (0-1)
  - `bounce_rate` number, float, required — Bounce rate (0-1)

## Other responses

- `400` — Invalid request parameters
- `401` — Invalid or missing API key
- `429` — Rate limit exceeded
- `500` — Internal server error

## Changes

- **2026-02-04** `4f8eeb0b9933` — 184 warning
  - added the new `already_exists` enum value to the `error/code` response property for the response status `400`
  - added the new `already_exists` enum value to the `error/code` response property for the response status `401`
  - added the new `already_exists` enum value to the `error/code` response property for the response status `429`
  - added the new `already_exists` enum value to the `error/code` response property for the response status `500`
  - …180 more
- **2026-02-03** `80a061ee3002` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/arkhq-io/apis/ark-email-api/changes/usage/export/get.md)

---

[API](https://skmtc.dev/arkhq-io/apis/ark-email-api.md) · [All operations](https://skmtc.dev/arkhq-io/apis/ark-email-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/arkhq-io/ark-email-api/revisions/4f8eeb0b9933/schema)
