---
title: "Get exchange rates"
method: GET
path: "/rates"
---

# Get exchange rates

`GET /rates`

Returns exchange rates blended across providers. Without date params, returns the latest rates. Each record is a single currency pair. The response includes an identity record for the base currency (base equals quote, rate 1), subject to the quotes filter like any other record. Daily date ranges of any length are served, including full history. Limit: requests using `providers` or `expand=providers` recompute the blend per date, so at daily granularity they return 422 for ranges longer than 5 years. With `providers` naming at most 5 providers, a `quotes` list of at most 5 currencies lifts the cap; without `providers`, `expand=providers` ranges compute every currency regardless of `quotes`, so aggregate with `group=week` or `group=month`, add `providers`, or split the range into shorter requests.

## Query parameters

- `date` string, date
- `from` string, date
- `to` string, date
- `base` string
- `quotes` string
- `providers` string
- `group` 'week' | 'month'
- `expand` 'providers'

## Response `200`

Exchange rates

- Rate[]
  - `date` string, date, required — The date of the rate
  - `base` string, required — Base currency code
  - `quote` string, required — Quote currency code
  - `rate` number, required — Exchange rate value
  - `providers` object[] — Per-provider rates for this pair. Present only when `expand=providers` is set. Each entry has the provider's observation date and published rate (rebased to the row's base). Entries with `excluded: true` did not contribute to the blended `rate` — either flagged as outliers by the consensus filter, or overridden by a currency peg. Omitted on synthesized peg rows where no provider published the quote.
    - `key` string, required — Provider key
    - `date` string, date, required — Provider observation date used for this entry
    - `rate` number, required — Provider's rate, rebased to the row's base
    - `excluded` boolean — Present and true when this entry did not contribute to the blended rate

## Other responses

- `404` — No data found
- `422` — Invalid request
- `503` — The request deadline expired before the response could be computed. Retry with a narrower request: filter with quotes, aggregate with group, or split the range into shorter requests.

## Changes

- **2026-07-22** (v2) `ebf82a6197fc` — 1 info
  - added the non-success response with the status `503`
- **2026-07-06** (v2) `0295842e0d54` — 1 info
  - added the required property `items/providers/items/date` to the response with the `200` status
- **2026-05-07** (v2) `4041a71e2865` — 1 breaking, 3 info
  - the `items/providers/items/` response's property type/format changed from `string`/`` to `object`/`` for status `200`
  - added the optional property `items/providers/items/excluded` to the response with the `200` status
  - added the required property `items/providers/items/key` to the response with the `200` status
  - added the required property `items/providers/items/rate` to the response with the `200` status
- **2026-04-28** (v2) `6f66aaf7e5a8` — 2 info
  - added the new optional `query` request parameter `expand`
  - added the optional property `items/providers` to the response with the `200` status
- **2026-03-27** (v2) `7f616d04dcbc` — 5 breaking
  - the response's body type/format changed from `object`/`` to `string`/`` for status `200`
  - removed the required property `base` from the response with the `200` status
  - removed the required property `date` from the response with the `200` status
  - removed the required property `quote` from the response with the `200` status
  - …1 more

[Full history](https://skmtc.dev/lineofflight/apis/frankfurter-api/changes/rates/get.md)

---

[API](https://skmtc.dev/lineofflight/apis/frankfurter-api.md) · [All operations](https://skmtc.dev/lineofflight/apis/frankfurter-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/lineofflight/frankfurter-api/revisions/30aa6112e44b/schema)
