Currencies are store configuration, not catalog data. Reads use read_currencies; writes use write_currencies and go through the same storefront-service validation as the admin — the gateway only checks scope and resolves the store from the token.
Three facts shape every call. The base currency is fixed when the store is created: it cannot be created, edited, disabled, or deleted through any API, and every price the API returns is denominated in it unless a market currency applies. Multi-currency is a plan capability resolved server-side — a request cannot claim it. And rates are decimal strings: send conversion_rate exactly as typed ("0.0105"), never as a float, or precision is lost.
In automatic-rate mode the platform manages rates from the market table and manual adds, rate edits, and deletes are rejected; in manual mode you own each rate and the market rate is only a reference. Bulk currency operations are intentionally admin-only and absent here.
Endpoints#
List currencies
List the store's currencies with their settings.
Returns every currency the store has configured — the base plus any added — each with its conversion rate, rounding mode, and enabled state, alongside the store-level currency settings: whether multi-currency is enabled and allowed by the plan, whether rates are automatic, the available rounding modes, and the per-store currency cap.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
Enabled currencies
The lean priceable set: currencies a shopper can actually pay in.
Returns only the enabled currencies with the fields needed to display prices — code, name, symbol, decimals, conversion rate, rounding mode — with the base flagged. This is the endpoint to build a storefront currency selector from; it deliberately carries no settings or plan metadata.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
Base currency
Fetch the store's base currency.
A single indexed read for the currency every price in the API is denominated in (unless a market currency applies). The base is fixed when the store is created and never changes.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
All exchange rates
Current market rates for every supported currency, relative to the store's base.
Returns the full market rate table computed against the store's base currency. Each entry carries the rate in both directions as decimal strings — rate is how much base one unit of the currency buys, rate_inverse is how many units one base unit buys — plus the table's last update time.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
One exchange rate
Current market rate for one currency code.
Returns the market rate for a single ISO currency code relative to the store's base, in both directions, with its last update time. Useful when suggesting a rate while a merchant sets a manual one.
Path parameters
| Name | Type | Description |
|---|---|---|
code
required
|
string |
ISO 4217 currency code. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
-
400BILLING_EXCHANGE_RATE_UNAVAILABLENo market rate exists for this currency code.
Get a currency
Fetch one store currency by id.
Returns the currency if it belongs to the token's store, with its conversion rate, rounding mode, and enabled state.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
string |
Store currency id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
-
404CURRENCY_NOT_FOUNDCurrency does not exist in this store.
Add a currency
Add a currency to the store with a manual conversion rate.
Adds a non-base currency. conversion_rate is a positive decimal string meaning 1 <base> = rate <code> — send the exact string, never a float. Fails when multi-currency is off or not in the plan, when automatic rates are on (rates are market-managed then), at the per-store currency cap, or for an unknown/duplicate code. is_base is never accepted.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
code
required
|
string |
ISO 4217 currency code to add. |
conversion_rate
required
|
string |
Positive decimal string: 1 base = rate code. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
-
400CURRENCY_INVALID_CODENot a supported ISO 4217 currency code.
-
400CURRENCY_ALREADY_EXISTSThe store already has this currency.
-
400CURRENCY_LIMIT_REACHEDPer-store currency cap has been reached.
-
400CURRENCY_CONVERSION_RATE_POSITIVEconversion_rate must be a positive decimal.
-
400CURRENCY_CONVERSION_RATE_TOO_PRECISEconversion_rate exceeds the allowed decimal precision.
-
400CURRENCY_AUTO_MODE_ADD_FORBIDDENCurrencies cannot be added manually while automatic rates are on.
-
400CURRENCY_PLAN_UNSUPPORTEDThe store's plan does not include multi-currency.
-
400CURRENCY_MULTI_CURRENCY_DISABLEDMulti-currency is turned off for this store.
Update a currency
Change a currency's rate, enabled state, and rounding mode.
Updates a non-base currency. The base currency is immutable and requests against it are rejected. In automatic-rate mode the rate is market-managed and manual rate changes are rejected.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
string |
Store currency id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
conversion_rate
required
|
string |
Positive decimal string: 1 base = rate code. |
is_enabled
required
|
boolean |
Whether shoppers can use this currency. |
rounding_mode
required
|
string |
One of the store's rounding modes (see currencies.list). |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
-
404CURRENCY_NOT_FOUNDCurrency does not exist in this store.
-
400CURRENCY_BASE_EDIT_FORBIDDENThe base currency cannot be edited.
-
400CURRENCY_CONVERSION_RATE_POSITIVEconversion_rate must be a positive decimal.
-
400CURRENCY_INVALID_ROUNDING_MODErounding_mode is not one of the store's rounding modes.
-
400CURRENCY_AUTO_MODE_RATE_FORBIDDENRates are market-managed while automatic rates are on.
Remove a currency
Remove a non-base currency from the store.
Deletes the currency. The base currency cannot be deleted, and a currency still referenced by a market must be removed from that market first.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
string |
Store currency id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
-
404CURRENCY_NOT_FOUNDCurrency does not exist in this store.
-
400CURRENCY_BASE_DELETE_FORBIDDENThe base currency cannot be deleted.
-
400CURRENCY_MARKET_USAGE_IN_USEThe currency is used by a market; remove it from the market first.
-
400CURRENCY_AUTO_MODE_DELETE_FORBIDDENCurrencies cannot be deleted manually while automatic rates are on.
Set rounding mode
Set the price rounding rule for one currency.
Sets how converted prices are tidied for this currency. The base currency never rounds — it is the source of truth — so requests against it are rejected.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
string |
Store currency id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
rounding_mode
required
|
string |
One of the store's rounding modes (see currencies.list). |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
-
404CURRENCY_NOT_FOUNDCurrency does not exist in this store.
-
400CURRENCY_INVALID_ROUNDING_MODErounding_mode is not one of the store's rounding modes.
-
400CURRENCY_BASE_ROUNDING_FORBIDDENThe base currency never rounds.
Toggle multi-currency
Turn selling in additional currencies on or off.
Enables or disables multi-currency for the store. The plan capability is resolved server-side — a plan without multi-currency cannot enable it regardless of the request.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
enabled
required
|
boolean |
Whether multi-currency selling is on. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
-
400CURRENCY_PLAN_UNSUPPORTEDThe store's plan does not include multi-currency.
Toggle automatic rates
Switch between market-managed and manual exchange rates.
Turning automatic rates ON requires no manually-added currencies to exist. Turning them OFF snapshots the current market rates onto each enabled currency, which you then own as manual rates.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
enabled
required
|
boolean |
Whether exchange rates follow the market automatically. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
403STORE_ADMIN_TOKEN_RUNTIME_FORBIDDENToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDToken's per-window quota exceeded. Retry after the Retry-After header.
-
400CURRENCY_AUTO_ENABLE_BLOCKEDRemove manually-added currencies before enabling automatic rates.
-
400CURRENCY_AUTO_RATES_NOT_ENABLEDAutomatic rates require multi-currency to be on.