Skip to main content
POST
Quote a purchase
Moves no money and commits you to nothing. It exists so the figure you show a customer is the figure that leaves their account.

USD accounts need no quote

When the account is already USD, payable is simply price plus fee, and fxQuoteId, rate and expiresAt are all null. You may buy without quoting at all.

Any other currency does

The catalog is USD; the account is not. The quote holds a rate for about two minutes and returns an fxQuoteId. Send that id when you buy — without it the purchase is refused.
A quote is bound to one account, one plan, and one price. It cannot be re-pointed at a different account, and it can back exactly one order.

Error codes

Authorizations

Authorization
string
header
required

A secret API key, sent as Authorization: Bearer sk_test_… in sandbox or Bearer sk_live_… in live.

Body

application/json

Provide exactly one of packageSlug or packageId.

debitAccountId
string
required

Any active, debitable account you own, in any currency.

Required string length: 26
Pattern: ^[0-7][0-9A-HJKMNP-TV-Z]{25}$
Example:

"01K2Z3AB4C5D6E7F8G9HJKMNPQ"

packageSlug
string
Maximum string length: 200
packageId
string

A 26-character ULID.

Required string length: 26
Pattern: ^[0-7][0-9A-HJKMNP-TV-Z]{25}$
Example:

"01K2Z3AB4C5D6E7F8G9HJKMNPQ"

quantity
integer
default:1
Required range: 1 <= x <= 10

Response

Successful response.

package
object
required
quantity
integer
required
Required range: x >= 1
price
object
required
fee
object
required
payable
object
required
rate
string | null
required

Units of the paying currency per USD. Null when the account is already USD.

fxQuoteId
string | null
required

Send this when buying. Null when no conversion is needed.

Required string length: 26
Pattern: ^[0-7][0-9A-HJKMNP-TV-Z]{25}$
Example:

"01K2Z3AB4C5D6E7F8G9HJKMNPQ"

expiresAt
string<date-time> | null
required
Example:

"2026-08-14T09:00:00.000Z"