EditaCódigo API — Documentação

← Voltar para a área de tutoriais
Baixar no GitHub

Instalação

O servidor Node.js (que roda no seu VPS) e o instalador ficam disponíveis publicamente no GitHub:

github.com/edita-codigo/editacodigo-api-publica

Todas as chamadas seguem o mesmo formato: POST / no domínio/porta onde a API está instalada, com JSON no corpo:

{
  "token": "SUA_CHAVE_API_AQUI",
  "action": "NomeDaAcao",
  "usuario": "usuario1",
  "message": { }
}

token é a sua chave de API (veja em "Meu Token") — obrigatório em toda requisição. Se a chave não for enviada ou não existir no banco, o servidor bloqueia a chamada com erro 401, sem nem processar a ação. usuario identifica a instância/sessão do WhatsApp. message só é necessário nas ações que exigem parâmetros extras.

Guia rápido da API Gratuita GRÁTIS

Este guia mostra o caminho mínimo para usar a API Gratuita do EditaCódigo. Ela envia mensagens de texto, recebe mensagens pelo webhook e permite consultar o estado da instância.

Nos exemplos abaixo, troque https://seu-dominio.com:443/ pelo seu domínio/porta e use o seu token real no lugar de SUA_CHAVE_API_AQUI. Se for compartilhar o código com outra pessoa, use nomes fictícios como TOKEN_EXEMPLO e SEU_DOMINIO.

1. Instalar a API no seu servidor

Comece pela seção Instalação, que aponta para o GitHub da API Pública. Se quiser gerar um comando pronto, use o Instalador Automático.

  • Informe a porta onde a API vai rodar, normalmente 443.
  • Informe o WEBHOOK_MENSAGENS, que é a URL do seu sistema para receber mensagens.
  • Depois de instalar, teste o domínio e a porta antes de criar a instância.

2. Criar a instância e ler o QR code

Use AbrirInstancia para iniciar a sessão do WhatsApp. O campo usuario identifica essa sessão.

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "AbrirInstancia", "usuario": "usuario1" }'

Depois, chame GerarQrcode para pegar a string do QR code e mostrá-la no seu painel. A explicação completa de como transformar essa string em imagem está em Instância.

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "GerarQrcode", "usuario": "usuario1" }'

3. Enviar mensagem de texto

Na API Gratuita, o envio disponível é mensagem de texto. O telefone deve ser enviado no formato numérico com DDI e DDD, como 5511999999999.

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{
        "token": "SUA_CHAVE_API_AQUI",
        "action": "EnviarMsg",
        "usuario": "usuario1",
        "message": { "telefone": "5511999999999", "msg": "Olá!" }
      }'

4. Receber mensagens por webhook

Quando chega uma mensagem no WhatsApp conectado, a API envia um POST para o seu WEBHOOK_MENSAGENS. O seu endpoint precisa responder rápido e retornar sucesso.

# Isso NÃO é uma chamada que você faz — é o formato que o NOSSO servidor
# envia pro SEU webhook (WEBHOOK_MENSAGENS) toda vez que chega mensagem.
# Exemplo simulando o envio pro seu próprio endpoint de teste:

curl -X POST https://seusite.com/webhook/recebe.php \
  -H "Content-Type: application/json" \
  -d '{
        "telefone": "5511999999999",
        "telefone_resolvido": true,
        "jid_original": "5511999999999@s.whatsapp.net",
        "grupo": null,
        "texto": "oi",
        "media": null,
        "id_mensagem": "ABCDEF123456",
        "usuario": "usuario1",
        "timestamp": 1234567890,
        "tipo": "chat",
        "nomeContato": "Fulano",
        "fotoPerfilUrl": null
      }'

5. Consultar o estado das instâncias

Use StatusInstancias para verificar as instâncias e seus status. Para consultas de contatos, chats e foto de perfil, veja a seção Consultas.

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "StatusInstancias" }'

6. Erros comuns e como resolver

  • Instância desconectada: gere o QR code novamente em Instância e escaneie pelo WhatsApp.
  • Número inválido: revise o campo telefone. Use apenas números, com DDI e DDD.
  • Webhook sem resposta: confirme se a URL configurada no WEBHOOK_MENSAGENS está online, aceita POST com JSON e retorna uma resposta simples.
  • Porta sem acesso: confirme a porta usada na instalação, o firewall da VPS e o teste em https://seu-dominio:PORTA/status.

7. Quando passar para a API VIP/Premium

Use a API VIP/Premium quando precisar enviar mídia, enquetes, presença, recursos de grupos ou estrutura privada com mais recursos. Veja os planos em editacodigo.com.br/inicio/api.php.

Instalador Automático

Preencha os dados abaixo e receba um comando único pra colar no terminal — funciona em VPS Linux (Ubuntu 22.04/24.04), Windows ou macOS. Ele baixa o instalador, instala tudo e já sobe a API configurada.

Instância GRÁTIS

AbrirInstancia — abre/conecta a sessão do WhatsApp

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "AbrirInstancia", "usuario": "usuario1" }'

GerarQrcode — retorna o QR code atual

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "GerarQrcode", "usuario": "usuario1" }'

Recomendação: o campo qrcode retornado é só o texto/string do QR code, não uma imagem. Pra transformar em imagem escaneável, use uma API online gratuita de QR code dinâmico, tipo o goqr.me, passando a string como parâmetro:

https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=SEU_QRCODE_AQUI_URL_ENCODED

# Exemplo direto no HTML:
<img src="https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=SEU_QRCODE_AQUI_URL_ENCODED">

Outras opções equivalentes: Google Charts QR (legado) ou gerar localmente com bibliotecas como qrcode (Node/Python/PHP), sem depender de API externa.

RegenerarQrcode — força um novo QR code

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "RegenerarQrcode", "usuario": "usuario1" }'

FecharInstancia — fecha sem apagar a sessão

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "FecharInstancia", "usuario": "usuario1" }'

DestruirInstancia — fecha e apaga a sessão salva

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "DestruirInstancia", "usuario": "usuario1" }'

StatusInstancias — lista todas as instâncias e status

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "StatusInstancias" }'

Já configurou tudo? Gere o comando de instalação da API Pública automaticamente:

Envio de Texto GRÁTIS

EnviarMsg — envia mensagem de texto

Única forma de envio de conteúdo disponível na API Pública.

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{
        "token": "SUA_CHAVE_API_AQUI",
        "action": "EnviarMsg",
        "usuario": "usuario1",
        "message": { "telefone": "5511999999999", "msg": "Olá!" }
      }'

Recebimento de Mensagens GRÁTIS

A API Pública captura tudo que chega no WhatsApp (texto, imagem, vídeo, áudio, ptt, documento, sticker) — mesmo só podendo enviar texto. Toda mensagem recebida é enviada via POST para o seu WEBHOOK_MENSAGENS.

Como chega o número de telefone

  • telefone — número já limpo, ex: 5511999999999
  • telefone_resolvido — true quando o número real foi identificado; false quando o WhatsApp mandou um ID interno (@lid) impossível de resolver — nesse caso use jid_original como identificador
  • jid_original — identificador completo original (5511999999999@s.whatsapp.net)
  • grupo — vem preenchido com o ID do grupo quando a mensagem veio de um grupo

Como chega a mídia (imagem, vídeo, áudio, documento, sticker)

O campo media vem null para mensagens de texto puro, e preenchido assim para os outros tipos:

{ "type": "image", "mimetype": "image/jpeg", "data": "base64..." }

type pode ser: image, video, audio, ptt (áudio de voz), document, sticker. O data vem em base64 — você decodifica e salva onde quiser.

Como montar seu endpoint receptor

# Isso NÃO é uma chamada que você faz — é o formato que o NOSSO servidor
# envia pro SEU webhook (WEBHOOK_MENSAGENS) toda vez que chega mensagem.
# Exemplo simulando o envio pro seu próprio endpoint de teste:

curl -X POST https://seusite.com/webhook/recebe.php \
  -H "Content-Type: application/json" \
  -d '{
        "telefone": "5511999999999",
        "telefone_resolvido": true,
        "jid_original": "5511999999999@s.whatsapp.net",
        "grupo": null,
        "texto": "oi",
        "media": null,
        "id_mensagem": "ABCDEF123456",
        "usuario": "usuario1",
        "timestamp": 1234567890,
        "tipo": "chat",
        "nomeContato": "Fulano",
        "fotoPerfilUrl": null
      }'

Consultas GRÁTIS

BuscarContatos — lista os contatos da instância

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "BuscarContatos", "usuario": "usuario1" }'

BuscarChats — lista as conversas recentes

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "BuscarChats", "usuario": "usuario1", "message": { "limite": 20 } }'

GetConversationContacts — contatos das conversas privadas

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "GetConversationContacts", "usuario": "usuario1" }'

GetProfilePic — foto de perfil de um contato

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{
        "token": "SUA_CHAVE_API_AQUI",
        "action": "GetProfilePic",
        "usuario": "usuario1",
        "message": { "telefone": "5511999999999" }
      }'

Mídia PRIVADA

EnviarMidia — imagem, vídeo, áudio, ptt, documento ou sticker

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{
        "token": "SUA_CHAVE_API_AQUI",
        "action": "EnviarMidia",
        "usuario": "usuario1",
        "message": {
          "telefone": "5511999999999",
          "tipo": "image",
          "arquivo": "https://exemplo.com/foto.jpg",
          "legenda": "Legenda opcional"
        }
      }'

tipo aceita: image, video, audio, ptt, document, sticker. arquivo aceita URL, base64 puro ou com prefixo data:....

Já configurou tudo? Gere o comando de instalação da API Privada automaticamente (exclusivo pra quem tem o plano Premium):

Enquetes PRIVADA

EnviarEnquete — envia uma enquete (poll)

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{
        "token": "SUA_CHAVE_API_AQUI",
        "action": "EnviarEnquete",
        "usuario": "usuario1",
        "message": {
          "telefone": "5511999999999",
          "pergunta": "Qual sua cor favorita?",
          "opcoes": ["Azul", "Verde", "Vermelho"],
          "permiteMultiplas": false
        }
      }'

Presença PRIVADA

EnviarDigitando / PararDigitando / EnviarGravando

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{
        "token": "SUA_CHAVE_API_AQUI",
        "action": "EnviarDigitando",
        "usuario": "usuario1",
        "message": { "telefone": "5511999999999" }
      }'

# Outras ações do mesmo grupo: "PararDigitando" e "EnviarGravando"

Grupos PRIVADA

ListarGrupos — lista os grupos do WhatsApp

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{ "token": "SUA_CHAVE_API_AQUI", "action": "ListarGrupos", "usuario": "usuario1" }'

EnviarMsgGrupo — envia mensagem para um grupo

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{
        "token": "SUA_CHAVE_API_AQUI",
        "action": "EnviarMsgGrupo",
        "usuario": "usuario1",
        "message": { "idGrupo": "1234567890-1234567890@g.us", "msg": "Olá grupo!" }
      }'

EnviarMsgGrupoMencoes — envia mencionando todos (invisível)

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{
        "token": "SUA_CHAVE_API_AQUI",
        "action": "EnviarMsgGrupoMencoes",
        "usuario": "usuario1",
        "message": { "idGrupo": "1234567890-1234567890@g.us", "msg": "Aviso importante!" }
      }'

GetGroupParticipants — extrai os participantes de um grupo

curl -X POST https://seu-dominio.com:443/ \
  -H "Content-Type: application/json" \
  -d '{
        "token": "SUA_CHAVE_API_AQUI",
        "action": "GetGroupParticipants",
        "usuario": "usuario1",
        "message": { "idGrupo": "1234567890-1234567890@g.us" }
      }'

Resumo comparativo

RecursoPúblicaPrivada
Abrir/fechar/destruir instância, QR code, status✓✓
Enviar texto✓✓
Receber texto e mídia (webhook)✓✓
Buscar contatos / chats / foto de perfil✓✓
Enviar mídia (imagem, vídeo, áudio, documento, sticker)✗✓
Enviar enquete✗✓
Indicadores de digitando/gravando✗✓
Grupos (listar, enviar, participantes)✗✓

Referência para IA (LLM) BÁSICA — GRÁTIS

Cole o texto abaixo em qualquer IA (ChatGPT, Claude, Gemini etc.) e peça pra ela gerar o painel, script ou integração que você quiser usando essa API. É um resumo compacto de todas as funções — sem passos de instalação.

Você está vendo a versão básica (só API Pública). Quem tem o plano Premium recebe a referência completa, com mídia, enquetes, presença e grupos também.

# INSTRUÇÕES PARA A IA — LEIA ANTES DE GERAR QUALQUER CÓDIGO

Você recebeu a documentação da EditaCódigo WhatsApp API — versão Pública
(grátis). Antes de escrever qualquer código, sistema ou painel, faça estas
perguntas ao usuário, NESSA ORDEM, uma de cada vez:

1) "Você quer usar TODAS as funções disponíveis, ou só algumas específicas?"
   - Se TODAS: monte o sistema já usando todas as ações abaixo, sem precisar
     perguntar mais nada sobre escopo.
   - Se ALGUMAS: liste as ações abaixo (organizadas por categoria) e pergunte
     quais especificamente o usuário quer incluir.

2) "Em qual linguagem de programação você quer o sistema?" (ex: PHP, Python,
   Node.js/JavaScript, outra)

Só depois de ter as respostas, gere a estrutura completa do sistema (painel,
script, bot, o que o usuário pediu), implementando exatamente as ações
escolhidas.

IMPORTANTE — a API não é só "enviar requisição e receber resposta". Ela
também EMPURRA dados pro sistema do usuário via webhook. Por isso, todo
painel/sistema gerado precisa incluir OBRIGATORIAMENTE estes dois arquivos
rodando no servidor do usuário (não no servidor da API):

1. Um arquivo receptor de mensagens (ex: "recebe.php", "recebe.py",
   "recebe.js" — a URL dele é o WEBHOOK_MENSAGENS configurado na instalação).
   Ele recebe POST toda vez que uma mensagem chega no WhatsApp (ver seção
   "Recebimento de mensagens" abaixo pro formato exato). É aqui que o painel
   salva as mensagens recebidas, atualiza conversas, etc.

2. Um arquivo de validação/cron (ex: "cron.php", "cron.py", "cron.js" — a
   URL dele é o WEBHOOK_VALIDATE). Ele recebe POST a cada 60 segundos com
   `{ "token": "...", "usuarios": ["usuario1", ...] }` — é só confirmar
   recebimento com HTTP 200. Serve pra rotina de validação periódica da
   licença.

Sem esses dois arquivos existindo e publicados numa URL acessível, a
instalação fica incompleta — o usuário não vai receber nada.

---

# EditaCódigo WhatsApp API — Pública — Referência de Funções

Todas as chamadas são: POST https://SEU-DOMINIO:PORTA/
Header: Content-Type: application/json
Body padrão: { "token": "SUA_CHAVE_API", "action": "NomeDaAcao", "usuario": "id_da_instancia", "message": { ... } }

"token" é a chave de API do cliente (obrigatório em TODA requisição). Se não
for enviado ou não existir cadastrado, o servidor responde 401 e bloqueia a
chamada completamente, sem processar a ação.
"usuario" identifica a instância/sessão do WhatsApp. "message" só é necessário
quando a ação exige parâmetros extras. A resposta é sempre JSON.

Formato de erro (qualquer ação pode retornar isso em vez do resultado normal):
{ "error": "mensagem descrevendo o erro" }
Erro de autenticação (token ausente ou inválido):
{ "error": "❌ Chave de API inválida ou não enviada" }  (HTTP 401)

## Instância

- AbrirInstancia { token, usuario } -> abre/conecta a sessão do WhatsApp
- GerarQrcode { token, usuario } -> retorna o QR code atual pra escanear
  DICA: "qrcode" é só texto. Pra virar imagem: monte a URL
  https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=<qrcode URL-encoded>
  e use num <img src="...">.
- RegenerarQrcode { token, usuario } -> força a geração de um novo QR code
- FecharInstancia { token, usuario } -> fecha sem apagar a sessão salva
- DestruirInstancia { token, usuario } -> fecha e apaga a sessão salva
- StatusInstancias { token } -> lista todas as instâncias ativas e seus status

## Envio de texto

- EnviarMsg { token, usuario, message: { telefone, msg } }
  -> envia mensagem de texto (única forma de envio nessa versão)
  telefone: string só com dígitos, ex "5511999999999"

## Recebimento de mensagens (webhook)

A API captura TUDO que chega no WhatsApp (texto, imagem, vídeo, áudio, ptt,
documento, sticker) e envia via POST pro seu WEBHOOK_MENSAGENS, mesmo que só
consiga ENVIAR texto. Formato do payload recebido:

{
  "telefone": "5511999999999",
  "telefone_resolvido": true,
  "jid_original": "5511999999999@s.whatsapp.net",
  "grupo": null,
  "texto": "oi",
  "media": null,
  "id_mensagem": "ABCDEF123456",
  "usuario": "usuario1",
  "timestamp": 1234567890,
  "tipo": "chat",
  "nomeContato": "Fulano",
  "fotoPerfilUrl": null
}

- media vem null pra texto puro, e preenchido assim pros outros tipos:
  { "type": "image", "mimetype": "image/jpeg", "data": "base64..." }
  type pode ser: image, video, audio, ptt, document, sticker.

## Consultas

- BuscarContatos { token, usuario } -> lista os contatos da instância
- BuscarChats { token, usuario, message: { limite } } -> lista conversas recentes
- GetConversationContacts { token, usuario } -> contatos das conversas privadas
- GetProfilePic { token, usuario, message: { telefone } } -> foto de perfil de um contato

## Não disponível nessa versão (só no plano Premium)

Envio de mídia, enquetes, indicadores de digitando/gravando e grupos. Se o
usuário pedir alguma dessas funções, avise que precisa do plano Premium da
EditaCódigo (editacodigo.com.br).

## Instalação (comando pronto — Ubuntu 22.04/24.04, root/sudo)

Peça ao usuário: TOKEN (a chave de API dele, em "Meu Token"), a URL de
WEBHOOK_MENSAGENS (o endpoint do sistema dele que recebe as mensagens) e a
PORTA (padrão 443). Com isso, monte o comando abaixo substituindo os valores:

curl -o instalador.sh "https://raw.githubusercontent.com/edita-codigo/editacodigo-api-publica/master/INSTALADOR/instaladorv2.txt" && \
sed -i 's/\r$//' instalador.sh && \
chmod +x instalador.sh && \
PORTA="443" \
TOKEN="TOKEN_DO_USUARIO" \
WEBHOOK_FUNCOES="https://api.editacodigo.com.br/publica/api/index.php" \
WEBHOOK_MENSAGENS="URL_DO_WEBHOOK_DO_USUARIO" \
WEBHOOK_VALIDATE="URL_DO_WEBHOOK_VALIDATE_DO_USUARIO" \
./instalador.sh

Depois de rodar: confirme com `pm2 status` e teste em `https://dominio:PORTA/status`.

Instalar via IA (VPS ou local)

Cole o texto abaixo em qualquer IA (ChatGPT, Claude, Gemini etc.) e ela vai te guiar, passo a passo, instalando a API no seu VPS Ubuntu ou testando localmente (Windows via WSL2) — mesmo sem nenhum conhecimento técnico.

# INSTRUÇÕES PARA A IA — INSTALAÇÃO DA API (leia antes de ajudar o usuário)

Você vai guiar uma pessoa SEM CONHECIMENTO TÉCNICO a instalar a EditaCódigo
WhatsApp API (versão pública, baseada em Node.js/Baileys). Explique cada
passo em linguagem simples, um comando de cada vez, e peça pra pessoa colar
o resultado antes de seguir pro próximo passo. Nunca assuma que ela sabe o
que é SSH, terminal, sudo, etc — explique rapidamente antes de pedir pra
rodar o comando.

Primeiro faça estas perguntas, nessa ordem:

1) "Você tem um servidor VPS (Ubuntu) ou quer instalar/testar no seu
   computador?"
   - Se VPS Ubuntu 22.04 ou 24.04: siga o roteiro "INSTALAÇÃO EM VPS" abaixo.
   - Se computador local (Windows/Mac): o instalador foi feito pra Ubuntu,
     então primeiro siga o roteiro "INSTALAÇÃO LOCAL / WSL2" pra criar um
     ambiente Ubuntu, depois continue no roteiro "INSTALAÇÃO EM VPS" dentro
     dele (os passos são os mesmos).

2) "Qual token de API você tem?" (a pessoa pega esse token na área 'Meu
   Token' do painel, depois de fazer login em editacodigo.com.br — se ela
   não tiver token ainda, oriente a criar conta e pegar o token grátis lá)

3) "Pra onde as mensagens recebidas devem ser enviadas?" (a URL do
   WEBHOOK_MENSAGENS — o endpoint no sistema da própria pessoa que vai
   processar as mensagens recebidas do WhatsApp)

## INSTALAÇÃO EM VPS (Ubuntu 22.04 ou 24.04)

Pré-requisito: acesso root/sudo via SSH ao servidor (a hospedagem/VPS
fornece um IP, usuário e senha ou chave SSH).

1. Conectar no servidor via SSH (explique: é como um "terminal remoto" pra
   controlar o servidor à distância). Ex: ssh root@IP_DO_SERVIDOR

2. Baixar o instalador:
   wget https://raw.githubusercontent.com/edita-codigo/editacodigo-api-publica/master/INSTALADOR/instaladorv2.txt -O instalador.sh

3. Dar permissão de execução:
   chmod +x instalador.sh

4. Rodar o instalador:
   ./instalador.sh

5. O instalador vai perguntar, nessa ordem (explique cada um antes da
   pessoa responder):
   - PORTA -> normalmente 443
   - TOKEN -> o token de API que a pessoa já tem (pergunta 2)
   - WEBHOOK_FUNCOES -> pode aceitar o valor sugerido, é o servidor da
     EditaCódigo que fornece a lógica das ações
   - WEBHOOK_MENSAGENS -> a URL do sistema da pessoa (pergunta 3)
   - WEBHOOK_VALIDATE -> pode aceitar o valor sugerido

6. O instalador faz tudo sozinho a partir daí: instala Node.js 20+, PM2,
   gera certificado SSL, baixa o servidor, instala dependências, e já inicia
   o processo com reinício automático a cada 3h.

7. Confirmar que funcionou:
   pm2 status
   (deve aparecer um processo chamado "EDITACODIGO PUBLICA" com status
   "online")

8. Ver os logs em tempo real (útil pra depurar problema):
   pm2 logs "EDITACODIGO PUBLICA"

9. Testar se a API está respondendo — abrir no navegador ou rodar:
   curl -k https://SEU-DOMINIO-OU-IP:PORTA/status
   Deve retornar um JSON com "status": "online"

10. Conectar o WhatsApp: chamar a ação GerarQrcode (ver a documentação de
    funções da API) e escanear o QR code retornado pelo WhatsApp do celular
    da pessoa (Configurações > Aparelhos conectados > Conectar aparelho).

## INSTALAÇÃO LOCAL / WSL2 (Windows) — pra testar antes de ir pra produção

1. Abrir o PowerShell como Administrador (clique direito no menu Iniciar >
   "Windows PowerShell (Admin)").

2. Instalar o WSL2 com Ubuntu:
   wsl --install -d Ubuntu
   Reiniciar o computador se for pedido.

3. Abrir o "Ubuntu" pelo menu Iniciar e criar um usuário/senha quando pedir
   (é só pro Linux interno, pode ser simples).

4. Dentro desse terminal Ubuntu, seguir exatamente os mesmos passos do
   roteiro "INSTALAÇÃO EM VPS" acima (o WSL2 se comporta como um Ubuntu
   normal, sem precisar de servidor externo).

5. Diferença: pra testar localmente, use "localhost" no lugar do domínio/IP
   ao acessar https://localhost:PORTA/status

## Problemas comuns (e como resolver)

- "pm2: command not found" -> o instalador não terminou de instalar; rode o
  instalador de novo (./instalador.sh).
- Porta 443 já em uso -> escolher outra porta (ex: 8443) quando o instalador
  perguntar "PORTA", e usar essa porta em todos os testes depois.
- WhatsApp não conecta / QR code não aparece -> chamar a ação GerarQrcode e
  escanear o QR pelo WhatsApp do celular (Configurações > Aparelhos
  conectados).
- Erro de certificado SSL no navegador ("conexão não seria privada") ->
  normal, o certificado é autoassinado; clicar em "Avançado > Continuar
  mesmo assim", ou usar "curl -k" (ignora a validação do certificado).
- "Dados incompletos" ou erro 400 -> revisar se TOKEN, WEBHOOK_MENSAGENS
  etc. foram preenchidos certinho durante a instalação (dá pra conferir/
  editar depois no arquivo .env dentro da pasta de instalação).

## Repositório com o instalador e o código do servidor

https://github.com/edita-codigo/editacodigo-api-publica