Export Subscription Charges
GET/reports/subscription-charges/exportDescription
Export your subscription charges — both succeeded and failed — as a CSV file for reconciliation and dunning analysis. Each row represents one charge attempt. Supports filtering by date range and charge status.
The response is a text/csv file download. The endpoint is available to both API key holders and dashboard sessions.
Headers
| Header | Description | Required |
|---|---|---|
| Authorization | Bearer token with your API key. Required for API key authentication; omit when using dashboard session cookies. | no |
Query Parameters
| Name | Type | Description | Required |
|---|---|---|---|
| to | string | End of date range, inclusive. Format: YYYY-MM-DD. Interpreted as end of day UTC. Filters by charge date. | yes |
| from | string | Start of date range, inclusive. Format: YYYY-MM-DD. Interpreted as start of day UTC. When omitted, no lower date bound is applied. When provided, the range cannot exceed 1 year. | no |
| status | string | Filter by charge status. Repeatable. Omit to include all statuses. Valid values: succeeded, failed. | no |
CSV Columns
| Column | Description |
|---|---|
| charge_id | Unique charge identifier |
| subscription_id | Associated subscription on-chain identifier |
| subscriber | Subscriber wallet address |
| charge_nonce | Monotonic charge sequence number within the subscription |
| amount | Charge amount in token base units |
| fee | Fee taken on the charge, in token base units |
| kind | Charge kind: cycle (scheduled billing) or adhoc (one-off) |
| status | Charge status: succeeded, failed |
| failure_reason | Reason the charge failed, if applicable |
| tx_hash | On-chain transaction hash |
| block_number | Block number the charge was mined in |
| charged_at | Charge timestamp (ISO 8601) |
Example Request
// Export failed charges from May 2026 for dunning analysis
const response = await fetch(
'https://checkout-api.exodus-int.com/reports/subscription-charges/export?from=2026-05-01&to=2026-05-31&status=failed',
{
headers: {
Authorization: 'Bearer sk_live_xxxxxxxxxxxxxxxx',
},
}
);
const csv = await response.text();// Export all charges with no date lower bound
const response = await fetch(
'https://checkout-api.exodus-int.com/reports/subscription-charges/export?to=2026-12-31',
{
headers: {
Authorization: 'Bearer sk_live_xxxxxxxxxxxxxxxx',
},
}
);Response
SUCCESSFUL RESPONSE (text/csv)
charge_id,subscription_id,subscriber,charge_nonce,amount,fee,kind,status,failure_reason,tx_hash,block_number,charged_at
subc_6789abcdef012345,0x9f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a,0x742d35Cc6634C0532925a3b844Bc9e7595f8fE21,3,9990000,0,cycle,succeeded,,0x8a9c67b2d1e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9,12346789,2026-05-19T12:02:18.000ZError Responses
MISSING REQUIRED PARAMETER
{
"error": {
"type": "validation_error",
"message": "to is required (format: YYYY-MM-DD)",
"param": "to"
}
}INVALID DATE FORMAT
{
"error": {
"type": "validation_error",
"message": "Invalid date format. Use YYYY-MM-DD",
"param": "from"
}
}INVALID DATE RANGE
{
"error": {
"type": "validation_error",
"message": "from must be before to",
"param": "from"
}
}DATE RANGE EXCEEDS 1 YEAR
{
"error": {
"type": "validation_error",
"message": "Date range cannot exceed 1 year. For larger exports, contact support.",
"param": "to"
}
}UNAUTHENTICATED
{
"error": {
"type": "authentication_error",
"message": "Authentication required"
}
}