Flows globais
Cria, lista, consulta, atualiza e apaga os Flows do WhatsApp compartilhados por todas as lojas, com a validação do JSON no formato da Meta.
Um Flow é um formulário nativo do WhatsApp: telas com textos, campos, listas e botões que abrem dentro da conversa, em vez de o cliente digitar tudo em mensagens. O Flow é descrito por um JSON no formato da Meta (flow_json). A Venddor guarda o JSON, valida e, quando você manda, publica na Meta (veja Publicar, pré-visualizar e usar com IA).
Os Flows desta página são globais: ficam no banco mestre e valem para toda loja com o módulo WhatsApp Commerce. Uma loja pode criar um Flow próprio com a mesma flow_key, e o da loja prevalece sobre o global. Um Flow só passa a ser usado pela IA de atendimento quando está published. Exigem root_admin com o privilégio manage_whatsapp_platform.
O objeto Flow
Campos do Flow
idintegerflow_keystringnamestringflow_key.scopestringstoreglobalglobal nestas rotas.flow_jsonobjectai_when_to_usestringai_paramsobject{} quando não há.statusstringdraftpublisheddraft até ser publicado. Só published é oferecido à IA. O servidor não restringe o valor enviado: use apenas esses dois.versionintegermeta_flow_idstringpublish.categorystringSIGN_UPSIGN_INAPPOINTMENT_BOOKINGLEAD_GENERATIONCONTACT_USCUSTOMER_SUPPORTSURVEYOTHEROTHER, sem aviso.created_atstringupdated_atstringRegras de validação do flow_json
A plataforma recusa o JSON ao salvar, publicar e gerar quando alguma destas regras falha:
| Regra | Detalhe |
|---|---|
version | Obrigatório (texto, por exemplo "7.3") |
screens | De 1 a 20 telas, cada uma com id não vazio e único |
| Layout | layout.type deve ser SingleColumnLayout, com pelo menos 1 componente |
| Componentes aceitos | TextHeading, TextSubheading, TextBody, TextCaption, RichText, TextInput, TextArea, Dropdown, RadioButtonsGroup, CheckboxGroup, ChipsSelector, DatePicker, CalendarPicker, PhotoPicker, DocumentPicker, OptIn, EmbeddedLink, Image, ImageCarousel, NavigationList, Footer. Os contêineres Form, If e Switch são aceitos e seus filhos também são validados |
| Propriedades obrigatórias | Texto (text) nos de texto e EmbeddedLink; name e label nos campos de entrada e seleção; label no Footer; src no Image; images no ImageCarousel; list-items no NavigationList |
Ações (on-click-action.name) | navigate, data_exchange, complete ou update_data |
| Limites por componente | Dropdown: até 200 itens; RadioButtonsGroup, CheckboxGroup, ChipsSelector: até 20; ImageCarousel: até 10 imagens |
| Limites por tela | Até 2 NavigationList, e ele não combina com outros componentes; até 1 DocumentPicker, que não coexiste com PhotoPicker; até 1 Form; até 1 Footer, que deve ser o último; If aninhado até 3 níveis |
| Outras | Form e ImageCarousel não ficam dentro de If; error-message não é permitido; on-unselect-action deve ser update_data |
As mensagens de erro são devolvidas em português pelo servidor.
Listar Flows
/api/v1/admin/whatsapp-platform/flowsAdminListar os Flows globais
Devolve todos os Flows globais, do alterado há menos tempo para o mais antigo, sem paginação, e a lista de tipos de componente aceitos (útil para montar uma paleta de edição).
{
"flows": [
{
"id": 3,
"flow_key": "cadastro_endereco",
"name": "Cadastro de endereço",
"scope": "global",
"flow_json": { "version": "7.3", "screens": [] },
"ai_when_to_use": "Cliente quer informar ou trocar o endereço de entrega.",
"ai_params": {},
"status": "draft",
"version": 2,
"meta_flow_id": "",
"category": "OTHER",
"created_at": "2026-10-06T14:21:09.317Z",
"updated_at": "2026-10-07T09:02:44.100Z"
}
],
"components": ["TextHeading", "TextBody", "TextInput", "Footer"]
}Campos da resposta
flowsarrayflow_json do exemplo foi encurtado.componentsarrayCriar um Flow
/api/v1/admin/whatsapp-platform/flowsAdminCriar um Flow global
Valida o flow_json e grava o Flow como draft (versão 1). Criar não publica nada na Meta.
Corpo da requisição
flow_keystringobrigatório_. Uma chave repetida falha (veja Erros).namestringflow_jsonobjectobrigatórioai_when_to_usestringai_paramsobject{}.statusstringpadrão: draftdraftpublisheddraft: published aqui só marca o registro, não publica na Meta.categorystringpadrão: OTHERSIGN_UPSIGN_INAPPOINTMENT_BOOKINGLEAD_GENERATIONCONTACT_USCUSTOMER_SUPPORTSURVEYOTHERExemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/whatsapp-platform/flows" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"flow_key": "contato_rapido",
"name": "Contato rápido",
"category": "CONTACT_US",
"ai_when_to_use": "Cliente quer deixar um recado para a loja.",
"flow_json": {
"version": "7.3",
"screens": [{
"id": "CONTATO",
"terminal": true,
"layout": {
"type": "SingleColumnLayout",
"children": [
{ "type": "TextHeading", "text": "Fale com a gente" },
{ "type": "TextInput", "name": "mensagem", "label": "Mensagem" },
{ "type": "Footer", "label": "Enviar",
"on-click-action": { "name": "complete", "payload": {} } }
]
}
}]
}
}'{
"id": 4,
"flow_key": "contato_rapido",
"name": "Contato rápido",
"scope": "global",
"flow_json": { "version": "7.3", "screens": [ { "id": "CONTATO", "terminal": true, "layout": { "type": "SingleColumnLayout", "children": [] } } ] },
"ai_when_to_use": "Cliente quer deixar um recado para a loja.",
"ai_params": {},
"status": "draft",
"version": 1,
"meta_flow_id": "",
"category": "CONTACT_US",
"created_at": "2026-10-11T12:00:00Z",
"updated_at": "2026-10-11T12:00:00Z"
}A criação devolve 200 (não 201) com o Flow completo.
Consultar um Flow
/api/v1/admin/whatsapp-platform/flows/{id}AdminConsultar um Flow pelo id
Devolve um Flow, com o flow_json completo.
Parâmetros de caminho
idintegerobrigatórioA resposta 200 é o objeto Flow descrito acima.
Atualizar um Flow
/api/v1/admin/whatsapp-platform/flows/{id}AdminAtualizar um Flow global
Substitui o conteúdo do Flow, valida o flow_json e soma 1 em version. É uma substituição completa: o que você não enviar é apagado ou volta ao padrão. A flow_key e o meta_flow_id não mudam. Atualizar não reenvia nada à Meta; para isso use publish de novo.
Parâmetros de caminho
idintegerobrigatórioCorpo da requisição
namestringflow_jsonobjectobrigatórioai_when_to_usestringai_paramsobject{}.statusstringpadrão: draftdraftpublisheddraft, mesmo que estivesse publicado.categorystringpadrão: OTHERSIGN_UPSIGN_INAPPOINTMENT_BOOKINGLEAD_GENERATIONCONTACT_USCUSTOMER_SUPPORTSURVEYOTHEROTHER.flow_keystringA resposta 200 é o Flow atualizado, com version incrementada.
Apagar um Flow
/api/v1/admin/whatsapp-platform/flows/{id}AdminApagar um Flow global
Remove o registro da plataforma. Se o Flow já foi publicado, ele continua existindo na Meta; só deixa de estar disponível aqui. Apagar um id que não existe também devolve sucesso.
Parâmetros de caminho
idintegerobrigatório{ "success": true }Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Corpo inválido | {"error":"Invalid request body"} |
| 400 | {id} que não é inteiro | {"error":"Invalid id"} |
| 400 | flow_key vazia (POST) | {"error":"flow_key é obrigatório"} |
| 400 | flow_key já existe (POST) | {"error":"..."} (mensagem do banco) |
| 400 | PUT em um id que não existe | {"error":"flow não encontrado"} |
| 404 | GET em um id que não existe | {"error":"flow não encontrado"} |
| 422 | flow_json inválido (POST, PUT) | {"error":"Flow JSON inválido","errors":["screens vazio"]} |
| 401 / 403 | Sem token / sem ser root_admin com manage_whatsapp_platform | {"error":"insufficient permissions"} |
| 500 | Falha de banco (listar, apagar) | {"error":"..."} |
Os textos de errors são montados em português pelo servidor, um item por problema encontrado (por exemplo, screen CONTATO comp TextInput: prop obrigatória ausente "label").