Listar e criar representantes
Lista os representantes comerciais com filtros e cadastra um novo representante, criando ou reaproveitando o login dele.
Listar representantes
Devolve os representantes do mais novo para o mais antigo, com paginação.
/api/v1/admin/trade-repsAdminLista os representantes comerciais
Parâmetros de consulta
searchstringParte do nome, e-mail, região ou código interno, sem diferenciar maiúsculas.
is_activebooleantrue só ativos, false só inativos. Qualquer outro texto conta como false.statestringSigla de estado (
SP). Só representantes que atendem esse estado em states.owner_vendor_iduuidSó os representantes da equipe de campo desse seller.
internal_codestringCódigo interno exato, sem diferenciar maiúsculas.
modestringsellermarketplaceseller só os que têm owner_vendor_id; marketplace só os que não têm.pageintegerpadrão: 1Página, a partir de 1.
per_pageintegerpadrão: 20Itens por página, de 1 a 100. Fora disso volta a 20.
Resposta
200Representantes
json
{
"reps": [
{
"id": 2,
"user_id": "fb345fc1-599a-4b4d-9fb0-93d1e7196cc0",
"name": "João da Silva",
"email": "joao.silva@example.com",
"phone": "(11)99321-4444",
"region": "Grande São Paulo",
"states": ["SP", "RJ", "MG"],
"is_active": true,
"commission_rate": 500,
"total_sales": 0,
"total_commission": 0,
"notes": "",
"regional_code": "",
"internal_code": "REP-001",
"hierarchy_level": 0,
"discount_limit_bp": 200,
"credit_balance": 0,
"created_at": "2026-05-17T04:55:18Z",
"updated_at": "2026-07-15T01:07:07Z"
}
],
"total": 1,
"page": 1,
"per_page": 20,
"total_pages": 1
}Campos da resposta
repsarrayRepresentantes da página. Vem
[] quando não há nenhum.reps[].idintegerId do representante (inteiro, não UUID).
reps[].user_iduuidUsuário de login vinculado. Vazio quando o representante não tem login.
reps[].namestringNome.
reps[].emailstringE-mail, normalizado (minúsculas, sem espaços).
reps[].phonestringTelefone, texto livre.
reps[].regionstringTerritório comercial, texto livre.
reps[].regional_codestringRegional de distribuição (faseamento), código da loja. Coisa diferente de
region. Vazio se não atribuído.reps[].statesarraySiglas de estado atendidas.
reps[].is_activebooleanSe o representante está ativo.
reps[].commission_rateintegerComissão do representante em pontos-base (
500 = 5%). 0 usa a regra do seller.reps[].total_salesintegerVendas acumuladas, em centavos.
reps[].total_commissionintegerComissão acumulada, em centavos.
reps[].owner_vendor_iduuidSeller dono da equipe de campo. Ausente no modo marketplace.
reps[].internal_codestringCódigo do representante no sistema da loja (por exemplo, o do ERP). Ausente se não definido.
reps[].hierarchy_levelinteger012340 representante de campo; 1 a 4 níveis de aprovação de desconto.
reps[].discount_limit_bpintegerDesconto máximo que ele concede sozinho, em pontos-base.
reps[].credit_balanceintegerSaldo da conta-corrente, em centavos (pode ser negativo).
reps[].deactivated_atstringQuando o próprio representante excluiu a conta pelo app. Ausente se ativo.
reps[].email_invalid_atstringMarcado quando o e-mail antigo era inválido. Apagado ao corrigir o e-mail.
totalintegerTotal que casa com o filtro, em todas as páginas.
pageintegerPágina devolvida.
per_pageintegerItens por página aplicados.
total_pagesintegerNúmero de páginas.
Criar um representante
Cria o representante e o login dele. A plataforma procura uma conta de seller com o e-mail: se existe, reaproveita (e troca a senha, se você mandou password); se não existe, cria com a senha informada. Se o e-mail pertence a cliente ou administrador, a criação é recusada. No modo do seller (owner_vendor_id), o usuário também entra na equipe daquele seller como gerente.
/api/v1/admin/trade-repsAdminCadastra um representante comercial
Corpo da requisição
namestringobrigatórioNome completo. Dividido em nome e sobrenome no login.
emailstringobrigatórioE-mail válido. Vira o login do representante.
passwordstringSenha do login. Obrigatória quando ainda não existe usuário seller com esse e-mail. Senha fraca devolve
password_too_weak.user_iduuidVincular a um usuário seller que já existe, em vez de procurar pelo e-mail. Esse usuário precisa ter senha ou você manda
password.phonestringTelefone.
regionstringTerritório comercial, texto livre.
regional_codestringRegional de distribuição. Se a loja já cadastrou regionais, o código precisa existir.
statesarraySiglas de estado. Padrão
[].commission_rateintegerpadrão: 0Comissão em pontos-base.
notesstringObservações internas.
owner_vendor_iduuidSeller dono. Preencha para o modo do seller; deixe vazio para o modo marketplace.
internal_codestringCódigo interno (ERP).
hierarchy_levelintegerpadrão: 001234Nível hierárquico.
discount_limit_bpintegerpadrão: 0Alçada própria de desconto, em pontos-base.
destination_idsarrayIds de destinos de venda (lista de strings). Padrão
[].usergroup_idsarrayIds de grupos de privilégio do tipo seller a conceder ao login.
Exemplo de requisição
bash
curl -X POST "$BASE_URL/api/v1/admin/trade-reps" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Maria Souza","email":"maria.souza@example.com","password":"Senha-Forte-2026","owner_vendor_id":"94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36","internal_code":"REP-014","states":["SP"],"commission_rate":300,"discount_limit_bp":200}'201Representante criado
json
{
"id": 31,
"user_id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"name": "Maria Souza",
"email": "maria.souza@example.com",
"phone": "",
"region": "",
"states": ["SP"],
"is_active": true,
"commission_rate": 300,
"total_sales": 0,
"total_commission": 0,
"notes": "",
"regional_code": "",
"owner_vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"internal_code": "REP-014",
"hierarchy_level": 0,
"discount_limit_bp": 200,
"credit_balance": 0,
"created_at": "2026-10-11T21:50:00Z",
"updated_at": "2026-10-11T21:50:00Z"
}Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Sem name ou sem email. | {"error":"name is required"} |
| 400 | E-mail com formato inválido. | {"error":"traderep_email_invalid","detail":"traderep_email_invalid: mail: missing '@' or angle-addr"} |
| 400 | Não existe login para o e-mail e faltou password. | {"error":"password_required","detail":"password_required"} |
| 400 | Senha fraca. | {"error":"password_too_weak","detail":"..."} |
| 400 | user_id não existe, ou usergroup_ids com grupo inválido. | {"error":"user_not_found","detail":"user_not_found"} |
| 409 | O e-mail (ou o user_id) pertence a conta que não é de seller. | {"error":"email_in_use","detail":"email_in_use: email belongs to a non-vendor account"} |
| 503 | Serviço de contas indisponível e foi enviada password. | {"error":"accounts_unavailable","detail":"accounts_unavailable"} |
| 401 / 403 | Sem token, módulo trade-reps desligado ou sem privilégio. | {"error":"module_disabled","module":"trade-reps"} |