Pricing in a Local Currency

Available via: API only. Requires a private API key. Not yet available from the Dashboard.

Enablement: off by default. Contact Inflow to have it enabled on your account.

What this solves

Your account settles in EUR, GBP or USD. But you may well set your prices in a different currency — the one your market understands, or simply the one you think in. Without this, you would have to convert every price yourself, with a rate found somewhere else, and redo it whenever rates move.

Instead, name the price in your own currency. We convert it at the live mid-market rate and store the result in your settlement currency. Nothing else changes — the link, the checkout and your payout work exactly as they do today.

The examples below use Turkish lira, but any of the 134 supported currencies works the same way.

The rates in this page were live on 1 September 2026. They move continuously, so every converted figure here is illustrative — call POST /api/fx/quote for a current one. The field names, limits and behaviour do not change with the rate.

You name       1,500.00 TRY
We store          26.84 EUR    ← the offer's real price, in your settlement currency
You are paid      26.84 EUR

Which rate we use, and who pays the conversion fee

This matters, so it is worth being explicit.

The rate this API gives you carries no conversion fee. It is the mid-market rate, the same one you would find on a public rate site. We do not mark it up, and we do not take a cut of it when you name a price.

The conversion fee is paid by the customer, at checkout, and only if they actually convert. A customer who pays in your link's settlement currency triggers no conversion and pays no fee. A customer who pays in another currency has their payment converted at a rate that does include the fee and that is what leaves your side whole.

Rate usedIncludes a conversion fee?Paid by
You, naming a price (this API)Mid-marketNo— nothing is converted yet
A customer paying in their own currency (at checkout)Mid-market + feeYesThe customer

So when you name 1,500.00 TRY, you receive the full mid-market value of 1,500.00 TRY — the 26.84 EUR above. You are never charged for a conversion you did not trigger.

This endpoint is informational. Use it to display a converted price while a merchant types, or simply to know the rate before you create a product. It writes nothing, reserves nothing, and cannot be redeemed — see the note on expiresAt below.


The one rule to remember

Amounts are always in the minor units of the currency you name.

You want to chargeCurrencyYou send
50.00 Turkish liraTRY5000
¥5,000 Japanese yenJPY5000 — yen has no minor unit
1,500.00 liraTRY150000

This is the same convention the rest of the API uses for price and amountInCents. Getting it wrong by a factor of 100 is the most common mistake.


Step 1 — Look up the rate (optional, display only)

Two uses: show a merchant what their price becomes while they type, or simply find out today's rate before you decide what to charge.

It is a read. Nothing is created, no rate is held, and the response cannot be sent back to us to claim that rate. Skip this step entirely if you do not need to display anything. The create endpoints convert on their own.

curl -X POST https://api.inflowpay.com/api/fx/quote \
  -H "X-Inflow-Api-Key: inflow_prod_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "sourceCurrency": "TRY",
    "currency": "EUR",
    "lines": [
      { "amountInMinorUnits": 120000, "quantity": 2 },
      { "amountInMinorUnits": 85000 }
    ]
  }'
{
  "sourceCurrency": "TRY",
  "currency": "EUR",
  "exchangeRate": 0.0178949,
  "quotedAt": "2026-08-29T15:07:47.022Z",
  "expiresAt": "2026-08-29T15:08:47.022Z",
  "lines": [
    { "sourceAmountInMinorUnits": 120000, "quantity": 2, "unitAmountInCents": 2147, "amountInCents": 4294 },
    { "sourceAmountInMinorUnits": 85000, "quantity": 1, "unitAmountInCents": 1521, "amountInCents": 1521 }
  ],
  "total": { "sourceAmountInMinorUnits": 325000, "amountInCents": 5815 }
}

Request

FieldTypeRequiredDescription
sourceCurrencystringYesThe currency you are pricing in (ISO 4217, case-insensitive). Must differ from currency.
currencystringYesYour settlement currency: EUR, GBP or USD. Same field, same meaning as currency on the create endpoints.
linesarrayYesOne entry per line item. amountInMinorUnits is the unit price; quantity defaults to 1.

Send the same lines you will send to the create endpoint, quantities included. Conversion rounds each unit price, so two units at 10.00 is not the same as one line at 20.00. Do that and total.amountInCents is exactly what the create endpoint stores at this rate.

Response

FieldDescription
exchangeRateUnits of currency per 1 unit of sourceCurrency, at the mid-market rate.
lines[].unitAmountInCentsThe converted unit price.
lines[].amountInCentsThat unit price times the quantity.
total.amountInCentsWhat the create endpoint will store for these lines.
expiresAtHow long this response stays representative — about a minute.

expiresAt is not a rate lock. Nothing in this response can be replayed to hold a rate. The create endpoints always fetch a fresh rate, so the stored amount may differ from the preview by a cent if the rate moved in between. The create response carries the authoritative figure.

Listing the currencies you can price in

curl https://api.inflowpay.com/api/fx/currencies \
  -H "X-Inflow-Api-Key: inflow_prod_your_key"

Returns the 134 ISO 4217 codes accepted as sourceCurrency.


Step 2 — Create the link or offer

Add sourceCurrency and send your prices in that currency's minor units. Everything else is unchanged.

Payment link

curl -X POST https://api.inflowpay.com/api/link \
  -H "X-Inflow-Api-Key: inflow_prod_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "currency": "EUR",
    "sourceCurrency": "TRY",
    "products": [
      { "name": "Kilim", "price": 120000, "quantity": 2 },
      { "name": "Tea set", "price": 85000, "quantity": 1 }
    ]
  }'

With sourceCurrency set, every products[].price is read as minor units of that currency.

Subscription offer

curl -X POST https://api.inflowpay.com/subscription/offer \
  -H "X-Inflow-Api-Key: inflow_prod_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Pro Plan",
    "description": "Full access",
    "currency": "EUR",
    "interval": "month",
    "intervalCount": 1,
    "sourceCurrency": "TRY",
    "sourceAmountInMinorUnits": 150000,
    "sourceEntryFeesInMinorUnits": 50000
  }'

Offers carry two independent amounts, so each has its own field. Send sourceAmountInMinorUnits, not amountInCents — sending both is rejected.

FieldTypeRequiredDescription
sourceCurrencystringNoThe currency you are pricing in. Omit it and the endpoint behaves exactly as before.
sourceAmountInMinorUnitsnumberWith sourceCurrencyRecurring amount, in sourceCurrency minor units.
sourceEntryFeesInMinorUnitsnumberNoFirst-payment amount, in sourceCurrency minor units.

Reading it back

GET /api/link/{id} and GET /subscription/offers/{id} return what you typed alongside what was stored.

{
  "amount": 5815,
  "currency": "EUR",
  "sourcePrice": {
    "currency": "TRY",
    "amountInMinorUnits": 325000,
    "exchangeRate": 0.0178949,
    "quotedAt": "2026-08-29T15:07:47.022Z"
  },
  "products": [
    { "name": "Kilim", "price": 2147, "quantity": 2, "sourcePrice": 120000 },
    { "name": "Tea set", "price": 1521, "quantity": 1, "sourcePrice": 85000 }
  ]
}

sourcePrice is null on anything priced directly in your settlement currency — which is every link and offer created before this feature existed.


Limits

Limit
Currencies accepted as sourceCurrency134 (see GET /api/fx/currencies)
Settlement currenciesEUR, GBP, USD
Lines per quote request50
Unit price1 to 99,999,999 minor units
Quantity per line1 to 10,000
Total across all lines2,000,000,000 minor units
Converted amountMust reach the 0.50 minimum in your settlement currency
Quote validity (display only)~60 seconds

Three-decimal currencies (BHD, JOD, KWD, OMR, TND) are not accepted.


Errors

All are 400 unless noted.

CodeMeaning
FX_AUTHORING_DISABLEDThe feature is not enabled on your account.
FX_SOURCE_EQUALS_TARGETsourceCurrency and currency are the same.
FX_AMBIGUOUS_PRICINGYou sent both a source amount and a settlement amount. Send one.
FX_SOURCE_AMOUNT_WITHOUT_CURRENCYA source* amount without sourceCurrency.
FX_AMOUNT_ROUNDS_TO_ZEROA unit price converts to 0 — raise it.
FX_INVALID_QUANTITYQuantity is not an integer within range.
FX_AUTHORED_TOTAL_TOO_LARGEThe total across all lines is above the ceiling.
FX_NOT_SUPPORTED_ON_CATALOG_ITEMSCatalog items[] are already priced in your settlement currency. Use inline products to price in a foreign currency.
FX_RATE_UNAVAILABLE503. No rate could be obtained. Retry — we never substitute a fallback rate.

What your customers see

The price you name is converted once, when you create the link, and the stored amount is what the link is worth from then on.

Two things:

  • Rates move. An offer priced at 1,500.00 TRY today is not re-priced tomorrow. It stays worth 26.84 EUR.
  • A customer paying in that same currency sees about 2% more than you typed. Their payment is converted with the conversion fee applied, while your price was set at the mid-market rate. On the example above, a Turkish customer is charged about 1,530.48 TRY for an offer you priced at 1,500.00 — roughly 2% more, which is the conversion fee.

That second point is deliberate, and it is the fee at work: you were charged nothing to name the price, so you receive its full mid-market value, and the customer who actually triggers a conversion pays for that conversion. A customer paying in your settlement currency converts nothing and pays no fee.

See Local Currency at Checkout for that side.


Related


Did this page help you?