Para monitorar cotações de soja, milho e café com alertas no Telegram, monte no n8n um fluxo com quatro peças: um Schedule Trigger que roda no horário de Brasília, um nó HTTP Request (ou leitura de planilha) que busca os preços em uma fonte cujos termos permitem esse uso, um nó de código que calcula variações e verifica limites, e o nó Telegram que envia o alerta ou o resumo do dia. Um modelo de linguagem pode redigir o resumo, desde que receba os números prontos e seja proibido de criar valores.
A parte técnica é simples. O que costuma dar problema é a fonte dos dados: indicadores de preços agrícolas têm dono, licença e regras de redistribuição. Este guia começa por aí, depois mostra o fluxo nó a nó, o prompt do resumo e os limites do Telegram.
Resumo rápido
- Escolha a fonte antes do fluxo: CEPEA, Conab e B3 têm condições de uso diferentes, e raspar páginas contra os termos não é opção.
- Os dados do CEPEA estão sob licença CC BY-NC 4.0, com citação obrigatória; a política do centro proíbe retransmitir séries de preços sem autorização.
- No n8n, configure o fuso do workflow: instâncias self-hosted usam America/New_York por padrão.
- O LLM só redige: preços, variações e limites são calculados em código e conferidos antes do envio.
- O Telegram limita mensagens a 4.096 caracteres e bots a cerca de 20 mensagens por minuto em um grupo.
De onde vêm os preços: fontes e o que cada uma permite
Commodities agrícolas no Brasil têm três tipos de referência que aparecem em conversas de cooperativas, cerealistas e tradings: os indicadores do CEPEA (Centro de Estudos Avançados em Economia Aplicada, da Esalq/USP), os levantamentos de preços da Conab (Companhia Nacional de Abastecimento) e os contratos futuros negociados na B3. Cada um mede uma coisa e tem regras próprias.
| Fonte | O que oferece | Condição de uso relevante | Como entra no fluxo |
|---|---|---|---|
| CEPEA/Esalq | Indicadores diários de preços de soja, milho, café e outros produtos; séries históricas mediante formulário | Licença CC BY-NC 4.0 (uso não comercial, com crédito); citação obrigatória; política proíbe transmitir séries de preços sem autorização formal; widgets são exceção | Uso interno com crédito; para grupos de clientes ou uso comercial, peça autorização ao CEPEA |
| Conab | Pesquisa de preços de mais de uma centena de produtos agropecuários há décadas, com sistemas de consulta (Preços de Mercado, Insumos, PGPM, entre outros) | A própria Conab informa que não está no escopo do Decreto nº 8.777/2016 (política de dados abertos); não há API pública documentada | Exportações e consultas dos sistemas, conferindo as condições de uso; dúvidas pelo contato indicado na página |
| B3 | Preços e ajustes de contratos futuros agrícolas | Dados de mercado seguem a política comercial e os distribuidores autorizados da B3 | API do distribuidor ou da corretora contratada, nos termos do contrato |
| Banco Central (PTAX) | Taxa de câmbio real/dólar de referência | API pública no Portal de Dados Abertos do BC | Converter referências em dólar para reais no resumo |
Na prática, um produtor ou consultor que quer acompanhar preços para decisão própria tem caminho simples: baixar ou receber os dados pelo meio oficial, guardar numa planilha ou banco e deixar o n8n ler dali. Quem pretende enviar indicadores para um grupo de clientes, associados ou assinantes está redistribuindo dados, e precisa da autorização do dono ou de uma fonte contratada.
Por que não fazer scraping
Raspar a página de um indicador parece o atalho óbvio. Além de quebrar a cada mudança de layout, o CEPEA declara que retransmitir conteúdo exige autorização e que a transmissão de séries de preços não é permitida; a licença de dados veda reprodução e distribuição comercial sem autorização expressa. Para dados de bolsa, o acesso passa pela política comercial da B3. Construa o fluxo em cima de exportações, APIs contratadas ou autorizações por escrito.
Arquitetura do fluxo no n8n
O fluxo completo tem de seis a oito nós. Se você ainda não montou um bot no n8n, o guia de bots de Telegram para alertas de servidores e APIs cobre a criação do bot e da credencial; aqui o foco é o que muda quando o dado é preço.
- Schedule Trigger. Duas regras: uma para checagens ao longo do dia e outra para o resumo de fim de tarde. O nó aceita intervalos (minutos, horas, dias, semanas) e expressões cron. Atenção ao fuso: ele usa o fuso do workflow, se definido, ou o da instância; no self-hosted o padrão é America/New_York. Defina America/Sao_Paulo nas configurações do workflow.
- Coleta. Um HTTP Request para a API contratada ou um nó de planilha (Google Sheets, por exemplo) lendo a aba onde os dados oficiais são registrados. Um segundo HTTP Request busca a PTAX na API do Banco Central para as conversões.
- Normalização (Code). Padroniza produto, praça, unidade (saca de 60 kg, por exemplo), moeda, data de referência e fonte. Descarta registros sem data ou com unidade desconhecida.
- Cálculo (Code). Variação diária e semanal, comparação com faixas de alerta definidas por produto e marcação de dado defasado (por exemplo, indicador sem atualização no último dia útil).
- IF. Separa o caminho de alerta imediato do caminho de resumo diário.
- LLM. Um nó Basic LLM Chain ou o nó da OpenAI recebe o JSON com os números já calculados e redige o texto.
- Validação (Code). Confere se todo número citado no texto existe no JSON de entrada. Se não bater, envia a versão em modelo fixo sem LLM.
- Telegram, Send Message. Envia ao chat ou grupo com formatação HTML.
Para quem está começando no n8n, vale ler antes nosso panorama de n8n com IA para pequenas empresas.
Calculando variação e alertas sem depender do modelo
Toda conta acontece no nó Code. O exemplo abaixo recebe itens já normalizados, cada um com o preço atual e o anterior, e devolve apenas o que interessa ao alerta. As faixas são parâmetros da sua operação, não recomendação.
// Nó Code (modo "Run Once for All Items")
const faixas = { soja: 2.0, milho: 2.5, cafe_arabica: 3.0 }; // % definidos pela equipe
return $input.all().map(({ json: p }) => {
const variacao = ((p.preco_atual / p.preco_anterior) - 1) * 100;
const limite = faixas[p.produto] ?? 2.0;
return {
json: {
...p,
variacao_pct: Number(variacao.toFixed(2)),
alerta: Math.abs(variacao) >= limite,
defasado: p.data_referencia !== p.ultimo_dia_util,
},
};
});
Repare em três decisões. A variação é arredondada no código, então o texto final não depende do arredondamento do modelo. O campo defasado evita que um indicador sem atualização pareça “estável”. E o resultado mantém fonte e data_referencia, que vão obrigatoriamente para a mensagem.
Conversão pelo dólar
Quando a referência está em dólar (contratos internacionais ou cotações de exportação), use a PTAX de venda do Banco Central, consultada pelo serviço Olinda, e informe na mensagem qual boletim foi usado. Se o dia não tiver boletim, use o último dia útil e escreva isso.
O resumo diário com LLM, sem números inventados
O modelo de linguagem é útil para transformar uma tabela em três parágrafos legíveis no celular. Ele não deve buscar dados, completar lacunas nem estimar tendência. O prompt precisa deixar isso explícito:
Você redige um resumo de preços agrícolas para um grupo de Telegram.
Use SOMENTE os números do JSON abaixo. Não arredonde, não estime,
não acrescente preços, previsões ou causas que não estejam no JSON.
Para cada produto: preço, unidade, praça, variação diária e fonte.
Se "defasado" for true, escreva "sem atualização na data".
Termine com a linha: "Fontes: {fontes}. Dados para referência,
não constituem recomendação de compra ou venda."
Formato: HTML do Telegram (apenas <b> e <i>), até 1.200 caracteres.
JSON: {{ $json.dados }}
Depois do LLM, o nó de validação extrai todos os números do texto com uma expressão regular e confere se cada um aparece no JSON de entrada. Qualquer número estranho faz o fluxo descartar o texto do modelo e montar a mensagem com um template fixo. É um controle barato contra o problema descrito no nosso guia sobre alucinação em IA. Se usar modelos da OpenAI no n8n, a página de integrações com OpenAI e ChatGPT reúne o que está disponível.
Configurando o bot e respeitando os limites do Telegram
O token do bot é gerado no BotFather com o comando /newbot; o nome de usuário deve terminar em “bot” e não pode ser alterado depois. No n8n, o token vai na credencial do Telegram. Para postar num canal ou grupo, adicione o bot a ele. O chat_id pode ser descoberto mandando uma mensagem ao bot e chamando getUpdates, que não funciona enquanto houver webhook configurado.
| Limite ou regra | O que diz a documentação do Telegram | Impacto no fluxo |
|---|---|---|
| Tamanho da mensagem | De 1 a 4.096 caracteres após o processamento das entidades | Peça ao LLM um teto bem menor e corte no código se passar |
| Formatação | Modos Markdown ou HTML; HTML aceita tags como <b>, <i> e <u> | Use HTML e escape os caracteres <, > e & vindos dos dados |
| Ritmo em um chat | Evitar mais de uma mensagem por segundo | Agrupe alertas simultâneos numa só mensagem |
| Ritmo em grupo | Até 20 mensagens por minuto | Resumo consolidado em vez de um alerta por praça |
| Envio em massa | Cerca de 30 mensagens por segundo no modo gratuito | Relevante só se o bot atender muitos assinantes individuais |
Exemplo: cooperativa no oeste do Paraná
Imagine uma cooperativa em Cascavel (PR) cujos técnicos de campo recebem perguntas diárias de cooperados sobre preço de soja e milho, e cuja equipe comercial acompanha café para um grupo de associados no norte do estado. Hoje, um analista copia valores de diferentes sites para um grupo de WhatsApp no meio da manhã, sem padrão de horário nem indicação de fonte.
No novo fluxo, a cooperativa formaliza o uso dos dados: pede ao CEPEA autorização para enviar os indicadores aos cooperados, com a citação exigida, e usa a API da corretora que já contrata para os ajustes dos futuros na B3. O analista continua responsável pela planilha de preços pagos nas unidades da própria cooperativa. O n8n roda checagens durante o pregão e, se a variação de um produto passar da faixa combinada, envia um alerta curto ao grupo interno da equipe comercial. No fim da tarde, o resumo gerado pelo LLM e validado pelo código vai para o canal dos cooperados, com fontes e horário de referência.
O exemplo é ilustrativo e não traz números de resultado. O que muda, de forma verificável, é que cada mensagem passa a ter fonte, data de referência e um responsável pela regra de alerta.
Erros comuns
- Começar pelo scraping. O fluxo funciona até a página mudar ou até chegar uma notificação do dono dos dados. Resolva a licença primeiro.
- Esquecer o fuso. Um Schedule Trigger no fuso de Nova York dispara o resumo no horário errado em parte do ano.
- Deixar o LLM “completar” o dia. Se um indicador não saiu, o modelo tende a preencher com algo plausível. Marque como defasado no código.
- Misturar unidades e praças. Saca de 60 kg, tonelada e bushel não se comparam sem conversão explícita; praça de porto e de interior também não.
- Omitir a fonte. Além de exigência do CEPEA, sem fonte e horário ninguém consegue conferir o alerta.
- Alerta por item. Dez mensagens seguidas no grupo esbarram nos limites do Telegram e cansam o leitor. Consolide.
- Soar como recomendação. Resumo de preços não é orientação de investimento; deixe isso escrito na mensagem.
Perguntas frequentes
Posso usar os indicadores do CEPEA num bot gratuito?
Para uso pessoal e não comercial, a licença CC BY-NC 4.0 permite, com crédito ao CEPEA. Enviar séries de preços a terceiros é retransmissão, e a política do centro pede autorização formal. Na dúvida, pergunte ao CEPEA antes de publicar.
A Conab tem uma API aberta de preços?
A Conab não publica uma API pública documentada de preços e informa que não está no escopo do decreto federal de dados abertos. Ela mantém sistemas de consulta de preços; use as opções que eles oferecem e confirme as condições de uso com a companhia.
Preciso de n8n Cloud ou posso usar self-hosted?
Os nós usados aqui (Schedule Trigger, HTTP Request, Code, IF, Telegram e nós de LLM) existem nas duas versões. No self-hosted, configure o fuso e mantenha a instância atualizada.
Qual modelo de linguagem usar no resumo?
Como o modelo só redige um texto curto a partir de números prontos, modelos menores e mais baratos costumam bastar. Teste com alguns dias de dados reais e mantenha a validação de números ligada.
Dá para receber os alertas no WhatsApp em vez do Telegram?
Sim, trocando o último nó pela integração com a API oficial do WhatsApp. As regras de envio e de custo são diferentes, então revise a frequência das mensagens antes de migrar.
Fontes e leitura recomendada
- CEPEA: licença de uso de dados (CC BY-NC 4.0)
- CEPEA: política de direitos autorais
- Conab: preços agropecuários e sistemas de consulta
- B3: market data, plataformas de difusão e política comercial
- n8n: documentação do Schedule Trigger
- n8n: documentação do HTTP Request
- n8n: documentação do nó Telegram
- Telegram Bot API: referência de métodos (sendMessage, getUpdates)
- Telegram: Bot FAQ (limites de envio)
- Banco Central: API PTAX (Olinda)