Use /api/v2/macro para baixar séries históricas de Selic, CDI e IPCA. Use
/api/v2/macro/latest quando você só precisa da observação mais recente.
O JSON tem a mesma estrutura para todas as séries. O que muda é unidade e frequência, e é aí que a conta sai errada: a Selic Meta é percentual ao ano com publicação diária, o CDI é percentual ao dia, o IPCA é mensal.
Este artigo é sobre essa diferença. Para o catálogo inteiro, leia a visão geral da API de macroeconomia.
Slugs de Selic, CDI e IPCA
A API usa slugs públicos, então você não precisa guardar códigos numéricos de fontes externas.
| Slug | Série | Unidade | Frequência |
|---|---|---|---|
selic | Selic Meta | percentPerYear | daily |
selicovernight | Selic efetiva diária | percentPerDay | daily |
cdi | CDI | percentPerDay | daily |
ipca | Variação mensal do IPCA | percentPerMonth | monthly |
ipca12m | IPCA acumulado em 12 meses | percent | monthly |
Dois pares de slugs se parecem e não são a mesma coisa. selic é a meta
definida pelo Copom; selicovernight é a taxa efetiva diária.
O mesmo vale para ipca e ipca12m. Um ponto de ipca é a variação daquele
mês. Um ponto de ipca12m é o acumulado dos doze meses anteriores. Trocar um
pelo outro num painel produz uma inflação de 0,4% ou de 4,8% para a mesma data.
Descobrir séries sem autenticação
O catálogo público retorna slug, nome, unidade, frequência, categoria e início do histórico.
curl "https://brapi.dev/api/v2/macro/available?q=ipca"Você também pode filtrar por categoria.
curl "https://brapi.dev/api/v2/macro/available?category=interestRate"Use esse catálogo para montar o seletor da sua interface. Uma lista paralela hardcoded fica desatualizada na primeira série nova. A documentação das séries disponíveis descreve os filtros atuais.
Consultar séries históricas
O parâmetro symbols aceita vários slugs separados por vírgula, e a janela usa
startDate e endDate em YYYY-MM-DD.
curl -H "Authorization: Bearer SEU_TOKEN" \
"https://brapi.dev/api/v2/macro?symbols=selic,cdi,ipca,ipca12m&startDate=2025-01-01&endDate=2026-06-30&sortOrder=asc&limit=10000"Cada item de results tem series e observations: uma descreve o dado, a
outra traz os pares de data e valor.
{
"results": [
{
"series": {
"slug": "selic",
"name": "Taxa Selic",
"unit": "percentPerYear",
"frequency": "daily",
"category": "interestRate",
"startDate": "1999-03-05"
},
"observations": [
{ "date": "2026-04-29", "value": 14.75 },
{ "date": "2026-04-30", "value": 14.5 }
]
}
]
}Os valores ilustram o formato da resposta e não são a taxa atual.
Leia a unidade antes de calcular
Um CDI de 0.054267 com percentPerDay significa 0,054267% no dia. Ele
não significa 5,4267% nem uma taxa anual.
Multiplicar a taxa diária por um número redondo de dias é o atalho que quase todo mundo tenta primeiro, e ele ignora a composição. O artigo sobre o histórico do CDI por API mostra a anualização correta.
Consultar somente o último valor
Painel não precisa baixar anos de série a cada atualização. /latest devolve
uma observação por série.
curl -H "Authorization: Bearer SEU_TOKEN" \
"https://brapi.dev/api/v2/macro/latest?symbols=selic,cdi,ipca12m"Uma resposta reduzida tem este formato:
{
"results": [
{
"series": {
"slug": "selic",
"unit": "percentPerYear",
"frequency": "daily"
},
"latest": { "date": "2026-04-30", "value": 14.5 }
},
{
"series": {
"slug": "ipca12m",
"unit": "percent",
"frequency": "monthly"
},
"latest": { "date": "2026-03-01", "value": 4.14 }
}
]
}Repare nas datas. O IPCA costuma ter mês de referência anterior ao da Selic, e isso não é atraso: cada série segue o próprio calendário de publicação.
Ler e validar o JSON com Python
O código abaixo cria uma linha por observação, mantendo unidade e frequência ao lado do valor.
import os
import pandas as pd
import requests
response = requests.get(
"https://brapi.dev/api/v2/macro",
params={
"symbols": "selic,cdi,ipca,ipca12m",
"startDate": "2025-01-01",
"endDate": "2026-06-30",
"sortOrder": "asc",
"limit": 10000,
},
headers={"Authorization": f"Bearer {os.environ['BRAPI_TOKEN']}"},
timeout=30,
)
response.raise_for_status()
rows = []
for result in response.json()["results"]:
series = result["series"]
for point in result["observations"]:
rows.append(
{
"slug": series["slug"],
"unit": series["unit"],
"frequency": series["frequency"],
"date": point["date"],
"value": point["value"],
}
)
frame = pd.DataFrame(rows)
frame["date"] = pd.to_datetime(frame["date"])
print(frame.groupby("slug").tail(1))Evite sair fazendo pivot com preenchimento antes de decidir a regra. O IPCA
mensal não precisa virar trinta cópias diárias para conviver com o CDI na mesma
tabela.
Comparar juros e inflação
Para comparar, selecione observações compatíveis. Uma regra simples é usar o último IPCA em 12 meses disponível em cada data de análise. Deixe essa regra escrita, porque ela muda o resultado.
Juro real exige a mesma coerência de período. O artigo sobre Selic, IPCA e juro real traz a fórmula e os cuidados.
Perguntas frequentes
Como obter a série histórica da Selic em JSON?
Use /api/v2/macro?symbols=selic. Defina a janela com startDate e endDate.
Passe um limit suficiente para o período.
Qual slug retorna o IPCA acumulado em 12 meses?
Use ipca12m. O slug ipca retorna a variação mensal, não o acumulado anual.
Posso comparar CDI e Selic sem converter nada?
Não. cdi vem em percentual ao dia e selic em percentual ao ano. Converta
para o mesmo período antes de subtrair um do outro.
