Mid-Market vs Retail Exchange Rates: What Developers Need to Know
When you integrate an exchange rate API into your application, one of the most important questions to ask is: "Is this the mid-market rate or a retail rate?" The difference can mean a 1–5% hidden markup on every conversion your users see — and most API documentation doesn't make this clear.
What Is the Mid-Market Rate?
The mid-market rate (also called the interbank rate) is the midpoint between the buy price and the sell price of a currency pair on the global foreign exchange market. It is the "true" exchange rate — the rate at which banks trade with each other in large volumes.
When you see an exchange rate on Google, XE, or Bloomberg, you are seeing the mid-market rate. It is the benchmark that financial professionals reference.
Example: If banks are buying EUR at 1.0820 USD and selling EUR at 1.0830 USD, the mid-market rate is 1.0825 — the midpoint between the two.
What Is a Retail Rate?
A retail rate is the mid-market rate plus a spread (markup). This spread is how banks, currency exchange services, and money transfer companies make money. When you exchange currency at an airport kiosk, you get a retail rate — and the spread can be enormous.
| Provider Type | Typical Spread | Impact on $10,000 |
|---|---|---|
| Mid-market (interbank) | 0% | $0 |
| Online money transfer (e.g. Wise) | 0.3–0.7% | $30–$70 |
| Bank wire transfer | 1–3% | $100–$300 |
| Credit card foreign transaction | 1–3% | $100–$300 |
| Airport currency exchange | 3–8% | $300–$800 |
Why This Matters for Your Application
If your API returns retail rates instead of mid-market rates, you have a transparency problem. Your users might think they are getting the "real" exchange rate, but there is already a hidden markup baked into the data before you even apply your own fees.
E-Commerce Price Display
If your online store shows "1 USD = 0.92 EUR" but the real mid-market rate is 0.9350, your international customers are seeing prices that are 1.6% higher than they should be. On a $500 purchase, that is $8 in invisible overcharge — eroding trust and conversion rates.
Multi-Currency SaaS Billing
If you bill customers in their local currency using retail rates, you are effectively applying a markup your customers didn't agree to. Many SaaS companies have faced chargebacks and complaints over this exact issue.
Financial Reporting
Auditors and compliance teams expect rates that are traceable to a recognized source. Mid-market rates from Reuters, Bloomberg, or Central Banks are accepted. Retail rates from unnamed sources are not.
How to Tell What Your API Returns
Unfortunately, many APIs don't clearly state whether they return mid-market or retail rates. Here is how to check:
- Compare against Google: Search "1 USD to EUR" on Google. Google shows the mid-market rate. If your API's rate differs by more than 0.05%, it may include a spread.
- Check the documentation: Look for terms like "interbank," "mid-market," or "wholesale." If the docs say "indicative rates" or don't specify, be cautious.
- Ask about the source: APIs sourcing from Reuters, Refinitiv, or Bloomberg typically provide mid-market rates. APIs that aggregate from "multiple sources" without naming them may include retail spreads.
Red flag: If an exchange rate API is completely free with unlimited requests and doesn't disclose its data source, the data may be low-quality or include a hidden spread. Free services need a revenue model — if you are not paying with money, you might be paying with data accuracy.
Mid-Market Rate API Example
AllRatesToday provides mid-market rates sourced from Reuters (Refinitiv) and interbank market feeds. Here is what the response looks like:
curl -X GET "https://allratestoday.com/api/v1/rates?source=USD&target=EUR,GBP,JPY" \
-H "Authorization: Bearer YOUR_API_KEY" {
"source": "USD",
"rates": {
"EUR": { "rate": 0.9234, "time": "2026-04-09T14:30:00Z" },
"GBP": { "rate": 0.7891, "time": "2026-04-09T14:30:00Z" },
"JPY": { "rate": 151.42, "time": "2026-04-09T14:30:00Z" }
}
} These are the same mid-market rates displayed on Google Finance and XE — no spread, no markup.
Adding Your Own Markup
If your business model requires a spread (e.g., you run a money transfer service), you should start with the mid-market rate and apply your own transparent margin:
import AllRatesToday from '@allratestoday/sdk';
const client = new AllRatesToday('YOUR_API_KEY');
const MARKUP = 0.005; // 0.5% spread
async function getCustomerRate(from, to) {
const midMarketRate = await client.getRate(from, to);
// Apply spread: customer gets slightly less favorable rate
const customerRate = midMarketRate * (1 - MARKUP);
return {
midMarket: midMarketRate,
customerRate: customerRate,
spread: MARKUP
};
}
const rate = await getCustomerRate('USD', 'EUR');
console.log(`Mid-market: ${rate.midMarket}`);
console.log(`Customer rate: ${rate.customerRate} (includes ${rate.spread * 100}% fee)`); This approach gives you full control over your pricing while being transparent with your users about the markup.
Quick Reference: Mid-Market vs Retail
| Aspect | Mid-Market Rate | Retail Rate |
|---|---|---|
| Definition | Midpoint between buy/sell | Mid-market + provider's spread |
| Markup | None | 0.3% to 8% |
| Used by | Google, XE, Bloomberg | Banks, exchange bureaus |
| Best for apps | Price display, invoicing, comparison | Simulating actual transfer cost |
| Audit-friendly | Yes (traceable source) | Depends on provider |
Get Transparent Mid-Market Rates
AllRatesToday provides mid-market rates from Reuters/Refinitiv for 160+ currencies. No hidden spreads, no markup. Free tier available.
Get Your Free API Key