Quote the next charge for a subscription
POST/subscriptions/{subscriptionId}/charge-quoteQuote the next charge for a subscription. Crypto-priced plans return the fixed amount; fiat-priced plans return a locked rate and a price_lock_code to submit with the charge.
Headers
| Header | Description | Required |
|---|---|---|
| Authorization | Bearer token with your secret API key | yes |
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| subscriptionId | string | yes |
Example Request
Request
const response = await fetch('https://checkout-api.exodus-int.com/subscriptions/<subscriptionId>/charge-quote', {
method: 'POST',
headers: {
Authorization: 'Bearer sk_live_xxxxxxxxxxxxxxxx',
},
});Responses
| Status | Description |
|---|---|
| 200 | The charge quote, including any locked rate. |
| 400 | Validation error |
| 401 | Missing or invalid authentication |
| 404 | Resource not found |
Response body
| Field | Type | Required | Description |
|---|---|---|---|
| object | enum: subscription_charge_quote | yes | |
| subscription_id | string | yes | |
| amount | string | yes | |
| price_lock_code | string | null | yes | |
| rate | string | null | yes | |
| expires_at | string | null | yes |
Example Response
{
"object": "subscription_charge_quote",
"subscription_id": "0x9f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a",
"amount": "9990000",
"price_lock_code": null,
"rate": null,
"expires_at": null
}Error Response
Error (e.g. 400)
{
"error": {
"type": "validation_error",
"message": "amount must be a positive number",
"param": "amount"
}
}Quote Semantics
No request body and no signature — this call moves no funds.
- Token-priced plans (
price_currency: null) echo the plan’spriceasamount, withprice_lock_code,rate, andexpires_atallnull. You can skip the quote entirely and signpricedirectly. - Fiat-priced plans (
price_currencyset) convert the fiatpriceto a settlement-tokenamountat the live rate and lock that rate: pass the returnedamountandprice_lock_codetoPOST /subscriptions/:id/chargebeforeexpires_at.
The subscription id is the on-chain bytes32 hex id — obtain it from GET /merchants/:merchantId/subscriptions, the subscription.created webhook, or the subscription_checkout.completed webhook.
The quote binds the price_lock_code to the exact amount it returned. Charging a different
amount under that lock is rejected with quote_amount_mismatch; charging after expires_at is
rejected with quote_expired — re-quote and re-sign.
Errors
| Status | Type | Description |
|---|---|---|
| 400 | invalid_request | Fiat-priced plan on a business without a fiat settlement configuration (“Charge quote is only available for fiat settlements”). |
| 404 | not_found | Subscription ID does not exist or belongs to another merchant. |
| 502 | invalid_request | The settlement provider failed to create the price lock. Retry. |
Token-priced plans never fail on settlement configuration — the quote is a passthrough of price.
