Clear direction
One unit of the base always equals the returned amount of the quote currency.
Request one base currency and receive explicit quote records with their own timestamps and freshness state.
/v1/fx/rates/USD?currencies=EUR,JPY{
"base": "USD",
"market_session": "open",
"rates": [
{
"currency": "EUR",
"rate": "0.9200",
"timestamp": "2026-08-22T06:29:41Z",
"stale": false
},
{
"currency": "JPY",
"rate": "147.23",
"timestamp": "2026-08-22T06:29:39Z",
"stale": false
}
]
}One unit of the base always equals the returned amount of the quote currency.
Each currency keeps its own timestamp and stale state instead of inheriting one vague update time.
Open, weekend, or interbank closed tells you the market context around the rates.
Rates arrive as an ordered list of explicit records. That makes the response predictable for applications, generated SDKs, JSON Schema, and MCP clients.
basemarket_sessionratetimestamp / stale/v1/fx/rates/{base}Latest selected exchange rates
First release/v1/fx/convert/{from}/{to}/{amount}Indicative decimal-safe conversion
Next releaseThese pages show the accepted response shape. Public API traffic remains disabled during backend hardening.

Narwhal does not pretend the market is always open. Market session, effective timestamp, and per-rate freshness remain visible so an application can decide whether to use the value.
Choose a base, select the currencies you need, and keep every rate in one predictable shape.