O Frankfurter é uma API de câmbio gratuita para 223 moedas, com dados de 104 bancos centrais e fontes oficiais. As cotações são atualizadas diariamente e remontam a 1948.

A API pública fica em api.frankfurter.dev e não exige chave de API. O projeto é open source, então você também pode hospedar sua própria instância e ter controle total.

Usando um agente de IA? Aponte-o para o llms.txt ou adicione o servidor MCP.

Cotações

Busque as cotações mais recentes.

curl https://api.frankfurter.dev/v2/rates

Troque a moeda base com base.

curl https://api.frankfurter.dev/v2/rates?base=usd

Filtre as moedas de cotação com quotes.

curl https://api.frankfurter.dev/v2/rates?quotes=usd,gbp

Cotações históricas

Consulte as cotações de uma data específica.

curl https://api.frankfurter.dev/v2/rates?date=1999-01-04

Séries temporais

Busque cotações de um período com from e to.

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01&quotes=usd

Dica: filtrar as moedas mantém as respostas pequenas. Para períodos longos, peça NDJSON e receba os resultados em streaming, linha a linha.

Agrupamento

Reduza a granularidade de uma série temporal com group. Aceita week e month.

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01&group=month

Filtrar por fonte

Limite a consulta a fontes específicas com providers.

curl https://api.frankfurter.dev/v2/rates?providers=ecb

Por padrão, as cotações combinam todas as fontes. Use providers para buscar cotações de uma fonte específica ou use as rotas por fonte para consultar uma fonte diretamente.

Atribuição de fontes

Adicione expand=providers para ver quais fontes entraram em cada cotação combinada.

curl https://api.frankfurter.dev/v2/rates?expand=providers

Cada linha ganha um array providers com as chaves das fontes que contribuíram. Linhas de moedas com paridade fixa não trazem esse campo: essas cotações vêm da paridade, não de dados das fontes.

Saída em CSV

As cotações também saem em CSV. Adicione .csv ao path ou defina o header Accept como text/csv.

curl https://api.frankfurter.dev/v2/rates.csv

Saída em NDJSON

Para respostas grandes, peça NDJSON (JSON delimitado por quebra de linha) definindo o header Accept como application/x-ndjson. Cada linha é um objeto JSON independente, útil para fazer streaming de séries temporais longas sem manter a resposta inteira em buffer.

curl https://api.frankfurter.dev/v2/rates?from=2026-01-01

Cotação

Busque a cotação de um único par de moedas. Se quiser, adicione date ou providers.

curl https://api.frankfurter.dev/v2/rate/eur/usd

Moedas

Liste as moedas disponíveis e as fontes que cobrem cada uma.

curl https://api.frankfurter.dev/v2/currencies

Inclua moedas descontinuadas com scope.

curl https://api.frankfurter.dev/v2/currencies?scope=all

Moeda

Veja os detalhes de uma moeda e as fontes que a cobrem.

curl https://api.frankfurter.dev/v2/currency/eur

Fontes

Liste as fontes de dados por trás da API.

curl https://api.frankfurter.dev/v2/providers

Veja os detalhes de uma fonte.

curl https://api.frankfurter.dev/v2/providers/ecb

Cotações por fonte

Consulte as cotações direto de uma fonte específica. Aceita os mesmos parâmetros de /v2/rates e /v2/rate.

curl https://api.frankfurter.dev/v2/providers/ecb/rates

Busque um único par de moedas dessa fonte.

curl https://api.frankfurter.dev/v2/providers/ecb/rate/eur/usd

Combine com date, intervalos de datas (from e to) ou agrupamento. Formatos como .csv e ndjson também funcionam aqui.

curl https://api.frankfurter.dev/v2/providers/ecb/rates?date=2024-05-15

Conversão

Não existe endpoint de conversão. Busque a cotação e converta em poucas linhas de código.

function convert(base, quote, amount) {
  const api = "https://api.frankfurter.dev";
  return fetch(`${api}/v2/rate/${base}/${quote}`)
    .then((r) => r.json())
    .then((d) => (amount * d.rate).toFixed(2));
}

convert("eur", "usd", 10).then((result) =>
  alert(`10 EUR = ${result} USD`)
);

Erros

A API retorna códigos de status HTTP padrão com um corpo JSON.

{
  "status": 422,
  "message": "invalid currency: ABC"
}
400
Parâmetro inválido ou requisição malformada.
404
Moeda, cotação ou recurso não encontrado.
422
Requisição entendida, mas não pode ser processada.

Self-hosting

Você pode hospedar o Frankfurter com Docker. O guia de deploy cobre a configuração para produção e as chaves de API.

FAQ

Para quem é o Frankfurter (e para quem não é)?
Funciona bem para cobrança de SaaS, e-commerce, relatórios fiscais, ERPs e sistemas contábeis, e pesquisa acadêmica com séries históricas desde 1948. Não é para trading em tempo real nem para negócios com moedas exóticas sujeitas a oscilações intraday bruscas.
A API é gratuita para uso comercial?
Sim. As cotações em si seguem os termos de cada provedor.
A API tem limite de requisições?
Não há cotas. As requisições têm rate limit para evitar abuso, mas não há limite diário nem mensal. Para volumes altos, considere fazer cache das respostas, hospedar sua própria instância ou consultar os datasets diretamente.
A API suporta GraphQL?
Não. A API REST é simples o bastante, e GraphQL só adicionaria complexidade sem muito ganho. Também quebraria o edge caching, que mantém a API rápida. Use parâmetros de query como base, quotes e from/to para buscar exatamente os dados de que você precisa.
A API v1 vai ser desativada?
Não. A API v1 está deprecated e foi substituída pela v2, mas continua no ar por tempo indeterminado. Veja a documentação da v1. Para dados do Banco Central Europeu, use /v2/providers/ecb/rates.
Qual é a política de privacidade da API?
A API não coleta nem registra dados pessoais, endereços IP ou URLs de requisição. A instância pública roda atrás da Cloudflare para cache e proteção contra DDoS; a Cloudflare só fornece estatísticas agregadas de tráfego.
Preciso declarar a API nos rótulos de privacidade da App Store ou do Google Play?
Não. Como as consultas são anônimas e nenhum log de requisição é mantido, elas contam como “Dados não coletados” pelas diretrizes da Apple e do Google Play.
Onde posso reportar um bug ou tirar dúvidas?
Abra uma issue para reportar bugs, pedir funcionalidades ou sugerir novas fontes de dados. Use o Discussions para tirar dúvidas ou compartilhar bibliotecas e ferramentas que você criou com o Frankfurter.
Quão precisas são as cotações?
Para compliance, filtre por uma fonte específica e use as taxas de referência oficiais dela. Para uso geral, as cotações combinadas padrão funcionam bem, embora as últimas casas decimais possam mudar conforme chegam novos dados.
As cotações são médias, de compra ou de venda?
A API retorna cotações médias de mercado (mid-market). Quando uma fonte publica cotações de compra e venda em vez de uma taxa de referência, o Frankfurter armazena as duas e calcula o ponto médio.
Todas as cotações são diárias?
Quase todas. Algumas fontes fornecem observações semanais, mensais ou trimestrais. Essas fontes não entram no feed combinado. Consulte-as diretamente com o filtro providers.
Por que algumas moedas antigas e novas têm datas sobrepostas?
Algumas fontes aplicam a moeda substituta retroativamente ao período da moeda antiga (por exemplo, TRL termina em 2010 enquanto TRY começa em 1996). Registramos os dados das fontes como vêm e só filtramos as sobreposições na combinação.
Por que Frankfurter?
Porque o Banco Central Europeu, nossa fonte de dados original, fica em Frankfurt.
European Central Bank and Main riverfront, Frankfurt