Skip to Content
CheckoutAPI ReferenceReportsExport Subscription Charges

Export Subscription Charges

GET/reports/subscription-charges/export

Description

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

HeaderDescriptionRequired
AuthorizationBearer token with your API key. Required for API key authentication; omit when using dashboard session cookies.no

Query Parameters

NameTypeDescriptionRequired
tostringEnd of date range, inclusive. Format: YYYY-MM-DD. Interpreted as end of day UTC. Filters by charge date.yes
fromstringStart 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
statusstringFilter by charge status. Repeatable. Omit to include all statuses. Valid values: succeeded, failed.no

CSV Columns

ColumnDescription
charge_idUnique charge identifier
subscription_idAssociated subscription on-chain identifier
subscriberSubscriber wallet address
charge_nonceMonotonic charge sequence number within the subscription
amountCharge amount in token base units
feeFee taken on the charge, in token base units
kindCharge kind: cycle (scheduled billing) or adhoc (one-off)
statusCharge status: succeeded, failed
failure_reasonReason the charge failed, if applicable
tx_hashOn-chain transaction hash
block_numberBlock number the charge was mined in
charged_atCharge 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.000Z

Error 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"
  }
}

Start building

XO

Request Demo

Schedule a call with our team

Select a product
Arrow right

Start building
Grateful

Contact Us

We're here to help