Blocos
Lista, cria, lê, altera e apaga os blocos (passos) de um fluxo de conversa.
Um bloco é um passo da conversa: enviar uma mensagem, mostrar um menu, perguntar um dado, decidir por uma condição, passar para um atendente. O que o bloco faz depende do block_type e do config.
Listar os blocos de um fluxo
Devolve os blocos do fluxo em ordem de position (e, em empate, do mais antigo ao mais novo). Não verifica se o fluxo existe: um id desconhecido devolve lista vazia.
/api/v1/admin/whatsapp/flows/{id}/blocksAdminLista os blocos de um fluxo
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição (Listar blocos)
curl "$BASE_URL/api/v1/admin/whatsapp/flows/fa4b0c91-2883-43c6-94ef-86e5b540a2aa/blocks" \
-H "Authorization: Bearer $TOKEN"Resposta (Listar blocos)
{
"flow_id": "fa4b0c91-2883-43c6-94ef-86e5b540a2aa",
"blocks": [
{
"id": "b8c1057a-d5b6-448f-af73-31734882b110",
"flow_id": "fa4b0c91-2883-43c6-94ef-86e5b540a2aa",
"block_type": "menu",
"name": "Menu",
"config": {
"options": [
{
"label": "Ver produtos",
"option_index": 1
},
{
"label": "Meus pedidos",
"option_index": 2
}
]
},
"position": 0,
"position_x": 990,
"position_y": 337,
"status": "active",
"created_at": "2026-05-07T06:53:17.425442Z",
"updated_at": "2026-07-21T15:16:48.409466Z"
}
]
}Campos da resposta
flow_iduuidblocksarrayBlocos do fluxo.
iduuidflow_iduuidblock_typestringnamestringblock_keystringconfigobjectblock_type.positionintegerposition_xintegerposition_yintegerstatusstringactivedisabledcreated_atstringupdated_atstringErros (Listar blocos)
| 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 | O id não é um UUID válido, ou falha ao consultar. | {"error":"Failed to list blocks: ..."} |
Adicionar um bloco
Cria um bloco dentro do fluxo. O bloco nasce solto: ligue-o a outros com uma conexão e, se for o primeiro, defina-o como start_block_id.
/api/v1/admin/whatsapp/flows/{id}/blocksAdminAdiciona um bloco a um fluxo
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
block_typestringobrigatórionamestringblock_keystringconfigobject{}. Chaves desconhecidas são aceitas e guardadas, mas o bot as ignora.positionintegerpadrão: 0position_xintegerpadrão: 0position_yintegerpadrão: 0statusstringpadrão: activeactivedisabledExemplo de requisição (Adicionar um bloco)
curl -X POST "$BASE_URL/api/v1/admin/whatsapp/flows/fa4b0c91-2883-43c6-94ef-86e5b540a2aa/blocks" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"block_type": "message",
"name": "Boas-vindas",
"config": {
"text": "Oi! Bem-vindo à nossa loja."
},
"position_x": 120,
"position_y": 80
}'Resposta (Adicionar um bloco)
{
"id": "c9f47922-b163-47f0-a7db-8345287707fc",
"flow_id": "fa4b0c91-2883-43c6-94ef-86e5b540a2aa",
"block_type": "message",
"name": "Boas-vindas",
"config": {
"text": "Oi! Bem-vindo à nossa loja."
},
"position": 0,
"position_x": 120,
"position_y": 80,
"status": "active",
"created_at": "2026-10-11T14:30:00.000000Z",
"updated_at": "2026-10-11T14:30:00.000000Z"
}Campos da resposta
iduuidflow_iduuidblock_typestringnamestringblock_keystringconfigobjectblock_type.positionintegerposition_xintegerposition_yintegerstatusstringactivedisabledcreated_atstringupdated_atstringErros (Adicionar um bloco)
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo que não é JSON, block_type vazio, ou fluxo inexistente (a chave estrangeira recusa). | {"error":"whatsapp/flows: block_type is required"} |
| 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"} |
Ver um bloco
Devolve um bloco pelo id, sem precisar do id do fluxo.
/api/v1/admin/whatsapp/blocks/{block_id}AdminLê um bloco
Parâmetros de caminho
block_iduuidobrigatórioExemplo de requisição (Ver um bloco)
curl "$BASE_URL/api/v1/admin/whatsapp/blocks/b8c1057a-d5b6-448f-af73-31734882b110" \
-H "Authorization: Bearer $TOKEN"Resposta (Ver um bloco)
{
"id": "b8c1057a-d5b6-448f-af73-31734882b110",
"flow_id": "fa4b0c91-2883-43c6-94ef-86e5b540a2aa",
"block_type": "menu",
"name": "Menu",
"config": {
"options": [
{
"label": "Ver produtos",
"option_index": 1
},
{
"label": "Meus pedidos",
"option_index": 2
}
]
},
"position": 0,
"position_x": 990,
"position_y": 337,
"status": "active",
"created_at": "2026-05-07T06:53:17.425442Z",
"updated_at": "2026-07-21T15:16:48.409466Z"
}Campos da resposta
iduuidflow_iduuidblock_typestringnamestringblock_keystringconfigobjectblock_type.positionintegerposition_xintegerposition_yintegerstatusstringactivedisabledcreated_atstringupdated_atstringErros (Ver um bloco)
| 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"} |
| 404 | Bloco não encontrado. | {"error":"Block not found"} |
| 500 | O id não é um UUID válido. | {"error":"Failed to load block: ..."} |
Alterar um bloco
Altera só os campos enviados. O config enviado substitui o atual por inteiro: reenvie o objeto completo.
/api/v1/admin/whatsapp/blocks/{block_id}AdminAltera um bloco
Parâmetros de caminho
block_iduuidobrigatórioCorpo da requisição
block_typestringnamestringblock_keystring"" limpa.configobjectconfig, que substitui o atual. null volta para {}.positionintegerposition_xintegerposition_yintegerstatusstringactivedisabledExemplo de requisição (Alterar um bloco)
curl -X PATCH "$BASE_URL/api/v1/admin/whatsapp/blocks/b8c1057a-d5b6-448f-af73-31734882b110" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Menu principal",
"position_x": 400,
"position_y": 200
}'Resposta (Alterar um bloco)
{
"id": "b8c1057a-d5b6-448f-af73-31734882b110",
"flow_id": "fa4b0c91-2883-43c6-94ef-86e5b540a2aa",
"block_type": "menu",
"name": "Menu principal",
"config": {
"options": [
{
"label": "Ver produtos",
"option_index": 1
},
{
"label": "Meus pedidos",
"option_index": 2
}
]
},
"position": 0,
"position_x": 400,
"position_y": 200,
"status": "active",
"created_at": "2026-05-07T06:53:17.425442Z",
"updated_at": "2026-07-21T15:16:48.409466Z"
}Campos da resposta
iduuidflow_iduuidblock_typestringnamestringblock_keystringconfigobjectblock_type.positionintegerposition_xintegerposition_yintegerstatusstringactivedisabledcreated_atstringupdated_atstringErros (Alterar um bloco)
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo que não é JSON. | {"error":"Invalid JSON body"} |
| 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 | Bloco não encontrado. | {"error":"Block not found"} |
Apagar um bloco
Apaga o bloco (remoção lógica) e todas as ligações que entram ou saem dele.
/api/v1/admin/whatsapp/blocks/{block_id}AdminApaga um bloco e suas ligações
Parâmetros de caminho
block_iduuidobrigatórioExemplo de requisição (Apagar um bloco)
curl -X DELETE "$BASE_URL/api/v1/admin/whatsapp/blocks/b8c1057a-d5b6-448f-af73-31734882b110" \
-H "Authorization: Bearer $TOKEN"Resposta (Apagar um bloco)
{
"status": "deleted",
"id": "b8c1057a-d5b6-448f-af73-31734882b110"
}Campos da resposta
statusstringdeleteddeleted.iduuidErros (Apagar um bloco)
| 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 | O id não é um UUID válido, ou falha ao apagar. | {"error":"Failed to delete block: ..."} |
Tipos de bloco
O campo block_type aceita os valores abaixo. Os blocos de Meta Flow (list, button, form e afins) usam telas nativas do WhatsApp; os demais são mensagens de conversa.
| Grupo | Tipos |
|---|---|
| Entrada e controle | trigger, message, menu, input_text, conditional, end |
| Loja | login, products, cart, checkout, order_history, order_details, order_success, order_confirmation, recover_cart, cancellation, shipping, payment |
| Conta | signup, registration, address, forgot_password, change_password, otp |
| Telas e mídia | list, button, form, media, location, send_template |
| Assistente e atendimento | ai_reply, human_handoff |
Chaves de config mais usadas
O config é livre e cada tipo lê suas próprias chaves. As principais:
| Tipo | Chaves |
|---|---|
message | text (também aceita message ou body): o texto enviado. |
menu | question (ou prompt, header): a pergunta; options: lista de {label, description}. O cliente responde com o número (a partir de 1), com o texto da opção ou tocando no botão. |
input_text | question, variable_name (onde guardar a resposta), required, validation_regex, error_message. |
conditional | variable, operator (equals, not_equals, contains, greater_than, less_than, is_empty, is_not_empty) e value; ou uma lista conditions com vários desses trios. |
media | content_type (image, video, document ou audio), media_url, caption. |
ai_reply | multi_turn (continua no bloco após a resposta), enable_product_search, enable_kb_injection, max_tokens. |
order_history | limit (padrão 10), empty_message. |
As chaves de texto aceitam variáveis entre chaves duplas, como {{vendor_name}}, preenchidas pelo bot.
Como as ligações escolhem o próximo bloco
Quando um bloco termina, o bot procura uma ligação que sai dele. O connection_type da ligação decide o caminho: next (padrão, segue sempre), option_0, option_1... (a opção escolhida num menu, contando de zero) e condition_0, condition_1... (o ramo que casou num conditional). Em caso de nenhuma opção ou condição casar, o bot tenta a ligação default e depois next. Veja a página de ligações.