Clientes
Como funcionam clientes e usuários na Venddor, os tipos de usuário, pessoa física e jurídica, o status da conta e o mapa de todas as rotas.
Um usuário é qualquer pessoa com login na loja: o cliente que compra, o administrador que opera o painel da loja e o usuário de seller (lojista) que opera o painel de um vendedor do marketplace. Todos moram na mesma tabela e na mesma API. O que muda é o user_type. Esta seção cobre o dia a dia de um cliente: cadastrar, consultar, corrigir, endereçar, ativar, desativar, definir formas de pagamento e ligar a um grupo.
Todas as rotas desta seção ficam em /api/v1/admin/users...: a API de administração, com UUIDs, datas RFC 3339, PF/PJ explícito, histórico de troca de tipo e operações em lote.
Como funciona
Os três tipos de usuário
user_type | Quem é | Como ganha acesso |
|---|---|---|
customer | Comprador da vitrine. Pode ser PF ou PJ. | Pelo cadastro na loja ou criado por API. Não tem privilégios de painel. |
vendor | Administrador de um seller (lojista). | Vínculo com o seller (dono ou equipe) e privilégios de seller. |
admin | Administrador da loja. | Pertence a grupos do tipo administrador, cujos privilégios definem o que ele pode fazer. |
Existe ainda o tipo root_admin (dono da plataforma), aceito em PUT mas que você não deve usar em integrações.
O ciclo de vida da conta
| Letra | Palavra aceita na entrada | Significado |
|---|---|---|
A | active | Conta ativa, pode entrar e comprar. É o padrão ao criar. |
P | pending | Aguardando aprovação (cadastros que a loja revisa antes de liberar). Não entra até ser aprovada. |
D | disabled, inactive, deleted | Desativada. Também é a letra de um usuário excluído. |
Mudar o status de um usuário derruba as sessões abertas dele na hora: o token em uso deixa de valer. Aprovar e recusar têm rotas próprias (Alterar cliente). As respostas sempre devolvem a letra. Palavras longas só são aceitas na entrada.
Pessoa física e pessoa jurídica
PF (person_type: "F") | PJ (person_type: "J") | |
|---|---|---|
| Documento | CPF, 11 dígitos, no campo cpf. | CNPJ, 14 caracteres, no campo cnpj. |
| Nome | first_name e last_name são o nome da pessoa. | legal_name é a razão social; trade_name é o nome fantasia (opcional). first_name repete a razão social inteira e last_name fica vazio. |
| Quem opera a conta | A própria pessoa. | O responsável, guardado nos campos de perfil responsible_name e responsible_cpf. |
| Inscrição estadual | Não se aplica. | state_reg (opcional). |
Essa é a forma canônica de PJ. Ela existe para que leitores antigos de first_name (nota fiscal, e-mails e integrações antigas) continuem vendo o nome inteiro da empresa. Você não precisa montar o espelho: ao criar ou editar uma PJ, a plataforma copia a razão social para first_name e zera last_name. Se você mandar só first_name e last_name junto de um CNPJ, os dois são juntados numa razão social em vez de a chamada ser recusada.
Regras do documento:
- CPF e CNPJ são validados pelos dígitos verificadores. Máscara é aceita (
123.456.789-09) e removida antes de gravar. O CNPJ aceita o formato alfanumérico da Receita Federal (letras maiúsculas nas 12 primeiras posições). - Um CPF só pode existir em uma conta ativa. Um CNPJ pode repetir em várias contas: elas passam a formar uma conta corporativa, e compradores de uma mesma empresa enxergam os pedidos uns dos outros.
person_typeaceitaF,PF,JePJ. Quem nunca teve o tipo declarado (person_type_declared: false) é classificado pelo documento: com CNPJ é PJ, sem CNPJ é PF.- Trocar o tipo de um cliente existente tem prévia e histórico: veja PF e PJ.
Dados do cliente em três lugares
- A conta: e-mail, nome, telefone, documento, idioma, status. É o objeto devolvido por Consultar cliente.
- Os endereços: quantos o cliente quiser, um deles padrão (Endereços).
- Os campos de perfil: campos que cada loja define (por exemplo, "ramo de atividade"). São lidos e gravados à parte (Campos de perfil).
Como um cliente se liga a um seller
O cadastro do cliente é da loja, e a mesma pessoa pode comprar de vários sellers. A ligação com um seller nasce de um destes fatos:
- Comprou do seller. O cliente aparece na lista de clientes do seller assim que existe um pedido dele (a venda de um pedido pai gera sub-pedidos por seller, veja Pedidos).
- Entrou na carteira do seller. O próprio seller cadastra ou importa clientes na carteira dele, mesmo sem pedido, pelo painel do seller.
- Está num grupo liberado ao seller. Grupos de usuários marcados como gerenciáveis pelo seller deixam o seller colocar clientes neles.
Já o usuário do seller (user_type: "vendor") se liga ao seller por vínculo de equipe (dono ou membro), e a listagem aceita o filtro vendor_id para ver os administradores de um seller.
Autenticação
Faça login (POST /api/v1/auth/login) e use access_token como Bearer. O login tem limite de requisições (429): guarde o token. Cada rota exige um privilégio:
| Privilégio | Para quê |
|---|---|
view_users ou manage_users | Ler (listar, consultar, endereços, sessões, estatísticas, regras de pagamento). |
manage_users | Escrever (criar, editar, excluir, status, endereços, lote, grupos). |
manage_user_passwords | Trocar a senha de outro usuário e disparar o e-mail de redefinição. Não vem junto com manage_users. |
manage_profile_fields | Gravar campos de perfil de um usuário. |
manage_usergroups | Grupos de usuários e seus privilégios. |
Ids, datas e dinheiro
- Todo id é um UUID em string.
- As datas vêm em RFC 3339 (UTC). Junto delas vêm também os campos de apelido
user_id,firstname,lastname,tax_idetimestamp(cadastro em Unix, em segundos). - Dinheiro é sempre inteiro em centavos (
total_spend_centavos). - Telefones gravados na conta são normalizados para o formato internacional (
11 3333-4444vira+551133334444). O telefone de um endereço é gravado como veio.
Endpoints
Auth: Admin é o administrador, com Authorization: Bearer <JWT> e o privilégio de cada rota.
| Método | Rota | O que faz | Auth | Página |
|---|---|---|---|---|
| GET | /api/v1/admin/users | Lista usuários com filtros | Admin | Listar clientes |
| POST | /api/v1/admin/users/search | Busca avançada | Admin | Listar clientes |
| GET | /api/v1/admin/users/person-type-presence | Há clientes PF e PJ? | Admin | Listar clientes |
| GET | /api/v1/admin/users/stats/summary | Totais de usuários | Admin | Listar clientes |
| GET | /api/v1/admin/users/{id} | Consulta um usuário | Admin | Consultar cliente |
| GET | /api/v1/admin/users/{id}/stats | Estatísticas de compra | Admin | Consultar cliente |
| POST | /api/v1/admin/users | Cria usuário | Admin | Criar cliente |
| PUT | /api/v1/admin/users/{id} | Altera usuário | Admin | Alterar cliente |
| PATCH | /api/v1/admin/users/{id}/status | Muda o status | Admin | Alterar cliente |
| PUT | /api/v1/admin/users/{id}/approve | Aprova cadastro pendente | Admin | Alterar cliente |
| PUT | /api/v1/admin/users/{id}/reject | Recusa cadastro pendente | Admin | Alterar cliente |
| DELETE | /api/v1/admin/users/{id} | Exclui usuário | Admin | Excluir cliente |
| POST | /api/v1/admin/users/bulk | Ativa ou desativa em lote | Admin | Ações em lote |
| POST | /api/v1/admin/users/{id}/person-type/preview | Prévia da troca PF/PJ | Admin | PF e PJ |
| GET | /api/v1/admin/users/{id}/person-type/changes | Histórico de trocas | Admin | PF e PJ |
| POST | /api/v1/admin/users/{id}/person-type/changes/{changeId}/undo | Desfaz uma troca | Admin | PF e PJ |
| GET | /api/v1/admin/users/{id}/addresses | Lista endereços | Admin | Endereços |
| POST | /api/v1/admin/users/{id}/addresses | Cria endereço | Admin | Endereços |
| PUT | /api/v1/admin/users/{id}/addresses/{addressId} | Altera endereço | Admin | Endereços |
| DELETE | /api/v1/admin/users/{id}/addresses/{addressId} | Exclui endereço | Admin | Endereços |
| GET, PUT | /api/v1/admin/users/{id}/field-values | Lê e grava campos de perfil | Admin | Campos de perfil |
| POST | /api/v1/admin/users/{id}/set-password | Define a senha de um usuário | Admin | Acesso e senha |
| POST | /api/v1/admin/users/{id}/send-password-reset | Envia o e-mail de redefinição | Admin | Acesso e senha |
| GET, DELETE | /api/v1/admin/users/{id}/sessions | Lista e encerra sessões | Admin | Acesso e senha |
| POST | /api/v1/admin/users/{id}/resend-verification-email | Reenvia a verificação de e-mail | Admin | Acesso e senha |
| POST | /api/v1/admin/users/{id}/mark-email-verified | Marca o e-mail como verificado | Admin | Acesso e senha |
| GET, PUT | /api/v1/admin/users/{id}/payment-methods | Formas de pagamento permitidas ao cliente | Admin | Formas de pagamento do cliente |
| GET | /api/v1/admin/users/{id}/usergroups | Grupos do usuário | Admin | Vínculo com grupos |
| GET | /api/v1/admin/users/{id}/whatsapp-bindings | Números de WhatsApp ligados | Admin | |
| DELETE | /api/v1/admin/users/{id}/whatsapp-bindings/{bindingId} | Solta um número | Admin |
Grupos de usuários e seus privilégios estão em Grupos de usuários.
Erros comuns
- Mandar a senha em
PUT /users/{id}. A atualização não troca senha: a API recusa com 400password_not_updatable. Useset-password(Acesso e senha). - Criar uma PJ só com
first_name. Numa PJ o nome que vale élegal_name. Mandecnpjelegal_namee deixe a plataforma montarfirst_name. - Esperar que um CPF repetido dê 400. Ele volta como 500 com
CPF already registered by another user. Pesquise o CPF antes de criar. - Usar a palavra do status na saída.
status=activefunciona na entrada, mas a saída é sempre a letra (A,D,P). - Achar que excluir apaga o histórico. A exclusão é lógica; pedidos e endereços continuam ligados ao registro. Para apenas impedir o acesso, desative (
D). - Procurar a senha na resposta. A plataforma nunca devolve senha nem hash.