API do Fluxos do WhatsApp
https://whatsapp.turn.io/v1/flows
Os Fluxos do WhatsApp são ferramentas interativas de coleta de dados que podem ser usadas para coletar informações de clientes diretamente no WhatsApp. Este endpoint permite que você crie Fluxos do WhatsApp programaticamente para sua Conta Comercial do WhatsApp.
Os Fluxos do WhatsApp são um recurso fornecido pela Meta. Para informações detalhadas sobre especificações de fluxo, tipos de tela e componentes, consulte a documentação oficial dos Fluxos do WhatsApp.
Pré-requisitos
Feature Flag
Todos os endpoints de Fluxos do WhatsApp requerem que o recurso whatsapp_flows_api esteja habilitado para o seu número. Entre em contato com seu gerente de conta para habilitar este recurso.
Autenticação
Todos os endpoints usam autenticação Bearer token. Inclua seu token Turn.io no cabeçalho HTTP Authorization:
-H "Authorization: Bearer <token>"
O número do WhatsApp é determinado a partir do token de autenticação.
Criando um Fluxo
Para criar um Fluxo do WhatsApp, forneça um objeto JSON com a definição do fluxo. O fluxo será criado sob sua Conta Comercial do WhatsApp (WABA).
POST https://whatsapp.turn.io/v1/flows
Corpo da Requisição
| Parâmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
name | string | Sim | O nome do fluxo. Este será visível no seu Gerenciador de Negócios do WhatsApp. | |
flow_json | object ou string | Sim | A definição do fluxo como um objeto JSON ou JSON em formato de string. Deve estar em conformidade com a especificação JSON de Fluxo do WhatsApp v7.2+. | |
categories | array de strings | Não | ["OTHER"] | As categorias para classificar seu fluxo. Opções válidas: SIGN_UP, SIGN_IN, APPOINTMENT_BOOKING, LEAD_GENERATION, CONTACT_US, CUSTOMER_SUPPORT, SURVEY, OTHER. |
publish | boolean | Não | false | Se deve publicar o fluxo imediatamente após a criação. Se false, o fluxo será criado em modo rascunho. |
Exemplo de Requisição
$ curl -X POST https://whatsapp.turn.io/v1/flows \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Pesquisa de Satisfação",
"flow_json": {
"version": "7.2",
"screens": [
{
"id": "SURVEY_START",
"title": "Satisfação do Cliente",
"terminal": true,
"layout": {
"type": "SingleColumnLayout",
"children": [
{
"type": "TextHeading",
"text": "Qual é o seu nível de satisfação com nosso serviço?"
},
{
"type": "RadioButtonsGroup",
"name": "satisfaction",
"label": "Por favor, selecione seu nível de satisfação",
"data-source": [
{ "id": "very_satisfied", "title": "Muito Satisfeito" },
{ "id": "satisfied", "title": "Satisfeito" },
{ "id": "neutral", "title": "Neutro" },
{ "id": "dissatisfied", "title": "Insatisfeito" }
],
"required": true
},
{
"type": "Footer",
"label": "Enviar",
"on-click-action": {
"name": "complete",
"payload": {}
}
}
]
}
}
]
},
"categories": ["SURVEY"],
"publish": false
}'
Resposta
201 Created
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 201
},
"id": "1234567890123456",
"validation_errors": []
}
| Parâmetro | Tipo | Descrição |
|---|---|---|
meta | object | Objeto de metadados padrão contendo informações de versão e status da API. |
id | string | O identificador único do fluxo recém-criado, fornecido pela Meta. |
validation_errors | array | Array de erros de validação retornados pela API da Meta, se houver. |
Usando o ID do Fluxo
O ID do seu fluxo e as telas disponíveis são fornecidos pelo Gerenciador de Negócios do Facebook.
Uma vez que você tenha o id do fluxo, você pode usá-lo para enviar mensagens interativas com fluxos para seus clientes:
$ curl -X POST https://whatsapp.turn.io/v1/messages \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"to": "27123456789",
"type": "interactive",
"interactive": {
"type": "flow",
"header": {
"type": "text",
"text": "Pesquisa de Satisfação"
},
"body": {
"text": "Adoraríamos ouvir seu feedback! Por favor, reserve um momento para completar nossa pesquisa."
},
"footer": {
"text": "Seu feedback nos ajuda a melhorar"
},
"action": {
"name": "flow",
"parameters": {
"flow_id": "1234567890123456",
"flow_cta": "Iniciar Pesquisa",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "SURVEY_START"
},
"flow_message_version": "3",
"mode": "published"
}
}
}
}'
Parâmetros Principais:
flow_id: O ID retornado ao criar seu fluxo (o flow_json já está armazenado no sistema da Meta)flow_cta: O texto do botão de chamada para ação (ex.: "Iniciar Pesquisa")flow_action: Geralmente "navigate" para abrir o fluxo em uma tela específicaflow_action_payload.screen: O ID da tela do seu flow_json para abrirmode: Pode ser "published" (para fluxos ao vivo) ou "draft" (para testes)
Para mais detalhes, consulte a documentação da API de Mensagens.
Atualizando Metadados do Fluxo
Atualize os metadados de um fluxo, como nome, categorias, URI do endpoint e ID do aplicativo, sem alterar o JSON do fluxo.
POST https://whatsapp.turn.io/v1/flows/:flow_id
Corpo da Requisição
Todos os parâmetros são opcionais. Inclua apenas os campos que você deseja atualizar.
| Parâmetro | Tipo | Descrição |
|---|---|---|
name | string | O novo nome para o fluxo. |
categories | array de strings | Novas categorias para o seu fluxo. Opções válidas: SIGN_UP, SIGN_IN, APPOINTMENT_BOOKING, LEAD_GENERATION, CONTACT_US, CUSTOMER_SUPPORT, SURVEY, OTHER. |
endpoint_uri | string | URL do Endpoint do Fluxo do WA (para versão 3.0+ do JSON de Fluxo com troca de dados). |
application_id | string | ID do aplicativo Meta para conectar ao Fluxo (obrigatório para fluxos com endpoints). |
Exemplo de Requisição
$ curl -X POST https://whatsapp.turn.io/v1/flows/1234567890123456 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Formulário de Feedback do Cliente",
"categories": ["CUSTOMER_SUPPORT", "SURVEY"]
}'
Resposta
200 OK
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 200
},
"success": true
}
Atualizando o JSON do Fluxo
Atualize o JSON de um fluxo enviando um novo arquivo flow.json. A Meta validará o JSON e retornará quaisquer erros de validação.
POST https://whatsapp.turn.io/v1/flows/:flow_id/assets
Requisição
A requisição deve ser enviada como multipart/form-data:
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
file | arquivo | Sim | O arquivo JSON do fluxo. Tamanho máximo: 10 MB. |
Os parâmetros name e asset_type são automaticamente definidos como flow.json e FLOW_JSON respectivamente.
Exemplo de Requisição
$ curl -X POST https://whatsapp.turn.io/v1/flows/1234567890123456/assets \
-H "Authorization: Bearer <token>" \
-F "file=@flow.json"
Resposta
200 OK
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 200
},
"success": true,
"validation_errors": []
}
Se o JSON do fluxo contiver erros de validação, a Meta ainda aceitará o upload mas retornará informações detalhadas sobre os erros:
{
"success": true,
"validation_errors": [
{
"error": "INVALID_PROPERTY_VALUE",
"error_type": "FLOW_JSON_ERROR",
"message": "Invalid value found for property 'type'.",
"line_start": 10,
"line_end": 10,
"column_start": 21,
"column_end": 34,
"pointers": [
{
"line_start": 10,
"line_end": 10,
"column_start": 21,
"column_end": 34,
"path": "screens[0].layout.children[0].type"
}
]
}
]
}
Publicando um Fluxo
Publique um fluxo em rascunho para disponibilizá-lo para mensagens de produção.
POST https://whatsapp.turn.io/v1/flows/:flow_id/publish
Exemplo de Requisição
$ curl -X POST https://whatsapp.turn.io/v1/flows/1234567890123456/publish \
-H "Authorization: Bearer <token>"
Resposta
200 OK
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 200
},
"success": true
}
Notas Importantes
- Apenas fluxos com status DRAFT podem ser publicados
- Uma vez publicados, os fluxos não podem ser editados ou deletados (apenas depreciados)
- Fluxos publicados podem ser usados imediatamente em mensagens de produção
- Certifique-se de ter testado completamente seu fluxo em modo rascunho antes de publicar
Deletando um Fluxo
Delete um fluxo que esteja no status DRAFT.
DELETE https://whatsapp.turn.io/v1/flows/:flow_id
Apenas fluxos no status DRAFT podem ser deletados. Para remover um fluxo publicado, use o endpoint de depreciar.
Exemplo de Requisição
$ curl -X DELETE https://whatsapp.turn.io/v1/flows/1234567890123456 \
-H "Authorization: Bearer <token>"
Resposta
200 OK
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 200
},
"success": true
}
Depreciando um Fluxo
Deprecie um fluxo publicado. Fluxos depreciados permanecem visíveis no histórico de fluxos, mas não podem mais ser usados para enviar mensagens aos clientes.
POST https://whatsapp.turn.io/v1/flows/:flow_id/deprecate
Exemplo de Requisição
$ curl -X POST https://whatsapp.turn.io/v1/flows/1234567890123456/deprecate \
-H "Authorization: Bearer <token>"
Resposta
200 OK
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 200
},
"success": true
}
Listando Fluxos
Recupere uma lista de todos os Fluxos do WhatsApp da sua Conta Comercial do WhatsApp.
GET https://whatsapp.turn.io/v1/flows
Exemplo de Requisição
$ curl -X GET https://whatsapp.turn.io/v1/flows \
-H "Authorization: Bearer <token>"
Resposta
200 OK
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 200
},
"data": [
{
"id": "1234567890123456",
"name": "Pesquisa de Satisfação",
"status": "PUBLISHED",
"categories": ["SURVEY"],
"validation_errors": []
},
{
"id": "6543210987654321",
"name": "Fluxo de Cadastro",
"status": "DRAFT",
"categories": ["SIGN_UP"],
"validation_errors": []
}
]
}
Valores de Status do Fluxo
| Status | Descrição |
|---|---|
DRAFT | Fluxo está em modo rascunho e pode ser editado ou deletado |
PUBLISHED | Fluxo está publicado e pode ser usado para enviar mensagens |
DEPRECATED | Fluxo foi depreciado e não pode mais ser usado |
THROTTLED | Fluxo está limitado devido a problemas de saúde do endpoint (limitado a 10 mensagens/hora) |
BLOCKED | Fluxo foi bloqueado devido a problemas contínuos de saúde do endpoint |
Listando Ativos do Fluxo
Recupere os ativos de um fluxo, incluindo o ativo FLOW_JSON contendo a definição do fluxo.
GET https://whatsapp.turn.io/v1/flows/:flow_id/assets
Exemplo de Requisição
$ curl -X GET https://whatsapp.turn.io/v1/flows/1234567890123456/assets \
-H "Authorization: Bearer <token>"
Resposta
200 OK
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 200
},
"data": [
{
"name": "flow.json",
"asset_type": "FLOW_JSON",
"download_url": "https://scontent.xx.fbcdn.net/m1/v/..."
}
]
}
A download_url é uma URL temporária para baixar o conteúdo do ativo:
$ curl -X GET "https://scontent.xx.fbcdn.net/m1/v/..." -o flow.json
Respostas de Erro
Todos os endpoints podem retornar os seguintes erros comuns:
403 Forbidden - Recurso Não Habilitado
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 403
},
"error": {
"code": "feature_not_enabled",
"message": "The whatsapp_flows_api feature is not enabled for this number",
"type": "FeatureNotEnabled"
}
}
403 Forbidden - Não Suportado para Tipo de Número
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 403
},
"error": {
"code": "not_supported",
"message": "This operation is not supported for the given number type",
"type": "NotSupported"
}
}
400 Bad Request - ID do Fluxo Ausente
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 400
},
"error": {
"code": "missing_parameters",
"message": "Missing required parameter: flow_id",
"type": "BadRequest"
}
}
400 Bad Request - Fluxo Não Encontrado
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 400
},
"errors": [
{
"title": "Flow not found",
"details": "The specified flow ID does not exist or is not accessible"
}
]
}
400 Bad Request - WABA Não Encontrada
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 400
},
"errors": [
{
"title": "WABA not found",
"details": "This number is not associated with a WhatsApp Business Account"
}
]
}
400 Bad Request - Status de Fluxo Inválido
Retornado ao tentar publicar, deletar ou depreciar um fluxo em um status inválido:
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 400
},
"error": {
"code": 100,
"message": "Flow is not in DRAFT status",
"error_user_title": "Invalid Flow Status",
"error_user_msg": "Only flows in DRAFT status can be published",
"type": "OAuthException"
}
}
400 Bad Request - Erros de Validação
{
"meta": {
"version": "v1",
"api_status": "stable",
"http_code": 400
},
"error": {
"code": 100,
"message": "Flow has validation errors",
"error_user_title": "Validation Failed",
"error_user_msg": "Please fix all validation errors before publishing",
"type": "OAuthException"
}
}
Especificação JSON do Fluxo
O parâmetro flow_json deve estar em conformidade com a especificação JSON de Fluxo do WhatsApp:
- Versão: Deve ser
7.2ou superior - Telas: Um array de objetos de tela que definem a interface do usuário do fluxo
- Modelo de Dados: Modelo de dados opcional para gerenciar o estado do fluxo
- Roteamento: Lógica de navegação entre telas
Para aceitar um payload no WhatsApp, você precisa definir data na definição do fluxo do WhatsApp, assim como init-value para cada campo de entrada.
Para detalhes completos sobre a especificação JSON de Fluxo, incluindo layouts de tela disponíveis, tipos de componentes, tipos de ação e regras de validação, consulte a Referência JSON dos Fluxos do WhatsApp.
Melhores Práticas
O Turn não suporta atualmente Fluxos do WhatsApp com endpoints (ou seja, sem troca de dados enquanto o usuário está navegando pelo formulário).
O Turn garante apenas o funcionamento dos Fluxos do WhatsApp para os seguintes dispositivos conforme políticas da Meta:
- Android rodando OS 6.0 ou mais recente
- iPhone rodando iOS 12 ou mais recente
- Teste no Modo Rascunho: Crie fluxos com
publish: falseinicialmente para testá-los antes de publicar. - Valide o JSON do Fluxo: Certifique-se de que seu JSON de fluxo é válido antes de fazer a chamada da API para evitar erros.
- Use Categorias Apropriadas: Selecione a categoria que melhor corresponde ao propósito do seu fluxo para uma melhor organização.
- Mantenha Simples: Comece com fluxos simples e adicione complexidade gradualmente conforme necessário.
- Tratamento de Erros: O JSON do fluxo pode conter erros de validação retornados pela API da Meta. Revise as mensagens de erro cuidadosamente para corrigir problemas.