> ## Documentation Index
> Fetch the complete documentation index at: https://developer.wabox.me/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Wabox é uma API não-oficial de WhatsApp (aparelho vinculado). Tudo é snake_case; a base é https://api.wabox.me/instances/{instance_id}/token/{token}.
> Envios respondem { id, message_id, wabox_id, status: "queued" } na hora; o resultado real chega no webhook delivery. Envios não são idempotentes: confira GET /queue antes de repetir.
> Sempre verifique X-Wabox-Signature (HMAC-SHA256 de "<t>.<corpo cru>") nos webhooks e deduplique por event_id.
> Botões, listas, carrossel e catálogo são best effort e não renderizam no WhatsApp Web/Desktop. Não existem: chamadas, listas de transmissão, histórico de mensagens, instância mobile.
> Não invente endpoints ou campos: use o OpenAPI em https://api.wabox.me/openapi.json.

# Zapier

> Receba mensagens do WhatsApp com Catch Hook e responda com uma ação POST do Webhooks by Zapier.

O Zap usa o app **Webhooks by Zapier** nas duas pontas: **Catch Hook** como gatilho, recebendo o evento `received` do Wabox, e **POST** como ação, chamando o `send-text`. No meio, um **Filter** para responder só a mensagens de texto de outras pessoas.

<Note>
  Base das rotas: `https://api.wabox.me/instances/{instance_id}/token/{token}` — `instance_id` e `token` ficam no dashboard (instância › Credenciais). Envie o header `Client-Token` só se ele estiver ativado no workspace ([Client-Token](/security/client-token)). O Webhooks by Zapier é um app premium em alguns planos do Zapier.
</Note>

## Gatilho: receber mensagens

<Steps>
  <Step title="Crie o gatilho Catch Hook">
    Novo Zap → app **Webhooks by Zapier** → evento **Catch Hook**. Deixe o campo de chave filha (*child key*) vazio para receber o payload inteiro. Copie a URL gerada.

    O Zapier responde `200` ao Wabox assim que recebe a requisição, dentro do limite de 10 s.
  </Step>

  <Step title="Configure a URL no Wabox">
    No dashboard, cole a URL no webhook de mensagens recebidas da instância, ou:

    ```bash theme={"system"}
    curl -X PUT "https://api.wabox.me/instances/{instance_id}/token/{token}/webhooks" \
      -H "Content-Type: application/json" \
      -d '{ "received_url": "https://hooks.zapier.com/hooks/catch/SEU/ID/" }'
    ```
  </Step>

  <Step title="Teste o gatilho com uma mensagem de texto">
    Clique em testar o gatilho e envie uma **mensagem de texto** para o número conectado. O Zapier carrega a requisição como amostra e passa a oferecer os campos no mapeamento.

    O Zapier achata objetos aninhados usando `__` no nome: o texto da mensagem, que no payload é `text.message`, costuma aparecer como `text__message`. Os campos que você vai usar (payload completo em [Webhook received](/webhooks/received)):

    | No Zapier       | No payload     | Uso                              |
    | --------------- | -------------- | -------------------------------- |
    | `type`          | `type`         | `received`                       |
    | `phone`         | `phone`        | número de quem enviou            |
    | `text__message` | `text.message` | texto (ausente em mídia)         |
    | `from_me`       | `from_me`      | `true` se saiu do próprio número |
    | `is_group`      | `is_group`     | `true` em grupos                 |
    | `message_id`    | `message_id`   | para citar na resposta           |
    | `event_id`      | `event_id`     | id da entrega                    |

    <Warning>
      Se a amostra for uma imagem ou um áudio, `text__message` não aparece. Teste de novo com uma mensagem de texto.
    </Warning>
  </Step>

  <Step title="Adicione um Filter">
    Adicione um passo **Filter by Zapier** que só continua quando:

    * `type` é exatamente `received`
    * `from_me` é falso
    * `text__message` existe

    Sem a condição de `from_me`, um Zap com `notify_sent_by_me` ligado responde às próprias respostas em loop.
  </Step>
</Steps>

## Ação: responder pelo WhatsApp

<Steps>
  <Step title="Adicione a ação POST">
    App **Webhooks by Zapier** → evento **POST**:

    * **URL**: `https://api.wabox.me/instances/{instance_id}/token/{token}/send-text`
    * **Payload Type**: `json`
    * **Data**: duas chaves, mapeando os campos do gatilho:
      * `phone` → `phone`
      * `message` → texto da resposta, por exemplo `Recebemos: ` + `text__message`
    * **Wrap Request In Array**: não
    * **Unflatten**: sim (padrão) — assim uma chave como `a__b` vira `{ "a": { "b": … } }`, o que não afeta `phone` e `message`
    * **Headers**: `Client-Token` se ele estiver ativado no workspace

    Para responder citando a mensagem original, adicione a chave `reply_to_message_id` mapeada para `message_id`.
  </Step>

  <Step title="Use a resposta nos próximos passos">
    A API responde na hora:

    ```json theme={"system"}
    { "id": "3EB0A9C6D2F1E4B5A7D0", "message_id": "3EB0A9C6D2F1E4B5A7D0", "wabox_id": "wbx_01J5Q8ZK3M4N5P6Q7R8S9T0M01", "status": "queued" }
    ```

    `id` é um alias de `message_id`: existe justamente para facilitar o mapeamento em ferramentas que tratam `id` como campo padrão. Guarde-o se quiser cruzar com o webhook [delivery](/webhooks/delivery), que traz o mesmo `message_id` com o resultado do envio. `status: "queued"` significa enfileirado, não entregue.
  </Step>
</Steps>

## Outras rotas

Troque a URL e as chaves de **Data** para enviar outros tipos — todos com o mesmo padrão `phone` + conteúdo, corpos completos na [API Reference](/api-reference/introduction):

* `POST .../send-image` — `phone`, `image` (URL), `caption`
* `POST .../send-document` — `phone`, `document`, `file_name`
* `POST .../send-audio` — `phone`, `audio`

## Reentregas

Se o Zap estiver desligado ou o Zapier responder erro, o Wabox reenvia a entrega em 10 s, 1 min, 10 min, 1 h e 6 h com o **mesmo** `event_id`. Se responder duas vezes ao cliente for um problema para você, use um passo de armazenamento (Storage by Zapier ou Zapier Tables) para registrar os `event_id` já processados e um Filter para descartar repetidos.

## Verificar a assinatura

Cada entrega traz `X-Wabox-Signature: t=<unix>,v1=<hex>`, com `v1` = HMAC-SHA256 do corpo cru ([Assinatura de webhooks](/security/webhook-signature)). O Catch Hook comum entrega o corpo já interpretado, então não serve para recalcular o HMAC. O Webhooks by Zapier tem uma variante que expõe o corpo bruto (**Catch Raw Hook**); com ela é possível verificar a assinatura em um passo **Code by Zapier**, desde que o header e o corpo cru estejam disponíveis para o código. Se a verificação for obrigatória para você, a opção mais simples é receber o webhook em um backend seu e encaminhar para o Zapier só depois de validar — veja [Integração HTTP genérica](/integrations/http).
