Exchange rateswithout guesswork.

Request one base currency and receive explicit quote records with their own timestamps and freshness state.

FX APILocal preview
api.narwhalapi.com 200 OK
GET/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
    }
  ]
}

Each rate explains when it applies.

Clear direction

One unit of the base always equals the returned amount of the quote currency.

Per-rate freshness

Each currency keeps its own timestamp and stale state instead of inheriting one vague update time.

Market session

Open, weekend, or interbank closed tells you the market context around the rates.

Stable records, not dynamic keys.

Rates arrive as an ordered list of explicit records. That makes the response predictable for applications, generated SDKs, JSON Schema, and MCP clients.

base
Currency that equals one unit.
market_session
Current context for the FX market.
rate
Decimal-string quote for the currency.
timestamp / stale
Freshness attached to each selected rate.
Endpoint planv1
GET/v1/fx/rates/{base}

Latest selected exchange rates

First release
GET/v1/fx/convert/{from}/{to}/{amount}

Indicative decimal-safe conversion

Next release

These pages show the accepted response shape. Public API traffic remains disabled during backend hardening.

Narwhal mascot holding a life ring beside flowing data lines

A weekend rate can still be honest.

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.

Start with one FX request.

Choose a base, select the currencies you need, and keep every rate in one predictable shape.