Skip to content

Instantly share code, notes, and snippets.

@danperrout
Last active May 6, 2024 17:53
Show Gist options
  • Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.
Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.
API Função TESOURODIRETO Google Sheets
/*
* @return Retorna a cotação atual de um título específico do Tesouro Direto.
* Fonte: https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm
**/
function TESOURODIRETO(bondName, argumento="r") {
let srcURL = "https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json";
let jsondata = UrlFetchApp.fetch(srcURL);
let parsedData = JSON.parse(jsondata.getContentText()).response;
for(let bond of parsedData.TrsrBdTradgList) {
let currBondName = bond.TrsrBd.nm;
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.");
}
@levycarneiro
Copy link

Olá amigo, obrigado pelo código!

Uma dúvida, por que "Tesouro Prefixado 2025" não aparece na API? As vezes aparece, as vezes não. Neste exato momento não aparece.

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

Retorno da URL acima:

{
	"responseStatus": 200,
	"responseStatusText": "success",
	"statusInfo": "OK",
	"response": {
		"BdTxTp": {
			"cd": 0
		},
		"TrsrBondMkt": {
			"opngDtTm": "2022-11-23T09:25:00",
			"clsgDtTm": "2022-11-24T05:00:00",
			"qtnDtTm": "2022-11-23T13:08:40.893",
			"stsCd": 1,
			"sts": "Aberto"
		},
		"TrsrBdTradgList": [
			{
				"TrsrBd": {
					"cd": 159,
					"nm": "Tesouro Selic 2023",
					"featrs": "Título com rentabilidade diária vinculada à taxa de juros da economia (taxa Selic). Isso significa que se a taxa Selic aumentar a sua rentabilidade aumenta e se a taxa Selic diminuir, sua rentabilidade diminui.",
					"mtrtyDt": "2023-03-01T00:00:00",
					"minInvstmtAmt": 0.0,
					"untrInvstmtVal": 0.0,
					"invstmtStbl": "Esse investimento garante que, mesmo em caso de resgate antecipado, o montante do dinheiro resgatado será superior ao inicialmente investido.  Como não paga juros semestrais, é mais interessante para quem pode deixar o dinheiro render até o vencimento do investimento.",
					"semiAnulIntrstInd": false,
					"rcvgIncm": "Indicado para aqueles que querem realizar investimentos de curto prazo.",
					"anulInvstmtRate": 0.0,
					"anulRedRate": 0.0273,
					"minRedQty": 0.01,
					"untrRedVal": 12456.21,
					"minRedVal": 124.56,
					"isinCd": "BRSTNCLF1R82",
					"FinIndxs": {
						"cd": 17,
						"nm": "SELIC"
					},
					"wdwlDt": "2019-02-01T00:00:00"
				},
				"TrsrBdType": {
					"cd": 4,
					"nm": "LFT",
					"ctdyRate": 10000.0,
					"grPr": 0
				}
			},
			{
				"TrsrBd": {
					"cd": 171,
					"nm": "Tesouro Selic 2024",
					"featrs": "Título com rentabilidade diária vinculada à taxa de juros da economia (taxa Selic). Isso significa que se a taxa Selic aumentar a sua rentabilidade aumenta e se a taxa Selic diminuir, sua rentabilidade diminui.\r\n",
					"mtrtyDt": "2024-09-01T00:00:00",
					"minInvstmtAmt": 0.0,
					"untrInvstmtVal": 0.0,
					"invstmtStbl": "Como não paga juros semestrais, é mais interessante para quem pode deixar o dinheiro render até o vencimento do investimento\r\n",
					"semiAnulIntrstInd": false,
					"rcvgIncm": "Indicado para aqueles que querem realizar investimentos de curto prazo\r\n",
					"anulInvstmtRate": 0.0,
					"anulRedRate": 0.0294,
					"minRedQty": 0.01,
					"untrRedVal": 12450.66,
					"minRedVal": 124.51,
					"isinCd": "BRSTNCLF0008",
					"FinIndxs": {
						"cd": 17,
						"nm": "SELIC"
					},
					"wdwlDt": "2022-02-24T00:00:00"
				},
				"TrsrBdType": {
					"cd": 4,
					"nm": "LFT",
					"ctdyRate": 10000.0,
					"grPr": 0
				}
			},
			{
				"TrsrBd": {
					"cd": 164,
					"nm": "Tesouro Selic 2025",
					"featrs": "Título com rentabilidade diária vinculada à taxa de juros da economia (taxa Selic). Isso significa que se a taxa Selic aumentar a sua rentabilidade aumenta e se a taxa Selic diminuir, sua rentabilidade diminui.",
					"mtrtyDt": "2025-03-01T00:00:00",
					"minInvstmtAmt": 124.46,
					"untrInvstmtVal": 12446.57,
					"invstmtStbl": "Como não paga juros semestrais, é mais interessante para quem pode deixar o dinheiro render até o vencimento do investimento",
					"semiAnulIntrstInd": false,
					"rcvgIncm": "Indicado para aqueles que querem realizar investimentos de curto prazo",
					"anulInvstmtRate": 0.0373,
					"anulRedRate": 0.0473,
					"minRedQty": 0.01,
					"untrRedVal": 12443.75,
					"minRedVal": 124.44,
					"isinCd": "BRSTNCLF1RC4",
					"FinIndxs": {
						"cd": 17,
						"nm": "SELIC"
					}
				},
				"TrsrBdType": {
					"cd": 4,
					"nm": "LFT",
					"ctdyRate": 10000.0,
					"grPr": 0
				}
			},
			{
				"TrsrBd": {
					"cd": 172,
					"nm": "Tesouro Selic 2027",
					"featrs": "Título com rentabilidade diária vinculada à taxa de juros da economia (taxa Selic). Isso significa que se a taxa Selic aumentar a sua rentabilidade aumenta e se a taxa Selic diminuir, sua rentabilidade diminui.\r\n",
					"mtrtyDt": "2027-03-01T00:00:00",
					"minInvstmtAmt": 123.8,
					"untrInvstmtVal": 12380.75,
					"invstmtStbl": "Como não paga juros semestrais, é mais interessante para quem pode deixar o dinheiro render até o vencimento do investimento\r\n",
					"semiAnulIntrstInd": false,
					"rcvgIncm": "Indicado para aqueles que querem realizar investimentos de curto prazo\r\n",
					"anulInvstmtRate": 0.1448,
					"anulRedRate": 0.1548,
					"minRedQty": 0.01,
					"untrRedVal": 12375.49,
					"minRedVal": 123.75,
					"isinCd": "BRSTNCLF1RG5",
					"FinIndxs": {
						"cd": 17,
						"nm": "SELIC"
					}
				},
				"TrsrBdType": {
					"cd": 4,
					"nm": "LFT",
					"ctdyRate": 10000.0,
					"grPr": 0
				}
			}
		],
		"BizSts": {
			"cd": "0",
			"dtTm": "2022-11-23T14:14:30"
		}
	}
}

@blechner
Copy link

Olá amigo, obrigado pelo código!

Uma dúvida, por que "Tesouro Prefixado 2025" não aparece na API? As vezes aparece, as vezes não. Neste exato momento não aparece.

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

Retorno da URL acima:

{
	"responseStatus": 200,
	"responseStatusText": "success",
	"statusInfo": "OK",
	"response": {
		"BdTxTp": {
			"cd": 0
		},
		"TrsrBondMkt": {
			"opngDtTm": "2022-11-23T09:25:00",
			"clsgDtTm": "2022-11-24T05:00:00",
			"qtnDtTm": "2022-11-23T13:08:40.893",
			"stsCd": 1,
			"sts": "Aberto"
		},
		"TrsrBdTradgList": [
			{
				"TrsrBd": {
					"cd": 159,
					"nm": "Tesouro Selic 2023",
					"featrs": "Título com rentabilidade diária vinculada à taxa de juros da economia (taxa Selic). Isso significa que se a taxa Selic aumentar a sua rentabilidade aumenta e se a taxa Selic diminuir, sua rentabilidade diminui.",
					"mtrtyDt": "2023-03-01T00:00:00",
					"minInvstmtAmt": 0.0,
					"untrInvstmtVal": 0.0,
					"invstmtStbl": "Esse investimento garante que, mesmo em caso de resgate antecipado, o montante do dinheiro resgatado será superior ao inicialmente investido.  Como não paga juros semestrais, é mais interessante para quem pode deixar o dinheiro render até o vencimento do investimento.",
					"semiAnulIntrstInd": false,
					"rcvgIncm": "Indicado para aqueles que querem realizar investimentos de curto prazo.",
					"anulInvstmtRate": 0.0,
					"anulRedRate": 0.0273,
					"minRedQty": 0.01,
					"untrRedVal": 12456.21,
					"minRedVal": 124.56,
					"isinCd": "BRSTNCLF1R82",
					"FinIndxs": {
						"cd": 17,
						"nm": "SELIC"
					},
					"wdwlDt": "2019-02-01T00:00:00"
				},
				"TrsrBdType": {
					"cd": 4,
					"nm": "LFT",
					"ctdyRate": 10000.0,
					"grPr": 0
				}
			},
			{
				"TrsrBd": {
					"cd": 171,
					"nm": "Tesouro Selic 2024",
					"featrs": "Título com rentabilidade diária vinculada à taxa de juros da economia (taxa Selic). Isso significa que se a taxa Selic aumentar a sua rentabilidade aumenta e se a taxa Selic diminuir, sua rentabilidade diminui.\r\n",
					"mtrtyDt": "2024-09-01T00:00:00",
					"minInvstmtAmt": 0.0,
					"untrInvstmtVal": 0.0,
					"invstmtStbl": "Como não paga juros semestrais, é mais interessante para quem pode deixar o dinheiro render até o vencimento do investimento\r\n",
					"semiAnulIntrstInd": false,
					"rcvgIncm": "Indicado para aqueles que querem realizar investimentos de curto prazo\r\n",
					"anulInvstmtRate": 0.0,
					"anulRedRate": 0.0294,
					"minRedQty": 0.01,
					"untrRedVal": 12450.66,
					"minRedVal": 124.51,
					"isinCd": "BRSTNCLF0008",
					"FinIndxs": {
						"cd": 17,
						"nm": "SELIC"
					},
					"wdwlDt": "2022-02-24T00:00:00"
				},
				"TrsrBdType": {
					"cd": 4,
					"nm": "LFT",
					"ctdyRate": 10000.0,
					"grPr": 0
				}
			},
			{
				"TrsrBd": {
					"cd": 164,
					"nm": "Tesouro Selic 2025",
					"featrs": "Título com rentabilidade diária vinculada à taxa de juros da economia (taxa Selic). Isso significa que se a taxa Selic aumentar a sua rentabilidade aumenta e se a taxa Selic diminuir, sua rentabilidade diminui.",
					"mtrtyDt": "2025-03-01T00:00:00",
					"minInvstmtAmt": 124.46,
					"untrInvstmtVal": 12446.57,
					"invstmtStbl": "Como não paga juros semestrais, é mais interessante para quem pode deixar o dinheiro render até o vencimento do investimento",
					"semiAnulIntrstInd": false,
					"rcvgIncm": "Indicado para aqueles que querem realizar investimentos de curto prazo",
					"anulInvstmtRate": 0.0373,
					"anulRedRate": 0.0473,
					"minRedQty": 0.01,
					"untrRedVal": 12443.75,
					"minRedVal": 124.44,
					"isinCd": "BRSTNCLF1RC4",
					"FinIndxs": {
						"cd": 17,
						"nm": "SELIC"
					}
				},
				"TrsrBdType": {
					"cd": 4,
					"nm": "LFT",
					"ctdyRate": 10000.0,
					"grPr": 0
				}
			},
			{
				"TrsrBd": {
					"cd": 172,
					"nm": "Tesouro Selic 2027",
					"featrs": "Título com rentabilidade diária vinculada à taxa de juros da economia (taxa Selic). Isso significa que se a taxa Selic aumentar a sua rentabilidade aumenta e se a taxa Selic diminuir, sua rentabilidade diminui.\r\n",
					"mtrtyDt": "2027-03-01T00:00:00",
					"minInvstmtAmt": 123.8,
					"untrInvstmtVal": 12380.75,
					"invstmtStbl": "Como não paga juros semestrais, é mais interessante para quem pode deixar o dinheiro render até o vencimento do investimento\r\n",
					"semiAnulIntrstInd": false,
					"rcvgIncm": "Indicado para aqueles que querem realizar investimentos de curto prazo\r\n",
					"anulInvstmtRate": 0.1448,
					"anulRedRate": 0.1548,
					"minRedQty": 0.01,
					"untrRedVal": 12375.49,
					"minRedVal": 123.75,
					"isinCd": "BRSTNCLF1RG5",
					"FinIndxs": {
						"cd": 17,
						"nm": "SELIC"
					}
				},
				"TrsrBdType": {
					"cd": 4,
					"nm": "LFT",
					"ctdyRate": 10000.0,
					"grPr": 0
				}
			}
		],
		"BizSts": {
			"cd": "0",
			"dtTm": "2022-11-23T14:14:30"
		}
	}
}

Isso é porque a negociação dos títulos está sendo suspensa a todo momento nesses dias, com o risco brasil nas alturas graças à tragédia que ocorreu no dia 30/10/2022. Então o Tesouro Nacional suspende as negociações para acalmar o "animo" dos investidores. Mas agora já voltou, pode testar que todos os títulos estão sendo incluídos no resultado.

@LuizHDev
Copy link

Olá amigo, seria muito trabalhoso fazer essa função para o excel no VBA?

@Octandrade
Copy link

Uso sua API, como faço para buscar o valor de um tesouro que não está mais à venda, mais tenho dinheiro aplicado, como o Tesouro Selic 2024

@joaopedrosusselbertogna

Gente, eu sou meio animal com programação, como eu faço para adicionar essa API no Google Planilhas? Sou professor e estou desenvolvendo um projeto de educação financeira, posso melhorar muito minha planilha com esse API

@danperrout
Copy link
Author

danperrout commented Feb 11, 2023 via email

@danperrout
Copy link
Author

Uso sua API, como faço para buscar o valor de um tesouro que não está mais à venda, mais tenho dinheiro aplicado, como o Tesouro Selic 2024

Meu código já prevê isso e vc pode usar um argumento na sua função pra trazer o valor da aba "INVESTIR" ou o valor da aba "RESGATAR". Por padrão ele traz o valor da aba resgatar. Caso queira o outro valor, usando meu código, é só colocar na sua célula =TESOURODIRETO("nome do título","i")

@johnt1000
Copy link

Boa noite @danperrout, obrigado por compartilhar seu código.

@klausbegnis
Copy link

klausbegnis commented Sep 4, 2023

Então, não estava mais funcionando, pois não comparava certo os valores de ano, adicionei isso daqui:
resolvou para os casos do prefixado e selic que são os do meu interesse

Coloquei uns logs pra debug assim consegue ver no histório de execuções as comparações entre o json e o que você informou de input

/** @return Retorna a cotação atual de um título específico do Tesouro Direto. 
* Fonte: https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm
**/
function TESOURODIRETO2(bondName, argumento="r") {
    let srcURL = "https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.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(currBondName, bondName)
        if (currBondName === bondName)
          var thenum1 = currBondName.replace(/^\D+/g, '');
          var thenum2 = bondName.replace(/^\D+/g, '');
          if (thenum1 === thenum2)
              if(argumento == "r")
                  return bond.TrsrBd.untrRedVal;
              else
                  return bond.TrsrBd.untrInvstmtVal;
    }
    throw new Error("Título não encontrado.", bondName);
}

@wroliveira1
Copy link

Ha alguns dias parou de funcionar. Colocando o codigo do klausbegnis consegui fazer o tesouro selic 2029 funcionar com argumento i, ja os demais titulos nao sao encontrados. Com argumento r ele retorna 0. Alguma ideia ?

@danperrout
Copy link
Author

Ha alguns dias parou de funcionar. Colocando o codigo do klausbegnis consegui fazer o tesouro selic 2029 funcionar com argumento i, ja os demais titulos nao sao encontrados. Com argumento r ele retorna 0. Alguma ideia ?

No dia de hoje, esse são os 53 títulos que retornam valor:
[
"Tesouro Selic 2024",
"Tesouro Selic 2025",
"Tesouro Selic 2026",
"Tesouro Selic 2027",
"Tesouro Selic 2029",
"Tesouro Prefixado 2024",
"Tesouro Prefixado 2025",
"Tesouro Prefixado com Juros Semestrais 2025",
"Tesouro Prefixado 2026",
"Tesouro Prefixado com Juros Semestrais 2027",
"Tesouro Prefixado 2029",
"Tesouro Prefixado com Juros Semestrais 2029",
"Tesouro Prefixado com Juros Semestrais 2031",
"Tesouro Prefixado com Juros Semestrais 2033",
"Tesouro IPCA+ 2024",
"Tesouro IPCA+ com Juros Semestrais 2024",
"Tesouro IPCA+ 2026",
"Tesouro IPCA+ com Juros Semestrais 2026",
"Tesouro IPCA+ 2029",
"Tesouro IPCA+ com Juros Semestrais 2030",
"Tesouro Educa+ 2026",
"Tesouro Educa+ 2027",
"Tesouro IPCA+ com Juros Semestrais 2032",
"Tesouro Educa+ 2028",
"Tesouro Educa+ 2029",
"Tesouro Educa+ 2030",
"Tesouro IPCA+ 2035",
"Tesouro IPCA+ com Juros Semestrais 2035",
"Tesouro Educa+ 2031",
"Tesouro Educa+ 2032",
"Tesouro Educa+ 2033",
"Tesouro Educa+ 2034",
"Tesouro Educa+ 2035",
"Tesouro IPCA+ com Juros Semestrais 2040",
"Tesouro Educa+ 2036",
"Tesouro Educa+ 2037",
"Tesouro Educa+ 2038",
"Tesouro Educa+ 2039",
"Tesouro Educa+ 2040",
"Tesouro IPCA+ 2045",
"Tesouro IPCA+ com Juros Semestrais 2045",
"Tesouro Educa+ 2041",
"Tesouro Renda+ Aposentadoria Extra 2030",
"Tesouro IPCA+ com Juros Semestrais 2050",
"Tesouro Renda+ Aposentadoria Extra 2035",
"Tesouro IPCA+ com Juros Semestrais 2055",
"Tesouro Renda+ Aposentadoria Extra 2040",
"Tesouro Renda+ Aposentadoria Extra 2045",
"Tesouro Renda+ Aposentadoria Extra 2050",
"Tesouro Renda+ Aposentadoria Extra 2055",
"Tesouro Renda+ Aposentadoria Extra 2060",
"Tesouro Renda+ Aposentadoria Extra 2065",
"Tesouro IGPM+ com Juros Semestrais 2031"
]

@GuilhermeCostaTSilvio
Copy link

Boa tarde, como eu faria se quisesse trazer o valor unitário do titulo, algum saberia me ajudar?

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