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.
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).
cotacaoCompra (bid) and cotacaoVenda
(ask), in BRL per unit — always both. paridade* is the USD relation.
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.
/rate/{ccy}| Param | Padrão / Default | Descrição / Description |
|---|---|---|
date | hoje (SP) / today | ISO YYYY-MM-DD (convertido internamente p/ o formato US que o PTAX exige). |
bulletin | fechamento | fechamento (fiscal), abertura, intermediario, all. |
fallback | true | Em 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:[…].
fallback=true (padrão) você recebe o
último dia publicado, sem precisar saber as regras de dia útil.
fallback=true transparently returns the last published day.
/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 } ]
/convertGET /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" }
/latest/{ccy}GET /latest/USD // cotação publicada mais recente, sem saber a data de hoje
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
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)" }
} }
}
| HTTP | Quando / When |
|---|---|
400 | data/moeda/boletim/fill/amount inválido (moeda → lista válidas) / invalid input |
404 | modo estrito (fallback=false) e sem cotação na data / strict, no rate for the date |
502 | BCB indisponível (distinto de "sem cotação") / BCB upstream down |
/moedas → 1 dia; erros/strict-404//health não são cacheados.
/moedas 1d; errors never cached.