Dúvidas ou problemas? Poste no GitHub Discussions.

Você não precisa de SDK. O fetch já vem em todo navegador, no Node, no Deno, no Bun e em runtimes de edge. O CORS é aberto e não há chave para vazar, então você pode chamar a API direto do código no cliente.

Início rápido

Busque uma cotação e converta:

const res = await fetch("https://api.frankfurter.dev/v2/rate/usd/eur");
const data = await res.json();
const total = 100 * data.rate;

A resposta é um objeto plano: {"date": "2026-07-17", "base": "USD", "quote": "EUR", "rate": 0.8739}. O fetch resolve mesmo com erro HTTP, então confira res.ok. Um código de moeda inválido retorna 422 com uma mensagem em JSON.

Formatar com Intl

Não posicione símbolos de moeda manualmente. O Intl.NumberFormat sabe o símbolo, a posição dele e as casas decimais de cada moeda, em qualquer locale:

const res = await fetch("https://api.frankfurter.dev/v2/rate/usd/eur");
const { rate } = await res.json();

const eur = new Intl.NumberFormat("en", {
  style: "currency",
  currency: "EUR",
});
eur.format(100 * rate); // "€87.39"

Símbolos e casas decimais

Não precisa embutir no projeto uma tabela de metadados com subunidades e símbolos. Pergunte ao formatador:

const yen = new Intl.NumberFormat("en", {
  style: "currency",
  currency: "JPY",
});

yen.resolvedOptions().maximumFractionDigits; // 0, o iene não tem subunidades
yen.formatToParts(1).find((part) => part.type === "currency").value; // "¥"

Veja todas as moedas que o Frankfurter oferece, com códigos e símbolos.

Várias cotações de uma vez

/v2/rates retorna um array plano, com uma linha por cotação. Transforme-o num objeto indexado por moeda com Object.fromEntries. Omita quotes para receber todas as moedas.

const api = "https://api.frankfurter.dev";
const res = await fetch(`${api}/v2/rates?base=usd&quotes=eur,gbp,jpy`);
const rows = await res.json();

const rates = Object.fromEntries(rows.map((row) => [row.quote, row.rate]));
// { EUR: 0.8739, GBP: 0.74388, JPY: 162.33 }

Fixar uma fonte oficial

Por padrão, você recebe a combinação de todas as fontes. Adicione providers para fixar uma única autoridade, o que importa quando uma jurisdição exige a taxa publicada pelo próprio banco central, como a taxa de referência do BCE para o IVA da UE.

const api = "https://api.frankfurter.dev";
const res = await fetch(`${api}/v2/rate/usd/eur?providers=ecb`);

Veja todas as fontes. Uma fonte fixada segue o próprio calendário de publicação, então a cotação mais recente dela pode ficar um dia atrás da cotação combinada mais recente.

Teste ao vivo

Monte consultas e veja as respostas sem sair do navegador, no playground.