> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pilotstatus.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Enviar um Flow do WhatsApp sem template

> Escolha o Flow na hora do envio, em vez de o fixar num template aprovado. Exige a janela de 24 horas — e com ela fechada a Meta responde 200 e descarta a mensagem em silêncio, por isso recusamos antes.

O botão FLOW de um template é fixo: o Flow é escolhido quando o template é criado, e trocá-lo significa editar o template e esperar nova revisão.

Um **Flow dinâmico** escolhe o Flow na própria chamada de envio. A experiência para o cliente é a mesma, sem template e sem aprovação.

```json theme={null}
POST /v1/messages/send

{
  "destinationNumber": "+5511999999999",
  "text": "Responda a nossa pesquisa:",
  "flow": {
    "flowId": "2038526810137974",
    "cta": "Abrir",
    "action": "navigate",
    "screen": "WELCOME",
    "data": { "nome": "Ana" },
    "mode": "published"
  }
}
```

| Campo    | Obrigatório | O que faz                                                               |
| -------- | ----------- | ----------------------------------------------------------------------- |
| `flowId` | Sim         | O id do Flow **na Meta**, e não o id da linha no Pilot Status           |
| `cta`    | Sim         | Texto do botão que abre o Flow, até 30 caracteres                       |
| `action` | Não         | `navigate` (padrão) abre uma tela; `data_exchange` chama o seu endpoint |
| `screen` | Não         | Tela de entrada. Sem ela, resolvemos a primeira tela do Flow por você   |
| `data`   | Não         | Dados iniciais da primeira tela                                         |
| `mode`   | Não         | `published` (padrão) ou `draft`                                         |

`text` é obrigatório — o Flow é um botão, não a mensagem inteira. O bloco `flow` não pode ser combinado com `templateId`, `list`, `carousel`, `buttons`, `header` nem com envio direto de mídia.

## A janela de 24 horas não é opcional

Esta é a parte que você não consegue ver, e a razão de recusarmos o envio em vez de tentar.

Medimos em 9 de setembro de 2026 contra três versões da Graph API — v22.0, v25.0 e v26.0 — com números e aparelhos reais. **Fora da janela de 24 horas, a Meta responde `HTTP 200` com um `wamid` e descarta a mensagem em silêncio.** Sem erro. Sem status de falha. Sem nada em log nenhum. Foram oito envios, quatro entregues, `200` nos oito.

Ou seja: se deixássemos passar, a sua mensagem sumiria e nem você nem nós teríamos como saber. Em vez disso, você recebe:

```json theme={null}
{
  "code": "FLOW_WINDOW_CLOSED",
  "error": "A janela de 24h com este contato está fechada…"
}
```

Para reabrir a conversa, envie um **template**. Templates não dependem da janela — e é exatamente por isso que o botão FLOW dentro de um template continua a ser o caminho para iniciar uma conversa.

## Erros

| Código                      | HTTP | Quando                                                                 |
| --------------------------- | ---- | ---------------------------------------------------------------------- |
| `FLOW_REQUIRES_META_NUMBER` | 422  | O número não é Meta (Cloud API). Provedores não oficiais não têm Flows |
| `FLOW_WINDOW_CLOSED`        | 422  | A janela de 24 horas está fechada — veja acima                         |
| `FLOW_NOT_SENDABLE`         | 422  | O Flow não existe na sua conta, é de outra WABA, ou não está publicado |
| `FLOW_TOKEN_NOT_ACCEPTED`   | 422  | Você enviou `flow_token` no corpo. Nós geramos um por mensagem         |

O `FLOW_NOT_SENDABLE` devolve uma única mensagem para os três motivos, de propósito. Dizer "existe, mas é de outra conta" confirmaria que um id que não é seu é real.

## Como as respostas voltam

Quando alguém envia o Flow preenchido, as respostas chegam no evento de webhook `flow.response_received` e em `GET /v1/flows/{id}/responses`, correlacionadas com o envio que as originou.

Você não precisa fazer nada para essa correlação funcionar. O token que liga os dois é gerado por mensagem e guardado no momento do envio — que é também por que `flow_token` no corpo é recusado. Um token escolhido por quem chama deixaria uma conta reclamar as respostas de outra.

<Note>
  Assinar o evento `flow.response_received` é um passo à parte. Veja [Respostas de Flow](/pt-BR/guides/flow-responses).
</Note>

## Duas coisas que vale saber antes de testar

**Número Cloud API não recebe Flow.** Enviar para outro número Meta — mesmo com a janela aberta — não entrega, e a Meta responde `200` do mesmo jeito. Teste com um telefone comum.

**`mode: "draft"` funciona.** Você pode experimentar um Flow antes de publicá-lo. Lembre-se de que a mensagem chega a uma pessoa real.

## Botão de template ou Flow dinâmico?

|                             | Template com botão FLOW | `flow` dinâmico |
| --------------------------- | ----------------------- | --------------- |
| O Flow é escolhido          | Na criação do template  | **No envio**    |
| Janela de 24 horas          | Dispensa                | **Exige**       |
| Passa por revisão           | Sim                     | Não             |
| Serve para iniciar conversa | **Sim**                 | Não             |
