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

Copy link
Copy Markdown

@WadjoResende Muito obrigado. Funcionou perfeitamente.

@e-pke

e-pke commented Sep 4, 2025

Copy link
Copy Markdown

Não funcionou para mim. Copiei o código e a fórmula mas não consegui. Será que estou fazendo algo errado?
@thiagochaim @WadjoResende

@tuliopascoal

Copy link
Copy Markdown

@gwstavo , talvez seja porque desde hoje o código mais atual que estava funcionando está retornando 403.
O TD deve ter bloqueado os acessos novamente...

Alguém tem alguma novidade?

@thiagochaim

Copy link
Copy Markdown

Não funcionou para mim. Copiei o código e a fórmula mas não consegui. Será que estou fazendo algo errado? @thiagochaim @WadjoResende

Realmente parou de funcionar novamente.
Que tristeza.

@andretc-cit

Copy link
Copy Markdown

Vish, tá retornando 403 da url "https://www.tesourodireto.com.br/documents/d/guest/rendimento-resgatar-csv?download=true";, talvez tenham limitado

@tuliopascoal

Copy link
Copy Markdown

Sim, está fora desde meados da quarta/quinta-feira.
Alguém já descobriu uma forma diferente?

@gabrielgasp

gabrielgasp commented Sep 6, 2025 •

Copy link
Copy Markdown

Pra quem quer tentar uma implementação própria pra puxar os dados, a dica que eu posso dar é tentar achar uma forma de fazer a requisição que simule um browser. Pelos meus testes, quando você tenta fazer um fetch direto ou até mesmo um wget, eles conseguem detectar e bloquear (403), mas quando eles acham que o acesso está vindo de um browser tipo chrome eles deixa passar na maioria das vezes.

Essa api ai de cima eu implementei com Golang usando uma lib que consegue fazer o request impersonando o Chrome. Por enquanto tá dando certo.

@hdillax

hdillax commented Sep 8, 2025

Copy link
Copy Markdown

Pra quem quer tentar uma implementação própria pra puxar os dados, a dica que eu posso dar é tentar achar uma forma de fazer a requisição que simule um browser. Pelos meus testes, quando você tenta fazer um fetch direto ou até mesmo um wget, eles conseguem detectar e bloquear (403), mas quando eles acham que o acesso está vindo de um browser tipo chrome eles deixa passar na maioria das vezes.

Essa api ai de cima eu implementei com Golang usando uma lib que consegue fazer o request impersonando o Chrome. Por enquanto tá dando certo.

Excelente, meu caro! Muito obrigado

@thiagochaim

Copy link
Copy Markdown

Pra quem quer tentar uma implementação própria pra puxar os dados, a dica que eu posso dar é tentar achar uma forma de fazer a requisição que simule um browser. Pelos meus testes, quando você tenta fazer um fetch direto ou até mesmo um wget, eles conseguem detectar e bloquear (403), mas quando eles acham que o acesso está vindo de um browser tipo chrome eles deixa passar na maioria das vezes.

Essa api ai de cima eu implementei com Golang usando uma lib que consegue fazer o request impersonando o Chrome. Por enquanto tá dando certo.

Quão difícil é isso para alguém que não tem esse conhecimento técnico todo?
Eu estou frustrado com toda esse mudança do site do Tesouro Direto pois o script que eu usava funcionou muito bem por muitos anos.

Ficarei muito grato se puder me dar orientações ou referências para que eu consiga implementar isso na minha planilha.

Sei que estou pedindo muito e entenderei caso não consiga.

Muito obrigado por toda informação compartilhada até agora.

@kleitonramires

Copy link
Copy Markdown

@andreluistosato agradeço por ter compartilhado seu conhecimento. Resolveu aqui. Vida longa a você.

@danperrout

Copy link
Copy Markdown
Author

Tem algum lugar com mais instruções de como utilizar? O código, instruções de como puxar para o Google planilhas, etc? Obrigado! Sucesso!

https://www.youtube.com/watch?v=a7JCfMpRhD0&t=1s

@robsonrb77

Copy link
Copy Markdown

Funcionou perfeitamente para mim, parabéns Daniel.

@Alexandre-Azvdo

Copy link
Copy Markdown

Aqui parou de funcionar. Aparace a informação: https://api.radaropcoes.com/bonds/undefined

@danperrout

danperrout commented Jun 8, 2026 via email

Copy link
Copy Markdown
Author

@GuTeruel

GuTeruel commented Sep 2, 2026

Copy link
Copy Markdown

Estava funcionando pra mim, mas parou de atualizar e a última atualização de valor é do dia 28/08 às 19:51. Mais alguém está com o mesmo problema?

@danperrout

danperrout commented Sep 2, 2026 via email

Copy link
Copy Markdown
Author

@dennismozart1994

dennismozart1994 commented Sep 6, 2026 •

Copy link
Copy Markdown

Algum update sobre a atualização dos dados? Pra mim aparece ainda como 28/08 a última atualização de valores também.

@nikolas-18

nikolas-18 commented Sep 7, 2026 •

Copy link
Copy Markdown

Algum update sobre a atualização dos dados? Pra mim aparece ainda como 28/08 a última atualização de valores também.

Olá,
Estou usando o código abaixo que adaptei para minha necessidade (apenas obter o valor de resgate do título) e está funcionando normalmente.
Tente avaliá-lo na sua aplicação.

// ============================================================
const RADAR_TOKEN = "token";     // Gere em https://radaropcoes.com → /profile/ → card API.

function TESOURODIRETO(bondName) {
  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());

  if (bond.treasuryBondCode === null) {
    throw new Error(bond.indication);
  }

  return bond.unitaryRedemptionValue;

}

@dennismozart1994

dennismozart1994 commented Sep 10, 2026 •

Copy link
Copy Markdown

@nikolas-18 o meu código era similar e não estava funcionando no dia que postei minha msg... agora (dia 10/09) a API passou a retornar os valores atualizados novamente. Se quiser, adicione um retorno pro updated_at como parâmetro, assim dá pra ter uma noção da última vez que foi atualizado (foi o que eu fiz) pra saber quando passou a atualizar novamente ou se estava apenas retornando o mesmo valor de dias atrás. Acho que era algum problema na API que o @danperrout comentou semana passada que havia corrigido e só n estava ainda refletindo live 😄

A minha função está +- assim:

/**
 * Retorna o valor do título desejado do Tesouro Direto nacional.
 *
 * @param {string} bondName Nome exato do título do Tesouro Direto. Ex: "Tesouro IPCA+ 2032"
 * @param {string} [argumento="r"] Opcional. Tipo de informação: "r" para valor de resgate, "i" para valor de investimento, "t" para a taxa atual, ou "d" para ultima data de atualização do resultado da API.
 * @return {number|string} O valor numérico de resgate/investimento ou o texto da taxa do título.
 *
 * @customfunction
 *
 * @example
 * =TESOURODIRETO("Tesouro IPCA+ 2032")
 * =TESOURODIRETO("Tesouro IPCA+ 2032", "r")
 * =TESOURODIRETO("Tesouro IPCA+ 2032", "i")
 * =TESOURODIRETO("Tesouro IPCA+ 2032", "t")
 * =TESOURODIRETO("Tesouro IPCA+ 2032", "d")
 */
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
  });

  if (response.getResponseCode() !== 200) {
    throw new Error("Erro ao acessar a API ou título não encontrado.");
  }

  let bond = JSON.parse(response.getContentText());

  if (bond.treasuryBondCode === null) {
    throw new Error(bond.indication);
  }

  // "r" → valor de resgate
  // "i" → valor de investimento
  // "t" → taxa do Tesouro (investmentProfitabilityIndexerName)
  switch (argumento.toLowerCase()) {
    case "r":
      return bond.unitaryRedemptionValue;

    case "i":
      return bond.unitaryInvestmentValue;

    case "t":
      return bond.investmentProfitabilityIndexerName;

    case "d":
      return bond.updated_at;

    default:
      throw new Error("Argumento inválido. Use 'r', 'i', 't' ou 'd'.");
  }
}

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