Automação

ChatGPT sem API: GPT personalizado dispara o n8n por webhook

Em janeiro de 2025 eu liguei um GPT personalizado ao n8n por Action e webhook, atualizei fichas de cidade no banco e evitei a fatura da API. O truque do always allow, e o limite de URL “secreta”.

Assistir ao vídeo original no YouTube
Thumbnail do vídeo: Usando ChatGPT sem API para Automações e Workflow N8N Webhook

Quando se fala em workflow com GPT, a cabeça vai para a API da OpenAI. Nos modelos cheios, na época do 4o sem ser mini, a fatura no fim do mês doía. Eu já pagava os 20 dólares do ChatGPT. Queria usar essa assinatura para disparar automação — inclusive da rua, pelo celular — sem abrir o painel do n8n e sem colar texto no WordPress na mão. Dá. GPT personalizado tem Ações. A Ação chama um webhook. O n8n recebe e faz o resto.

Crie um GPT com instrução fixa, cadastre uma Ação apontando para o webhook do n8n, e mapeie no fluxo os campos que chegaram (no meu caso, cidade, província e HTML). O schema OpenAPI aceita `x-openai-isConsequential: false` para o ChatGPT oferecer “sempre permitir” em vez de confirmar cada envio. Eu não coloquei autenticação no webhook porque só eu tinha o link — isso é conveniência, não segurança. A API, num dos bancos, tinha passado de 50 dólares. No chat, a mesma atualização saiu da assinatura que eu já pagava.

Entrada
GPT personalizado com Ação HTTP
Meio
Webhook no n8n, SQL em dois nós
Saída
Artigo de cidade atualizado no banco

Por que o chat e não a API, mesmo no mesmo modelo

A API cobra por token no modelo que você escolher. O chat já está na fatura da assinatura. Além do preço, eu acho a resposta do ChatGPT melhor que a da API no mesmo modelo, com temperatura parecida. O próprio chat me falou em instruções internas que a API não leva. Se isso for marketing do modelo, a culpa é dele: eu estou relatando a impressão e o que ele respondeu. Na prática, para texto de ficha, eu preferi o chat.

O outro ganho é conversa. Na API, mudar o que vai para o n8n pede editar o workflow. No GPT, eu mando uma lista de cidades, digo “a partir de agora um ok devolve o próximo item”, e ele obedece. Estou na rua, abro o chat, mando o ok. Ele dispara a Ação. O n8n trabalha. Não é mágica. É HTTP.

Antes disso eu fazia o caminho manual: Navicat aberto, copiar cidade e província, colar num GPT, copiar a resposta, colar no banco. Para SEO programático de praças japonesas, isso era o dia. A automação não inventou o conteúdo. Tirou o vai-e-vem.

O fluxo: cidade e província entram, HTML sai no SQL

O recorte que eu mostrei: eu envio o nome de uma cidade do Japão e a província. O GPT devolve um texto já em `<p>` e `<h3>`, listando ponto turístico da região. O n8n pega isso e atualiza o artigo antigo no banco. Não é publicar um post novo. É enriquecer a ficha que já existe.

Na execução do n8n, o primeiro nó é Webhook. Chegam dois pedaços que eu pedi no schema: a “questão” (cidade e província, para eu filtrar) e a “resposta” (o HTML). Eu quebrei em dois nós de SQL por capricho. Dá para ser um. O primeiro acha o ID pela cidade e pela província. O segundo grava a resposta nesse ID. A lista de palavras que estava no campo vira texto com informação. Eu trabalho com página programática; atualizar ficha em lote é o trabalho chato que o ranking sente.

O servidor do n8n, no dia, estava instável. A primeira chamada falhou porque o processo estava subindo. Isso não é falha do GPT. É VPS. Quem hospeda n8n em casa conhece o restart. O webhook precisa estar no ar quando a Ação dispara, ou o chat devolve erro e você manda de novo.

  1. Crie o workflow com nó Webhook e copie a URL de produção.
  2. No ChatGPT, abra um GPT personalizado e crie uma Ação com o OpenAPI dessa URL.
  3. Descreva no schema os campos: questão, resposta, o que o SQL vai precisar.
  4. No n8n, filtre o registro (cidade, província) e só então faça o UPDATE.
  5. Mande um item de verdade e abra a execução: JSON in, SQL out, HTML no banco.

A Ação, o always allow, e o Actions GPT

Instrução do GPT: objetivo, formato da saída, quando chamar a Ação. Eu não vou colar o schema inteiro aqui. Pedi para o ChatGPT gerar o OpenAPI. Ele gerou. O campo que muda a vida operacional é `x-openai-isConsequential`. Na documentação das Ações, `false` faz o produto oferecer autorização permanente para aquele domínio, em vez de Confirm/Deny em toda mensagem. Eu achei a dica em fórum e confirmei no schema. Sem isso, cada cidade vira um clique a mais. Com isso, um ok na conversa segue a lista.

A OpenAI trata Ação consequente como operação que altera estado — POST que grava, dispara, apaga. Por isso o padrão é pedir confirmação. Atualizar banco é consequente no mundo real. O flag só muda o UX do chat. Não torna o POST inofensivo. Se outra pessoa tiver acesso ao GPT, ela dispara o mesmo webhook.

Existe um GPT oficial de ajuda, o Actions GPT, para tirar dúvida de schema. Eu usei a conversa comum. O caminho é o mesmo: OpenAPI, URL, método, corpo. Customizar. Copiar o meu fluxo e apontar para o seu banco sem mudar campo é o jeito de gravar no lugar errado.

URL escondida não é senha — e a API tinha passado de 50 dólares

Eu não coloquei autenticação no webhook. O argumento no vídeo: só eu sei o link, e eu já tinha rodado o endereço. Isso reduz curiosidade aleatória. Não reduz vazamento de chat, histórico, log do n8n, backup, pessoa no computador. A documentação do n8n oferece header, JWT, basic auth. Vale usar. O GPT envia o header se o schema pedir. “Ninguém vai adivinhar a UUID” é o mesmo erro da REST pública do WordPress, só que no seu automação.

Calculei a API para atualizar um dos bancos e passei de 50 dólares. Por isso o chat. A assinatura de 20 dólares já estava lá. A resposta, no meu gosto, ainda vinha melhor. Limite: a interface de GPT e de Ações muda. Este vídeo é de janeiro de 2025. Confirme no builder atual se a Ação ainda se cadastra do mesmo jeito, se o flag de consequential ainda existe, se o seu plano inclui GPT personalizado.

O resto do workflow é com você. Cadastro de usuário, fila, e-mail. O n8n só precisa receber um JSON previsível. O GPT só precisa saber quando chamar a Ação e o que mandar. A cabeça quebra em mapear resposta livre de modelo para coluna de banco. Isso não tem atalho. Tem um UPDATE com campo nomeado.

Na sequência

  1. Defina o JSON da Ação antes de escrever o SQL.
  2. Use `x-openai-isConsequential: false` só se você aceitar “sempre permitir” naquele domínio.
  3. Coloque autenticação no webhook; não confie no segredo da URL.
  4. Atualize por ID encontrado, não por LIKE no título inteiro do artigo.
  5. Some o custo da API num lote piloto antes de jurar que o chat “sai de graça”.

Onde isso quebra

Deixar o webhook aberto e compartilhar o GPT com outras pessoas.

Mandar o modelo escolher a query SQL a partir do texto livre.

Confirmar cada POST na mão e achar que o fluxo “não escala” — o flag existe para isso.

Comparar qualidade da API com o chat sem olhar o que mudou no builder dois anos depois.

Perguntas frequentes

Isso substitui a API da OpenAI?

Substitui no recorte de lote que uma pessoa dispara pelo chat, dentro da assinatura. Não substitui servidor falando com servidor 24 horas, sem ninguém mandar “ok”. Aí a API continua sendo o caminho.

Preciso do n8n?

Precisa de um HTTP que receba o POST. n8n foi o que eu usei. Qualquer webhook autenticado serve. O GPT não sabe que o destino é n8n.

O flag consequential é oficial?

É extensão documentada nas Ações de GPT. `false` mostra a opção de sempre permitir. `true` ou ausência em POST costuma pedir confirmação. Confirme no builder do seu plano.

Por que dois nós de SQL?

Capricho. Um SELECT do ID, um UPDATE. Dá para ser um nó. Eu quis ver o ID na execução antes de gravar.

O n8n que ainda pede VPS e a alternativa na borda estão em alternativa ao n8n com Cloudflare Workflows. Outro workflow meu no mesmo n8n, sujando menos o MySQL, está em limpar o banco do TranslatePress com n8n.