Currencies are store configuration, not catalog data. Reads use read_currencies; writes use write_currencies.
The base currency is set when the store is created and cannot be created, edited, disabled, or deleted through the Store API. Prices use the base currency unless a market currency applies. Multi-currency is available only when the store's plan includes it; the Store API cannot override that plan restriction. Conversion rates are decimal strings: send conversion_rate as a JSON string, for example "0.0105", to avoid binary floating-point conversion. Manual rates allow up to max_conversion_decimals decimal places (currently ten) after insignificant trailing zeros are removed, and a maximum value of max_conversion_rate (currently 999999); read both from List currencies instead of hardcoding them. Equivalent input formatting, such as trailing zeros, is not retained.
With automatic rates, Tringify supplies the current market rate. Manual adds, rate edits, and deletes are rejected; selecting additional automatic-rate currencies remains a Store Admin workflow. With manual rates, the store controls each saved rate and the market rate is reference data. Bulk data cleanup is available in Store Admin, the Tringify mobile app, the MCP connector, and the Store API; other bulk currency changes remain Store Admin operations.
Removing a currency is blocked while live prices or settings still use it. Use Remove currency data for one currency, or Remove data for multiple currencies for a batch, capped by bulk_max from List currencies, that is cleaned up all at once. Both use a two-step confirmation flow. The cleanup covers 17 kinds of references across product and variant prices, shipping, sales-channel product feeds, quantity tiers, markets, checkout, fees, cash on delivery, discounts, and duties. It never changes historical carts, orders, payments, gift cards, ledgers, invoices, or settlements.
Endpoints#
List currencies
List the store's currencies with their settings.
Returns the store's complete currency set, including the base currency and any added currencies. Each currency includes its conversion rate, rate_source, rounding mode, the rounding modes it can use, enabled state, and timestamps. The base currency keeps its original prices and cannot be rounded, so its rounding_modes is always empty. conversion_rate is the rate prices use right now: in manual mode it is the merchant's stored rate (rate_source: "manual"); in automatic-rate mode it is the live market cross-rate from the current exchange-rate snapshot (rate_source: "automatic"), and when no current snapshot exists it is the stored placeholder with rate_source: "automatic_unavailable"—prices in that currency cannot be charged until rates refresh. Exchange rates always use . as the decimal separator. Use All exchange rates for the live market table. Live rate refreshes do not fire currencies/update; re-read currencies when you need the current automatic rate. The response also shows whether multi-currency is enabled and available on the store's plan, whether rates are automatic, every rounding mode the platform supports, and the store's currency limits. The top-level rounding_modes includes nearest_99, nearest_95 and nearest_50, which zero-decimal currencies such as JPY reject; offer each currency its own rounding_modes instead. Use max_conversion_decimals and max_conversion_rate to validate manual rates. bulk_max caps currency batches, including the bulk data-removal endpoint.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
Enabled currencies
Currencies enabled at the store level for pricing and market assignment.
Returns only the enabled currencies with their ids, display fields, conversion rate and rate_source, rounding configuration, timestamps, and the store's multi-currency enabled state. conversion_rate is the rate prices use right now: in manual mode it is the merchant's stored rate (rate_source: "manual"); in automatic-rate mode it is the live market cross-rate from the current exchange-rate snapshot (rate_source: "automatic"), and when no current snapshot exists it is the stored placeholder with rate_source: "automatic_unavailable"—prices in that currency cannot be charged until rates refresh. Exchange rates always use . as the decimal separator. Use All exchange rates for the live market table. Live rate refreshes do not fire currencies/update; re-read currencies when you need the current automatic rate. Market assignment still determines which currencies a shopper may use. Use the resolved active market—not this store-wide list alone—to build a shopper-facing currency selector.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
Base currency
Fetch the store's base currency.
Returns the store's base currency. Every price the API returns is in this currency unless a market currency applies. The base is set 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.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
All exchange rates
Current market rates for supported currencies, relative to the store's base.
Returns current market rates for supported currencies relative to the store's base currency. Each entry carries base_currency and the rate in both directions as decimal strings: rate is how much base one unit of the currency buys, while rate_inverse is how many units one base unit buys. Both are rounded to six significant digits (at most ten decimal places), so they may not multiply to exactly one. updated_at is an RFC 3339 UTC timestamp for the complete rate snapshot. The request fails when the latest snapshot is unavailable or stale. The store's base currency is not included in rates.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
404BILLING_EXCHANGE_RATE_UNAVAILABLEThe current market-rate snapshot is unavailable or stale.
-
404BILLING_BASE_RATE_UNAVAILABLEThe store's base currency market rate is not available.
-
404BILLING_EXCHANGE_RATE_ZEROA market rate is zero or unavailable.
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. updated_at is the complete snapshot's RFC 3339 UTC timestamp. The request fails when the latest snapshot is unavailable or stale. 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.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
404BILLING_CURRENCY_INVALIDThe currency code is not a supported ISO 4217 currency code.
-
404BILLING_EXCHANGE_RATE_UNAVAILABLEThe current market-rate snapshot is unavailable or stale, or no rate exists for this currency code.
-
404BILLING_EXCHANGE_RATE_ZEROThe market rate for this currency is zero or unavailable.
Get a currency
Fetch one store currency by id.
Returns the currency if it belongs to the token's store, with its conversion rate and rate_source, rounding mode, the rounding modes it can use (empty for the base currency), and enabled state. In automatic-rate mode conversion_rate is the live market rate.
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.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. 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 expressing how many units of the added currency equal one unit of the store's base currency—for example, "0.0105" means 1 INR = 0.0105 USD. Send it as a JSON string to avoid binary floating-point conversion. Manual rate values allow up to max_conversion_decimals decimal places (currently ten) after insignificant trailing zeros are removed, and a maximum value of max_conversion_rate (currently 999999); read both from List currencies instead of hardcoding those limits. Equivalent formatting such as trailing zeros is not preserved. The call fails when multi-currency is off or unavailable on the plan, automatic rates are on, the store has reached its currency limit, or the code is unknown or already configured. is_base is not 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: one base-currency unit equals this many units of the added currency. Apply the limits returned by List currencies. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400INVALID_INPUTA required field is missing, null, or unsupported.
-
400CURRENCY_INVALID_CODENot a supported ISO 4217 currency code.
-
409CURRENCY_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_HIGHConversion_rate exceeds the allowed maximum.
-
400CURRENCY_CONVERSION_RATE_TOO_PRECISEConversion_rate exceeds the allowed decimal precision.
-
403CURRENCY_AUTO_MODE_ADD_FORBIDDENCurrencies cannot be added manually while automatic rates are on.
-
403CURRENCY_PLAN_UNSUPPORTEDThe store's plan does not include multi-currency.
-
403CURRENCY_MULTI_CURRENCY_DISABLEDMulti-currency is turned off for this store.
Update a currency
Update a currency's rate, enabled state, or rounding mode.
Updates a non-base currency. Supply at least one field; omitted fields keep their current values, and a request with none is rejected with CURRENCY_BULK_FIELDS_REQUIRED. The base currency is immutable and requests against it are rejected. In automatic-rate mode the rate and enabled state are market-managed: changing either is rejected, while a rounding-only change is accepted and values equal to the current ones are not changes. The rounding mode must be one of the currency's own rounding_modes; a zero-decimal currency rejects nearest_99, nearest_95 and nearest_50 with CURRENCY_ROUNDING_MODE_UNAVAILABLE. Disabling a currency is rejected while a market still uses it. It is also rejected with CURRENCY_DISABLE_GIFT_CARD_BALANCES while active or scheduled, unexpired Gift Cards still hold a balance in it; details carries code, active_gift_cards and outstanding_balance. A request that changes nothing returns the currency without code or message and records no audit entry or webhook.
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
|
string |
Positive decimal string: one base-currency unit equals this many units of this currency. Apply the limits returned by List currencies. Omit to keep the current rate. |
is_enabled
|
boolean |
Whether the currency is enabled at the store level. Market assignment still determines shopper availability. Omit to keep the current state. |
rounding_mode
|
string |
One of the values returned in |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400INVALID_INPUTA required field is missing, null, or unsupported.
-
404CURRENCY_NOT_FOUNDCurrency does not exist in this store.
-
400CURRENCY_BASE_EDIT_FORBIDDENThe base currency cannot be edited.
-
400CURRENCY_ROUNDING_MODE_REQUIREDRounding_mode is required.
-
400CURRENCY_INVALID_ROUNDING_MODERounding_mode is not one of the store's rounding modes.
-
400CURRENCY_CONVERSION_RATE_POSITIVEConversion_rate must be a positive decimal.
-
400CURRENCY_CONVERSION_RATE_TOO_HIGHConversion_rate exceeds the allowed maximum.
-
400CURRENCY_CONVERSION_RATE_TOO_PRECISEConversion_rate exceeds the allowed decimal precision.
-
403CURRENCY_PLAN_UNSUPPORTEDThe store's plan does not include multi-currency.
-
403CURRENCY_MULTI_CURRENCY_DISABLEDMulti-currency is turned off for this store.
-
403CURRENCY_AUTO_MODE_RATE_FORBIDDENRates are market-managed while automatic rates are on.
-
409CURRENCY_MARKET_USAGE_IN_USEThe currency is used by a market; remove it from that market before disabling it.
-
409CURRENCY_DISABLE_GIFT_CARD_BALANCESActive Gift Cards still hold a balance in the currency. details.active_gift_cards and details.outstanding_balance give the card count and total; the cards must be spent, expire or be cancelled before the currency can be disabled.
-
400CURRENCY_BULK_FIELDS_REQUIREDSupply at least one of conversion_rate, is_enabled or rounding_mode.
-
400CURRENCY_ROUNDING_MODE_UNAVAILABLEThe currency has no decimal places, so its prices cannot end in .50, .95 or .99.
Remove a currency
Remove a non-base currency from the store.
Deletes the currency in manual-rate mode. Removal is blocked while any live mutable reference remains, and while an active Gift Card still holds a balance in this currency. The error (CURRENCY_IN_USE, or CURRENCY_GIFT_CARDS_IN_USE when Gift Card balances are the only blocker) returns six summary groups (gift_cards among them), the exact count for each of the 17 reference types, and active_gift_cards. Use Remove Currency Data to clear the mutable references first; it never touches Gift Card balances, which must be spent, cancelled or expire. Historical carts, orders, payments, spent or closed gift cards, ledgers, invoices, and settlements are retained and do not block removal.
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.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
404CURRENCY_NOT_FOUNDCurrency does not exist in this store.
-
403CURRENCY_BASE_DELETE_FORBIDDENThe base currency cannot be deleted.
-
403CURRENCY_AUTO_MODE_DELETE_FORBIDDENCurrencies cannot be deleted while automatic rates are on.
-
403CURRENCY_PLAN_UNSUPPORTEDThe store's plan does not include multi-currency.
-
403CURRENCY_MULTI_CURRENCY_DISABLEDMulti-currency is turned off for this store.
-
409CURRENCY_IN_USELive mutable references remain, with or without active Gift Card balances. details.usage contains six summary groups, details.counts contains all 17 exact reference counts, and details.active_gift_cards counts active Gift Cards with a balance in this currency.
-
409CURRENCY_GIFT_CARDS_IN_USEOnly active Gift Card balances block removal. The details match CURRENCY_IN_USE; balances must be spent, cancelled or expire first.
Remove data for multiple currencies
Preview and atomically clear live data for selected non-base currencies.
Send a non-empty list of unique currency UUIDs in ids, capped by bulk_max from List currencies. Every ID must belong to this store. The base currency and automatic exchange-rate mode are rejected. The entire selection is checked together: a market must retain at least one currency after removal. First call without confirmation. CONFIRMATION_REQUIRED returns details.preview with total and per-currency removed/counts, warnings, and a five-minute single-use confirmation token. Repeat the same IDs with confirmed: true and confirmation_token. The token is bound to the store, actor, sorted selection and all previewed counts. Changed counts, selection, expiry or replay require a fresh preview. All 17 reference types are cleared for the whole batch at once: either every currency in the batch is cleaned up or nothing changes. No currency configuration records or historical carts, orders, payments or financial records are deleted. An all-empty unconfirmed batch returns zero counts without mutation events. Successful cleanup records per-currency and batch audit entries, queues one currencies/update with changed currency IDs/codes and one currencies/data_removed per currency whose data changed. Storefront product filters are refreshed once for the whole batch. Any failure rolls back the entire batch.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
ids
required
|
array<string> |
Unique store currency UUIDs; maximum bulk_max from List currencies. |
confirmed
|
boolean |
True only after reviewing the preview. |
confirmation_token
|
string |
Single-use token returned by the preview. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400INVALID_INPUTA required field is missing, null, or unsupported.
-
404CURRENCY_NOT_FOUNDCurrency does not exist in this store.
-
403CURRENCY_BASE_DATA_REMOVE_FORBIDDENData cannot be removed for the base currency.
-
403CURRENCY_AUTO_MODE_DELETE_FORBIDDENCurrency data cannot be removed while automatic rates are on.
-
403CURRENCY_PLAN_UNSUPPORTEDThe store's plan does not include multi-currency.
-
403CURRENCY_MULTI_CURRENCY_DISABLEDMulti-currency is turned off for this store.
-
409CURRENCY_DATA_MARKET_LAST_CURRENCYAt least one market has no other currency; add one before cleanup.
-
409CONFIRMATION_REQUIREDReview the exact reference counts and repeat with the supplied single-use token.
-
400CURRENCY_DATA_CONFIRMATION_INVALIDThe confirmation token is invalid, expired, or already used.
-
400CURRENCY_BULK_IDS_INVALIDIDs must be a non-empty list of unique currency UUIDs.
-
400CURRENCY_BULK_LIMIT_EXCEEDEDThe selection exceeds bulk_max.
Remove currency data
Clear live mutable data that references one currency.
This is a two-step destructive operation. Call it first without confirmation; if references exist, the API returns CONFIRMATION_REQUIRED with exact warnings and a short-lived, single-use token bound to those counts. Repeat with confirmed: true and that token. If the counts changed, review a fresh preview. The confirmed request checks again that every market keeps another currency, then clears all 17 reference types at once: either everything is cleared or nothing changes. The response reports the counts actually removed, and currencies/update and currencies/data_removed are sent only when the cleanup is saved. Counts cover directly addressed reference rows; dependent feed jobs, diagnostics, and artifacts cascade with their feed unit and are not added to the total. It does not delete the currency. Historical commerce and financial records are never changed.
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 |
|---|---|---|
confirmed
|
boolean |
Set to true only when repeating a request that returned CONFIRMATION_REQUIRED. |
confirmation_token
|
string |
Single-use token returned by CONFIRMATION_REQUIRED for this currency. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400INVALID_INPUTA required field is missing, null, or unsupported.
-
404CURRENCY_NOT_FOUNDCurrency does not exist in this store.
-
403CURRENCY_BASE_DATA_REMOVE_FORBIDDENData cannot be removed for the base currency.
-
403CURRENCY_AUTO_MODE_DELETE_FORBIDDENCurrency data cannot be removed while automatic rates are on.
-
403CURRENCY_PLAN_UNSUPPORTEDThe store's plan does not include multi-currency.
-
403CURRENCY_MULTI_CURRENCY_DISABLEDMulti-currency is turned off for this store.
-
409CURRENCY_DATA_MARKET_LAST_CURRENCYAt least one market has no other currency; add one before cleanup.
-
409CONFIRMATION_REQUIREDReview the exact reference counts and repeat with the supplied single-use token.
-
400CURRENCY_DATA_CONFIRMATION_INVALIDThe confirmation token is invalid, expired, or already used.
Set rounding mode
Set the price rounding rule for one currency.
Applies the selected rounding rule to converted prices in this currency; storefront prices, the checkout preview and the created order all use it. It is accepted in automatic-rate mode: rates are automatic, rounding is not. The mode must be one of the currency's own rounding_modes; a zero-decimal currency rejects nearest_99, nearest_95 and nearest_50 with CURRENCY_ROUNDING_MODE_UNAVAILABLE. The base currency keeps its original prices and does not use a rounding rule, so requests against it are rejected. Setting the current mode returns the currency without code or message and records nothing.
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 values returned in |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400INVALID_INPUTA required field is missing, null, or unsupported.
-
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.
-
400CURRENCY_ROUNDING_MODE_UNAVAILABLEThe currency has no decimal places, so its prices cannot end in .50, .95 or .99.
-
403CURRENCY_PLAN_UNSUPPORTEDThe store's plan does not include multi-currency.
-
403CURRENCY_MULTI_CURRENCY_DISABLEDMulti-currency is turned off for this store.
Toggle multi-currency
Turn selling in additional currencies on or off.
Enables or disables multi-currency for the store. Enabling requires the store's plan to include multi-currency. Disabling requires every additional currency to be removed first. A change returns CURRENCY_UPDATED and queues currencies/update; requesting the current value returns data.success without code or message and records nothing.
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.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400INVALID_INPUTA required field is missing, null, or unsupported.
-
403STOREFRONT_MULTI_CURRENCY_NOT_ON_PLANThe store's plan does not include multi-currency.
-
403STOREFRONT_REMOVE_CURRENCIES_FIRSTRemove all additional currencies before disabling multi-currency.
Toggle automatic rates
Switch between market-managed and manual exchange rates.
Switches exchange rates between market-managed automatic rates and merchant-managed manual rates. Turning automatic rates on requires the store to have no additional currencies. In automatic mode, selecting additional currencies is a Store Admin workflow, and currency reads report the live market rate with rate_source: "automatic". Each market-rate refresh that changes those rates fires currencies/rates_updated. Turning automatic rates off writes the current market rate onto every additional currency, enabled or disabled, in the same transaction; those values then become the store's manual rates. It fails with CURRENCY_EXCHANGE_RATE_UNAVAILABLE (503) and changes nothing when a current rate is missing for any additional currency. The response echoes use_auto_exchange_rates. A change returns CURRENCY_UPDATED and queues currencies/update; requesting the current value returns without code or message and records nothing.
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.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400INVALID_INPUTA required field is missing, null, or unsupported.
-
403CURRENCY_PLAN_UNSUPPORTEDThe store's plan does not include multi-currency.
-
403CURRENCY_MULTI_CURRENCY_DISABLEDMulti-currency is turned off for this store.
-
403CURRENCY_AUTO_ENABLE_BLOCKEDRemove all additional currencies before enabling automatic rates.
-
503CURRENCY_EXCHANGE_RATE_UNAVAILABLETurning automatic rates off needs a current market rate for every additional currency; none was changed. Try again later.
-
400STORE_TIMEZONE_INVALIDThe store's timezone is not valid, so current market rates cannot be requested when turning automatic rates off.
Fields#
Create and Update show whether a request accepts the field. Adding a currency requires code and conversion_rate. An update must include at least one of conversion_rate, is_enabled, or rounding_mode; omitted fields keep their current values. The remaining fields are returned in responses only.
Field |
Kind |
Create |
Update |
Required |
|---|---|---|---|---|
|
string |
No |
No |
|
|
string |
No |
No |
|
|
string |
Yes |
No |
create |
|
string |
No |
No |
|
|
string |
No |
No |
|
|
integer |
No |
No |
|
|
string |
Yes |
Yes |
create; update: at least one of these three |
|
string |
No |
No |
|
|
boolean |
No |
Yes |
update: at least one of these three |
|
boolean |
No |
No |
|
|
string |
No |
Yes |
update: at least one of these three |
|
array of strings |
No |
No |
|
|
datetime |
No |
No |
|
|
datetime |
No |
No |
Webhook events#
Subscribe to currencies/update when your integration mirrors store currencies or exchange-rate mode. It carries the complete current currency set. Subscribe to currencies/data_removed for the exact committed cleanup counts by reference type. Bulk cleanup queues one update with changed currency IDs and codes, plus one data-removed event per currency with nonzero counts. Events and audit entries commit with the cleanup; previews, rejected requests and all-empty batches emit none. A failed or rolled-back cleanup publishes neither.
Currency updated
Fired after currencies are added, changed, enabled, disabled, rounded, or removed, after currency data is removed, or after multi-currency or automatic-rate mode changes. The currencies array contains the complete current store currency set, each with the rate prices use and its rate_source. change_type says what changed; branch on it. reason is display text. Changed currency IDs and codes are included only when applicable. Automatic market-rate refreshes fire currencies/rates_updated instead.
Payload fields
| Field | Type | Description |
|---|---|---|
currencies[*].id |
string |
Always present
The store currency ID. |
currencies[*].code |
string |
Selectable in the Payload builder
The ISO 4217 currency code. |
currencies[*].name |
string |
Selectable in the Payload builder
The currency's English name. |
currencies[*].symbol |
string |
Selectable in the Payload builder
The currency symbol. |
currencies[*].decimals |
integer |
Selectable in the Payload builder
The number of decimal places amounts in this currency use. |
currencies[*].conversion_rate |
string |
Selectable in the Payload builder
The rate prices use, as a decimal string: one unit of the base currency equals this many units of this currency. The base currency is always 1. |
currencies[*].rate_source |
string |
Selectable in the Payload builder
Where conversion_rate comes from: manual (the merchant's saved rate), automatic (the current market rate), or automatic_unavailable (automatic rates are on but no current market rate exists, so prices in this currency cannot be charged until rates refresh). |
currencies[*].is_enabled |
boolean |
Selectable in the Payload builder
Whether the currency is enabled for the store. Market assignment still decides where shoppers can use it. |
currencies[*].is_base |
boolean |
Selectable in the Payload builder
True for the store's base currency, which is set when the store is created and never changes. |
currencies[*].rounding_mode |
string |
Selectable in the Payload builder
The rounding rule applied to converted prices in this currency. The base currency is always none. |
currencies[*].created_at |
string |
Selectable in the Payload builder
When the currency was added, in the store's time zone with its offset (RFC 3339). |
currencies[*].updated_at |
string |
Selectable in the Payload builder
When the currency last changed, in the store's time zone with its offset (RFC 3339). |
multi_currency_enabled |
boolean |
Selectable in the Payload builder
Whether the store sells in additional currencies after this change. |
use_auto_exchange_rates |
boolean |
Selectable in the Payload builder
Whether exchange rates follow the market automatically after this change. |
change_type |
string |
Selectable in the Payload builder
What changed. One of created, updated, deleted, rounding_updated, enabled, disabled, multi_currency_enabled, multi_currency_disabled, auto_rates_enabled, auto_rates_disabled, bulk_created, bulk_deleted, bulk_updated, bulk_enabled, bulk_disabled, data_removed. Branch on this field. |
reason |
string |
Selectable in the Payload builder
A short English description of the change for display or logs. Its wording can change; branch on change_type instead. |
changed_currency_id |
string |
Selectable in the Payload builder
The ID of the one currency that changed. Omitted when the change affects several currencies or no single currency. |
changed_currency_code |
string |
Selectable in the Payload builder
The code of the one currency that changed. Omitted when the change affects several currencies or no single currency. |
changed_currency_ids |
array |
Selectable in the Payload builder
The IDs of the currencies a bulk change affected. Omitted for a single-currency change. |
changed_currency_codes |
array |
Selectable in the Payload builder
The codes of the currencies a bulk change affected. Omitted for a single-currency change. |
Currency data removed
Fired after Remove currency data is confirmed and saved. The payload names the currency and counts, by type, how many prices, amounts, and settings in that currency were removed or cleared; removed is the total. Records that belong to a removed product feed go with it and are not counted. The currency itself stays in the store, and past orders, payments, and other financial records are never changed.
Payload fields
| Field | Type | Description |
|---|---|---|
currency_id |
string |
Always present
The ID of the currency whose data was removed. The currency itself is not deleted. |
currency_code |
string |
Always present
The ISO 4217 code of that currency. |
removed |
integer |
Selectable in the Payload builder
The total number of references removed or cleared: the sum of every value in counts. |
counts.product_prices |
integer |
Selectable in the Payload builder
How many product prices in this currency were removed or cleared. |
counts.variant_prices |
integer |
Selectable in the Payload builder
How many variant prices in this currency were removed or cleared. |
counts.product_shipping_prices |
integer |
Selectable in the Payload builder
How many product shipping prices in this currency were removed or cleared. |
counts.variant_shipping_prices |
integer |
Selectable in the Payload builder
How many variant shipping prices in this currency were removed or cleared. |
counts.channel_feed_units |
integer |
Selectable in the Payload builder
How many sales-channel product feeds in this currency were removed or cleared. |
counts.shipping_rate_thresholds |
integer |
Selectable in the Payload builder
How many shipping rate thresholds in this currency were removed or cleared. |
counts.quantity_price_tiers |
integer |
Selectable in the Payload builder
How many quantity price tiers in this currency were removed or cleared. |
counts.market_currencies |
integer |
Selectable in the Payload builder
How many market currency assignments in this currency were removed or cleared. |
counts.market_country_currencies |
integer |
Selectable in the Payload builder
How many country currency selections in markets in this currency were removed or cleared. |
counts.shipping_rate_prices |
integer |
Selectable in the Payload builder
How many shipping rate prices in this currency were removed or cleared. |
counts.checkout_settings_amounts |
integer |
Selectable in the Payload builder
How many checkout setting amounts in this currency were removed or cleared. |
counts.checkout_fee_amounts |
integer |
Selectable in the Payload builder
How many checkout fee amounts in this currency were removed or cleared. |
counts.cod_settings_amounts |
integer |
Selectable in the Payload builder
How many cash-on-delivery setting amounts in this currency were removed or cleared. |
counts.cod_zone_amounts |
integer |
Selectable in the Payload builder
How many cash-on-delivery zone amounts in this currency were removed or cleared. |
counts.market_discount_amounts |
integer |
Selectable in the Payload builder
How many discount amounts in this currency were removed or cleared. |
counts.shipping_settings_amounts |
integer |
Selectable in the Payload builder
How many shipping setting amounts in this currency were removed or cleared. |
counts.duty_country_rules |
integer |
Selectable in the Payload builder
How many duty rules in this currency were removed or cleared. |
Exchange rates updated
Fired when a market-rate refresh changes the rate a store with automatic exchange rates prices an enabled currency at. Only currencies whose rate changed are listed, each with its previous and new rate and its rounding rule. Prices set explicitly in a currency are unaffected. Use it to update converted prices you keep elsewhere, such as in a product feed. Stores with manual rates never receive it; their rate edits fire currencies/update.
Payload fields
| Field | Type | Description |
|---|---|---|
base_currency_code |
string |
Always present
The store's base currency. Rates convert one unit of it into each listed currency. |
currencies[*].code |
string |
Always present
The ISO 4217 code of a currency whose rate changed. |
currencies[*].previous_rate |
string |
Selectable in the Payload builder
The rate prices in this currency used before the refresh, as a decimal string, or null when no current market rate existed. |
currencies[*].rate |
string |
Always present
The rate prices in this currency use now, as a decimal string. |
currencies[*].rounding_mode |
string |
Selectable in the Payload builder
The rounding rule applied to converted prices in this currency. A changed rate can leave rounded prices unchanged. |
updated_at |
string |
Always present
When the new rates took effect, in the store's time zone with its offset (RFC 3339). |