Two pricing tools

The FX Engine provides two ways to get exchange rate information, each serving a different purpose:
ToolEndpointRate locked?Executable?Use case
Indicative rateGET /fx/rates/indicativeNoNoDisplay current rate in a UI, estimate costs, informational pricing
FX quotePOST /fx/quotesYes (60 seconds)YesLock a rate before executing a conversion or cross-currency payment
Indicative rates are free look-ups with no commitment. FX quotes lock a rate and are intended to be consumed by a conversion or payment shortly after creation.

Indicative rates

Use GET /fx/rates/indicative to fetch the current market rate for a asset pair. This rate is informational only — it is not locked, cannot be referenced in a conversion, and may change by the time you execute.

Request parameters

ParameterTypeRequiredDescription
sellCurrencyAssetCodeYesThe currency being sold (e.g., USD, USDC)
buyCurrencyAssetCodeYesThe currency being bought (e.g., EUR, GBP)
curl -X GET "https://sandbox.api.openfx.com/v1/fx/rates/indicative?sellCurrency=USD&buyCurrency=EUR" \
  -H "Authorization: Bearer $API_KEY" \
  -H "X-Signature: $SIGNATURE" \
  -H "X-Timestamp: $TIMESTAMP"

Example response

{
  "sellCurrency": "USD",
  "buyCurrency": "EUR",
  "rate": "1.0848",
  "inverseRate": "0.9218",
  "timestamp": "2026-02-23T12:00:00Z"
}

Response fields

FieldTypeDescription
sellCurrencyAssetCodeThe sell currency from the request
buyCurrencyAssetCodeThe buy currency from the request
ratestringThe indicative exchange rate (sell to buy)
inverseRatestringThe inverse rate (buy to sell)
timestampstringISO 8601 timestamp of when the rate was captured
Indicative rates are snapshots of the current market. They can change at any time and cannot be used as a quoteId in a conversion or payment. If you need a guaranteed rate, create an FX quote instead.

FX quotes

Use POST /fx/quotes to lock an exchange rate for 60 seconds. The returned quote can then be used to execute a conversion (POST /fx/conversions) or a cross-currency payment (POST /payments with executionPreference: use_quote).

Request fields

FieldTypeRequiredDescription
sellCurrencyAssetCodeYesThe currency being sold
buyCurrencyAssetCodeYesThe currency being bought
sellAmountstringOne of sellAmount or buyAmountThe amount to sell (provide this OR buyAmount, not both)
buyAmountstringOne of sellAmount or buyAmountThe amount to buy (provide this OR sellAmount, not both)
Provide exactly one of sellAmount or buyAmount. The system calculates the other side at the locked rate.

Create a quote with sell amount

When you know how much you want to sell:
curl -X POST https://sandbox.api.openfx.com/v1/fx/quotes \
  -H "Authorization: Bearer $API_KEY" \
  -H "X-Signature: $SIGNATURE" \
  -H "X-Timestamp: $TIMESTAMP" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "sellCurrency": "USD",
    "buyCurrency": "GBP",
    "sellAmount": "10000.00"
  }'

Create a quote with buy amount

When you know how much you want to receive:
curl -X POST https://sandbox.api.openfx.com/v1/fx/quotes \
  -H "Authorization: Bearer $API_KEY" \
  -H "X-Signature: $SIGNATURE" \
  -H "X-Timestamp: $TIMESTAMP" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "sellCurrency": "USD",
    "buyCurrency": "EUR",
    "buyAmount": "5000.00"
  }'

Example response

{
  "id": "qte_01953e1a5f4b7006",
  "sellCurrency": "USD",
  "buyCurrency": "GBP",
  "sellAmount": "10000.00",
  "buyAmount": "7850.00",
  "rate": "0.7850",
  "inverseRate": "1.2739",
  "status": "active",
  "expiresAt": "2026-02-23T12:01:00Z",
  "createdAt": "2026-02-23T12:00:00Z"
}

Response fields

FieldTypeDescription
idstringUnique quote identifier (qte_ prefix)
sellCurrencyAssetCodeThe currency being sold
buyCurrencyAssetCodeThe currency being bought
sellAmountstringThe sell amount (calculated if buyAmount was provided)
buyAmountstringThe buy amount (calculated if sellAmount was provided)
ratestringThe locked exchange rate
inverseRatestringThe inverse of the locked rate
statusstringQuote status: active, expired, or consumed
expiresAtstringISO 8601 timestamp when the quote expires
createdAtstringISO 8601 timestamp when the quote was created

Quote lifecycle

Every FX quote follows a simple lifecycle:
StatusDescriptionTerminal?
activeRate is locked and available for use. Execute before expiresAt.No
expiredThe 60-second hold period elapsed without the quote being used.Yes
consumedThe quote was used in a conversion or payment.Yes
Quotes expire after approximately 60 seconds. The holdSeconds value is determined by the server and returned in the response — do not hardcode it. Create your quote as close to execution time as possible to avoid expiration.
You can check a quote’s current status at any time by calling GET /fx/quotes/{quoteId}. This is useful for confirming a quote is still active before executing.

Retrieving a quote

curl -X GET https://sandbox.api.openfx.com/v1/fx/quotes/qte_01953e1a5f4b7006 \
  -H "Authorization: Bearer $API_KEY" \
  -H "X-Signature: $SIGNATURE" \
  -H "X-Timestamp: $TIMESTAMP"

FX quotes vs. payment quotes

OpenFX has two types of quotes that serve different purposes. Do not confuse them:
FX QuotePayment Quote
EndpointPOST /fx/quotesPOST /payments/quotes
ID prefixqte_pqt_
PurposeLock rate for standalone conversion or payment FX componentLock full payment pricing (FX + fees + total cost)
Use withPOST /fx/conversions or POST /paymentsPOST /payments
Includes fees?NoYes
Includes delivery estimate?NoYes
Rule of thumb: Use FX quotes when doing standalone balance conversions. Use payment quotes when you want a complete price guarantee for an outbound payment including fees and delivery timing.

Next steps

Now that you understand pricing:
  1. Execute a conversion — Use your FX quote to convert currency on a customer’s account.

API Reference