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.
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, exchange services, and money transfer companies make money.
| Provider Type | Typical Spread | Impact on $10,000 |
|---|---|---|
| Mid-market (interbank) | 0% | $0 |
| Online 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.
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.
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.
Financial Reporting
Auditors and compliance teams expect rates 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
- Compare against Google: Search "1 USD to EUR" on Google (mid-market rate). If your API's rate differs by more than 0.05%, it may include a spread.
- Check the documentation: Look for "interbank," "mid-market," or "wholesale." If the docs say "indicative rates" or don't specify, be cautious.
- Ask about the source: Reuters, Refinitiv, or Bloomberg = mid-market. Unnamed "multiple sources" = potentially includes 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.
Adding Your Own Transparent Markup
If your business model requires a spread, 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);
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
| 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 |
AllRatesToday provides mid-market rates from institutional interbank market data for 160+ currencies. No hidden spreads, no markup. Free tier available.
Get your free API key | Documentation | GitHub
Written by the team behind AllRatesToday — an exchange rate API with real-time mid-market rates for 150+ currencies and the official published rates of 116 central banks and tax authorities, with keyless open endpoints for the central-bank data. Browse the API docs or grab a free key to start building.
Open source: official SDKs for JavaScript, Python, PHP, Go and Rust,
plus an MCP server (@allratestoday/mcp-server) for AI agents.
Follow along: GitHub
Top comments (0)