sifting/io
Forex & Crypto
8 min readSiftingIO Team

Base currency vs quote currency: how to read a forex pair like EURUSD

What base and quote currency mean, why it's EURUSD and never USDEUR, direct vs indirect quoting, and how to read any FX price. With live API examples.

Base currency vs quote currency: how to read a forex pair like EURUSD

Base currency vs quote currency is the first distinction to get right before any forex price means something. A line like EURUSD = 1.16934 carries three facts at once: which currency is being priced, which currency the price is written in, and how many units of the second buy one unit of the first. Read it backwards and every number downstream, from a treasury conversion to a backtest P&L, comes out wrong. This post covers what the two terms mean, why the market writes EURUSD and never USDEUR, how direct and indirect quoting look from a dollar and a non-dollar desk, and how to read any FX price as units of quote per one unit of base, with live quotes pulled from the SiftingIO API along the way.

What do base currency and quote currency mean#

Every forex symbol concatenates two ISO 4217 currency codes. EURUSD is EUR followed by USD; USDJPY is USD followed by JPY. The first code is the base currency, the asset being priced. The second is the quote currency, the money the price is expressed in. The price is always units of quote currency per one unit of base currency.

So EURUSD = 1.16934 reads as one euro costs 1.16934 US dollars. USDJPY at, say, 147.20 reads as one dollar costs 147.20 yen. The base side is always exactly one unit; only the quote side scales.

A stock quote works the same way with the pricing currency left implicit. AAPL trading at, say, 230 means 230 US dollars per share, and nobody writes AAPLUSD because the pricing currency never changes. In FX either currency could play either role, so the symbol spells both out and the order itself becomes information.

One practical detail rides along with the quote currency: decimal scale. Most pairs print five decimals and one pip is 0.0001. Pairs quoted in yen print three decimals and one pip is 0.01. A parser that hard-codes a decimal count for FX prices breaks the first time a JPY pair arrives.

Why is the pair written EURUSD and never USDEUR#

Nothing mathematical forces the order. USDEUR at 0.85518 encodes the same exchange rate as EURUSD at 1.16934; each is the reciprocal of the other. The interbank market settled on one canonical direction per pair long ago, and brokers, terminals, and data APIs all follow it.

The convention is a priority ladder. When two currencies meet, the one higher in this ranking takes the base slot: EUR, then GBP, AUD, NZD, USD, CAD, CHF, JPY. That single list explains the whole majors board. EUR outranks USD, so the pair is EURUSD. USD outranks JPY, CHF, and CAD, so those three run dollar-first. GBP outranks JPY, so the cross is GBPJPY.

The ladder itself is historical. Sterling was quoted as dollars per pound in the era when the rate crossed the Atlantic by undersea cable, which is why GBPUSD still goes by the nickname cable, and the pre-decimal pound was an awkward divisor anyway. The Australian and New Zealand dollars kept pound-style quoting after decimalization. The euro was assigned the top of the ladder at its 1999 launch.

For code the consequence is blunt: a market data API publishes one direction per pair. On SiftingIO the symbol is EURUSD, and a request for USDEUR returns a 404 instead of an inverted price. If a workflow genuinely needs euros per dollar, fetch EURUSD and take the reciprocal in code, with the bid and ask care described under pitfalls below.

Direct vs indirect quotes, from a dollar and a non-dollar desk#

Direct and indirect describe a pair from a particular country's point of view, and the labels flip depending on where the reader sits.

A direct quote prices one unit of foreign currency in domestic currency; the domestic currency occupies the quote slot. It answers the everyday question: what does one unit of the foreign currency cost in local money An indirect quote puts the domestic currency in the base slot instead.

From a US perspective, EURUSD and GBPUSD are direct quotes: dollars per euro, dollars per pound. USDJPY, USDCHF, and USDCAD are indirect: the dollar is the base and the price arrives in foreign units. Dealers also call the first group American terms and the second European terms.

Move the observer and the labels swap while the symbols stay put. A desk in Tokyo reads USDJPY as its direct quote, yen per one dollar. A treasury team in Istanbul reads USDTRY the same way, lira per dollar, where a higher print means each dollar costs more lira. From Frankfurt, EURUSD is the indirect quote, since the domestic euro sits in the base.

Direct vs indirect is a property of the reader. Base vs quote is a property of the symbol. EURUSD means dollars per euro for everyone on the planet, and that stability is what makes the symbol usable as a wire format between systems that keep books in different currencies.

The major pairs, with base and quote identified#

PairBaseQuoteA price of P means
EURUSDEUR (euro)USD (US dollar)P dollars per euro
USDJPYUSD (US dollar)JPY (Japanese yen)P yen per dollar
GBPUSDGBP (British pound)USD (US dollar)P dollars per pound
USDCHFUSD (US dollar)CHF (Swiss franc)P francs per dollar
USDCADUSD (US dollar)CAD (Canadian dollar)P Canadian dollars per US dollar
AUDUSDAUD (Australian dollar)USD (US dollar)P US dollars per Australian dollar
NZDUSDNZD (New Zealand dollar)USD (US dollar)P US dollars per New Zealand dollar

Crosses follow the same ladder with the dollar absent: EURGBP is pounds per euro, EURJPY is yen per euro, GBPJPY is yen per pound. Exotic pairs almost always keep the dollar as base: USDTRY, USDMXN, USDZAR. Each published pair has a reference page listing its base, quote, and tier, for example EURUSD and USDJPY.

A live snapshot makes the reading concrete. The quote endpoint takes the pair in its canonical direction:

curl -H "X-API-Key: $SIFTING_KEY" \
     "https://api.sifting.io/v1/last/quote/forex/EURUSD"

An abridged response (see /docs for the full field list):

{ "s": "EURUSD", "b": "1.16930", "B": "510300", "a": "1.16938", "A": "585025", "t": 1778019852426 }

The fields are single letters: b and a are the bid and ask prices, B and A their sizes, and t is a Unix millisecond timestamp. One detail catches most first integrations: the prices and sizes come back as quoted strings, so cast them with float() before any arithmetic; only t is already a number. Both prices are in the quote currency, dollars here. The bid b is where the aggregated market buys one euro; the ask a is where it sells one. SiftingIO forms each side as a consensus across multiple independent venues, so the quote reads the same way regardless of which venue a counterparty happens to use.

The quote-per-base rule is also why cross-rate algebra works. EURUSD is USD per EUR and USDJPY is JPY per USD, so their product is JPY per EUR:

import requests

BASE = "https://api.sifting.io/v1/last/quote/forex"
HEADERS = {"X-API-Key": "sft_your_key_here"}

def mid(pair):
    q = requests.get(f"{BASE}/{pair}", headers=HEADERS).json()
    return (float(q["b"]) + float(q["a"])) / 2   # cast: prices are strings

eurusd = mid("EURUSD")   # USD per 1 EUR
usdjpy = mid("USDJPY")   # JPY per 1 USD
print(eurusd * usdjpy)   # JPY per 1 EUR, the EURJPY cross
print(1 / eurusd)        # EUR per 1 USD, the flipped view

With EURUSD at 1.16934 and USDJPY at 147.20, the computed cross is about 172.13 yen per euro. SiftingIO publishes EURJPY directly, so the calculation is a sanity check rather than a necessity, but the unit algebra is the reason the shortcut works. The same symbols stream over WebSocket: connect to wss://stream.sifting.io/ws/v1?key=$SIFTING_KEY, send {"op":"subscribe","product":"fx","symbols":["EURUSD","USDJPY"]}, and ticks arrive as frames like {"f":"tick","s":"EURUSD","p":1.16934,"t":1778019852426}.

Common pitfalls#

Inverting a quote without swapping bid and ask. To flip EURUSD (bid 1.16930, ask 1.16938) into euros per dollar, the new bid is 1 divided by the old ask (0.85515) and the new ask is 1 divided by the old bid (0.85521). Inverting each side in place puts the bid above the ask, and the negative spread usually surfaces far downstream as impossible P&L instead of failing loudly at the source.

Sending the symbol in the wrong shape. The API expects the two codes concatenated in canonical order: EURUSD. A slash (EUR/USD) and a flipped pair (USDEUR) both return a 404. The error doesn't suggest the correct direction, so a flipped symbol sitting in a config file can masquerade as missing coverage for the currency itself.

Forgetting that snapshot prices are strings. The quote fields b, a, B, and A arrive as quoted strings, not numbers. Skip the float() cast and q["b"] + q["a"] concatenates two strings instead of adding two prices, and a comparison like bid <= 0 measures string against number. Convert at the boundary, the moment the response is parsed.

Base and quote are the entire grammar of an FX price: the first code is what's being priced, the second is what it's priced in, and the number is units of quote per one unit of base. The conventions above cover every pair SiftingIO publishes, from the majors in the table to the exotics; coverage, update behavior, and history depth are documented on the forex product page. Start building free

Keep reading

Related posts