Voltar ao Blog

Alternativas à API Frankfurter em 2026: uma comparação honesta para programadores

V
Vlado Grigirov
August 28, 2026
Currency API Exchange Rates Frankfurter API Comparison Free API Developer Guide

Se você está procurando alternativas à API Frankfurter, é bem provável que já tenha colocado algo em produção com ela. A Frankfurter é a API gratuita de taxas de câmbio padrão para uma geração inteira de projetos paralelos: sem chave de API, sem cadastro, sem cota, uma superfície REST limpa e um código aberto que dá para ler numa tarde. Aí algo muda — uma dúvida de conformidade, um bug de fim de semana, um cliente que precisa de taxas intradiárias — e você começa a se perguntar o que mais existe por aí.

Este guia é um olhar honesto sobre essa decisão. Ele cobre o que a Frankfurter realmente faz em 2026 (a maioria dos artigos comparativos trabalha com informação desatualizada), os cinco limites específicos que afastam as equipes dela e os três caminhos realistas: auto-hospedar, migrar para uma API comercial com chave ou montar um híbrido. Há um exemplo de migração no final.

O que a Frankfurter realmente é em 2026

Quase todas as listas de "melhores APIs de moeda gratuitas" ainda descrevem a Frankfurter como "taxas do BCE, cerca de 30 moedas, sem dados de fim de semana". Isso foi verdade por anos. Já não é.

A API v2 em frankfurter.dev acompanha taxas diárias de 84 bancos centrais, cobrindo 201 moedas, com histórico que chega até 1948. É genuinamente gratuita para uso comercial, não exige autenticação, não publica cota mensal nem diária e entrega saída em CSV e NDJSON além de JSON. Há uma especificação OpenAPI, um llms.txt e um servidor MCP para fluxos com agentes. Você pode auto-hospedar com Docker.

Isso é um produto mais forte do que as listas reconhecem, e vale dizer com clareza: para um grande número de projetos, a Frankfurter é a resposta certa e você não deveria migrar. Se você está construindo um controlador de finanças pessoais, uma página de referência de moedas, uma ferramenta de faturamento que fixa taxas uma vez por dia ou um notebook de ciência de dados puxando uma década de médias mensais, a Frankfurter faz isso bem e não custa nada.

O resto deste artigo é sobre os casos em que ela não serve.

Cinco limites que levam equipes a procurar alternativas à API Frankfurter

1. Taxas de referência diárias não são taxas ao vivo

Este é o limite estrutural, e não é um defeito — é o que a fonte de dados é. Taxas de referência de bancos centrais são publicadas uma vez por dia útil. O BCE, por exemplo, publica suas taxas de referência do euro todo dia útil por volta das 16:00 CET. A Frankfurter expõe fielmente esses números.

Isso significa que uma taxa consultada às 09:00 e outra às 15:00 são o mesmo número, mesmo que o mercado tenha se movido 1,2% no intervalo. Para um conversor apenas de exibição, ninguém percebe. Para uma página de checkout, um cálculo de repasse ou qualquer coisa em que o cliente compare seu número com o do Google, esse atraso vira um chamado de suporte.

Se o seu produto precisa de taxas que se movem durante o dia, você precisa de uma fonte de dados de mercado, não de uma fonte de taxas de referência. A API da Finexly atualiza a cada minuto durante o horário de mercado em mais de 170 moedas, o que é um modelo de dados diferente, não uma versão melhor do mesmo. Nosso texto sobre de onde vêm os dados das APIs de câmbio detalha a distinção.

2. Não existem linhas de fim de semana nem de feriado

Bancos centrais não publicam aos sábados, domingos ou feriados nacionais. Então uma consulta para 2026-08-23 não retorna nada útil, e uma série temporal de um mês tem cerca de 21 linhas, não 31.

Toda equipe bate nisso do mesmo jeito: uma rotina noturna roda no domingo, recebe um resultado vazio ou deslocado e ou quebra, ou — bem pior — grava silenciosamente um null no razão. Se você constrói sobre taxas diárias de qualquer fonte de banco central, precisa de uma política explícita de preenchimento para frente, e precisa documentá-la, porque "usar a última taxa publicada" e "pular a linha" produzem demonstrações financeiras diferentes.

3. Taxas combinadas podem mudar depois de publicadas

Por padrão, a Frankfurter combina taxas de todos os provedores contribuintes. O próprio FAQ dela é refrescantemente direto sobre a consequência: as últimas casas decimais podem mudar conforme novos dados chegam e, para conformidade, você deve filtrar por um provedor específico.

É um design perfeitamente razoável para uso geral. Vira problema se você armazena uma taxa, mostra ao usuário e depois reconcilia contra uma nova consulta — você vai encontrar pequenas divergências muito difíceis de explicar a um auditor. A correção na Frankfurter é passar providers=ECB (ou a autoridade que regula você) em vez de aceitar a combinação. A correção no seu próprio sistema é persistir a taxa que você de fato usou no momento da transação e nunca derivá-la de novo. Essa regra vale para qualquer provedor, e tratamos dela no guia de taxas de câmbio e declaração fiscal.

4. Sem chave de API não há cota — nem visibilidade

"Não requer chave de API" é o melhor recurso da Frankfurter e o seu risco mais subestimado. Como não há chave:

  • Você não tem cota por aplicação. Divide um limitador público com a internet inteira, incluindo quem estiver martelando o serviço agora a partir de um laço mal escrito.
  • Você não tem telemetria de uso. Nenhum painel vai te avisar que seu volume de chamadas triplicou na terça passada.
  • Você não tem relação de suporte. Há uma página de status e um rastreador de issues no GitHub, o que é mais do que muitos serviços gratuitos oferecem, mas não há SLA nem alguém para acionar.

A orientação do próprio projeto é explícita: para uso de alto volume, faça cache das respostas, auto-hospede ou consulte os conjuntos de dados diretamente. É um conselho honesto, e também é o momento em que muitas equipes começam a avaliar alternativas à API Frankfurter — não porque os dados estejam errados, mas porque assumiram uma dependência de produção sem contrato nenhum por trás.

5. Não há endpoint de conversão

A Frankfurter documenta isso de propósito: pegue a taxa e multiplique. São três linhas de código.

São também três linhas de código que acabam escritas de forma ligeiramente diferente em seis lugares da sua base, e num deles alguém divide quando deveria multiplicar. Um endpoint convert dedicado não é uma necessidade técnica; é uma forma de ter exatamente uma implementação das regras de arredondamento e de direção. Se você já publicou um bug em que EUR→USD e USD→EUR divergiam em 0,3%, você sabe por que isso importa. Nosso guia de arredondamento e casas decimais em moedas cobre o resto desse campo minado.

Alternativas à API Frankfurter, comparadas

Os detalhes dos planos gratuitos abaixo são os publicados por cada provedor no momento em que este texto foi escrito. Verifique antes de se comprometer — planos gratuitos mudam mais do que a documentação.

APIPlano gratuitoFrequência de atualizaçãoAutenticaçãoMoeda baseMelhor para
FrankfurterIlimitado (limitado contra abuso, sem SLA)Diária, dias úteisNenhumaQualquerProjetos pessoais, contabilidade, pesquisa histórica
Frankfurter auto-hospedadaGrátis + custo da sua infraDiária, dias úteisSuaQualquerTimes que precisam de controle e já usam Docker
Finexly1.000 req/mêsA cada minuto no horário de mercadoChave BearerQualquer (base customizada em planos superiores)Produtos que precisam de taxas intradiárias e um canal de suporte
ExchangeRate-API~1.500 req/mêsDiáriaChaveQualquerPainéis atualizados uma vez por dia
Open Exchange Rates1.000 req/mêsPor horaChaveSó USD no gratuitoApps de servidor que aceitam base USD
Fixer.io100 req/mêsPor horaChaveSó EUR no gratuitoIntegrações legadas
Duas coisas se destacam. Primeiro, ninguém supera a Frankfurter em cota, porque a Frankfurter não tem cota. Se a sua restrição é volume bruto de chamadas contra taxas diárias, a resposta é auto-hospedar a Frankfurter, não comprar uma cota menor em outro lugar. Segundo, as opções pagas não estão vendendo os mesmos dados com embalagem melhor — estão vendendo uma frequência de atualização diferente e uma relação de suporte. Se nenhuma das duas é o seu problema, migrar é um retrocesso.

Temos análises lado a lado de várias delas na comparação de APIs de moeda e na nossa comparação de APIs de câmbio em tempo real.

Opção 1: auto-hospedar a Frankfurter

A resposta mais subutilizada. A Frankfurter publica uma imagem Docker, e rodá-la você mesmo elimina as duas coisas que realmente preocupam equipes em produção: o limitador compartilhado e a falta de controle.

docker run -d -p 8080:8080 --name frankfurter \
  lineofflight/frankfurter

O que você ganha: chamadas internas ilimitadas, o seu próprio destino em disponibilidade e a capacidade de fixar um provedor. O que você assume: um contêiner, um banco de dados, monitoramento e alguém que perceba quando a coleta upstream quebrar num feriado bancário. É um custo real — é basicamente o argumento da nossa análise de construir ou comprar, aplicado a um código que outra pessoa já escreveu.

Auto-hospedar é a escolha certa quando seu volume é alto, seus requisitos de latência são rígidos e taxas de referência diárias são de fato suficientes. Não ajuda em nada se o problema é precisar de taxas intradiárias — você só vai rodar sua própria cópia dos mesmos dados diários.

Opção 2: migrar para uma API com chave e taxas intradiárias

Se o motivo de você estar aqui é frescor das taxas, cobertura de pares exóticos ou a necessidade de alguém responder a um e-mail, uma API comercial com chave é a resposta honesta.

Aqui está a mesma tarefa nas duas. Frankfurter primeiro:

curl "https://api.frankfurter.dev/v2/rate/USD/EUR"

E o equivalente na Finexly:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.finexly.com/v1/rate?from=USD&to=EUR"
{ "pair": "USD_EUR", "rate": 0.9215 }

Mapeamento de endpoints

TarefaFrankfurter v2Finexly v1
Listar moedasGET /v2/currenciesGET /v1/currencies
Par únicoGET /v2/rate/EUR/USDGET /v1/rate?from=EUR&to=USD
Vários paresGET /v2/rates?base=USD&quotes=EUR,GBPGET /v1/convert?q=USD_EUR,USD_GBP
Converter um valor(não existe — multiplique você mesmo)GET /v1/convert-amount?from=USD&to=EUR&amount=100
HistóricoGET /v2/rates?date=1999-01-04Planos pagos — veja o guia de taxas históricas
A principal mudança de formato é a chamada multi-par. A Frankfurter usa uma base e uma lista de moedas cotadas; a Finexly recebe uma lista de pares BASE_QUOTE explícitos, o que permite buscar USD_EUR e GBP_JPY na mesma requisição sem divisão cruzada.

Um wrapper de migração

Não espalhe um cliente novo pela base de código. Coloque os dois atrás de uma única interface, para que voltar atrás seja só mudar configuração:

import os
import requests

FINEXLY_KEY = os.environ["FINEXLY_API_KEY"]

def get_rate(base: str, quote: str, provider: str = "finexly") -> float:
    """Return the mid-market rate for base->quote."""
    if provider == "frankfurter":
        r = requests.get(
            f"https://api.frankfurter.dev/v2/rate/{base}/{quote}",
            timeout=5,
        )
        r.raise_for_status()
        return float(r.json()["rate"])

    r = requests.get(
        "https://api.finexly.com/v1/rate",
        params={"from": base, "to": quote},
        headers={"Authorization": f"Bearer {FINEXLY_KEY}"},
        timeout=5,
    )
    r.raise_for_status()
    return float(r.json()["rate"])

print(get_rate("USD", "EUR"))

Dois detalhes que vale copiar. A chave de API vem do ambiente, nunca do código-fonte — a documentação da Finexly observa que chaves passadas como parâmetro de consulta podem vazar por logs de acesso do servidor e por cabeçalhos HTTP Referrer, então o cabeçalho Authorization é o caminho de produção. E toda chamada tem timeout, porque o padrão da maioria dos clientes HTTP é "esperar para sempre".

Acompanhe os cabeçalhos de resposta X-RateLimit-Limit, X-RateLimit-Used e X-RateLimit-Units para ver o consumo de cota em tempo real. Essa telemetria é justamente o que uma API sem autenticação não pode te dar, e muitas vezes é o verdadeiro motivo de as equipes migrarem.

Opção 3: o híbrido — cacheie um, recorra ao outro

O padrão para o qual a maioria dos sistemas em produção converge. Use seu provedor principal, faça cache agressivo e mantenha a API gratuita sem autenticação como último recurso:

const CACHE = new Map();
const TTL_MS = 60_000;

async function getRate(base, quote) {
  const key = `${base}_${quote}`;
  const hit = CACHE.get(key);
  if (hit && Date.now() - hit.at < TTL_MS) return hit.rate;

  let rate;
  try {
    const res = await fetch(
      `https://api.finexly.com/v1/rate?from=${base}&to=${quote}`,
      { headers: { Authorization: `Bearer ${process.env.FINEXLY_API_KEY}` } }
    );
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    rate = (await res.json()).rate;
  } catch (err) {
    // Degrade to daily reference rates rather than failing the request
    const res = await fetch(`https://api.frankfurter.dev/v2/rate/${base}/${quote}`);
    rate = (await res.json()).rate;
  }

  CACHE.set(key, { rate, at: Date.now() });
  return rate;
}

Um cache de 60 segundos sobre um plano gratuito de 1.000 requisições cobre com folga um app pequeno, porque seu volume de chamadas passa a ser função do tempo, e não do tráfego. Marque as respostas de fallback nos seus logs para que uma degradação silenciosa para a taxa de ontem não passe despercebida por uma semana. Há mais sobre escolha de TTL e comportamento de retentativa no nosso guia de cache e tratamento de erros.

Um checklist de decisão

Percorra esta lista e pare no primeiro "sim":

  1. As taxas precisam mudar durante o pregão? → Você precisa de uma API de dados de mercado, não de taxas de referência.
  2. É um fluxo regulado ou auditado? → Fixe um provedor nomeado, guarde a taxa que usou, nunca derive de novo.
  3. Seu volume de chamadas é alto mas taxas diárias bastam? → Auto-hospede a Frankfurter.
  4. Precisa que alguém responda quando quebrar? → Você precisa de um plano com chave e nível de suporte.
  5. Nada acima? → Fique na Frankfurter. Faça cache, trate a lacuna de fim de semana e gaste seu tempo em outra coisa.

A maioria das equipes que sai atrás de alternativas à API Frankfurter descobre no passo 5 que o problema real era um cache faltando e um domingo não tratado.

Perguntas frequentes

A API Frankfurter é mesmo gratuita para uso comercial? Sim. O projeto declara que é gratuita para uso comercial, sem cota mensal ou diária — as requisições são limitadas apenas para evitar abuso. A contrapartida é que não há SLA nem contrato de suporte, então o risco é seu.

A Frankfurter fornece só taxas do BCE? Não mais. A API v2 combina dados de 84 bancos centrais em 201 moedas, e você pode restringir a uma única fonte com o parâmetro providers. A descrição difundida de "só BCE, 30 moedas" se refere a versões antigas.

Por que a Frankfurter não retorna dados nos fins de semana? Porque bancos centrais não publicam taxas de referência em dias não úteis. Qualquer API construída sobre dados de bancos centrais tem a mesma lacuna. Ou você preenche para frente com a última taxa publicada, ou usa uma fonte de mercado que cota continuamente.

Qual é a melhor alternativa gratuita à Frankfurter? Depende do que "gratuito" precisa te comprar. Para taxas diárias ilimitadas, nada supera a Frankfurter — auto-hospede. Para um plano gratuito com atualização intradiária e uma chave de API de verdade, o plano gratuito da Finexly dá 1.000 requisições por mês em mais de 170 moedas. Veja nosso guia de APIs de moeda gratuitas para o panorama completo.

Posso usar a Frankfurter e uma API paga juntas? Sim, e é uma arquitetura sensata. Direcione o tráfego normal ao provedor principal e caia para a Frankfurter em caso de erro, como no exemplo híbrido acima. Só garanta que as respostas de fallback sejam registradas, já que carregam garantias de frescor diferentes.

Comece agora

Se taxas de referência diárias bastam para o que você está construindo, fique na Frankfurter — é um bom projeto e não vai custar nada. Se você precisa de taxas que se movem durante o dia, cobertura além dos conjuntos de referência dos bancos centrais ou cabeçalhos de uso que dê para monitorar de verdade, pegue sua chave gratuita da API Finexly — sem cartão de crédito. Comece com 1.000 requisições por mês em mais de 170 moedas e evolua conforme crescer, ou compare os planos antes na nossa página de preços.

Vlado Grigirov

Senior Currency Markets Analyst & Financial Strategist

Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...

View full profile →

Compartilhar este artigo