Fluxo
Lê o fluxo de conversa do seller, altera nome, status e gatilho, e confere se o desenho está coerente.
Estas quatro rotas tratam do fluxo como um todo, sem mexer nos blocos. Veja o vocabulário (fluxo, bloco, conexão, gatilho) no resumo da seção. Todas exigem um usuário seller com o módulo whatsapp-commerce e o privilégio vendor_manage_whatsapp.
Fluxo ativo
/api/v1/vendor/whatsapp/flows/activeSellerDevolve o fluxo ativo do seller
É o ponto de entrada do editor. Procura o fluxo ativo do seller, de preferência o de boas-vindas (inbound_default). Se o seller ainda não tem um fluxo próprio, mas existe um da loja, a plataforma cria uma cópia editável para o seller e a devolve. Ou seja, esta chamada de leitura pode criar dados.
Exemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/flows/active" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"flow": {
"id": "6f1c2d3e-9a4b-4c5d-8e7f-0a1b2c3d4e5f",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"name": "Welcome Retail",
"description": "Boas-vindas, menu, catálogo, carrinho e pedidos.",
"start_block_id": "b1a2c3d4-0000-4000-8000-000000000001",
"status": "active",
"channel": "whatsapp",
"metadata": {},
"trigger_type": "inbound_default",
"trigger_keywords": [],
"trigger_match_mode": "contains",
"trigger_case_sensitive": false,
"trigger_priority": 0,
"created_at": "2026-10-01T12:00:00Z",
"updated_at": "2026-10-09T18:30:00Z"
},
"owned": true
}{ "flow": null }Campos da resposta
flowobjectnull se não existe nenhum fluxo ativo para o seller nem para a loja.flow.iduuidflow.vendor_iduuidflow.namestringflow.descriptionstringflow.start_block_iduuidflow.statusstringdraft, active, inactive ou archived (ou a letra correspondente, veja o resumo).flow.channelstringwhatsapp nos fluxos criados por aqui.flow.modestringflow.metadataobjectflow.trigger_typestringmanualkeywordinbound_defaultflow.trigger_keywordsarraytrigger_type é keyword.flow.trigger_match_modestringexactstarts_withcontainsregexflow.trigger_case_sensitivebooleanflow.trigger_priorityintegerflow.created_atstringflow.updated_atstringownedbooleantrue quando o fluxo pertence ao seller. false significa fluxo da loja, somente leitura. Ausente quando flow é null.Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token | {"error":"authentication required"} |
| 403 | Token que não é de seller | {"error":"insufficient permissions"} |
| 403 | Módulo desligado | {"error":"module_disabled","module":"whatsapp-commerce"} |
| 403 | Falta o privilégio | {"error":"insufficient vendor privileges","required":"vendor_manage_whatsapp"} |
| 404 | Usuário sem cadastro de seller | {"error":"vendor profile not found","code":"vendor_profile_not_found"} |
| 500 | Falha ao ler | {"error":"..."} |
Ler um fluxo
/api/v1/vendor/whatsapp/flows/{id}SellerLê um fluxo do seller
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/flows/$FLOW_ID" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": "6f1c2d3e-9a4b-4c5d-8e7f-0a1b2c3d4e5f",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"name": "Welcome Retail",
"start_block_id": "b1a2c3d4-0000-4000-8000-000000000001",
"status": "active",
"channel": "whatsapp",
"trigger_type": "inbound_default",
"trigger_keywords": [],
"trigger_match_mode": "contains",
"trigger_case_sensitive": false,
"trigger_priority": 0,
"created_at": "2026-10-01T12:00:00Z",
"updated_at": "2026-10-09T18:30:00Z"
}Os campos são os de flow em "Fluxo ativo". Os blocos e conexões ficam em rotas próprias: Blocos e Conexões.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Autenticação, módulo ou privilégio | veja acima |
| 404 | Fluxo inexistente, da loja ou de outro seller | {"error":"flow not found or not owned by this seller"} |
Alterar um fluxo
/api/v1/vendor/whatsapp/flows/{id}SellerAltera nome, status, gatilho e bloco inicial do fluxo
Atualização parcial: só os campos enviados mudam. Um corpo sem campos conhecidos não faz nada e devolve o fluxo como está. Devolve o fluxo atualizado.
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
namestringdescriptionstringstatusstringdraftactiveinactivearchiveddisabled é aceito como sinônimo de inactive.channelstringwhatsapp.modestringstart_block_iduuidmetadataobjecttrigger_typestringmanualkeywordinbound_defaulttrigger_keywordsarraytrigger_type keyword, precisa ter ao menos uma não vazia.trigger_match_modestringexactstarts_withcontainsregextrigger_case_sensitivebooleanregex.trigger_priorityintegerExemplo de requisição
curl -X PATCH "$BASE_URL/api/v1/vendor/whatsapp/flows/$FLOW_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"status": "active",
"trigger_type": "keyword",
"trigger_keywords": [
"promo",
"oferta"
],
"trigger_match_mode": "contains"
}'Resposta
{
"id": "6f1c2d3e-9a4b-4c5d-8e7f-0a1b2c3d4e5f",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"name": "Promoções",
"status": "active",
"channel": "whatsapp",
"trigger_type": "keyword",
"trigger_keywords": ["promo", "oferta"],
"trigger_match_mode": "contains",
"trigger_case_sensitive": false,
"trigger_priority": 0,
"created_at": "2026-10-01T12:00:00Z",
"updated_at": "2026-10-11T14:00:00Z"
}Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | JSON inválido | {"error":"Invalid JSON body"} |
| 400 | trigger_type inválido | {"error":"whatsapp/flows: invalid trigger_type \"x\" (want manual|keyword|inbound_default)"} |
| 400 | trigger_match_mode inválido | {"error":"whatsapp/flows: invalid trigger_match_mode \"x\" (want exact|starts_with|contains|regex)"} |
| 400 | keyword sem palavras | {"error":"whatsapp/flows: trigger_type=keyword requires at least one non-empty trigger_keywords entry"} |
| 401 / 403 | Autenticação, módulo ou privilégio | veja acima |
| 404 | Fluxo inexistente, da loja ou de outro seller | {"error":"flow not found or not owned by this seller"} |
Validar o desenho
/api/v1/vendor/whatsapp/flows/{id}/validateSellerAponta problemas de desenho no fluxo
Somente leitura. Percorre os blocos e conexões e devolve a lista de problemas. Rode depois de editar e antes de ativar.
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/flows/$FLOW_ID/validate" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"flow_id": "6f1c2d3e-9a4b-4c5d-8e7f-0a1b2c3d4e5f",
"valid": false,
"issues": [
{
"code": "orphan_block",
"block_id": "b1a2c3d4-0000-4000-8000-000000000009",
"message": "block has no inbound connections and is not the entry block"
}
]
}Campos da resposta
flow_iduuidvalidbooleantrue quando issues está vazio.issuesarrayissues[].codestringno_entrystart_block_not_in_flowself_loopunknown_block_refdangling_outboundduplicate_edgeorphan_blockno_entry: há blocos mas falta o bloco inicial. start_block_not_in_flow: o bloco inicial não é deste fluxo. self_loop: uma conexão sai e chega no mesmo bloco. unknown_block_ref: a origem da conexão não é deste fluxo. dangling_outbound: o destino da conexão não é deste fluxo. duplicate_edge: duas conexões do mesmo bloco com o mesmo tipo. orphan_block: bloco que nenhuma conexão alcança e que não é o inicial.issues[].block_iduuidissues[].edge_iduuidissues[].messagestringErros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Autenticação, módulo ou privilégio | veja acima |
| 404 | Fluxo inexistente, da loja ou de outro seller | {"error":"flow not found or not owned by this seller"} |
| 400 | Falha ao ler o desenho | {"error":"..."} |