Supported Countries & Payment Currencies
CROSS Pay currently serves 53 countries. Each country supports one or more fiat currencies and/or the crypto currencies (USDT / CROSSD). For chain metadata and token contracts, see Chain & Token Contracts.
The tables below are a reference snapshot. For the live, merchant-specific
mapping (including decimals), call
GET /v1/catalog. Note that crypto currencies are
hidden in countries under an active
crypto restriction.
This page lists the payment currencies available per country, not the specific payment-method brands or underlying providers behind them. The available brands change often; the currencies a country can pay in are stable.
Any country code that is not on this 53-country whitelist fails at
POST /v1/payments with 422 UNSUPPORTED_COUNTRY.
- A public sandbox environment (test keys, test cards / test tokens)
- Tron chains (
tron-nile, etc.) - USDC token
| Group | Countries | Payment currencies |
|---|---|---|
| Global (crypto only) | 1 | USDT / CROSSD |
| Local currency + crypto | 5 | THB / JPY / TWD / IDR / PHP (+ USDT / CROSSD) |
| USD + crypto | 47 | USD (+ USDT / CROSSD) |
Country catalog
🌐 Global — crypto currencies (GL)
| Country | Code | Payment currencies |
|---|---|---|
| Global | GL | USDT / CROSSD |
Local currency + crypto
Each country supports its local fiat currency plus the crypto currencies (USDT / CROSSD).
| Country | Code | Local currency | Crypto |
|---|---|---|---|
| Thailand | TH | THB | USDT / CROSSD |
| Japan | JP | JPY | USDT / CROSSD |
| Taiwan | TW | TWD | USDT / CROSSD |
| Indonesia | ID | IDR | USDT / CROSSD |
| Philippines | PH | PHP | USDT / CROSSD |
🌍 USD + crypto (47 countries)
These countries support USD as the fiat currency, plus the crypto currencies (USDT / CROSSD).
| Code | Country | Code | Country |
|---|---|---|---|
US | United States | KW | Kuwait |
GU | Guam | PY | Paraguay |
KH | Cambodia | BH | Bahrain |
AU | Australia | DO | Dominican Republic |
GB | United Kingdom | PL | Poland |
CA | Canada | CO | Colombia |
FR | France | NZ | New Zealand |
MP | Northern Mariana Islands | IN | India |
AR | Argentina | IE | Ireland |
VN | Vietnam | EG | Egypt |
UY | Uruguay | PA | Panama |
DE | Germany | EC | Ecuador |
ES | Spain | CH | Switzerland |
LK | Sri Lanka | HU | Hungary |
MX | Mexico | BG | Bulgaria |
PT | Portugal | BE | Belgium |
SA | Saudi Arabia | SE | Sweden |
UA | Ukraine | SG | Singapore |
PE | Peru | BR | Brazil |
QA | Qatar | MY | Malaysia |
AM | Armenia | HK | Hong Kong |
CL | Chile | ||
NO | Norway | ||
IT | Italy | ||
NL | Netherlands | ||
SV | El Salvador |
Currencies
Currency decimals
amount is always passed as a decimal string (to avoid JS Number
precision loss). The decimal places follow ISO 4217; invalid precision
is rejected with 422 INVALID_AMOUNT.
| Currency | Type | decimals | Notes |
|---|---|---|---|
USD | FIAT | 2 | '9.99' |
THB | FIAT | 2 | Thai Baht |
JPY | FIAT | 0 | Integers only ('500') |
TWD | FIAT | 2 | New Taiwan Dollar |
IDR | FIAT | 2 | Indonesian Rupiah |
PHP | FIAT | 2 | Philippine Peso |
USDT | CRYPTO | Per chain (6 or 18) | Ethereum=6, BSC=18, CROSS=18 |
CROSSD | CRYPTO | 18 | Native CROSS Dollar (CROSS chain) |
JPY has no decimal places — '500.50' is rejected. IDR is nominally
2 decimals but rounded in practice; round on the merchant side before
sending.
Using the country parameter
Listing supported countries
GET /v1/countries is a public API.
GET /v1/countries HTTP/1.1
Host: api.crosspay.io
Responses are sorted by name ascending, and metadata is always an
object. The currently used key for UI is metadata.image_url.
{
"countries": [
{
"country_code": "US",
"name": "United States",
"metadata": {
"image_url": "https://static.crosspay.ai/flags/us.svg"
}
}
]
}
Countries whose operational data has not yet been seeded may return
metadata: {}. Clients do not need to add null-handling branches.
Payment catalog API
GET /v1/catalog (merchant API key required) returns, per supported
country, the currencies payable through your provisioned payment
methods, with the display decimals of each. Countries in which your
merchant has nothing payable are omitted.
GET /v1/catalog HTTP/1.1
Host: api.crosspay.io
Authorization: Bearer sk_live_...
{
"updated_at": "2026-06-01T09:00:00Z",
"countries": [
{
"country_code": "JP",
"name": "Japan",
"currencies": [
{ "currency": "JPY", "decimals": 0 },
{ "currency": "USDT", "decimals": 4 },
{ "currency": "CROSSD", "decimals": 4 }
]
}
]
}
decimalsis the payment/display precision (ISO 4217 for fiat, project convention 4 for crypto symbols) — not the per-chain on-chain token decimals. For smallest-unit conversion, use the chain/token metadata from Chain & Token Contracts.- Crypto currencies are excluded for countries under an active
CRYPTOrestriction (see below). - Responses carry an
ETagandCache-Control: private, max-age=300; revalidate withIf-None-Matchto get a cheap304 Not Modified.
Country-level crypto restrictions
An admin-managed restriction list (independent of the FDS country blocklist, which blocks payment entry entirely) selectively limits crypto features per country:
| Type | What it restricts | Country signal used |
|---|---|---|
CRYPTO | Crypto payment methods on the hosted checkout, and crypto currencies in GET /v1/catalog | Buyer's request IP (CloudFront-Viewer-Country — not forgeable) |
ONRAMP | Fiat→crypto on-ramp (AlchemyPay) orders | country parameter in the request body |
South Korea (KR) carries an ONRAMP restriction by default (migrated
from the former on-ramp country blacklist). The list is operated by the
CROSS Pay admin service; there is no merchant-facing toggle. Response
shapes are unchanged by restrictions — only the returned sets narrow.
country in payment creation
POST /v1/payments accepts an optional country field in the request body.
{
"currency": "USD",
"amount": "9.99",
"payer_uid": "user-456",
"country": "US"
}
- Only 2-character ISO 3166-1 alpha-2 values are accepted.
- Propagated to the response's
checkout_urlonly, as?country=US. - Not persisted to the database.
- Not preserved in the checkout URL returned by subsequent
GET /v1/payments/{payment_id}orGET /v1/checkout/{checkout_id}calls.
country in the Checkout API
GET /v1/checkout/{checkout_id} responses may include suggested_country,
a UI hint derived from geo-resolution.
GET /v1/checkout/{checkout_id}/quotes accepts an optional country
query parameter. When omitted, the backend uses the geo-resolution
result, falling back to a default country if resolution fails.
GET /v1/checkout/cs_abc123/quotes?currency=USD&country=US
country and suggested_country should only be used as defaults for
billing country or as the initial selection in dropdowns. Tax, routing,
authentication, and access control must be driven by server responses
and FDS results.
Merchant activation
Activating a new merchant or changing payment-currency exposure follows a managed process — no self-service UI is provided today.
- Complete the PG contract and KYC.
- Send an activation request to CROSS Pay specifying the target countries / currencies.
- The operations team applies the changes.
- Validate the flow.
- Activate.
Contact: support@crosspay.ai
Next steps
- Chain & Token Contracts — chain metadata, PayGateway addresses, and token mappings for on-chain rails.