Skip to Content
CheckoutAPI ReferenceOverview

API Reference

Complete reference documentation for the Checkout API.

Base URL

All API requests should be made to:

https://checkout-api.exodus-int.com

Authentication

All API requests require authentication using your API key in the Authorization header.

headers: {
  'Authorization': 'Bearer sk_live_xxxxxxxxxxxxxxxx'
}
🔐

See the Authorization guide for complete details.

Pagination

The checkout, payment, subscription, subscription charge, subscription checkout, and webhook event list endpoints are cursor-paginated and take the same three parameters. Lists are returned newest first, and the order is not configurable. Endpoints that return a fixed set of configuration rows, such as GET /payments/settlement, are not paginated, and the payouts endpoints document their parameters on their individual pages.

ParameterDescription
limitRows per page. Each endpoint page documents the range and default.
starting_afterAn object id from a previous page. Returns the rows after it.
ending_beforeAn object id from a previous page. Returns the rows before it.

Each response carries object: "list", the rows in data, and a has_more boolean.

{
  "object": "list",
  "data": [{ "id": "chk_1234567890abcdef" }],
  "has_more": true
}

Omit both cursors to get the first page. To walk forward, take the last id of a page and pass it as starting_after. To walk back, take the first id and pass it as ending_before.

starting_after and ending_before are mutually exclusive. Sending both is a 400, since the two ask for opposite directions from different anchors and there is no sensible page to return:

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

has_more is relative to the direction you are paging, not always forward. On a starting_after page it means more rows exist after the returned set; on an ending_before page it means more rows exist before it. This differs from Stripe, where has_more is always forward-looking, so a client written against that definition will read it backwards on backward pages. It lets you gate a Previous control off the same field you use for Next, but it never reports the opposite direction, so track that yourself from whether you arrived via a cursor.

Endpoints

Checkouts

Create and manage one-time payment sessions.

EndpointDescription
POST /checkoutsCreate a checkout
GET /checkouts/:idGet checkout details
GET /checkoutsList all checkouts
POST /checkouts/:id/cancelCancel a checkout

Subscription Checkouts

Single-use intents that authorize a customer to start a subscription. Customer pays the first charge and signs the on-chain authorization atomically; the resulting Subscription is the durable billing record.

EndpointDescription
POST /subscription-checkoutsCreate a subscription checkout
GET /subscription-checkouts/:idGet subscription checkout details
GET /subscription-checkoutsList all subscription checkouts
PATCH /subscription-checkouts/:id/cancelCancel a subscription checkout

Subscriptions

Manage active subscriptions. Subscriptions are created when a customer completes a Subscription Checkout. There is no direct POST /subscriptions endpoint. Each charge is authorized with the @exodus/checkout-signer SDK; cap/budget raises are subscriber-authorized on-chain.

EndpointDescription
GET /subscriptions/:idGet subscription details
GET /merchants/:merchantId/subscriptionsList all subscriptions
POST /subscriptions/:id/chargeCharge a cycle
POST /subscriptions/:id/charge-quoteQuote the next charge
POST /subscriptions/:id/cancelCancel a subscription

Subscription Charges

Per-attempt records of cycle charges. Both succeeded and failed attempts are persisted with a typed failure_reason for dunning and reconciliation.

EndpointDescription
GET /merchants/:merchantId/chargesList subscription charges

Payments

View payment details, capture and refund two-step payments, and recover stranded funds.

EndpointDescription
GET /payments/:paymentIdGet payment details
GET /paymentsList all payments
POST /payments/:paymentId/captureCapture a payment
POST /payments/:paymentId/refundRefund a payment
POST /payments/:paymentId/rescueRescue funds
POST /payments/:paymentId/recoverRecover an expired payment
GET /payments/settlementView settlement config
PUT /payments/settlementUpdate settlement address

Payouts (Beta)

Off-ramp crypto to a beneficiary’s bank account in fiat. See the Payouts overview.

Beneficiaries — bank accounts that receive fiat.

EndpointDescription
POST /beneficiariesCreate a beneficiary
GET /beneficiaries/:idGet a beneficiary
GET /beneficiariesList beneficiaries

Customers — people who send crypto, after a one-time KYC.

EndpointDescription
POST /customersCreate a customer
GET /customers/:idGet a customer
GET /customersList customers

Payouts — off-ramp transactions that move the funds.

EndpointDescription
POST /payoutsCreate a payout
GET /payouts/:idGet a payout
GET /payoutsList payouts

Reports

Export data as CSV for accounting and reconciliation.

EndpointDescription
GET /reports/payments/exportExport payments as CSV
GET /reports/subscriptions/exportExport subscriptions as CSV
GET /reports/subscription-charges/exportExport subscription charges as CSV

Settings

Read your business configuration and register the signer, settlement address, and webhook URL.

EndpointDescription
GET /settingsGet settings
POST /settingsRegister the merchant signer
PUT /settingsUpdate the settlement address
PATCH /settingsUpdate the webhook URL
POST /settings/webhook/secretRegenerate the webhook secret
POST /settings/webhook/testSend a test webhook

Webhooks

Receive real-time event notifications.

EndpointDescription
GET /merchants/:merchantId/webhook-eventsList webhook events
🔔

See the Webhooks guide for event types, payload structure, and signature verification.

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