Skip to Content
CheckoutAPI ReferenceSubscription CheckoutsCreate a subscription checkout

Create a subscription checkout

POST/subscription-checkouts

Create a single-use intent that authorizes a customer to start a recurring subscription. The merchant declares the per-cycle budget (required) and an optional per-charge cap. Returns a checkout_url — redirect the customer there to complete the subscribe and first-charge flow. No signed request is needed at creation; the customer's on-chain signature authorizes the subscription and first charge atomically.

Headers

HeaderDescriptionRequired
AuthorizationBearer token with your secret API keyyes

Request Body

FieldTypeRequiredDescription
supported_chainsstring[]
token_symbolstring
pricestringyes
price_currencyenum: ARS | BRL | USDFIAT pricing is not yet available. Supplying a fiat currency returns 422; price the subscription in a crypto token instead.
period_durationintegeryes
capstring
budgetstringyes
subscriberstring
external_customer_idstring
success_urlstring · uri
cancel_urlstring · uri
metadataobject
expires_atstring · date-time

Example Request

Request

const response = await fetch('https://checkout-api.exodus-int.com/subscription-checkouts', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer sk_live_xxxxxxxxxxxxxxxx',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "supported_chains": [
      "string"
    ],
    "token_symbol": "string",
    "price": "string",
    "price_currency": "ARS",
    "period_duration": 0,
    "cap": "string",
    "budget": "string",
    "subscriber": "string",
    "external_customer_id": "string",
    "success_url": "https://example.com",
    "cancel_url": "https://example.com",
    "metadata": {
      "key": null
    },
    "expires_at": "2024-01-15T12:30:00Z"
  }),
});

Responses

StatusDescription
201The created subscription checkout.
400Validation error
401Missing or invalid authentication

Response body

FieldTypeRequiredDescription
objectenum: subscription_checkoutyes
idstringyes
statusenum: pending | completed | expired | cancelledyes
onchain_idstringyes
business_namestringyes
subscriberstring | nullyes
external_customer_idstring | nullyes
subscription_optionsobject[]yes
pricestringyes
price_currencystring | nullyes
period_durationnumberyes
capstring | nullyes
budgetstringyes
checkout_urlstringyes
success_urlstring | nullyes
cancel_urlstring | nullyes
metadataobject | nullyes
expires_atstringyes
created_atstringyes
updated_atstringyes
completed_atstring | nullyes
cancelled_atstring | nullyes
expired_atstring | nullyes
cancellation_reasonstring | nullyes

subscription_options

FieldTypeRequiredDescription
chainstringyes
tokenstringyes
subscription_manager_addressstringyes
relayer_addressstringyes

Example Response

{
  "object": "subscription_checkout",
  "id": "schk_1234567890abcdef",
  "status": "completed",
  "onchain_id": "0x9f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a",
  "business_name": "Acme Inc",
  "subscriber": "0x742d35Cc6634C0532925a3b844Bc9e7595f8fE21",
  "external_customer_id": "cus_42",
  "subscription_options": [
    {
      "chain": "eip155:1",
      "token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
      "subscription_manager_address": "0xa1b2c3d4e5f6789012345678901234567890abcd",
      "relayer_address": "0x9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b"
    },
    {
      "chain": "eip155:137",
      "token": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
      "subscription_manager_address": "0xb2c3d4e5f67890123456789012345678901234cd",
      "relayer_address": "0x9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b"
    }
  ],
  "price": "9990000",
  "price_currency": null,
  "period_duration": 2592000,
  "cap": "120000000",
  "budget": "300000000",
  "checkout_url": "https://checkout.exodus-int.com/subscribe/schk_1234567890abcdef",
  "success_url": "https://merchant.com/subscribed",
  "cancel_url": "https://merchant.com/cancelled",
  "metadata": {
    "external_plan_ref": "pro_monthly"
  },
  "expires_at": "2026-05-19T12:05:00Z",
  "created_at": "2026-05-19T12:00:00Z",
  "updated_at": "2026-05-19T12:02:18Z",
  "completed_at": "2026-05-19T12:02:18Z",
  "cancelled_at": null,
  "expired_at": null,
  "cancellation_reason": null
}

Error Response

Error (e.g. 400)

{
  "error": {
    "type": "validation_error",
    "message": "amount must be a positive number",
    "param": "amount"
  }
}

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