Skip to Content
CheckoutAPI ReferenceSubscriptionsList a merchant's subscription charges

List a merchant's subscription charges

GET/merchants/{merchantId}/charges

List a merchant's subscription charges — both succeeded and failed — in descending ingestion order. Use for health dashboards, dunning workflows (filter status=failed), and reconciliation. Filter by subscription, subscriber, status, chain, and date range.

Headers

HeaderDescriptionRequired
AuthorizationBearer token with your secret API keyyes

Path Parameters

NameTypeRequiredDescription
merchantIdstringyes

Query Parameters

NameTypeRequiredDescription
limitintegerRows per page, 1 to 100. Defaults to 50. Values outside the range are rejected rather than clamped.
starting_afterstringCursor for forward pagination: an object id from a previous page. Returns results after it. Mutually exclusive with ending_before; sending both is a 400.
ending_beforestringCursor for backward pagination: an object id from a previous page. Returns results before it. Mutually exclusive with starting_after; sending both is a 400.
subscriberstring
subscription_idstring
external_customer_idstring
chainstring
fromstring · date-time
tostring · date-time
statusenum: succeeded | failed

Example Request

Request

const response = await fetch('https://checkout-api.exodus-int.com/merchants/<merchantId>/charges?limit=50&starting_after=<starting_after>&ending_before=<ending_before>&subscriber=<subscriber>&subscription_id=<subscription_id>&external_customer_id=<external_customer_id>&chain=<chain>&from=<from>&to=<to>&status=succeeded', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer sk_live_xxxxxxxxxxxxxxxx',
  },
});

Responses

StatusDescription
200A paginated list of subscription charges.
400Validation error
401Missing or invalid authentication
403API key lacks the required scope

Response body

FieldTypeRequiredDescription
objectenum: listyes
dataobject[]yes
has_morebooleanyes

data

FieldTypeRequiredDescription
objectenum: subscription_chargeyes
idstringyes
subscription_idstringyes
subscriberstringyes
amountstringyes
feestringyes
tx_hashstring | nullyes
chainstringyes
token_symbolstring | nullyes
token_decimalsnumber | nullyes
charge_noncenumberyes
charged_atstringyes
statusenum: succeeded | failedyes
failure_reasonstring | nullyes
block_numberstringyes
metadataobject | nullyes
created_atstringyes

Example Response

{
  "object": "list",
  "data": [
    {
      "object": "subscription_charge",
      "id": "subc_6789abcdef012345",
      "subscription_id": "0x9f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a",
      "subscriber": "0x742d35Cc6634C0532925a3b844Bc9e7595f8fE21",
      "token_symbol": "USDC",
      "token_decimals": 6,
      "amount": "9990000",
      "fee": "0",
      "tx_hash": "0x8a9c67b2d1e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9",
      "chain": "eip155:1",
      "charge_nonce": 3,
      "charged_at": "2026-05-19T12:02:18Z",
      "status": "succeeded",
      "failure_reason": null,
      "block_number": "12346789",
      "metadata": {
        "invoice_id": "inv_202605"
      },
      "created_at": "2026-05-19T12:02:18Z"
    }
  ],
  "has_more": false
}

Error Response

Error (e.g. 400)

{
  "error": {
    "type": "validation_error",
    "message": "starting_after and ending_before are mutually exclusive",
    "param": "ending_before"
  }
}

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