Representantes e aprovação de desconto
Vincula representantes de vendas a clientes e decide os pedidos de desconto que eles fazem pelo WhatsApp.
No B2B, um representante (rep) é um vendedor da equipe que atende uma carteira de clientes. Ele pode fazer pedidos em nome do cliente conversando com o WhatsApp da loja (a mensagem do rep é reconhecida porque o telefone dele está cadastrado). Uma atribuição liga um rep a um cliente, opcionalmente limitada a um seller e a uma família de produtos. Quando o rep pede um preço abaixo do permitido, nasce uma aprovação de desconto que um administrador aceita ou recusa.
Listar atribuições
Para usuário vinculado a um seller, a lista é restrita a esse seller.
/api/v1/admin/whatsapp/rep-assignmentsAdminLista quem atende quem
Parâmetros de consulta
rep_user_idstringcustomer_user_idstringvendor_idstringfamily_idstringlimitintegerpadrão: 100offsetintegerpadrão: 0Exemplo de requisição (Listar atribuições)
curl "$BASE_URL/api/v1/admin/whatsapp/rep-assignments?rep_user_id=a0000000-0000-0000-0000-000000000004" \
-H "Authorization: Bearer $TOKEN"Resposta (Listar atribuições)
{
"assignments": [
{
"id": "84f740cb-5454-4038-8bf3-9d89a8949cfd",
"rep_user_id": "a0000000-0000-0000-0000-000000000004",
"customer_user_id": "a0000000-0000-0000-0000-000000000002",
"vendor_id": "207b2a04-9ca7-4820-b217-2c4eabbcee95",
"family_id": "8fcaf422-1631-4282-b503-85cc57380649",
"created_at": "2026-05-05T14:25:37Z",
"rep_name": "Carlos Pereira",
"rep_email": "carlos@exemplo.com.br",
"customer_name": "João Santos",
"customer_email": "joao@exemplo.com.br",
"vendor_name": "Distribuidora Exemplo",
"family_name": "Camisetas"
}
]
}Campos da resposta
assignmentsarrayAtribuições, da mais nova para a mais antiga.
idstringrep_user_idstringcustomer_user_idstringvendor_idstringfamily_idstringcreated_atstringrep_namestringrep_emailstringcustomer_namestringcustomer_emailstringvendor_namestringfamily_namestringErros (Listar atribuições)
| 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"} |
Criar atribuição
Cria a ligação. Repetir a mesma combinação não duplica: a resposta é 409 com a atribuição existente.
/api/v1/admin/whatsapp/rep-assignmentsAdminLiga um representante a um cliente
Corpo da requisição
rep_user_idstringobrigatóriocustomer_user_idstringobrigatóriovendor_idstringfamily_idstringExemplo de requisição (Criar atribuição)
curl -X POST "$BASE_URL/api/v1/admin/whatsapp/rep-assignments" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"rep_user_id": "a0000000-0000-0000-0000-000000000004",
"customer_user_id": "a0000000-0000-0000-0000-000000000002",
"vendor_id": "207b2a04-9ca7-4820-b217-2c4eabbcee95"
}'Resposta (Criar atribuição)
{
"assignment": {
"id": "84f740cb-5454-4038-8bf3-9d89a8949cfd",
"rep_user_id": "a0000000-0000-0000-0000-000000000004",
"customer_user_id": "a0000000-0000-0000-0000-000000000002",
"vendor_id": "207b2a04-9ca7-4820-b217-2c4eabbcee95",
"family_id": "8fcaf422-1631-4282-b503-85cc57380649",
"created_at": "2026-05-05T14:25:37Z",
"rep_name": "Carlos Pereira",
"rep_email": "carlos@exemplo.com.br",
"customer_name": "João Santos",
"customer_email": "joao@exemplo.com.br",
"vendor_name": "Distribuidora Exemplo",
"family_name": "Camisetas"
}
}Campos da resposta
assignmentobjectErros (Criar atribuição)
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo inválido, ou rep_user_id / customer_user_id ausente. | {"error":"rep_user_id 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"} |
| 409 | Já existe uma atribuição igual. | {"error":"This rep is already assigned to this vendor and family","code":"rep_assignment_exists","assignment":{}} |
Remover atribuição
Remove definitivamente a atribuição.
/api/v1/admin/whatsapp/rep-assignments/{id}AdminDesfaz a ligação entre representante e cliente
Parâmetros de caminho
idstringobrigatórioExemplo de requisição (Remover atribuição)
curl -X DELETE "$BASE_URL/api/v1/admin/whatsapp/rep-assignments/84f740cb-5454-4038-8bf3-9d89a8949cfd" \
-H "Authorization: Bearer $TOKEN"Resposta (Remover atribuição)
{
"deleted": true
}Campos da resposta
deletedbooleantrue.Erros (Remover atribuição)
| 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 | Atribuição inexistente. | {"error":"rep assignment not found"} |
Listar pedidos de desconto
Cada pedido guarda o preço de tabela, o preço pedido e o desconto resultante.
/api/v1/admin/whatsapp/discount-approvalsAdminLista os pedidos de desconto feitos por representantes
Parâmetros de consulta
statusstringpendingapprovedrejectedexpiredexpired inclui pendentes já vencidos.rep_user_idstringcustomer_user_idstringvendor_idstringproduct_idstringlimitintegerpadrão: 100offsetintegerpadrão: 0Exemplo de requisição (Listar pedidos de desconto)
curl "$BASE_URL/api/v1/admin/whatsapp/discount-approvals?status=pending" \
-H "Authorization: Bearer $TOKEN"Resposta (Listar pedidos de desconto)
{
"approvals": [
{
"id": "5d0b6c6a-1f6e-4c2a-9e55-3b7c1a2d4e90",
"rep_user_id": "a0000000-0000-0000-0000-000000000004",
"customer_user_id": "a0000000-0000-0000-0000-000000000002",
"vendor_id": "207b2a04-9ca7-4820-b217-2c4eabbcee95",
"product_id": "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766",
"quantity": 10,
"base_price": 30000,
"requested_price": 27000,
"discount_bps": 1000,
"reason": "Cliente fecha 10 peças",
"status": "P",
"expires_at": "2026-10-12T14:00:00Z",
"created_at": "2026-10-11T14:00:00Z",
"updated_at": "2026-10-11T14:00:00Z",
"rep_name": "Carlos Pereira",
"customer_name": "João Santos",
"vendor_name": "Distribuidora Exemplo",
"product_name": "Camisa do Flamengo Masculina I 26 Adidas"
}
]
}Campos da resposta
approvalsarrayPedidos de desconto.
idstringrep_user_idstringcustomer_user_idstringvendor_idstringproduct_idstringquantityintegerbase_priceintegerrequested_priceintegerdiscount_bpsinteger1000 = 10%.reasonstringstatusstringPAREP pendente, A aprovado, R recusado, E expirado.reviewed_bystringreviewed_atstringrejection_reasonstringexpires_atstringapplied_to_order_idstringcreated_atstringupdated_atstringrep_namestringcustomer_namestringvendor_namestringproduct_namestringErros (Listar pedidos de desconto)
| 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 | status com valor desconhecido (falha genérica). | {"error":"Failed to list discount approvals: invalid status filter: x"} |
Decidir um pedido de desconto
Só pedidos pendentes podem ser decididos. Ao aprovar, o desconto fica disponível para o representante usar no pedido.
/api/v1/admin/whatsapp/discount-approvals/{id}/reviewAdminAprova ou recusa um pedido de desconto
Parâmetros de caminho
idstringobrigatórioCorpo da requisição
decisionstringobrigatórioapprovedrejectedrejection_reasonstringrejected.Exemplo de requisição (Decidir um pedido de desconto)
curl -X POST "$BASE_URL/api/v1/admin/whatsapp/discount-approvals/5d0b6c6a-1f6e-4c2a-9e55-3b7c1a2d4e90/review" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"decision": "rejected",
"rejection_reason": "Margem insuficiente."
}'Resposta (Decidir um pedido de desconto)
{
"approval": {
"id": "5d0b6c6a-1f6e-4c2a-9e55-3b7c1a2d4e90",
"rep_user_id": "a0000000-0000-0000-0000-000000000004",
"customer_user_id": "a0000000-0000-0000-0000-000000000002",
"vendor_id": "207b2a04-9ca7-4820-b217-2c4eabbcee95",
"product_id": "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766",
"quantity": 10,
"base_price": 30000,
"requested_price": 27000,
"discount_bps": 1000,
"reason": "Cliente fecha 10 peças",
"status": "R",
"expires_at": "2026-10-12T14:00:00Z",
"created_at": "2026-10-11T14:00:00Z",
"updated_at": "2026-10-11T14:00:00Z",
"rep_name": "Carlos Pereira",
"customer_name": "João Santos",
"vendor_name": "Distribuidora Exemplo",
"product_name": "Camisa do Flamengo Masculina I 26 Adidas",
"rejection_reason": "Margem insuficiente."
}
}Campos da resposta
approvalobjectErros (Decidir um pedido de desconto)
| 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 | Pedido inexistente. | {"error":"discount approval not found"} |
| 409 | O pedido já foi decidido ou expirou. | {"error":"discount approval is not pending"} |
| 500 | decision inválida ou rejection_reason ausente ao recusar. Atenção: é um 500, não um 400. | {"error":"Failed to review discount approval: decision must be 'approved' or 'rejected'"} |