Câmbio PTAX do Banco Central

Banco Central PTAX exchange rates as clean JSON

A PTAX API entrega as taxas de câmbio oficiais (PTAX) do Banco Central em JSON limpo: cotação de uma data, série histórica e conversão. Trata datas, feriados/fins de semana e boletins, e devolve os valores como string decimal exata (nunca float) — feita para uso fiscal/contábil e como ferramenta de IA.

The PTAX API serves the Banco Central's official exchange rates as clean JSON: single-date quote, historical series, and conversion. It handles dates, weekends/holidays and bulletins, and returns values as exact decimal strings (never float).

Base: https://ptax.api.insyde.one — aberta, sem autenticação / open, no auth.

Valor primário: cotacaoCompra (bid) e cotacaoVenda (ask), em BRL por unidade — sempre os dois. paridade* é a relação com o dólar (tipoMoeda A = unidades por USD, B = USD por unidade).
Primary value: cotacaoCompra (bid) and cotacaoVenda (ask), in BRL per unit — always both. paridade* is the USD relation.

1. Moedas / Currencies

O PTAX cota 10 moedas de boletim diário: / PTAX quotes 10 daily-bulletin currencies:

GET /moedas            // catálogo (code, name, tipoMoeda)
GET /moedas?q=euro     // busca por código/nome/apelido

USD EUR GBP JPY CHF CAD AUD DKK NOK SEK. Código inválido em qualquer rota → 400 listando os válidos.

2. Cotação de uma data / One date — /rate/{ccy}

ParamPadrão / DefaultDescrição / Description
datehoje (SP) / todayISO YYYY-MM-DD (convertido internamente p/ o formato US que o PTAX exige).
bulletinfechamentofechamento (fiscal), abertura, intermediario, all.
fallbacktrueEm dia sem cotação, anda para o último dia útil publicado e marca fallback:true. false = 404 estrito.
// GET /rate/EUR?date=2025-02-01  (um sábado → cai para sexta)
{
  "currency": "EUR", "tipoMoeda": "B",
  "requestedDate": "2025-02-01", "referenceDate": "2025-01-31", "fallback": true,
  "bulletin": "Fechamento PTAX", "dataHoraCotacao": "2025-01-31 13:03:54.994",
  "cotacaoCompra": "6.06030", "cotacaoVenda": "6.06160",
  "paridadeCompra": "1.03960", "paridadeVenda": "1.03970",
  "source": "BCB PTAX"
}

Precisa de uma taxa única? Use o ponto médio / Need a single rate? Use the mid: (cotacaoCompra + cotacaoVenda) / 2. bulletin=all devolve todos os boletins intradiários em bulletins:[…].

O boletim de fechamento sai por volta de 13:00–13:30 (America/Sao_Paulo). De manhã, "hoje" ainda não tem fechamento — com fallback=true (padrão) você recebe o último dia publicado, sem precisar saber as regras de dia útil.
The closing bulletin publishes ~13:00–13:30 (São Paulo time); in the morning "today" has no closing yet — fallback=true transparently returns the last published day.

3. Série / Series — /series/{ccy}

GET /series/EUR?start=2025-01-01&end=2025-01-31&bulletin=fechamento&fill=raw

Uma observação por dia. fill=raw (padrão) mantém as lacunas (só dias úteis); fill=ffill preenche fins de semana/feriados com o dia útil anterior, cada item marcado filled:true. Intervalos longos são quebrados por ano internamente e costurados — pedir vários anos "simplesmente funciona".
One observation per day. raw keeps gaps; ffill forward-fills non-business days (flagged filled:true). Long ranges are chunked per year and stitched.

// /series/EUR?...&fill=ffill
[ { "date": "2025-01-31", "cotacaoVenda": "6.06160", "filled": false },
  { "date": "2025-02-01", "cotacaoVenda": "6.06160", "filled": true } ]

4. Conversão / Convert — /convert

GET /convert?amount=100&from=USD&to=EUR&date=2025-01-31&side=venda

Cruza via BRL (from → BRL → to). O cálculo é em ponto-fixo exato — os valores intermediários não são arredondados; arredonda só no fim (places, padrão 6). side = venda (ask, padrão) ou compra (bid). BRL é aceito como from/to (taxa 1).
Crosses via BRL; exact fixed-point math, no intermediate rounding. BRL accepted.

{ "amount": "100", "from": "USD", "to": "EUR", "referenceDate": "2025-01-31",
  "rate": { "from": "5.83010", "to": "6.06160" }, "result": "96.180876", "source": "BCB PTAX" }

5. Última cotação / Latest — /latest/{ccy}

GET /latest/USD   // cotação publicada mais recente, sem saber a data de hoje

6. Exemplos / Examples

JavaScript (fetch):

const BASE = 'https://ptax.api.insyde.one';

async function rate(ccy, date) {
  const qs = new URLSearchParams(date ? { date } : {});
  const res = await fetch(`${BASE}/rate/${ccy}?${qs}`);
  if (!res.ok) throw new Error((await res.json()).error);
  return res.json(); // values are exact decimal strings — cast as needed
}

const usd = await rate('USD', '2025-01-31');

Python (requests):

import requests
from decimal import Decimal

r = requests.get("https://ptax.api.insyde.one/rate/EUR", params={"date": "2025-02-01"})
r.raise_for_status()
data = r.json()
venda = Decimal(data["cotacaoVenda"])   # string → Decimal, sem perda

7. Uso como tool de IA / Use as an AI tool

A interface plana mapeia direto num schema de function calling: / The flat interface maps directly to a function-calling schema:

{
  "name": "ptax_rate",
  "description": "Official BRL exchange rate for a currency on a date (Banco Central PTAX).",
  "parameters": { "type": "object", "properties": {
    "ccy":      { "type": "string", "enum": ["USD","EUR","GBP","JPY","CHF","CAD","AUD","DKK","NOK","SEK"] },
    "date":     { "type": "string", "description": "YYYY-MM-DD; default today (São Paulo)" },
    "bulletin": { "type": "string", "enum": ["fechamento","abertura","intermediario","all"] },
    "fallback": { "type": "boolean", "description": "walk back to last published day (default true)" }
  } }
}

8. Erros e cache / Errors & caching

HTTPQuando / When
400data/moeda/boletim/fill/amount inválido (moeda → lista válidas) / invalid input
404modo estrito (fallback=false) e sem cotação na data / strict, no rate for the date
502BCB indisponível (distinto de "sem cotação") / BCB upstream down
Cache: cotação de data passada é imutável → 30 dias no CDN; "hoje" (pode não ter publicado) → 15 min; /moedas → 1 dia; erros/strict-404//health não são cacheados.
Caching: past dates 30d at the CDN; today 15min; /moedas 1d; errors never cached.

Back to Insyde APIs