Gerenciar fluxos
Lista, consulta, cria, altera e exclui fluxos conversacionais do WhatsApp Commerce.
Um fluxo é um roteiro de conversa do atendimento por WhatsApp: blocos (mensagem, pergunta, menu...) ligados por conexões, que começam a rodar quando o cliente manda uma mensagem que casa com o gatilho. Estas rotas gerenciam o fluxo em si (nome, gatilho, estado). Os blocos e as conexões do desenho têm rotas próprias, em /api/v1/admin/whatsapp/flows/{id}/blocks e .../connections. Todas as rotas desta página exigem o módulo whatsapp-commerce ativo e o privilégio manage_settings.
Listar fluxos
/api/v1/admin/flowsAdminLista os fluxos
Parâmetros de consulta
statusstringdraftactiveinactivearchivedFiltra por estado. Aceita a palavra ou a letra.
channelstringFiltra por canal.
vendor_iduuidFiltra por seller. Um administrador que também é seller só vê os fluxos do próprio seller, qualquer que seja este parâmetro.
searchstringTexto no nome ou na descrição, sem diferenciar maiúsculas.
limitintegerpadrão: 50Itens a devolver.
offsetintegerpadrão: 0Quantos itens pular.
Exemplo de requisição
bash
curl "$BASE_URL/api/v1/admin/flows?status=active&limit=50" \
-H "Authorization: Bearer $TOKEN"Resposta
200Fluxos
json
{
"flows": [
{
"id": "4b8801c7-d1cf-4adc-807f-1aeb6f9687db",
"name": "Consulta de pedido",
"description": "Cumprimenta e pede o número do pedido",
"status": "R",
"channel": "whatsapp",
"metadata": {},
"trigger_type": "keyword",
"trigger_keywords": [
"pedido",
"order"
],
"trigger_match_mode": "starts_with",
"trigger_case_sensitive": false,
"trigger_priority": 5,
"created_at": "2026-10-11T21:05:32.24225Z",
"updated_at": "2026-10-11T21:05:32.24225Z"
}
],
"limit": 50,
"offset": 0
}Campos da resposta
flowsarrayOs fluxos da página. Sem contagem total: peça páginas até vir menos itens que
limit.limit / offsetintegerOs valores usados.
flows[].iduuidId do fluxo.
flows[].vendor_iduuidSeller dono do fluxo. Ausente em fluxos da loja inteira.
flows[].namestringNome.
flows[].descriptionstringDescrição. Ausente se vazia.
flows[].start_block_iduuidBloco em que a conversa começa. Ausente enquanto não definido.
flows[].statusstringRAPHEstado do fluxo, devolvido como letra:
R rascunho, A ativo, P inativo, H arquivado. Veja a nota abaixo.flows[].channelstringCanal. Padrão
whatsapp.flows[].modestringModo do fluxo, texto livre. Ausente se vazio.
flows[].metadataobjectDados livres do editor visual.
flows[].trigger_typestringmanualkeywordinbound_defaultO que inicia o fluxo.
flows[].trigger_keywordsarrayPalavras-chave (para
keyword).flows[].trigger_match_modestringexactstarts_withcontainsregexComo comparar a mensagem com as palavras-chave.
flows[].trigger_case_sensitivebooleanSe
true, maiúsculas e minúsculas diferem. Não tem efeito em regex.flows[].trigger_priorityintegerEm empate, vence a maior prioridade.
flows[].created_at / updated_atstringDatas (RFC 3339, UTC).
Erros
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário administrador. | {"error":"admin access required"} |
| 403 | O usuário é administrador, mas não tem o privilégio exigido. | {"error":"insufficient privileges","privilege_required_any":["manage_settings"]} |
| 403 | O módulo whatsapp-commerce não está ativo nesta loja. | {"error":"module_disabled","module":"whatsapp-commerce"} |
| 500 | Falha ao listar. | {"error":"Failed to list flows: ..."} |
Consultar um fluxo
/api/v1/admin/flows/{id}AdminUm fluxo pelo id
Parâmetros de caminho
iduuidobrigatórioId do fluxo.
Exemplo de requisição
bash
curl "$BASE_URL/api/v1/admin/flows/4b8801c7-d1cf-4adc-807f-1aeb6f9687db" \
-H "Authorization: Bearer $TOKEN"Resposta
200Fluxo
json
{
"id": "4b8801c7-d1cf-4adc-807f-1aeb6f9687db",
"name": "Consulta de pedido",
"description": "Cumprimenta e pede o número do pedido",
"status": "R",
"channel": "whatsapp",
"metadata": {},
"trigger_type": "keyword",
"trigger_keywords": [
"pedido",
"order"
],
"trigger_match_mode": "starts_with",
"trigger_case_sensitive": false,
"trigger_priority": 5,
"created_at": "2026-10-11T21:05:32.24225Z",
"updated_at": "2026-10-11T21:05:32.24225Z"
}Campos da resposta
iduuidId do fluxo.
vendor_iduuidSeller dono do fluxo. Ausente em fluxos da loja inteira.
namestringNome.
descriptionstringDescrição. Ausente se vazia.
start_block_iduuidBloco em que a conversa começa. Ausente enquanto não definido.
statusstringRAPHEstado do fluxo, devolvido como letra:
R rascunho, A ativo, P inativo, H arquivado. Veja a nota abaixo.channelstringCanal. Padrão
whatsapp.modestringModo do fluxo, texto livre. Ausente se vazio.
metadataobjectDados livres do editor visual.
trigger_typestringmanualkeywordinbound_defaultO que inicia o fluxo.
trigger_keywordsarrayPalavras-chave (para
keyword).trigger_match_modestringexactstarts_withcontainsregexComo comparar a mensagem com as palavras-chave.
trigger_case_sensitivebooleanSe
true, maiúsculas e minúsculas diferem. Não tem efeito em regex.trigger_priorityintegerEm empate, vence a maior prioridade.
created_at / updated_atstringDatas (RFC 3339, UTC).
Erros
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário administrador. | {"error":"admin access required"} |
| 403 | O usuário é administrador, mas não tem o privilégio exigido. | {"error":"insufficient privileges","privilege_required_any":["manage_settings"]} |
| 403 | O módulo whatsapp-commerce não está ativo nesta loja. | {"error":"module_disabled","module":"whatsapp-commerce"} |
| 404 | Fluxo não existe (ou foi excluído). | {"error":"Flow not found"} |
| 500 | id não é um UUID válido (a mensagem vem do banco, em inglês). | {"error":"Failed to load flow: ..."} |
Criar fluxo
/api/v1/admin/flowsAdminCria um fluxo
Corpo da requisição
namestringobrigatórioNome. Obrigatório.
descriptionstringDescrição.
statusstringpadrão: draftdraftactiveinactivearchivedEstado inicial.
channelstringpadrão: whatsappCanal.
modestringModo, texto livre.
metadataobjectDados livres do editor.
vendor_iduuidSeller dono do fluxo. Omitido: fluxo da loja inteira. Ignorado para administrador que é seller (vale o dele).
trigger_typestringmanualkeywordinbound_defaultO que inicia o fluxo.
manual (padrão): só é iniciado manualmente; keyword: quando a mensagem do cliente casa com trigger_keywords; inbound_default: fluxo padrão quando nenhum outro casa e o cliente não está em um fluxo.trigger_keywordsarrayLista de textos. Obrigatória (ao menos um não vazio) quando
trigger_type é keyword.trigger_match_modestringexactstarts_withcontainsregexComparação.
exact: texto igual; starts_with: começa com; contains (padrão): contém; regex: expressão regular.trigger_case_sensitivebooleanpadrão: falseDiferencia maiúsculas de minúsculas. Padrão
false.trigger_priorityintegerpadrão: 0Prioridade em caso de vários fluxos casando: o maior número vence. Padrão
0.Exemplo de requisição
bash
curl -X POST "$BASE_URL/api/v1/admin/flows" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Consulta de pedido", "description": "Cumprimenta e pede o número do pedido", "trigger_type": "keyword", "trigger_keywords": ["pedido", "order"], "trigger_match_mode": "starts_with", "trigger_priority": 5}'Resposta
201Fluxo criado
json
{
"id": "4b8801c7-d1cf-4adc-807f-1aeb6f9687db",
"name": "Consulta de pedido",
"description": "Cumprimenta e pede o número do pedido",
"status": "R",
"channel": "whatsapp",
"metadata": {},
"trigger_type": "keyword",
"trigger_keywords": [
"pedido",
"order"
],
"trigger_match_mode": "starts_with",
"trigger_case_sensitive": false,
"trigger_priority": 5,
"created_at": "2026-10-11T21:05:32.24225Z",
"updated_at": "2026-10-11T21:05:32.24225Z"
}Campos da resposta
campos-Os mesmos de Consultar um fluxo.
Erros
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário administrador. | {"error":"admin access required"} |
| 403 | O usuário é administrador, mas não tem o privilégio exigido. | {"error":"insufficient privileges","privilege_required_any":["manage_settings"]} |
| 403 | O módulo whatsapp-commerce não está ativo nesta loja. | {"error":"module_disabled","module":"whatsapp-commerce"} |
| 400 | JSON inválido, name vazio, trigger_type ou trigger_match_mode fora da lista, ou keyword sem palavras-chave. A mensagem vem no campo error. | {"error":"whatsapp/flows: trigger_type=keyword requires at least one non-empty trigger_keywords entry"} |
Alterar fluxo
/api/v1/admin/flows/{id}AdminAltera um fluxo (parcial)
Parâmetros de caminho
iduuidobrigatórioId do fluxo.
Corpo da requisição
namestringNovo nome.
descriptionstringNova descrição.
statusstringdraftactiveinactivearchivedNovo estado.
active liga o fluxo; inactive desliga. Palavra desconhecida vira inactive, nunca active.channelstringNovo canal.
modestringNovo modo.
start_block_iduuidBloco inicial. Omitido: não muda. Texto vazio (
"") remove o bloco inicial.metadataobjectDados do editor.
trigger_typestringmanualkeywordinbound_defaultO que inicia o fluxo.
manual (padrão): só é iniciado manualmente; keyword: quando a mensagem do cliente casa com trigger_keywords; inbound_default: fluxo padrão quando nenhum outro casa e o cliente não está em um fluxo.trigger_keywordsarrayLista de textos. Obrigatória (ao menos um não vazio) quando
trigger_type é keyword.trigger_match_modestringexactstarts_withcontainsregexComparação.
exact: texto igual; starts_with: começa com; contains (padrão): contém; regex: expressão regular.trigger_case_sensitivebooleanDiferencia maiúsculas de minúsculas. Padrão
false.trigger_priorityintegerPrioridade em caso de vários fluxos casando: o maior número vence. Padrão
0.Exemplo de requisição
bash
curl -X PATCH "$BASE_URL/api/v1/admin/flows/4b8801c7-d1cf-4adc-807f-1aeb6f9687db" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"status": "active"}'Resposta
200Fluxo atualizado
json
{
"id": "4b8801c7-d1cf-4adc-807f-1aeb6f9687db",
"name": "Consulta de pedido",
"description": "Cumprimenta e pede o número do pedido",
"status": "A",
"channel": "whatsapp",
"metadata": {},
"trigger_type": "keyword",
"trigger_keywords": [
"pedido",
"order"
],
"trigger_match_mode": "starts_with",
"trigger_case_sensitive": false,
"trigger_priority": 5,
"created_at": "2026-10-11T21:05:32.24225Z",
"updated_at": "2026-10-11T21:05:32.313655Z"
}Campos da resposta
campos-O fluxo completo, depois da alteração.
Erros
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário administrador. | {"error":"admin access required"} |
| 403 | O usuário é administrador, mas não tem o privilégio exigido. | {"error":"insufficient privileges","privilege_required_any":["manage_settings"]} |
| 403 | O módulo whatsapp-commerce não está ativo nesta loja. | {"error":"module_disabled","module":"whatsapp-commerce"} |
| 400 | JSON inválido ou valor recusado (mesmas regras de criar). | {"error":"whatsapp/flows: invalid trigger_type \"zzz\" (want manual|keyword|inbound_default)"} |
| 404 | Fluxo não existe (ou foi excluído). | {"error":"Flow not found"} |
Excluir fluxo
/api/v1/admin/flows/{id}AdminExclui um fluxo (soft delete)
Parâmetros de caminho
iduuidobrigatórioId do fluxo.
Exemplo de requisição
bash
curl -X DELETE "$BASE_URL/api/v1/admin/flows/4b8801c7-d1cf-4adc-807f-1aeb6f9687db" \
-H "Authorization: Bearer $TOKEN"Resposta
200Excluído
json
{
"status": "deleted",
"id": "4b8801c7-d1cf-4adc-807f-1aeb6f9687db"
}Campos da resposta
statusstringSempre
deleted.iduuidId do fluxo.
Erros
| Status | Quando | Exemplo de corpo |
|---|---|---|
| 401 | Token ausente, inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário administrador. | {"error":"admin access required"} |
| 403 | O usuário é administrador, mas não tem o privilégio exigido. | {"error":"insufficient privileges","privilege_required_any":["manage_settings"]} |
| 403 | O módulo whatsapp-commerce não está ativo nesta loja. | {"error":"module_disabled","module":"whatsapp-commerce"} |
| 500 | id inválido ou falha ao excluir. | {"error":"Failed to delete flow: ..."} |