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