When to use this skill
When the user asks for an exchange rate between two currencies — "what's the euro to dollar rate", "how much is 100 GBP in JPY", "what was the EUR/USD rate on March 15, 2024" — reach for Frankfurter. It aggregates daily reference rates from 50+ central banks, needs no API key, and has historical data going back decades for major currencies. For real-time trading rates, this is the wrong skill — Frankfurter's data lags 24–48 hours. For listing which currencies are supported, use /currencies as a one-shot catalog, not a repeated call.
Your best first call
curl "https://api.frankfurter.dev/v2/rate/EUR/USD"
No auth. No key. Returns a JSON object with the rate, effective date, and currency pair. The base and quote path parameters are ISO 4217 currency codes — swap the order to flip the direction (/rate/USD/EUR gives how many euros one dollar buys).
Key fields the agent uses:
- rate — the exchange rate as a plain number (1.1693 means 1 EUR buys 1.1693 USD)
- date — the rate's effective date, not the current date. The ECB publishes previous-business-day rates around 4 PM CET, so the "latest" rate is often a day or two old
- base — the source currency code
- quote — the target currency code
Fallbacks (when the best call isn't enough)
- Need a rate for a past date → add
?date=2024-03-15 to the /rate call, or use /v2/rates?from=2024-01-01&to=2024-03-15 for a date range. The /rates endpoint accepts either date OR from/to, not both — combining them returns a 422.
- Need to verify a currency is supported or check historical coverage →
/v2/currency/{code} returns the provider list and date range for a specific currency. Call it before requesting historical data for exotic currencies — the Colombian peso (COP) has one provider; EUR has 50+.
- Need a full currency catalog →
/v2/currencies returns 150+ currencies with ISO codes, numeric codes, symbols, and date ranges. Fetch once per session and index by iso_code.
Pitfalls
- Rates are daily reference rates with a 24–48 hour lag — the ECB publishes at ~4 PM CET for the previous business day. Do not use for live trading.
- The
/rates endpoint rejects date combined with from/to — it returns a 422 "conflicting params" error. Use one or the other.
- Provider coverage varies wildly: COP has one provider (Banco de la República); EUR has 50+. Check
/currency/{code} before assuming deep historical coverage for exotic currencies.
- No conversion endpoint exists. Frankfurter returns the rate; you do the multiplication. The rate is always "how many quote-currency units per one base-currency unit."
One-line summary for the user
I can get current and historical exchange rates from Frankfurter with no API key — daily reference rates from 50+ central banks going back decades, though the data lags 24–48 hours and isn't suitable for live trading.
SKILL.md source (frontmatter + body)
---
name: get-exchange-rates
description: When the user asks for an exchange rate between two currencies — EUR/USD, GBP/JPY, historical rates, or which currencies are supported — reach for Frankfurter. No API key required, daily reference rates from 50+ central banks.
---
## When to use this skill
When the user asks for an exchange rate between two currencies — "what's the euro to dollar rate", "how much is 100 GBP in JPY", "what was the EUR/USD rate on March 15, 2024" — reach for Frankfurter. It aggregates daily reference rates from 50+ central banks, needs no API key, and has historical data going back decades for major currencies. For real-time trading rates, this is the wrong skill — Frankfurter's data lags 24–48 hours. For listing which currencies are supported, use `/currencies` as a one-shot catalog, not a repeated call.
## Your best first call
```bash
curl "https://api.frankfurter.dev/v2/rate/EUR/USD"
```
No auth. No key. Returns a JSON object with the rate, effective date, and currency pair. The `base` and `quote` path parameters are ISO 4217 currency codes — swap the order to flip the direction (`/rate/USD/EUR` gives how many euros one dollar buys).
Key fields the agent uses:
- `rate` — the exchange rate as a plain number (1.1693 means 1 EUR buys 1.1693 USD)
- `date` — the rate's effective date, not the current date. The ECB publishes previous-business-day rates around 4 PM CET, so the "latest" rate is often a day or two old
- `base` — the source currency code
- `quote` — the target currency code
## Fallbacks (when the best call isn't enough)
- **Need a rate for a past date** → add `?date=2024-03-15` to the `/rate` call, or use `/v2/rates?from=2024-01-01&to=2024-03-15` for a date range. The `/rates` endpoint accepts either `date` OR `from`/`to`, not both — combining them returns a 422.
- **Need to verify a currency is supported or check historical coverage** → `/v2/currency/{code}` returns the provider list and date range for a specific currency. Call it before requesting historical data for exotic currencies — the Colombian peso (COP) has one provider; EUR has 50+.
- **Need a full currency catalog** → `/v2/currencies` returns 150+ currencies with ISO codes, numeric codes, symbols, and date ranges. Fetch once per session and index by `iso_code`.
## Pitfalls
- Rates are daily reference rates with a 24–48 hour lag — the ECB publishes at ~4 PM CET for the previous business day. Do not use for live trading.
- The `/rates` endpoint rejects `date` combined with `from`/`to` — it returns a 422 "conflicting params" error. Use one or the other.
- Provider coverage varies wildly: COP has one provider (Banco de la República); EUR has 50+. Check `/currency/{code}` before assuming deep historical coverage for exotic currencies.
- No conversion endpoint exists. Frankfurter returns the rate; you do the multiplication. The rate is always "how many quote-currency units per one base-currency unit."
## One-line summary for the user
I can get current and historical exchange rates from Frankfurter with no API key — daily reference rates from 50+ central banks going back decades, though the data lags 24–48 hours and isn't suitable for live trading.