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/quotefor 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 used | Includes a conversion fee? | Paid by | |
|---|---|---|---|
| You, naming a price (this API) | Mid-market | No | — nothing is converted yet |
| A customer paying in their own currency (at checkout) | Mid-market + fee | Yes | The 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
expiresAtbelow.
The one rule to remember
Amounts are always in the minor units of the currency you name.
| You want to charge | Currency | You send |
|---|---|---|
| 50.00 Turkish lira | TRY | 5000 |
| ¥5,000 Japanese yen | JPY | 5000 — yen has no minor unit |
| 1,500.00 lira | TRY | 150000 |
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
| Field | Type | Required | Description |
|---|---|---|---|
sourceCurrency | string | Yes | The currency you are pricing in (ISO 4217, case-insensitive). Must differ from currency. |
currency | string | Yes | Your settlement currency: EUR, GBP or USD. Same field, same meaning as currency on the create endpoints. |
lines | array | Yes | One 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
| Field | Description |
|---|---|
exchangeRate | Units of currency per 1 unit of sourceCurrency, at the mid-market rate. |
lines[].unitAmountInCents | The converted unit price. |
lines[].amountInCents | That unit price times the quantity. |
total.amountInCents | What the create endpoint will store for these lines. |
expiresAt | How long this response stays representative — about a minute. |
expiresAtis 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.
| Field | Type | Required | Description |
|---|---|---|---|
sourceCurrency | string | No | The currency you are pricing in. Omit it and the endpoint behaves exactly as before. |
sourceAmountInMinorUnits | number | With sourceCurrency | Recurring amount, in sourceCurrency minor units. |
sourceEntryFeesInMinorUnits | number | No | First-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 sourceCurrency | 134 (see GET /api/fx/currencies) |
| Settlement currencies | EUR, GBP, USD |
| Lines per quote request | 50 |
| Unit price | 1 to 99,999,999 minor units |
| Quantity per line | 1 to 10,000 |
| Total across all lines | 2,000,000,000 minor units |
| Converted amount | Must 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.
| Code | Meaning |
|---|---|
FX_AUTHORING_DISABLED | The feature is not enabled on your account. |
FX_SOURCE_EQUALS_TARGET | sourceCurrency and currency are the same. |
FX_AMBIGUOUS_PRICING | You sent both a source amount and a settlement amount. Send one. |
FX_SOURCE_AMOUNT_WITHOUT_CURRENCY | A source* amount without sourceCurrency. |
FX_AMOUNT_ROUNDS_TO_ZERO | A unit price converts to 0 — raise it. |
FX_INVALID_QUANTITY | Quantity is not an integer within range. |
FX_AUTHORED_TOTAL_TOO_LARGE | The total across all lines is above the ceiling. |
FX_NOT_SUPPORTED_ON_CATALOG_ITEMS | Catalog items[] are already priced in your settlement currency. Use inline products to price in a foreign currency. |
FX_RATE_UNAVAILABLE | 503. 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
- Local Currency at Checkout — letting customers pay in their own currency
- Creating a Payment Link
- Creating a Subscription Offer
- Error Handling
Updated 2 days ago
