Flows da loja
Lista, cria, lê, altera e apaga os Flows (telas de formulário do WhatsApp) da loja.
Um Flow da Meta é um conjunto de telas (formulários, listas, seletores) que abre dentro do WhatsApp. Estas rotas guardam, no painel da loja, o desenho dos seus Flows. Elas não falam com a Meta: para isso veja a página de publicação.
Listar os Flows
Devolve os Flows da loja, do alterado mais recentemente ao mais antigo, e a lista de componentes de tela que a plataforma aceita.
/api/v1/admin/whatsapp/meta-flowsAdminLista os Flows da loja
Exemplo de requisição (Listar os Flows)
curl "$BASE_URL/api/v1/admin/whatsapp/meta-flows" \
-H "Authorization: Bearer $TOKEN"Resposta (Listar os Flows)
{
"components": [
"Dropdown",
"RadioButtonsGroup",
"DatePicker",
"Image",
"TextCaption",
"CalendarPicker",
"NavigationList",
"CheckboxGroup",
"OptIn",
"RichText",
"ChipsSelector",
"DocumentPicker",
"TextHeading",
"TextBody",
"TextInput",
"TextArea",
"Footer",
"EmbeddedLink",
"TextSubheading",
"PhotoPicker",
"ImageCarousel"
],
"flows": [
{
"id": 2,
"flow_key": "contato-rapido",
"name": "Contato rápido",
"scope": "store",
"flow_json": {
"version": "6.2",
"screens": [
{
"id": "CONTACT",
"title": "Contato",
"terminal": true,
"success": true,
"layout": {
"type": "SingleColumnLayout",
"children": [
{
"type": "TextHeading",
"text": "Fale com a gente"
},
{
"type": "Form",
"name": "form",
"children": [
{
"type": "TextInput",
"name": "nome",
"label": "Seu nome",
"input-type": "text",
"required": true
},
{
"type": "Footer",
"label": "Enviar",
"on-click-action": {
"name": "complete",
"payload": {
"nome": "${form.nome}"
}
}
}
]
}
]
}
}
]
},
"ai_when_to_use": "Quando o cliente pedir para ser chamado de volta.",
"ai_params": {},
"status": "draft",
"version": 1,
"meta_flow_id": "",
"category": "CONTACT_US",
"created_at": "2026-10-11T23:55:12.229890Z",
"updated_at": "2026-10-11T23:55:12.229890Z"
}
]
}Campos da resposta
flowsarrayFlows da loja. Sem paginação.
idintegerflow_keystringnamestringscopestringstoreglobalstore.flow_jsonobjectai_when_to_usestringai_paramsobject{} quando vazio.statusstringdraftpublisheddraft até ser publicado na Meta; published depois.versionintegerPUT.meta_flow_idstringcategorystringSIGN_UPSIGN_INAPPOINTMENT_BOOKINGLEAD_GENERATIONCONTACT_USCUSTOMER_SUPPORTSURVEYOTHERcreated_atstringupdated_atstringcomponentsarrayflow_json.Erros (Listar os Flows)
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O módulo WhatsApp Commerce está desligado na loja, o usuário não é administrador ou não tem o privilégio exigido. | {"error":"module_disabled","module":"whatsapp-commerce"} ou {"error":"insufficient privileges","required":"manage_settings"} ou {"error":"admin access required"} |
| 500 | Falha ao consultar. | {"error":"..."} |
Criar um Flow
Guarda um Flow novo na loja, ainda só no painel: ele não existe na Meta até ser publicado. O flow_json é validado antes de gravar.
/api/v1/admin/whatsapp/meta-flowsAdminCria um Flow da loja
Corpo da requisição
flow_keystringobrigatórionamestringflow_jsonobjectobrigatórioai_when_to_usestringai_paramsobject{}.statusstringpadrão: draftdraftpublisheddraft.categorystringpadrão: OTHERSIGN_UPSIGN_INAPPOINTMENT_BOOKINGLEAD_GENERATIONCONTACT_USCUSTOMER_SUPPORTSURVEYOTHEROTHER.Exemplo de requisição (Criar um Flow)
curl -X POST "$BASE_URL/api/v1/admin/whatsapp/meta-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": "Quando o cliente pedir para ser chamado de volta.",
"flow_json": {
"version": "6.2",
"screens": [
{
"id": "CONTACT",
"title": "Contato",
"terminal": true,
"success": true,
"layout": {
"type": "SingleColumnLayout",
"children": [
{
"type": "TextHeading",
"text": "Fale com a gente"
},
{
"type": "Form",
"name": "form",
"children": [
{
"type": "TextInput",
"name": "nome",
"label": "Seu nome",
"input-type": "text",
"required": true
},
{
"type": "Footer",
"label": "Enviar",
"on-click-action": {
"name": "complete",
"payload": {
"nome": "${form.nome}"
}
}
}
]
}
]
}
}
]
}
}'Resposta (Criar um Flow)
{
"id": 2,
"flow_key": "contato-rapido",
"name": "Contato rápido",
"scope": "store",
"flow_json": {
"version": "6.2",
"screens": [
{
"id": "CONTACT",
"title": "Contato",
"terminal": true,
"success": true,
"layout": {
"type": "SingleColumnLayout",
"children": [
{
"type": "TextHeading",
"text": "Fale com a gente"
},
{
"type": "Form",
"name": "form",
"children": [
{
"type": "TextInput",
"name": "nome",
"label": "Seu nome",
"input-type": "text",
"required": true
},
{
"type": "Footer",
"label": "Enviar",
"on-click-action": {
"name": "complete",
"payload": {
"nome": "${form.nome}"
}
}
}
]
}
]
}
}
]
},
"ai_when_to_use": "Quando o cliente pedir para ser chamado de volta.",
"ai_params": {},
"status": "draft",
"version": 1,
"meta_flow_id": "",
"category": "CONTACT_US",
"created_at": "2026-10-11T23:55:12.229890Z",
"updated_at": "2026-10-11T23:55:12.229890Z"
}Campos da resposta
idintegerflow_keystringnamestringscopestringstoreglobalstore.flow_jsonobjectai_when_to_usestringai_paramsobject{} quando vazio.statusstringdraftpublisheddraft até ser publicado na Meta; published depois.versionintegerPUT.meta_flow_idstringcategorystringSIGN_UPSIGN_INAPPOINTMENT_BOOKINGLEAD_GENERATIONCONTACT_USCUSTOMER_SUPPORTSURVEYOTHERcreated_atstringupdated_atstringErros (Criar um Flow)
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo que não é JSON, flow_key ausente, ou chave já usada (a mensagem é a do banco de dados). | {"error":"flow_key é obrigatório"} ou {"error":"pq: duplicate key value violates unique constraint \"whatsapp_meta_flows_flow_key_key\" (23505)"} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O módulo WhatsApp Commerce está desligado na loja, o usuário não é administrador ou não tem o privilégio exigido. | {"error":"module_disabled","module":"whatsapp-commerce"} ou {"error":"insufficient privileges","required":"manage_settings"} ou {"error":"admin access required"} |
| 422 | O flow_json não passa na validação. A lista errors diz o que corrigir. | {"error":"Flow JSON inválido","errors":["version ausente","screens vazio"]} |
Ver um Flow
Devolve um Flow pelo id, com o flow_json completo.
/api/v1/admin/whatsapp/meta-flows/{id}AdminLê um Flow da loja
Parâmetros de caminho
idintegerobrigatórioExemplo de requisição (Ver um Flow)
curl "$BASE_URL/api/v1/admin/whatsapp/meta-flows/2" \
-H "Authorization: Bearer $TOKEN"Resposta (Ver um Flow)
{
"id": 2,
"flow_key": "contato-rapido",
"name": "Contato rápido",
"scope": "store",
"flow_json": {
"version": "6.2",
"screens": [
{
"id": "CONTACT",
"title": "Contato",
"terminal": true,
"success": true,
"layout": {
"type": "SingleColumnLayout",
"children": [
{
"type": "TextHeading",
"text": "Fale com a gente"
},
{
"type": "Form",
"name": "form",
"children": [
{
"type": "TextInput",
"name": "nome",
"label": "Seu nome",
"input-type": "text",
"required": true
},
{
"type": "Footer",
"label": "Enviar",
"on-click-action": {
"name": "complete",
"payload": {
"nome": "${form.nome}"
}
}
}
]
}
]
}
}
]
},
"ai_when_to_use": "Quando o cliente pedir para ser chamado de volta.",
"ai_params": {},
"status": "draft",
"version": 1,
"meta_flow_id": "",
"category": "CONTACT_US",
"created_at": "2026-10-11T23:55:12.229890Z",
"updated_at": "2026-10-11T23:55:12.229890Z"
}Campos da resposta
idintegerflow_keystringnamestringscopestringstoreglobalstore.flow_jsonobjectai_when_to_usestringai_paramsobject{} quando vazio.statusstringdraftpublisheddraft até ser publicado na Meta; published depois.versionintegerPUT.meta_flow_idstringcategorystringSIGN_UPSIGN_INAPPOINTMENT_BOOKINGLEAD_GENERATIONCONTACT_USCUSTOMER_SUPPORTSURVEYOTHERcreated_atstringupdated_atstringErros (Ver um Flow)
| Status | Quando | Corpo |
|---|---|---|
| 400 | O id não é um número. | {"error":"Invalid id"} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O módulo WhatsApp Commerce está desligado na loja, o usuário não é administrador ou não tem o privilégio exigido. | {"error":"module_disabled","module":"whatsapp-commerce"} ou {"error":"insufficient privileges","required":"manage_settings"} ou {"error":"admin access required"} |
| 404 | Flow não encontrado. | {"error":"flow não encontrado"} |
Alterar um Flow
Substitui o Flow inteiro: nome, desenho, textos para o assistente, estado e categoria. O flow_key não muda. A version sobe em 1.
/api/v1/admin/whatsapp/meta-flows/{id}AdminSubstitui um Flow da loja
Parâmetros de caminho
idintegerobrigatórioCorpo da requisição
namestringflow_jsonobjectobrigatórioai_when_to_usestringai_paramsobject{}.statusstringpadrão: draftdraftpublisheddraft.categorystringpadrão: OTHERSIGN_UPSIGN_INAPPOINTMENT_BOOKINGLEAD_GENERATIONCONTACT_USCUSTOMER_SUPPORTSURVEYOTHEROTHER.Exemplo de requisição (Alterar um Flow)
curl -X PUT "$BASE_URL/api/v1/admin/whatsapp/meta-flows/2" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Contato rápido v2",
"category": "CONTACT_US",
"ai_when_to_use": "Quando o cliente pedir para ser chamado de volta.",
"flow_json": {
"version": "6.2",
"screens": [
{
"id": "CONTACT",
"title": "Contato",
"terminal": true,
"success": true,
"layout": {
"type": "SingleColumnLayout",
"children": [
{
"type": "TextHeading",
"text": "Fale com a gente"
},
{
"type": "Form",
"name": "form",
"children": [
{
"type": "TextInput",
"name": "nome",
"label": "Seu nome",
"input-type": "text",
"required": true
},
{
"type": "Footer",
"label": "Enviar",
"on-click-action": {
"name": "complete",
"payload": {
"nome": "${form.nome}"
}
}
}
]
}
]
}
}
]
}
}'Resposta (Alterar um Flow)
{
"id": 2,
"flow_key": "contato-rapido",
"name": "Contato rápido v2",
"scope": "store",
"flow_json": {
"version": "6.2",
"screens": [
{
"id": "CONTACT",
"title": "Contato",
"terminal": true,
"success": true,
"layout": {
"type": "SingleColumnLayout",
"children": [
{
"type": "TextHeading",
"text": "Fale com a gente"
},
{
"type": "Form",
"name": "form",
"children": [
{
"type": "TextInput",
"name": "nome",
"label": "Seu nome",
"input-type": "text",
"required": true
},
{
"type": "Footer",
"label": "Enviar",
"on-click-action": {
"name": "complete",
"payload": {
"nome": "${form.nome}"
}
}
}
]
}
]
}
}
]
},
"ai_when_to_use": "Quando o cliente pedir para ser chamado de volta.",
"ai_params": {},
"status": "draft",
"version": 2,
"meta_flow_id": "",
"category": "CONTACT_US",
"created_at": "2026-10-11T23:55:12.229890Z",
"updated_at": "2026-10-11T23:55:12.229890Z"
}Campos da resposta
idintegerflow_keystringnamestringscopestringstoreglobalstore.flow_jsonobjectai_when_to_usestringai_paramsobject{} quando vazio.statusstringdraftpublisheddraft até ser publicado na Meta; published depois.versionintegerPUT.meta_flow_idstringcategorystringSIGN_UPSIGN_INAPPOINTMENT_BOOKINGLEAD_GENERATIONCONTACT_USCUSTOMER_SUPPORTSURVEYOTHERcreated_atstringupdated_atstringErros (Alterar um Flow)
| Status | Quando | Corpo |
|---|---|---|
| 400 | O id não é um número. | {"error":"Invalid id"} |
| 400 | Corpo que não é JSON, ou Flow inexistente (esta rota responde 400, não 404). | {"error":"flow não encontrado"} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O módulo WhatsApp Commerce está desligado na loja, o usuário não é administrador ou não tem o privilégio exigido. | {"error":"module_disabled","module":"whatsapp-commerce"} ou {"error":"insufficient privileges","required":"manage_settings"} ou {"error":"admin access required"} |
| 422 | O flow_json não passa na validação. A lista errors diz o que corrigir. | {"error":"Flow JSON inválido","errors":["version ausente","screens vazio"]} |
Apagar um Flow
Remove o Flow do painel.
/api/v1/admin/whatsapp/meta-flows/{id}AdminApaga um Flow da loja
Parâmetros de caminho
idintegerobrigatórioExemplo de requisição (Apagar um Flow)
curl -X DELETE "$BASE_URL/api/v1/admin/whatsapp/meta-flows/2" \
-H "Authorization: Bearer $TOKEN"Resposta (Apagar um Flow)
{
"success": true
}Campos da resposta
successbooleantrue.Erros (Apagar um Flow)
| Status | Quando | Corpo |
|---|---|---|
| 400 | O id não é um número. | {"error":"Invalid id"} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O módulo WhatsApp Commerce está desligado na loja, o usuário não é administrador ou não tem o privilégio exigido. | {"error":"module_disabled","module":"whatsapp-commerce"} ou {"error":"insufficient privileges","required":"manage_settings"} ou {"error":"admin access required"} |
| 500 | Falha ao apagar. | {"error":"..."} |