Receptor de webhooks para testes locais, no estilo do webhook.site. Recebe requisições HTTP em qualquer caminho/método, guarda em memória (com persistência em arquivo JSON) e mostra numa página web com auto-refresh e opção de excluir.
Sem banco de dados e sem dependências externas — usa apenas o Node.js nativo.
- Node.js 18 ou superior (
node -vpara conferir). Nada mais — semnpm install, sem banco de dados. - Git, para clonar.
git clone https://github.com/claudiolp/webhook-site.git
cd webhook-siteEscolha uma das opções abaixo.
Bom para uso pontual: roda enquanto o terminal estiver aberto.
node server.jsAbra http://localhost:48080/ no navegador. Para parar, Ctrl+C no terminal.
Durante o desenvolvimento, para reiniciar sozinho ao salvar o código:
npm run dev # node --watch server.jsBom para deixar rodando de forma permanente: inicia ao logon e reinicia sozinho se cair.
-
Abra o PowerShell e vá até a pasta do projeto (
cd ...\webhook-site). -
Registre a tarefa (vai pedir confirmação do UAC — aceite):
powershell -ExecutionPolicy Bypass -File .\scripts\install-task.ps1
-
Pronto — o servidor sobe imediatamente e a cada logon. Acesse http://localhost:48080/.
Comandos úteis:
Start-ScheduledTask -TaskName "WebhookSite" # iniciar manualmente
Stop-ScheduledTask -TaskName "WebhookSite" # parar
Unregister-ScheduledTask -TaskName "WebhookSite" -Confirm:$false # remover de vezComo funciona: a tarefa lança um supervisor oculto (scripts/run-supervisor.vbs) que mantém
o node server.js rodando e o reinicia em ~2s se ele cair. Logs em server.log.
A tarefa roda apenas quando o seu usuário está logado. Para rodar sem login (máquina compartilhada/servidor), seria necessário um Windows Service.
Padrão 48080 (escolhida para não colidir com 3000/8080 usados por outros devs).
Troque com a variável PORT:
PORT=45000 node server.jsEnvie qualquer requisição para o servidor. O caminho e o método são livres — tudo que
não for /, /index.html ou /api/requests* é registrado como webhook recebido.
curl -X POST "http://localhost:48080/meu-teste?x=1" \
-H "Content-Type: application/json" \
-d '{"evento":"pago","valor":10.5}'Cada request registrado guarda: método, caminho, query string, headers, IP de origem, corpo bruto e o corpo já parseado como JSON (quando aplicável).
- Lista os requests recebidos (mais recente no topo)
- Atualiza automaticamente a cada 2s (checkbox "Auto-refresh")
- Clique num item para ver headers, query e body
- Botão Excluir por request e Limpar tudo
Por padrão o servidor responde 200 com um JSON. Dá para customizar o que ele devolve a
cada webhook — útil para simular respostas específicas do sistema que está sendo testado.
Padrão global (persistido em response-config.json): edite pelo botão ⚙️ Resposta na
página, ou via API:
curl -X PUT http://localhost:48080/api/response-config \
-H "Content-Type: application/json" \
-d '{"status":418,"contentType":"text/plain","body":"sou um bule"}'Override por request (não altera a config global):
| Onde | Chave | Efeito |
|---|---|---|
| query | ?__status=404 |
Status HTTP da resposta |
| query | ?__body=texto |
Corpo da resposta |
| query | ?__delay=2000 |
Atraso em ms (máx. 30000) |
| header | X-Mock-Status |
Status HTTP |
| header | X-Mock-Content-Type |
Content-Type |
| header | X-Mock-Delay |
Atraso em ms |
curl -X POST "http://localhost:48080/teste?__status=503&__delay=1000"| Método | Rota | Ação |
|---|---|---|
| GET | /api/requests |
Lista todos os requests |
| DELETE | /api/requests/:id |
Exclui um request pelo id |
| DELETE | /api/requests |
Exclui todos |
| GET | /api/response-config |
Lê a config de resposta |
| PUT | /api/response-config |
Atualiza a config de resposta |
| Variável | Padrão | Descrição |
|---|---|---|
PORT |
3000 |
Porta do servidor |
MAX_REQUESTS |
500 |
Limite de requests mantidos (descarta antigos) |
Os requests ficam em memória e são gravados em requests.json (debounce de 200ms).
Ao reiniciar, o servidor recarrega esse arquivo. Apagar o arquivo zera o histórico.
MIT © Claudio Pereira