Overview

Before creating an FX quote or conversion, use GET /fx/asset-pairs to discover which pairs are available and what amount limits apply. This endpoint returns all supported sell/buy combinations, including fiat-to-fiat, fiat-to-crypto, and crypto-to-crypto pairs.
Always validate pair availability before attempting a quote or conversion. Requesting a quote for an unsupported pair returns a 400 error with an invalid_request_error type.

List asset pairs

Call GET /fx/asset-pairs to retrieve the full list of available pairs.
curl -X GET https://sandbox.api.openfx.com/v1/fx/asset-pairs \
  -H "Authorization: Bearer $API_KEY" \
  -H "X-Signature: $SIGNATURE" \
  -H "X-Timestamp: $TIMESTAMP"

Example response

{
  "items": [
    {
      "sellCurrency": "USD",
      "buyCurrency": "EUR",
      "minAmount": "10.00",
      "maxAmount": "5000000.00"
    },
    {
      "sellCurrency": "USD",
      "buyCurrency": "GBP",
      "minAmount": "10.00",
      "maxAmount": "5000000.00"
    },
    {
      "sellCurrency": "USD",
      "buyCurrency": "USDC",
      "minAmount": "1.00",
      "maxAmount": "10000000.00"
    },
    {
      "sellCurrency": "EUR",
      "buyCurrency": "USD",
      "minAmount": "10.00",
      "maxAmount": "5000000.00"
    }
  ]
}

Response fields

Each asset pair object contains:
FieldTypeDescription
sellCurrencyAssetCodeThe currency or asset being sold. Pattern: ^[A-Z]{2,10}$
buyCurrencyAssetCodeThe currency or asset being bought. Pattern: ^[A-Z]{2,10}$
minAmountstringMinimum sell amount for this pair. Amounts below this are rejected.
maxAmountstringMaximum sell amount for this pair. Amounts above this are rejected.
The minAmount and maxAmount values refer to the sell side of the pair. If you are specifying a buyAmount when creating a quote, the system will validate that the calculated sell amount falls within these bounds.

Pair types

The FX Engine supports three categories of asset pairs through the same unified endpoint:

Fiat-to-fiat

Traditional foreign exchange between ISO 4217 currencies.
Example PairUse Case
USD / EURUS to Eurozone payments
USD / GBPUS to UK payments
EUR / GBPEurozone to UK payments
USD / SGDUS to Singapore payments
USD / MXNUS to Mexico payments

Fiat-to-crypto

On-ramp and off-ramp conversions between fiat currencies and stablecoins.
Example PairUse Case
USD / USDCFiat on-ramp to USDC
USDC / USDCrypto off-ramp to USD
EUR / EURCEUR to EURC stablecoin
USD / USDTFiat on-ramp to USDT

Crypto-to-crypto

Conversions between different crypto assets.
Example PairUse Case
USDC / USDTStablecoin swap
USDC / EURCCross-currency stablecoin conversion

Filtering pairs

To find pairs for a specific sell currency, filter the response client-side:
import requests

response = requests.get(
    "https://sandbox.api.openfx.com/v1/fx/asset-pairs",
    headers={
        "Authorization": f"Bearer {api_key}",
        "X-Signature": signature,
        "X-Timestamp": timestamp,
    },
)

pairs = response.json()

# Find all pairs where USD is the sell currency
usd_pairs = [
    pair for pair in pairs["items"]
    if pair["sellCurrency"] == "USD"
]

for pair in usd_pairs:
    print(f"USD -> {pair['buyCurrency']} "
          f"(min: {pair['minAmount']}, max: {pair['maxAmount']})")

Validating before quoting

Use asset pair data to validate parameters before calling POST /fx/quotes:
def validate_fx_request(pairs, sell_currency, buy_currency, sell_amount):
    """Validate an FX request against available pairs."""
    matching = [
        p for p in pairs["items"]
        if p["sellCurrency"] == sell_currency
        and p["buyCurrency"] == buy_currency
    ]

    if not matching:
        raise ValueError(
            f"Pair {sell_currency}/{buy_currency} is not available"
        )

    pair = matching[0]
    amount = float(sell_amount)

    if amount < float(pair["minAmount"]):
        raise ValueError(
            f"Amount {sell_amount} is below minimum {pair['minAmount']}"
        )

    if amount > float(pair["maxAmount"]):
        raise ValueError(
            f"Amount {sell_amount} exceeds maximum {pair['maxAmount']}"
        )

    return True
Cache asset pair data for short periods (e.g., 5 minutes) to reduce API calls. Pair availability and limits change infrequently. Always re-fetch before high-value operations or when a quote request fails unexpectedly.

Next steps

Once you have confirmed pair availability:
  1. Get a rate — Use indicative rates or quotes to see pricing or lock a rate.
  2. Execute a conversion — Use conversions to convert on a customer’s account.

API Reference