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;
}
}
@willmoreira7

Copy link
Copy Markdown

Acabou de voltar a funcionar

@tuliopascoal

Copy link
Copy Markdown

Acabou de voltar a funcionar

Pelo Google ou Postman? Aqui pelo Google Script o problema persiste.

@willmoreira7

Copy link
Copy Markdown

Tinha sido pelo google mesmo, mas testando novamente agora voltou a apresentar o erro

@renanitokazo

Copy link
Copy Markdown

Será q já era mesmo então? Aqui pelo google:

Erro ao se conectar a API { [Exception: Request failed for https://www.tesourodireto.com.br returned code 403. Truncated server response: <title>Just a moment...</title><meta htt... (use muteHttpExceptions option to examine full response)] name: 'Exception' }

@kleitonramires

Copy link
Copy Markdown

Aqui, Google Script ainda fora.

@estevaobassani

Copy link
Copy Markdown

Aqui voltou um pouco pelo google script, mas caiu novamente

@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.

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