Currencies

Read the store's currencies and exchange rates, and manage multi-currency settings through the Store API.

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

GET read_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

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

Enabled currencies

GET read_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

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

Base currency

GET read_currencies

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

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

All exchange rates

GET read_currencies

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

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 404 BILLING_EXCHANGE_RATE_UNAVAILABLE

    The current market-rate snapshot is unavailable or stale.

  • 404 BILLING_BASE_RATE_UNAVAILABLE

    The store's base currency market rate is not available.

  • 404 BILLING_EXCHANGE_RATE_ZERO

    A market rate is zero or unavailable.

One exchange rate

GET read_currencies

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.

Example: USD

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 404 BILLING_CURRENCY_INVALID

    The currency code is not a supported ISO 4217 currency code.

  • 404 BILLING_EXCHANGE_RATE_UNAVAILABLE

    The current market-rate snapshot is unavailable or stale, or no rate exists for this currency code.

  • 404 BILLING_EXCHANGE_RATE_ZERO

    The market rate for this currency is zero or unavailable.

Get a currency

GET read_currencies

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.

Example: 7c9e4f2b-1a3d-4e5f-8b6c-2d0e1f3a4b5c

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 404 CURRENCY_NOT_FOUND

    Currency does not exist in this store.

Add a currency

POST write_currencies

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.

Example: "EUR"
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.

Example: "0.0105"

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request body is not valid JSON.

  • 400 INVALID_INPUT

    A required field is missing, null, or unsupported.

  • 400 CURRENCY_INVALID_CODE

    Not a supported ISO 4217 currency code.

  • 409 CURRENCY_ALREADY_EXISTS

    The store already has this currency.

  • 400 CURRENCY_LIMIT_REACHED

    Per-store currency cap has been reached.

  • 400 CURRENCY_CONVERSION_RATE_POSITIVE

    Conversion_rate must be a positive decimal.

  • 400 CURRENCY_CONVERSION_RATE_TOO_HIGH

    Conversion_rate exceeds the allowed maximum.

  • 400 CURRENCY_CONVERSION_RATE_TOO_PRECISE

    Conversion_rate exceeds the allowed decimal precision.

  • 403 CURRENCY_AUTO_MODE_ADD_FORBIDDEN

    Currencies cannot be added manually while automatic rates are on.

  • 403 CURRENCY_PLAN_UNSUPPORTED

    The store's plan does not include multi-currency.

  • 403 CURRENCY_MULTI_CURRENCY_DISABLED

    Multi-currency is turned off for this store.

Update a currency

PUT write_currencies

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.

Example: 7c9e4f2b-1a3d-4e5f-8b6c-2d0e1f3a4b5c

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.

Example: "0.0105"
is_enabled boolean

Whether the currency is enabled at the store level. Market assignment still determines shopper availability. Omit to keep the current state.

Example: true
rounding_mode string

One of the values returned in rounding_modes by List currencies. Omit to keep the current rounding mode.

Example: "nearest_99"

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request body is not valid JSON.

  • 400 INVALID_INPUT

    A required field is missing, null, or unsupported.

  • 404 CURRENCY_NOT_FOUND

    Currency does not exist in this store.

  • 400 CURRENCY_BASE_EDIT_FORBIDDEN

    The base currency cannot be edited.

  • 400 CURRENCY_ROUNDING_MODE_REQUIRED

    Rounding_mode is required.

  • 400 CURRENCY_INVALID_ROUNDING_MODE

    Rounding_mode is not one of the store's rounding modes.

  • 400 CURRENCY_CONVERSION_RATE_POSITIVE

    Conversion_rate must be a positive decimal.

  • 400 CURRENCY_CONVERSION_RATE_TOO_HIGH

    Conversion_rate exceeds the allowed maximum.

  • 400 CURRENCY_CONVERSION_RATE_TOO_PRECISE

    Conversion_rate exceeds the allowed decimal precision.

  • 403 CURRENCY_PLAN_UNSUPPORTED

    The store's plan does not include multi-currency.

  • 403 CURRENCY_MULTI_CURRENCY_DISABLED

    Multi-currency is turned off for this store.

  • 403 CURRENCY_AUTO_MODE_RATE_FORBIDDEN

    Rates are market-managed while automatic rates are on.

  • 409 CURRENCY_MARKET_USAGE_IN_USE

    The currency is used by a market; remove it from that market before disabling it.

  • 409 CURRENCY_DISABLE_GIFT_CARD_BALANCES

    Active 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.

  • 400 CURRENCY_BULK_FIELDS_REQUIRED

    Supply at least one of conversion_rate, is_enabled or rounding_mode.

  • 400 CURRENCY_ROUNDING_MODE_UNAVAILABLE

    The currency has no decimal places, so its prices cannot end in .50, .95 or .99.

Remove a currency

DELETE write_currencies

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.

Example: 7c9e4f2b-1a3d-4e5f-8b6c-2d0e1f3a4b5c

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 404 CURRENCY_NOT_FOUND

    Currency does not exist in this store.

  • 403 CURRENCY_BASE_DELETE_FORBIDDEN

    The base currency cannot be deleted.

  • 403 CURRENCY_AUTO_MODE_DELETE_FORBIDDEN

    Currencies cannot be deleted while automatic rates are on.

  • 403 CURRENCY_PLAN_UNSUPPORTED

    The store's plan does not include multi-currency.

  • 403 CURRENCY_MULTI_CURRENCY_DISABLED

    Multi-currency is turned off for this store.

  • 409 CURRENCY_IN_USE

    Live 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.

  • 409 CURRENCY_GIFT_CARDS_IN_USE

    Only 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

POST write_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.

Example: ["7c9e4f2b-1a3d-4e5f-8b6c-2d0e1f3a4b5c"]
confirmed boolean

True only after reviewing the preview.

Example: true
confirmation_token string

Single-use token returned by the preview.

Example: confirm_...

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request body is not valid JSON.

  • 400 INVALID_INPUT

    A required field is missing, null, or unsupported.

  • 404 CURRENCY_NOT_FOUND

    Currency does not exist in this store.

  • 403 CURRENCY_BASE_DATA_REMOVE_FORBIDDEN

    Data cannot be removed for the base currency.

  • 403 CURRENCY_AUTO_MODE_DELETE_FORBIDDEN

    Currency data cannot be removed while automatic rates are on.

  • 403 CURRENCY_PLAN_UNSUPPORTED

    The store's plan does not include multi-currency.

  • 403 CURRENCY_MULTI_CURRENCY_DISABLED

    Multi-currency is turned off for this store.

  • 409 CURRENCY_DATA_MARKET_LAST_CURRENCY

    At least one market has no other currency; add one before cleanup.

  • 409 CONFIRMATION_REQUIRED

    Review the exact reference counts and repeat with the supplied single-use token.

  • 400 CURRENCY_DATA_CONFIRMATION_INVALID

    The confirmation token is invalid, expired, or already used.

  • 400 CURRENCY_BULK_IDS_INVALID

    IDs must be a non-empty list of unique currency UUIDs.

  • 400 CURRENCY_BULK_LIMIT_EXCEEDED

    The selection exceeds bulk_max.

Remove currency data

POST write_currencies

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.

Example: 7c9e4f2b-1a3d-4e5f-8b6c-2d0e1f3a4b5c

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.

Example: true
confirmation_token string

Single-use token returned by CONFIRMATION_REQUIRED for this currency.

Example: confirm_...

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request body is not valid JSON.

  • 400 INVALID_INPUT

    A required field is missing, null, or unsupported.

  • 404 CURRENCY_NOT_FOUND

    Currency does not exist in this store.

  • 403 CURRENCY_BASE_DATA_REMOVE_FORBIDDEN

    Data cannot be removed for the base currency.

  • 403 CURRENCY_AUTO_MODE_DELETE_FORBIDDEN

    Currency data cannot be removed while automatic rates are on.

  • 403 CURRENCY_PLAN_UNSUPPORTED

    The store's plan does not include multi-currency.

  • 403 CURRENCY_MULTI_CURRENCY_DISABLED

    Multi-currency is turned off for this store.

  • 409 CURRENCY_DATA_MARKET_LAST_CURRENCY

    At least one market has no other currency; add one before cleanup.

  • 409 CONFIRMATION_REQUIRED

    Review the exact reference counts and repeat with the supplied single-use token.

  • 400 CURRENCY_DATA_CONFIRMATION_INVALID

    The confirmation token is invalid, expired, or already used.

Set rounding mode

PUT write_currencies

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.

Example: 7c9e4f2b-1a3d-4e5f-8b6c-2d0e1f3a4b5c

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 rounding_modes by List currencies.

Example: "nearest_95"

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request body is not valid JSON.

  • 400 INVALID_INPUT

    A required field is missing, null, or unsupported.

  • 404 CURRENCY_NOT_FOUND

    Currency does not exist in this store.

  • 400 CURRENCY_INVALID_ROUNDING_MODE

    Rounding_mode is not one of the store's rounding modes.

  • 400 CURRENCY_BASE_ROUNDING_FORBIDDEN

    The base currency never rounds.

  • 400 CURRENCY_ROUNDING_MODE_UNAVAILABLE

    The currency has no decimal places, so its prices cannot end in .50, .95 or .99.

  • 403 CURRENCY_PLAN_UNSUPPORTED

    The store's plan does not include multi-currency.

  • 403 CURRENCY_MULTI_CURRENCY_DISABLED

    Multi-currency is turned off for this store.

Toggle multi-currency

PUT write_currencies

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.

Example: true

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request body is not valid JSON.

  • 400 INVALID_INPUT

    A required field is missing, null, or unsupported.

  • 403 STOREFRONT_MULTI_CURRENCY_NOT_ON_PLAN

    The store's plan does not include multi-currency.

  • 403 STOREFRONT_REMOVE_CURRENCIES_FIRST

    Remove all additional currencies before disabling multi-currency.

Toggle automatic rates

PUT write_currencies

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.

Example: true

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request body is not valid JSON.

  • 400 INVALID_INPUT

    A required field is missing, null, or unsupported.

  • 403 CURRENCY_PLAN_UNSUPPORTED

    The store's plan does not include multi-currency.

  • 403 CURRENCY_MULTI_CURRENCY_DISABLED

    Multi-currency is turned off for this store.

  • 403 CURRENCY_AUTO_ENABLE_BLOCKED

    Remove all additional currencies before enabling automatic rates.

  • 503 CURRENCY_EXCHANGE_RATE_UNAVAILABLE

    Turning automatic rates off needs a current market rate for every additional currency; none was changed. Try again later.

  • 400 STORE_TIMEZONE_INVALID

    The 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

id

string

No

No

store_id

string

No

No

code

string

Yes

No

create

name

string

No

No

symbol

string

No

No

decimals

integer

No

No

conversion_rate

string

Yes

Yes

create; update: at least one of these three

rate_source

string

No

No

  • (manual, automatic, or automatic_unavailable)

is_enabled

boolean

No

Yes

update: at least one of these three

is_base

boolean

No

No

rounding_mode

string

No

Yes

update: at least one of these three

rounding_modes

array of strings

No

No

  • (modes this currency accepts; empty for the base currency)

created_at

datetime

No

No

updated_at

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

EVENT currencies/update App scope: read_currencies Staff permission: settings.currencies:read

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

EVENT currencies/data_removed App scope: read_currencies Staff permission: settings.currencies:read

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

EVENT currencies/rates_updated App scope: read_currencies Staff permission: settings.currencies:read

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).