💱 Currency data API
See the codeFrankfurter is an open-source currency data API that tracks daily exchange rates from central banks and official sources.
The public API runs at https://api.frankfurter.dev. If you prefer to host your own instance, you can run Frankfurter with Docker.
The quickest way to get started:
docker run -d --init -p 8080:8080 lineofflight/frankfurter
For production, mount a volume to persist the SQLite database across container restarts and set any optional API keys:
docker run -d --init -p 8080:8080 \
-e DATABASE_URL=sqlite:///app/data/frankfurter.sqlite3 \
-e BAM_API_KEY=your_key \
-e BANXICO_API_KEY=your_key \
-e BCCH_USER=your_email \
-e BCCH_PASS=your_password \
-e BOT_API_KEY=your_key \
-e FRED_API_KEY=your_key \
-e TCMB_API_KEY=your_key \
-v ./data:/app/data \
--pull always \
lineofflight/frankfurter
Without a mounted volume, the database is ephemeral and some endpoints may return empty data until their initial backfill completes.
Some data providers require API keys. All are free and optional:
BAM_API_KEY — Bank Al-Maghrib (Morocco). Register at apihelpdesk.centralbankofmorocco.ma.BANXICO_API_KEY — Banco de México. Register at banxico.org.mx.BCCH_USER / BCCH_PASS — Banco Central de Chile. Register at si3.bcentral.cl.BOT_API_KEY — Bank of Thailand. Register at portal.api.bot.or.th.FRED_API_KEY — Federal Reserve. Register at fred.stlouisfed.org.TCMB_API_KEY — Turkish Central Bank. Register at evds3.tcmb.gov.tr.Backfills are incremental by default. To re-fetch previously omitted quotes from each provider's coverage_start:
FULL=1 bundle exec rake backfill # All providers
FULL=1 bundle exec rake 'backfill[CBKKW]' # One provider
This inserts missing rows without replacing existing quotes. Per-day APIs can take days to finish. After the backfills
finish, run bundle exec rake blend:rebuild to rebuild daily, weekly and monthly blends, then
bundle exec rake blend:parity to check materialized results against live computation.
Provider routes retain retired and unknown currency codes. Blends and the currency catalogue exclude unknown codes and observations on or after a currency's terminal date. Early successor labels are relabelled to their configured predecessor. Provider health reports unknown codes for registry updates.
See AGENTS.md for development setup and guidelines.
Built a library or tool with Frankfurter? Share it in Show and Tell
Ruby
99.9%
💱 Currency data API
See the codeFrankfurter is an open-source currency data API that tracks daily exchange rates from central banks and official sources.
The public API runs at https://api.frankfurter.dev. If you prefer to host your own instance, you can run Frankfurter with Docker.
The quickest way to get started:
docker run -d --init -p 8080:8080 lineofflight/frankfurter
For production, mount a volume to persist the SQLite database across container restarts and set any optional API keys:
docker run -d --init -p 8080:8080 \
-e DATABASE_URL=sqlite:///app/data/frankfurter.sqlite3 \
-e BAM_API_KEY=your_key \
-e BANXICO_API_KEY=your_key \
-e BCCH_USER=your_email \
-e BCCH_PASS=your_password \
-e BOT_API_KEY=your_key \
-e FRED_API_KEY=your_key \
-e TCMB_API_KEY=your_key \
-v ./data:/app/data \
--pull always \
lineofflight/frankfurter
Without a mounted volume, the database is ephemeral and some endpoints may return empty data until their initial backfill completes.
Some data providers require API keys. All are free and optional:
BAM_API_KEY — Bank Al-Maghrib (Morocco). Register at apihelpdesk.centralbankofmorocco.ma.BANXICO_API_KEY — Banco de México. Register at banxico.org.mx.BCCH_USER / BCCH_PASS — Banco Central de Chile. Register at si3.bcentral.cl.BOT_API_KEY — Bank of Thailand. Register at portal.api.bot.or.th.FRED_API_KEY — Federal Reserve. Register at fred.stlouisfed.org.TCMB_API_KEY — Turkish Central Bank. Register at evds3.tcmb.gov.tr.Backfills are incremental by default. To re-fetch previously omitted quotes from each provider's coverage_start:
FULL=1 bundle exec rake backfill # All providers
FULL=1 bundle exec rake 'backfill[CBKKW]' # One provider
This inserts missing rows without replacing existing quotes. Per-day APIs can take days to finish. After the backfills
finish, run bundle exec rake blend:rebuild to rebuild daily, weekly and monthly blends, then
bundle exec rake blend:parity to check materialized results against live computation.
Provider routes retain retired and unknown currency codes. Blends and the currency catalogue exclude unknown codes and observations on or after a currency's terminal date. Early successor labels are relabelled to their configured predecessor. Provider health reports unknown codes for registry updates.
See AGENTS.md for development setup and guidelines.
Built a library or tool with Frankfurter? Share it in Show and Tell
Ruby
99.9%