Skip to content

Instantly share code, notes, and snippets.

@danperrout
Last active September 10, 2026 18:18
Show Gist options
  • Select an option

  • Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.

Select an option

Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.
API Função TESOURODIRETO Google Sheets
// ============================================================
// COLE SEU TOKEN AQUI (entre as aspas).
// Gere em https://radaropcoes.com → /profile/ → card API.
// ============================================================
const RADAR_TOKEN = "rop_COLE_SEU_TOKEN_AQUI";
// ============================================================
/*
* @return Acessa radaropcoes.com e retorna informações de um título específico do Tesouro Direto
* Endpoint: https://api.radaropcoes.com/bonds/{bondName}
*/
function TESOURODIRETO(bondName, argumento = "r") {
let srcURL = "https://api.radaropcoes.com/bonds/" + encodeURIComponent(bondName);
let response = UrlFetchApp.fetch(srcURL, {
headers: { "Authorization": "Bearer " + RADAR_TOKEN },
muteHttpExceptions: true
});
console.log(srcURL)
if (response.getResponseCode() !== 200) {
throw new Error("Erro ao acessar a API ou título não encontrado.");
}
let bond = JSON.parse(response.getContentText());
// A API responde 200 mesmo com token inválido/ausente/quota: campos numéricos vêm null
// e os textos contêm a mensagem do erro. Surface esse caso pro usuário.
if (bond.treasuryBondCode === null) {
throw new Error(bond.indication);
}
// argumento:
// "r" → valor de resgate
// qualquer outro → valor unitário de investimento
if (argumento === "r") {
return bond.unitaryRedemptionValue;
} else {
return bond.unitaryInvestmentValue;
}
}
@CaioFilipe93

Copy link
Copy Markdown

Fora do ar, ajuda nós Daniel
Captura de tela 2024-08-20 120929

@danperrout

Copy link
Copy Markdown
Author

Cloudflare está bloqueando mesmo.

Para quem tiver interesse na prória API, vcs podem usar uma das seguintes alternativas para desenvolver:

  • Python: Selenium
  • Nodejs: Puppeteer

@tuliopascoal

Copy link
Copy Markdown

Será que não daria para fazer algo com um simples cURL?
Creio que o Cloudfare não iria bloquear num primeiro moment (somente se a quantidade de requisições se tornar suspeita).

@danperrout

Copy link
Copy Markdown
Author

@rafaelgp23

EDIT: mas quando tento rodar isso no pythonanywhere.com, ainda volta 403 =/

O Cloudflare deve ter bloqueado todos os IPs das grandes, por isso está bloqueando.. ao meu ver tem que ter uma solução via SELENIUM mesmo, simulando o uso do navegador.

@glauberramos

Copy link
Copy Markdown

Estou com o mesmo problema : /

@blechner

Copy link
Copy Markdown

Alguém conseguiu alguma solução para o script voltar a funcionar no google sheets? Talvez a única solução seja ter um outro site que retorne esse json do tesouro, daí o script acessaria ele em vez de acessar api do tesouro diretamente... mas alguém teria q implementar esse site e garantir que ele consiga chamar a api do tesouro de tempos em tempos sem ser bloqueado também :)

@carmodurante

carmodurante commented Aug 24, 2024 •

Copy link
Copy Markdown

@tuliopascoal Que estranho aqui esta normal, pode ser que tenha caido de madrugada pra alguma atualização.
E sim está atualizado, mas api que está sendo chamanda no site não está exposta, esta vindo do google analytics, e a que eles disponibilizaram é meme.
Então por enquanto com IMPORTHTML é oque está funcionando pra mim, até achar alguma API utilizavel.

@tuliopascoal

Copy link
Copy Markdown

@carmodurante Obrigado meu caro. Confirmo que o sistema do TesouroInfo voltou ao normal aqui, e conseguir fazer as alterações necessárias na minhas tabelas.

Enquanto isso, vamos aguardar a situação do bloqueio da CloudFare :(

@renatofig

Copy link
Copy Markdown

Romulo, perfeito, meu caso é o mesmo, incluí a fórmula no Google Sheets trocando a célula referência onde incluí o nome como aparece no site "tesouroinfo.com", porém dá a mensagem ERRO:carregando os dados, O que pode estar errado, pois mesmo digitando direto o nome do título sem referenciar, o erro persiste... ?

@renatofig

Copy link
Copy Markdown

após um bom tempo rodou...Obrigado!

@mateusguenter

mateusguenter commented Sep 2, 2024 •

Copy link
Copy Markdown

Acessei agora e os dois estão sincronizados.
Tenho acompanhado os dois e estão sempre sincronizados, as vezes demora algumas horas, mas me parece que da pra utilizar.
Eu vou utilizar..

@epeixoto85

Copy link
Copy Markdown

Para atualização dos títulos existentes do Tesouro Direto, e dos preços e taxas de venda e compra, utilizava os seguintes serviços:

"https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json"
"https://www.tesourodireto.com.br/b3/tesourodireto/pricesAndFeesHistory?codigo=&periodo="

Ambos estão retornando erro 403, conforme algumas pessoas relataram anteriormente.

Alguém encontrou alguma alternativa?

@alexbenfica

Copy link
Copy Markdown

Colocaram o Cloudflare na frente ou já tinha mas ativaram para que bots não possam acessar, exigindo aquela verificação de que é humano. :(

o 403 é do Cloudflare, tanto que funciona no navegador mas com scripts falha sempre.

Como eles não fornecem a chave de API para pessoas físicas, talvez a solução é baixar manualmente o arquivo quando se quiser ver a atualização. Alguma outra ideia?

@BDonadelli

BDonadelli commented Sep 6, 2024 •

Copy link
Copy Markdown

Alegria de pobre dura pouco, o link não atualiza…

aqui ainda funciona (com o selenium)

@danperrout

danperrout commented Oct 18, 2024 •

Copy link
Copy Markdown
Author

Pessoal, implementei minha própria abstração do json do Tesouro Direto. Na verdade, é uma cópia exata do JSON fornecidos por eles que pode ser acessado em:
Oficial: https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json
Mirror: https://api.radaropcoes.com/bonds.json

Esse json é atualizado de 15 em 15 minutos, mas o próprio TD só atualiza de hora em hora, por isso as datas podem estar "atrasadas" em algumas horas.

Fiquem a vontade para utilizar, além disso, no site Radar Opções, incluí a possibilidade de COPIAR o nome do Título para a área de transferência:

image

@danperrout

danperrout commented Oct 21, 2024 •

Copy link
Copy Markdown
Author

Alguém saberia alguma forma de pegar o JSON para o dia atual?

Código atualizado com o novo endereço de json: https://api.radaropcoes.com/bonds.json

@WadjoResende

Copy link
Copy Markdown

Alguém sabe explicar como resolver o seguinte erro:

Erro TypeError: Cannot read properties of undefined (reading 'toLowerCase')
TESOURODIRETO @ TESOURODIRETO.gs:12

@ArturJuan

Copy link
Copy Markdown

O erro é por conta do comentário que declara a função, segue a versão corrigida:

/**
 * Retorna a cotação atual de um título específico do Tesouro Direto.
 * 
 * @param {string} nome do título
 * @return Retorna a cotação atual de um título específico do Tesouro Direto.
 * @customfunction 
 * Fonte: https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm
*/
function TESOURODIRETO(bondName="Tesouro IPCA+ 2029", argumento="r") {
    let srcURL = "https://api.radaropcoes.com/bonds.json";
    let jsondata = UrlFetchApp.fetch(srcURL);
    let parsedData = JSON.parse(jsondata.getContentText()).response;

    for(let bond of parsedData.TrsrBdTradgList) {
        let currBondName = bond.TrsrBd.nm;
        console.log(typeof(currBondName))
        if (currBondName.toLowerCase() === bondName.toLowerCase())
            if(argumento == "r")
                return bond.TrsrBd.untrRedVal;
            else
                return bond.TrsrBd.untrInvstmtVal;
    }
    throw new Error("Título não encontrado.");
}

@WadjoResende

Copy link
Copy Markdown

Perfeito Artur! Valeu!

@kleitonramires

Copy link
Copy Markdown

Os valores unitário de cada título está certo para vcs? o meu não mostra no google sheets (c/script) igual a do site do Tesouro.

@danperrout

Copy link
Copy Markdown
Author

Os valores unitário de cada título está certo para vcs? o meu não mostra no google sheets (c/script) igual a do site do Tesouro.

O script consegue acessar dois valores, se vc colocar:
=TESOURODIRETO("Nome do Titulo") retorna os valores da aba Resgate
=TESOURODIRETO("Nome do Titulo";"i") retorna os valores da aba Investimento

@kleitonramires

Copy link
Copy Markdown

Os valores unitário de cada título está certo para vcs? o meu não mostra no google sheets (c/script) igual a do site do Tesouro.

O script consegue acessar dois valores, se vc colocar: =TESOURODIRETO("Nome do Titulo") retorna os valores da aba Resgate =TESOURODIRETO("Nome do Titulo";"i") retorna os valores da aba Investimento

Putz, valeu irmão. Aprendi contigo no seu canal a colocar os dados no script e agora mais essa, ajudou muito. Tudo de bom para vc.

@diegob-ciandt

Copy link
Copy Markdown

pessoal,
aparentemente o endpoint oficial (https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json) voltou a funcionar para as chamadas a partir do google app script.
[]'s

@tuliopascoal

Copy link
Copy Markdown

Opa pessoal, somente comigo ou o endpoint do TesouroDireto está indisponível novamente (error 404)?
Desde quinta-feira ou sexta-feira...

https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json

Grato.

@tuliopascoal

Copy link
Copy Markdown

Olá pessoal, o endpoint do TD está fora novamente?
Só recebo error 404 desde sexta-feira 15/08/2025.
https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json

Mais alguém?
Grato.

@glauberramos

Copy link
Copy Markdown

Pra mim tbm está fora do ar

@Nauahbanda

Copy link
Copy Markdown

boa tarde, na verdade preciso pegar o PU e não a taxa, alguém conseguiu depois dessa mudança?

@WadjoResende

WadjoResende commented Aug 18, 2025 •

Copy link
Copy Markdown

Agora, o PU do resgate só é possível pelo download do CSV no link:

https://www.tesourodireto.com.br/documents/d/guest/rendimento-resgatar-csv

A boa notícia é que, pelo Google Sheets é possível obter o CSV diretamente na planilha sem necessidade de fazer o download.
Basta colocar a seguinte fórmula na primeira célula da planilha:

=IMPORTDATA("https://www.tesourodireto.com.br/documents/d/guest/rendimento-resgatar-csv?download=true")

Nesse caso, a planilha irá atualizar toda vez que for reaberta, ou, para forçar a atualização é só fazer uma pequena alteração na fórmula, da um enter, voltar o valor correto e dar outro enter.

Para o PU de aplicação, é só usar o link do CSV de investir:
=IMPORTDATA("https://www.tesourodireto.com.br/documents/d/guest/rendimento-investir-csv?download=true")

A fórmula IMPORTDATA não faz a divisão de ponto e vírgula, mas aí é só usar a fórmula SPLIT em uma coluna à frente, referenciando as colunas de interesse:
=ARRAYFORMULA(SPLIT(C2:C70; ";"))

@tuliopascoal

Copy link
Copy Markdown

Agora, o PU do resgate só é possível pelo download do CSV no link:

https://www.tesourodireto.com.br/documents/d/guest/rendimento-resgatar-csv

A boa notícia é que, pelo Google Sheets é possível obter o CSV diretamente na planilha sem necessidade de fazer o download. Basta colocar a seguinte fórmula na primeira célula da planilha:

=IMPORTDATA("https://www.tesourodireto.com.br/documents/d/guest/rendimento-resgatar-csv?download=true")

Nesse caso, a planilha irá atualizar toda vez que for reaberta, ou, para forçar a atualização é só fazer uma pequena alteração na fórmula, da um enter, voltar o valor correto e dar outro enter.

Para o PU de aplicação, é só usar o link do CSV de investir: =IMPORTDATA("https://www.tesourodireto.com.br/documents/d/guest/rendimento-investir-csv?download=true")

A fórmula IMPORTDATA não faz a divisão de ponto e vírgula, mas aí é só usar a fórmula SPLIT em uma coluna à frente, referenciando as colunas de interesse: =ARRAYFORMULA(SPLIT(C2:C70; ";"))

Obrigado pela dica.
Existe uma solução similar a esse (i.e., utilizando formulas GoogleSheets) para resgatar o "ti" (taxa para investir)?

Grato.

@WadjoResende

Copy link
Copy Markdown

Agora, o PU do resgate só é possível pelo download do CSV no link:
https://www.tesourodireto.com.br/documents/d/guest/rendimento-resgatar-csv
A boa notícia é que, pelo Google Sheets é possível obter o CSV diretamente na planilha sem necessidade de fazer o download. Basta colocar a seguinte fórmula na primeira célula da planilha:
=IMPORTDATA("https://www.tesourodireto.com.br/documents/d/guest/rendimento-resgatar-csv?download=true")
Nesse caso, a planilha irá atualizar toda vez que for reaberta, ou, para forçar a atualização é só fazer uma pequena alteração na fórmula, da um enter, voltar o valor correto e dar outro enter.
Para o PU de aplicação, é só usar o link do CSV de investir: =IMPORTDATA("https://www.tesourodireto.com.br/documents/d/guest/rendimento-investir-csv?download=true")
A fórmula IMPORTDATA não faz a divisão de ponto e vírgula, mas aí é só usar a fórmula SPLIT em uma coluna à frente, referenciando as colunas de interesse: =ARRAYFORMULA(SPLIT(C2:C70; ";"))

Obrigado pela dica. Existe uma solução similar a esse (i.e., utilizando formulas GoogleSheets) para resgatar o "ti" (taxa para investir)?

Grato.

O CSV trás essa informação. Você precisa tratar os dados por causa da formatação de vírgula e ponto e vírgula. Mas, está tudo lá.
É possível usar também uma automação no N8N para já entregar os dados tratados, mas ainda não tive tempo pra fazer isso.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment