Frankfurter
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/ratesTroque a moeda base com base.
curl https://api.frankfurter.dev/v2/rates?base=usdFiltre as moedas de cotação com quotes.
curl https://api.frankfurter.dev/v2/rates?quotes=usd,gbpCotações históricas
Consulte as cotações de uma data específica.
curl https://api.frankfurter.dev/v2/rates?date=1999-01-04Séries temporais
Busque cotações de um período com from e to.
curl https://api.frankfurter.dev/v2/rates?from=2026-01-01"es=usdDica: 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=monthFiltrar 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.csvSaí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-01Cotaçã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/usdMoedas
Liste as moedas disponíveis e as fontes que cobrem cada uma.
curl https://api.frankfurter.dev/v2/currenciesInclua moedas descontinuadas com scope.
curl https://api.frankfurter.dev/v2/currencies?scope=allMoeda
Veja os detalhes de uma moeda e as fontes que a cobrem.
curl https://api.frankfurter.dev/v2/currency/eurFontes
Liste as fontes de dados por trás da API.
curl https://api.frankfurter.dev/v2/providersVeja os detalhes de uma fonte.
curl https://api.frankfurter.dev/v2/providers/ecbCotaçõ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/ratesBusque 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-15Conversã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,quotesefrom/topara 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,
TRLtermina em 2010 enquantoTRYcomeç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.