Criar webhook
/v1/webhooksdesde M3token da instância ou adminQuando usar
Cadastra um endpoint que recebe por POST os eventos que combinam com events (tipos exatos, famílias como message.*, ou *). Com token de instância o webhook é sempre daquela instância. Com token admin, instance_id escolhe a instância; sem ele o webhook é global (todas as instâncias).
secret é opcional (16 a 256 caracteres); sem ele um é gerado com prefixo whsec_. O segredo só aparece nesta resposta (e na de um PATCH que o troque): guarde-o. Só URLs http(s); endereços privados, loopback e link-local são recusados na entrega, salvo webhook_allow_private_urls: true. Redirecionamentos não são seguidos.
Autenticação
Aceita o token da instância (só a própria instância) ou o token admin. Um token de outra instância recebe 403 forbidden (ou 404 not_found em webhooks de outra instância).
Parâmetros
Corpo (JSON)
| Nome | Tipo | Descrição |
|---|---|---|
url | string | URL absoluta http(s), até 2048 caracteres. Obrigatório na criação. |
events | string[] | Filtros: tipos exatos, famílias (message.*) ou *. Obrigatório na criação. (até 32 itens) |
secret | string | 16 a 256 caracteres. Omitido na criação: gerado. Vazio no PATCH: gera outro. |
instance_id | string | Só na criação. Admin: instância do webhook (omitido = global). Token de instância: só a própria. |
enabled | boolean | (padrão true) |
version | 1 | Versão do envelope. Só 1 por enquanto. |
filters | WebhookFilters | Restringem os eventos do webhook (marco 7). Cada filtro só vale para eventos que têm o campo: instance.* sempre passam. |
filters.chat | "direct" | "group" | |
filters.chats | string[] | Só estes chats (número com DDI ou JID). (até 500 itens) |
filters.exclude_chats | string[] | Todos menos estes chats. |
filters.message_types | "text" | "image" | "video" | "gif" | "ptv" | "audio" | "document" | "sticker" | "location" | "contact" | "poll" | "reaction" | "button_reply" | "unknown"[] | Só eventos de mensagem destes tipos (received, sent, reaction, button_reply). |
filters.from_me | boolean | true: só mensagens nossas; false: exclui as nossas. Omitido: ambas. Não se aplica a message.status. |
Exemplo
curl -s -X POST "$LITEZAP_URL/v1/webhooks" \ -H "Authorization: Bearer $LITEZAP_TOKEN" \ -d '{"url":"https://exemplo.com/litezap","events":["message.*","instance.status"]}'const res = await fetch("http://localhost:8787/v1/webhooks", { method: "POST", headers: { Authorization: `Bearer ${process.env.LITEZAP_TOKEN}`, "Content-Type": "application/json" }, body: JSON.stringify({ "url": "https://exemplo.com/litezap", "events": [ "message.*", "instance.status" ] }),});console.log(res.status, res.status === 204 ? "" : await res.json());import osimport requests
r = requests.post( "http://localhost:8787/v1/webhooks", headers={"Authorization": f"Bearer {os.environ['LITEZAP_TOKEN']}"}, json={ "url": "https://exemplo.com/litezap", "events": ["message.*", "instance.status"], }, timeout=150,)print(r.status_code, r.json() if r.content else "")package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { req, _ := http.NewRequest("POST", "http://localhost:8787/v1/webhooks", strings.NewReader(`{"url":"https://exemplo.com/litezap","events":["message.*","instance.status"]}`)) req.Header.Set("Authorization", "Bearer "+os.Getenv("LITEZAP_TOKEN")) req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.Status, string(out))}<?phprequire 'vendor/autoload.php'; // composer require guzzlehttp/guzzle
$client = new GuzzleHttp\Client(['base_uri' => 'http://localhost:8787']);$res = $client->request('POST', '/v1/webhooks', [ 'headers' => ['Authorization' => 'Bearer ' . getenv('LITEZAP_TOKEN')], 'json' => [ 'url' => 'https://exemplo.com/litezap', 'events' => ['message.*', 'instance.status'], ], 'http_errors' => false,]);echo $res->getStatusCode(), ' ', $res->getBody(), PHP_EOL;Nos exemplos, LITEZAP_URL é a URL base (ex.: http://localhost:8787) e o token vem deLITEZAP_TOKEN (instância) ou LITEZAP_ADMIN_TOKEN.
Resposta
201 Webhook criado, com o secret.
Campos de Webhook
id | string | |
instance_id | string | Ausente em webhook global. |
url | string | |
events | string[] | |
version | integer | |
enabled | boolean | |
filters | WebhookFilters | Restringem os eventos do webhook (marco 7). Cada filtro só vale para eventos que têm o campo: instance.* sempre passam. |
filters.chat | "direct" | "group" | |
filters.chats | string[] | Só estes chats (número com DDI ou JID). |
filters.exclude_chats | string[] | Todos menos estes chats. |
filters.message_types | "text" | "image" | "video" | "gif" | "ptv" | "audio" | "document" | "sticker" | "location" | "contact" | "poll" | "reaction" | "button_reply" | "unknown"[] | Só eventos de mensagem destes tipos (received, sent, reaction, button_reply). |
filters.from_me | boolean | true: só mensagens nossas; false: exclui as nossas. Omitido: ambas. Não se aplica a message.status. |
created_at | string | |
updated_at | string | |
secret | string | Só na criação e quando trocado por PATCH. |
{ "id": "wh_3c7e1a9f5b2d4806", "instance_id": "inst_7f3a9c2e5b1d4086", "url": "https://exemplo.com/litezap", "events": [ "message.*", "instance.status" ], "version": 1, "enabled": true, "created_at": "2026-10-17T14:00:00Z", "updated_at": "2026-10-17T14:00:00Z", "secret": "whsec_9Jd2kQm4xV7pR1tY6nB3cF8hL0sW5zA"}Erros
| Código | HTTP | Retentável | O que fazer |
|---|---|---|---|
validation_failed | 400 | não | Corrija o corpo ou os parâmetros; a message diz o campo. |
unauthorized | 401 | não | Envie Authorization: Bearer <token> válido. |
forbidden | 403 | não | Use o token certo (admin, ou o da própria instância). |
instance_not_found | 404 | não | Confira o id da instância. |
Todo erro usa o envelope {"error":{"code","message","retryable"}}. Tabela completa em Erros.
Equivalente na Z-API: Atualizar webhook (ao receber, ao enviar, status...). Veja Migrar da Z-API.
Outras operações de Webhooks: Listar webhooks · Consultar webhook · Atualizar webhook · Apagar webhook · Listar entregas · Reenviar entrega

