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 TypeTypical SpreadImpact on $10,000
Mid-market (interbank)0%$0
Online money transfer (e.g. Wise)0.3–0.7%$30–$70
Bank wire transfer1–3%$100–$300
Credit card foreign transaction1–3%$100–$300
Airport currency exchange3–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:

  1. 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.
  2. Check the documentation: Look for terms like "interbank," "mid-market," or "wholesale." If the docs say "indicative rates" or don't specify, be cautious.
  3. 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

Exchange Rate API provides mid-market rates sourced from Reuters (Refinitiv) and interbank market feeds. Here is what the response looks like:

curl -X GET "https://api.exchange-rateapi.com/v1/rates?source=USD&target=EUR,GBP,JPY" \
  -H "Authorization: Bearer era_live_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 ExchangeRateAPI from '@exchangerateapi/sdk';

const client = new ExchangeRateAPI('era_live_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: Mid-Market vs Retail

AspectMid-Market RateRetail Rate
DefinitionMidpoint between buy/sellMid-market + provider's spread
MarkupNone0.3% to 8%
Used byGoogle, XE, BloombergBanks, exchange bureaus
Best for appsPrice display, invoicing, comparisonSimulating actual transfer cost
Audit-friendlyYes (traceable source)Depends on provider

Get Transparent Mid-Market Rates

Exchange Rate API provides mid-market rates from Reuters/Refinitiv for 160+ currencies. No hidden spreads, no markup. Free tier available.

Get Your Free API Key →

Related Articles