lineofflight/frankfurter

💱 Currency data API

Ruby

1,868

1,073 commits

updated Sep 18, 2026

See the code
api
currency
currency-api
currency-converter
currency-exchange
currency-exchange-rates
forex
money
ruby

README

Frankfurter

Frankfurter is an open-source currency data API that tracks daily exchange rates from central banks and official sources.

Deployment

The public API runs at https://api.frankfurter.dev. If you prefer to host your own instance, you can run Frankfurter with Docker.

Using 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:

Contributing

Restoring provider history

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

Contributors

lineoffligbot

512 commits

hakanensari

457 commits

dependabot[bot]

75 commits

loflofloflof

4 commits

lineofflight/frankfurter

💱 Currency data API

Ruby

1,868

1,073 commits

updated Sep 18, 2026

See the code
api
currency
currency-api
currency-converter
currency-exchange
currency-exchange-rates
forex
money
ruby

README

Frankfurter

Frankfurter is an open-source currency data API that tracks daily exchange rates from central banks and official sources.

Deployment

The public API runs at https://api.frankfurter.dev. If you prefer to host your own instance, you can run Frankfurter with Docker.

Using 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:

Contributing

Restoring provider history

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

Contributors

lineoffligbot

512 commits

hakanensari

457 commits

dependabot[bot]

75 commits

loflofloflof

4 commits

Languages

Ruby

99.9%