Documentação
Referência pública da API do Tesouro Direto — comece por aqui antes de pedir sua chave
Início rápido
Três passos para a sua primeira chamada — pense neles como o verso da apólice, onde ficam as instruções de uso do selo.
1. Pegue sua chave
Entre em /desenvolvedores e gere uma chave de API. Ela é mostrada uma única vez — guarde-a com cuidado.
2. Faça a primeira requisição
Envie a chave no cabeçalho X-Api-Key e liste os títulos disponíveis:
curl -H "X-Api-Key: SUA_CHAVE" \
https://dadosdotesourodireto.com.br/api/v1/titulos3. Siga o caminho quente
O fluxo típico é: listar os títulos, escolher um pelo codigo, consultar o
preço atual e, se precisar de histórico, paginar a série de preços.
curl -H "X-Api-Key: SUA_CHAVE" \
https://dadosdotesourodireto.com.br/api/v1/titulos/{codigo}/preco-atual
curl -H "X-Api-Key: SUA_CHAVE" \
"https://dadosdotesourodireto.com.br/api/v1/titulos/{codigo}/precos?page=1&pageSize=50"
Limites (429 + Retry-After), cache condicional
(If-None-Match), paginação (X-Total-Count,
_links) e erros (application/problem+json) estão
documentados em detalhe nas seções abaixo.
Autenticação
Toda requisição autenticada leva a chave no cabeçalho X-Api-Key.
Sem ela — ou com uma chave inválida ou revogada — a API responde 401.
Para obter sua chave, entre em /desenvolvedores e gere uma credencial.
Limites
- Rate limit de 60 requisições por minuto, por chave — ao exceder, a API responde
429com o cabeçalhoRetry-After(segundos até liberar). - Flood-guard de 30 requisições por segundo, por IP, aplicado na borda (nginx), independente de autenticação.
Cache
Respostas de leitura trazem ETag. Envie o valor de volta no cabeçalho
If-None-Match na próxima chamada; se nada mudou, a API responde
304 Not Modified sem corpo, economizando banda.
Paginação
Listas paginadas trazem o cabeçalho Link (RFC 8288)
com as relações first, prev, next e last,
e o cabeçalho X-Total-Count com o total de itens.
Recursos individuais trazem _links (HAL) no corpo, com atalhos para
navegar entre recursos relacionados — por exemplo, de um título para seu preço atual.
Como resolver um href: os valores de _links
e do cabeçalho Link já vêm prontos, com o caminho completo da API
pública (incluindo o segmento /api). Basta resolvê-los contra o host:
https://dadosdotesourodireto.com.br + /api/v1/titulos/tesouro-selic-2029-03-01 =
https://dadosdotesourodireto.com.br/api/v1/titulos/tesouro-selic-2029-03-01.
Erros
Erros são retornados como application/problem+json, sempre com um
correlationId para rastreio junto ao suporte.
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.5",
"title": "Recurso não encontrado",
"status": 404,
"detail": "Nenhum título com o código informado foi encontrado.",
"code": "titulo_nao_encontrado",
"correlationId": "8f14e45f-ceea-467e-9de0-1e2b2c8f9ac3",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
}
| Status | Significado |
|---|---|
400 | Requisição inválida — parâmetro ausente ou mal formado (ex.: codigo fora do padrão). |
401 | Chave ausente, inválida ou revogada. |
404 | Recurso não encontrado (título, preço ou tributo inexistente). |
429 | Limite de requisições excedido — respeite o Retry-After. |
Endpoints
Referência dos endpoints de consumo da API. Todos exigem o cabeçalho X-Api-Key.
GET /titulos
Lista os títulos cadastrados, com filtro opcional por indexador e por vencido.
GET /titulos
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
indexador | query · string | Não | Filtra pelo nome do indexador (ex.: Selic, IPCA, Prefixado). |
vencido | query · bool | Não | Filtra títulos vencidos (true) ou não vencidos (false). |
curl -H "X-Api-Key: SUA_CHAVE" \
"https://dadosdotesourodireto.com.br/api/v1/titulos?indexador=Selic&vencido=false"[
{
"tipoTitulo": "Tesouro Selic",
"dataVencimento": "2029-03-01",
"indexador": "Selic",
"pagaJurosSemestrais": false,
"vencido": false,
"codigo": "tesouro-selic-2029-03-01",
"_links": {
"self": { "href": "/api/v1/titulos/tesouro-selic-2029-03-01" },
"precos": { "href": "/api/v1/titulos/tesouro-selic-2029-03-01/precos" },
"preco-atual": { "href": "/api/v1/titulos/tesouro-selic-2029-03-01/preco-atual" },
"simular": { "href": "/api/v1/simulador", "method": "POST", "templated": true }
}
}
]GET /titulos/{codigo}
Retorna um único título pelo código.
GET /titulos/{codigo}
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
codigo | path · string | Sim | Identificador público do título, derivado do tipo e da data de vencimento (ex.: tesouro-selic-2029-03-01). |
curl -H "X-Api-Key: SUA_CHAVE" \
https://dadosdotesourodireto.com.br/api/v1/titulos/tesouro-selic-2029-03-01{
"tipoTitulo": "Tesouro Selic",
"dataVencimento": "2029-03-01",
"indexador": "Selic",
"pagaJurosSemestrais": false,
"vencido": false,
"codigo": "tesouro-selic-2029-03-01",
"_links": {
"self": { "href": "/api/v1/titulos/tesouro-selic-2029-03-01" },
"precos": { "href": "/api/v1/titulos/tesouro-selic-2029-03-01/precos" },
"preco-atual": { "href": "/api/v1/titulos/tesouro-selic-2029-03-01/preco-atual" },
"simular": { "href": "/api/v1/simulador", "method": "POST", "templated": true }
}
}GET /titulos/preco-atual
Retorna o preço e a taxa mais recentes de um título, buscado pelo nome.
GET /titulos/preco-atual
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome | query · string | Sim | Nome exato do título (ex.: Tesouro Selic 2029). |
curl -H "X-Api-Key: SUA_CHAVE" \
"https://dadosdotesourodireto.com.br/api/v1/titulos/preco-atual?nome=Tesouro%20Selic%202029"{
"dataBase": "2026-08-08",
"taxaCompra": 11.85,
"taxaVenda": 11.95,
"puCompra": 985.32,
"puVenda": 980.10,
"puBase": 982.71
}GET /titulos/{codigo}/preco-atual
Retorna o preço e a taxa mais recentes de um título, buscado pelo código.
GET /titulos/{codigo}/preco-atual
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
codigo | path · string | Sim | Identificador público do título (ex.: tesouro-selic-2029-03-01). |
curl -H "X-Api-Key: SUA_CHAVE" \
https://dadosdotesourodireto.com.br/api/v1/titulos/tesouro-selic-2029-03-01/preco-atual{
"dataBase": "2026-08-08",
"taxaCompra": 11.85,
"taxaVenda": 11.95,
"puCompra": 985.32,
"puVenda": 980.10,
"puBase": 982.71
}GET /titulos/precos
Lista o histórico de preços e taxas de um título, buscado pelo nome.
GET /titulos/precos
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome | query · string | Sim | Nome exato do título. |
dataInicio | query · date (yyyy-MM-dd) | Não | Início do intervalo de datas. |
dataFim | query · date (yyyy-MM-dd) | Não | Fim do intervalo de datas. |
curl -H "X-Api-Key: SUA_CHAVE" \
"https://dadosdotesourodireto.com.br/api/v1/titulos/precos?nome=Tesouro%20Selic%202029&dataInicio=2026-01-01&dataFim=2026-06-30"[
{
"dataBase": "2026-06-30",
"taxaCompra": 11.90,
"taxaVenda": 12.00,
"puCompra": 978.14,
"puVenda": 973.02,
"puBase": 975.55
},
{
"dataBase": "2026-07-01",
"taxaCompra": 11.88,
"taxaVenda": 11.98,
"puCompra": 979.40,
"puVenda": 974.25,
"puBase": 976.80
}
]GET /titulos/{codigo}/precos
Lista o histórico de preços e taxas de um título, buscado pelo código, com
paginação opcional. Sem page, retorna a coleção inteira e não envia
o cabeçalho Link.
GET /titulos/{codigo}/precos
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
codigo | path · string | Sim | Identificador público do título. |
dataInicio | query · date (yyyy-MM-dd) | Não | Início do intervalo de datas. |
dataFim | query · date (yyyy-MM-dd) | Não | Fim do intervalo de datas. |
page | query · int | Não | Página desejada (padrão 1). Presente ⇒ resposta paginada, com cabeçalhos Link e X-Total-Count. |
pageSize | query · int | Não | Itens por página (padrão 100, máximo 500). |
curl -H "X-Api-Key: SUA_CHAVE" \
"https://dadosdotesourodireto.com.br/api/v1/titulos/tesouro-selic-2029-03-01/precos?dataInicio=2026-01-01&dataFim=2026-06-30&page=1&pageSize=50"
Cabeçalhos de resposta: X-Total-Count: 214 e
Link: </api/v1/titulos/tesouro-selic-2029-03-01/precos?page=1&pageSize=50>; rel="first", </api/v1/titulos/tesouro-selic-2029-03-01/precos?page=2&pageSize=50>; rel="next", </api/v1/titulos/tesouro-selic-2029-03-01/precos?page=5&pageSize=50>; rel="last"
[
{
"dataBase": "2026-06-30",
"taxaCompra": 11.90,
"taxaVenda": 12.00,
"puCompra": 978.14,
"puVenda": 973.02,
"puBase": 975.55
}
]GET /precos
Retorna o preço e a taxa de todos os títulos numa única data, em
1 requisição — o corte transversal dos endpoints de /titulos/... acima,
para quem precisa do fechamento do dia inteiro sem consultar título por título.
GET /precos
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
dataBase | query · date (yyyy-MM-dd) | Sim | Data do fechamento. Único parâmetro aceito — não há intervalo, filtro por indexador nem paginação. |
curl -H "X-Api-Key: SUA_CHAVE" \
"https://dadosdotesourodireto.com.br/api/v1/precos?dataBase=2026-06-30"
A resposta é um array cru (sem _links) ordenado por codigo
crescente, cada item com o mesmo formato de preço dos endpoints acima acrescido de
codigo. O cabeçalho X-Total-Count sempre acompanha a resposta.
200 com lista vazia [] e X-Total-Count: 0
— nunca 404. É assim que você distingue "dia sem pregão" de "requisição
inválida".
400 se dataBase estiver ausente ou fora do formato
yyyy-MM-dd (PrecoTaxa.DataBaseInvalida) ou for uma data
futura (PrecoTaxa.DataBaseFutura).
[
{
"codigo": "tesouro-selic-2029-03-01",
"dataBase": "2026-06-30",
"taxaCompra": 11.90,
"taxaVenda": 12.00,
"puCompra": 978.14,
"puVenda": 973.02,
"puBase": 975.55
},
{
"codigo": "tesouro-ipca-mais-2035-05-15",
"dataBase": "2026-06-30",
"taxaCompra": 5.85,
"taxaVenda": 5.95,
"puCompra": 3210.44,
"puVenda": 3195.10,
"puBase": 3202.77
}
]POST /simulador
Simula valor bruto/líquido, tributos aplicados e cupons (quando houver) para um título, valor investido, data de compra e taxa contratada.
POST /simulador
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
codigo | body · string | Sim | Identificador público do título. |
valorInvestido | body · decimal | Sim | Valor investido, em reais. |
dataCompra | body · date (yyyy-MM-dd) | Sim | Data da compra simulada. |
taxaContratada | body · decimal | Sim | Taxa contratada na compra, em percentual ao ano (10 = 10% a.a., não 0.10). |
projecaoAnual | body · decimal | Não | Projeção anual do indexador. Sem ela, para títulos indexados, usa a projeção de mercado do BCB Focus. |
curl -X POST -H "X-Api-Key: SUA_CHAVE" -H "Content-Type: application/json" \
-d '{"codigo":"tesouro-selic-2029-03-01","valorInvestido":1000,"dataCompra":"2026-08-01","taxaContratada":10,"projecaoAnual":12.5}' \
https://dadosdotesourodireto.com.br/api/v1/simulador{
"valorInvestido": 1000,
"valorBruto": 1734.07,
"rendimentoBruto": 734.07,
"tributosAplicados": [
{ "nome": "Imposto de Renda", "base": 734.07, "aliquota": 15, "valor": 110.11 }
],
"totalTributos": 110.11,
"valorLiquido": 1623.96,
"rendimentoLiquido": 623.96,
"cupons": null,
"projecaoUtilizada": {
"valorAnual": 12.5,
"dataReferencia": "2026-08-01",
"obtidaEmUtc": "2026-08-01T12:00:00Z",
"origem": "Bcb"
}
}POST /simulador/cenarios
Simula o mesmo investimento sob vários cenários nomeados, cada um com sua própria projeção anual informada explicitamente.
POST /simulador/cenarios
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
codigo | body · string | Sim | Identificador público do título. |
valorInvestido | body · decimal | Sim | Valor investido, em reais. |
dataCompra | body · date (yyyy-MM-dd) | Sim | Data da compra simulada. |
taxaContratada | body · decimal | Sim | Taxa contratada na compra, em percentual ao ano (10 = 10% a.a., não 0.10). |
cenarios | body · array | Sim | Lista de cenários, cada um com nome (string) e projecaoAnual (decimal). |
curl -X POST -H "X-Api-Key: SUA_CHAVE" -H "Content-Type: application/json" \
-d '{"codigo":"tesouro-selic-2029-03-01","valorInvestido":1000,"dataCompra":"2026-08-01","taxaContratada":10,"cenarios":[{"nome":"otimista","projecaoAnual":13.0},{"nome":"conservador","projecaoAnual":10.5}]}' \
https://dadosdotesourodireto.com.br/api/v1/simulador/cenarios[
{
"nome": "otimista",
"resultado": {
"valorInvestido": 1000,
"valorBruto": 1754.22,
"rendimentoBruto": 754.22,
"tributosAplicados": [
{ "nome": "Imposto de Renda", "base": 754.22, "aliquota": 15, "valor": 113.13 }
],
"totalTributos": 113.13,
"valorLiquido": 1641.09,
"rendimentoLiquido": 641.09,
"cupons": null,
"projecaoUtilizada": null
}
},
{
"nome": "conservador",
"resultado": {
"valorInvestido": 1000,
"valorBruto": 1655.64,
"rendimentoBruto": 655.64,
"tributosAplicados": [
{ "nome": "Imposto de Renda", "base": 655.64, "aliquota": 15, "valor": 98.35 }
],
"totalTributos": 98.35,
"valorLiquido": 1557.29,
"rendimentoLiquido": 557.29,
"cupons": null,
"projecaoUtilizada": null
}
}
]GET /configuracoes/tributos
Lista todos os tributos configurados (IOF, IR etc.), ativos ou não, com suas faixas.
GET /configuracoes/tributos
curl -H "X-Api-Key: SUA_CHAVE" \
https://dadosdotesourodireto.com.br/api/v1/configuracoes/tributosExemplo com 2 das faixas reais — IOF tem 29 faixas (uma por dia corrido) e IR tem 4.
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"nome": "IOF",
"baseCalculo": "Rendimento",
"tipoCalculo": "TabelaDiaria",
"faixas": [
{ "diasMin": null, "diasMax": null, "dia": 1, "aliquota": 96 }
],
"ativo": true,
"ordem": 1,
"cumulativo": true
},
{
"id": "5b1e2a3c-8f4d-4b2a-9c1e-7d6f5a4b3c2d",
"nome": "Imposto de Renda",
"baseCalculo": "Rendimento",
"tipoCalculo": "FaixaPorDias",
"faixas": [
{ "diasMin": 0, "diasMax": 180, "dia": null, "aliquota": 22.5 }
],
"ativo": true,
"ordem": 2,
"cumulativo": false
}
]