> ## 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.

# Partner API

> Para integradores: crie e administre instâncias do seu workspace Partner por API, sem trial nem cobrança no Wabox.

A **Partner API** é para quem embute o Wabox no próprio produto (um CRM, um omnichannel, uma plataforma de atendimento) e quer criar um número de WhatsApp para cada cliente **sem passar pelo painel**. Cada instância criada por ela pertence ao seu workspace Partner e é cobrada por você ao seu cliente; o Wabox não aplica trial nem `402`.

<Note>
  O programa Partner é ativado pela equipe do Wabox. Depois disso, o token aparece em **Segurança › Partner API** no painel. Fale com a gente em [wabox.me/partners](https://wabox.me/partners).
</Note>

## Autenticação

Todas as rotas ficam sob `https://api.wabox.me/partner` e usam o header `Partner-Token`:

```bash theme={"system"}
curl https://api.wabox.me/partner/instances \
  -H "Partner-Token: pt_9f8e7d6c5b4a39281706f5e4d3c2b1a0..."
```

* O token é mostrado **uma única vez** ao ser gerado (só o hash fica guardado). Perdeu? Gere outro; o anterior para de valer na hora.
* A [allowlist de IPs](/security/ip-allowlist) do workspace vale também aqui. O `Client-Token` não: o `Partner-Token` já é a credencial.
* Rate limit por workspace Partner, com os mesmos headers e `429` da [API pública](/guides/rate-limits-and-errors).
* Erros no mesmo formato: `{ "error": { "code": "partner_token_required" | "ip_not_allowed" | "instance_not_found" | ... } }`.

## Fluxo típico: um canal por cliente

<Steps>
  <Step title="Crie a instância quando o cliente pedir um número">
    ```bash theme={"system"}
    curl -X POST https://api.wabox.me/partner/instances \
      -H "Partner-Token: $PARTNER_TOKEN" -H "Content-Type: application/json" \
      -d '{
        "name": "Loja Centro (cliente 4821)",
        "webhooks": {
          "received_url": "https://seu-app.com/wabox/received",
          "delivery_url": "https://seu-app.com/wabox/delivery",
          "message_status_url": "https://seu-app.com/wabox/status",
          "connected_url": "https://seu-app.com/wabox/connected",
          "disconnected_url": "https://seu-app.com/wabox/disconnected",
          "notify_sent_by_me": true
        },
        "settings": { "call_reject_auto": true }
      }'
    ```

    A resposta é a instância completa, com `id`, `token`, `api_url`, `webhooks` (inclusive o `secret` para verificar a [assinatura](/security/webhook-signature)) e `subscription_status: "partner"`. **Guarde `id`, `token` e `secret`** junto do cliente no seu banco.
  </Step>

  <Step title="Mostre o QR code ao cliente">
    Use a API pública normal com as credenciais devolvidas: `GET {api_url}/qr-code` (data URL) ou `/qr-code/image` (PNG), ou `GET {api_url}/phone-code/{phone}` para pareamento por código. O webhook `connected` avisa quando o número entrou.
  </Step>

  <Step title="Opere o número como qualquer instância">
    `POST {api_url}/send-text`, webhooks `received`/`delivery`/`message_status`, grupos, contatos… tudo igual à [documentação da API](/quickstart). Recomendação: `notify_sent_by_me: true` para espelhar no seu produto o que o cliente digitou no celular.
  </Step>

  <Step title="Quando o cliente cancelar, exclua a instância">
    `DELETE /partner/instances/{id}` desconecta o aparelho no celular do cliente, para a sessão e remove a instância (a fila é descartada).
  </Step>
</Steps>

## Rotas

| Método e rota                                    | O que faz                                                                                                                            |
| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ |
| `POST /partner/instances`                        | Cria e já inicia a sessão. Body: `name` (obrigatório), `webhooks?`, `settings?` (mesmos campos de `PUT /webhooks` e `PUT /settings`) |
| `GET /partner/instances?status&q&page&page_size` | Lista com `token` e webhooks; `status` = `connected` \| `disconnected`, `q` busca por nome, id ou número                             |
| `GET /partner/instances/{id}`                    | Detalhes                                                                                                                             |
| `PUT /partner/instances/{id}`                    | Atualização parcial de `name`, `webhooks`, `settings`                                                                                |
| `POST /partner/instances/{id}/rotate-token`      | Novo `token` da instância (o antigo para de valer)                                                                                   |
| `DELETE /partner/instances/{id}`                 | Desconecta, para e remove                                                                                                            |

A referência completa, com exemplos de request e response, está em **API Reference › Partner**.

## Boas práticas para integradores

* **Um webhook por evento, com a assinatura verificada.** O `secret` é por instância; guarde-o ao criar e leia `X-Wabox-Instance-Id` para saber de qual cliente veio a entrega antes de escolher o segredo.
* **Idempotência do seu lado.** Se a criação falhar por rede sem resposta, liste com `q=<seu nome único>` antes de criar de novo, para não deixar instâncias órfãs.
* **Não exponha o `Partner-Token` no front-end** nem em ferramentas no-code. Ele cria instâncias no seu nome.
* **Trate `disconnected` com `reason: logged_out`** mostrando o QR de novo ao cliente; `banned` não volta e precisa de um número novo.
* **Limites** por instância continuam valendo: fila de 1.000 mensagens, intervalo anti-ban, 60 req/s. Com muitos clientes, o gargalo é sempre o número, nunca a Partner API.
