Carteira, conta-corrente e alçadas
Consulta a carteira de clientes e o extrato da conta-corrente de um representante, transfere clientes entre representantes e ajusta os parâmetros financeiros de desconto do seller.
Depois de cadastrar os representantes, estas cinco rotas respondem às perguntas do dia a dia: quem atende quais clientes, quanto crédito de desconto cada um ainda tem e até onde cada um pode ir sem pedir aprovação. Todas valem só para o seu seller e para representantes dele.
Carteira de clientes de um representante
/api/v1/vendor/trade-reps/{id}/customersSellerLista os clientes da carteira de um representante
Lista os vínculos entre o representante e os clientes, com o tipo de vínculo. A carteira é montada pelo administrador da loja e por transferências.
Parâmetros de caminho
idintegerobrigatórioParâmetros de consulta
pageintegerpadrão: 1per_pageintegerpadrão: 20{
"customers": [
{
"rep_id": 31,
"customer_id": "472e2c31-fa7a-4d06-84c9-f832619bcdbd",
"link_kind": "permanent",
"source": "manual",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"customer_name": "Mariana Cavalcanti",
"email": "mariana.cavalcanti@example.com",
"assigned_at": "2026-07-20T02:51:25Z"
}
],
"total": 1,
"page": 1,
"per_page": 20,
"total_pages": 1
}Campos da resposta
customersarraycustomers[].customer_iduuidcustomers[].link_kindstringpermanenttemporarycopypermanent: definitivo. temporary: cobertura com data final, depois volta ao representante original. copy: o cliente fica com este representante e com outro.customers[].sourcestringmanual, import, transfer, copy.customers[].vendor_iduuidcustomers[].original_rep_idintegercustomers[].valid_untilstringcustomers[].customer_namestringcustomers[].emailstringcustomers[].assigned_atstringtotalintegerpageintegerper_pageintegertotal_pagesintegerExtrato da conta-corrente
/api/v1/vendor/trade-reps/{id}/ledgerSellerExtrato da conta-corrente de um representante
A conta-corrente é o saldo de crédito que o representante pode gastar em descontos acima do livre. O extrato mostra cada lançamento, do mais novo ao mais antigo. Aqui só há leitura: ajustes manuais são feitos pelo administrador da loja.
Parâmetros de caminho
idintegerobrigatórioParâmetros de consulta
pageintegerpadrão: 1per_pageintegerpadrão: 20{
"entries": [
{
"id": 118,
"rep_id": 31,
"entry_type": "commission",
"amount": 3999,
"balance_after": 12999,
"order_id": "4cb4cd7c-e817-48b3-b4a0-2f99f856a50b",
"description": "commission order 4cb4cd7c-e817-48b3-b4a0-2f99f856a50b",
"actor_user_id": "system",
"created_at": "2026-09-07T02:10:00Z"
}
],
"balance": 12999,
"total": 1,
"page": 1,
"per_page": 20,
"total_pages": 1
}Campos da resposta
entriesarrayentries[].idintegerentries[].entry_typestringcommissiondiscountbonusmanual_creditmanual_debitreverse_commissionentries[].amountintegerentries[].balance_afterintegerentries[].order_idstringentries[].order_item_idstringentries[].descriptionstringentries[].actor_user_idstringsystem quando é automático.entries[].created_atstringbalanceintegertotalintegerpageintegerper_pageintegertotal_pagesintegerSó mexem no saldo os créditos e débitos manuais e os descontos acima do livre. Comissões de pedido e bônus aparecem no extrato, mas não alteram o saldo.
Transferir clientes entre representantes
/api/v1/vendor/trade-reps/transferSellerTransfere clientes de um representante para outro
Move clientes da carteira de um representante para outro, por exemplo quando alguém sai da equipe. Os dois representantes precisam ser do seu seller; senão a resposta é 403. A transferência age sobre os vínculos do seu seller.
Corpo da requisição
from_rep_idintegerobrigatórioto_rep_idintegerobrigatóriocustomer_idsarrayall_filtered: true) move toda a carteira ativa da origem.all_filteredbooleantrue ignora customer_ids e move tudo.kindstringpadrão: permanentpermanenttemporarypttemporary (ou t) exige valid_until; ao vencer, o cliente pode voltar ao representante de origem.valid_untilstring{ "moved": 1, "copied": 0, "skipped": 0 }Campos da resposta
movedintegercopiedinteger0 aqui (só a cópia preenche).skippedintegererrorsarrayParâmetros financeiros do seller
/api/v1/vendor/trade-reps/finance-settingsSellerLê os parâmetros financeiros de desconto do seller
Devolve a configuração do seu seller. Sem configuração salva, todos os campos vêm 0, vazio ou false.
/api/v1/vendor/trade-reps/finance-settingsSellerGrava os parâmetros financeiros de desconto do seller
Grava (cria ou substitui) a configuração. É um upsert completo: todo campo não enviado é gravado como 0, vazio ou false. O vendor_id do corpo é ignorado; vale o seu. A resposta é o objeto gravado.
Corpo da requisição
order_commission_bpintegerpadrão: 0global_free_discount_bpintegerpadrão: 0approval_limit_1_bpintegerpadrão: 00 significa que o nível 1 resolve tudo.approval_limit_2_bpintegerpadrão: 0extended_approval_levels.approval_limit_3_bpintegerpadrão: 0extended_approval_levels. Acima disso o nível exigido é 4, que a plataforma bloqueia (não há quem aprove).blocked_order_statusstringextended_approval_levelsbooleanpadrão: falsefalse: só existem os níveis 1 e 2. true: níveis 1 a 3 e o nível 4 como bloqueio.{
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"order_commission_bp": 300,
"global_free_discount_bp": 200,
"approval_limit_1_bp": 500,
"approval_limit_2_bp": 1000,
"approval_limit_3_bp": 1500,
"blocked_order_status": "",
"extended_approval_levels": false
}Exemplo de requisição
# carteira do representante 31
curl "$BASE_URL/api/v1/vendor/trade-reps/31/customers" \
-H "Authorization: Bearer $TOKEN"
# transferir toda a carteira do 31 para o 32
curl -X POST "$BASE_URL/api/v1/vendor/trade-reps/transfer" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"from_rep_id": 31, "to_rep_id": 32, "all_filtered": true}'
# gravar os parâmetros financeiros (corpo completo)
curl -X PUT "$BASE_URL/api/v1/vendor/trade-reps/finance-settings" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"order_commission_bp": 300, "global_free_discount_bp": 200, "approval_limit_1_bp": 500}'Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Corpo não é JSON. | {"error":"invalid body","detail":"..."} |
| 400 | Transferência recusada (origem igual ao destino, temporary sem valid_until, nenhum cliente, tipo inválido). | {"error":"transfer failed","detail":"origin and destination must differ"} |
| 400 | Falha ao gravar os parâmetros financeiros. | {"error":"save failed","detail":"..."} |
| 401 | Sem token. | {"error":"authentication required"} |
| 403 | Módulo desligado. | {"error":"module_disabled","module":"trade-reps"} |
| 403 | Falta um dos privilégios de representantes ou de pedidos. | {"error":"insufficient vendor privileges","privilege_required_any":["..."]} |
| 403 | Algum dos representantes da transferência não é do seu seller (ou não existe). | {"error":"reps must belong to your store"} |
| 404 | Carteira ou extrato de representante inexistente, de outro seller ou com id inválido. | {"error":"not found"} |
| 500 | Falha ao consultar a carteira, o extrato ou os parâmetros. | {"error":"list failed","detail":"..."} |