Cadastro de cliente e seller
Cria a conta de um cliente da loja ou a candidatura de um seller (lojista), com os erros por campo.
Existem dois cadastros públicos. register cria um cliente (quem compra na loja) e já devolve um par de tokens, então a pessoa fica logada. vendor-register cria a conta de um seller (lojista) e a ficha da empresa dele; na maioria das lojas a candidatura fica pendente até um administrador aprová-la, e nenhum token é devolvido.
Os dois exigem aceite das regras da loja e validam CPF e CNPJ pelo dígito verificador. O e-mail é único por loja (sem diferenciar maiúsculas).
Cadastrar um cliente
/api/v1/auth/registerPúblicaCadastrar um cliente
A loja decide quais campos de perfil são obrigatórios (telefone, campos personalizados). Se faltar algum, a resposta lista os campos. Quando a loja só aceita empresas, um cadastro de pessoa física volta 403 person_type_not_allowed.
Cabeçalhos
Content-Typestringobrigatórioapplication/json.X-Recaptcha-TokenstringCorpo da requisição
emailstringobrigatóriopasswordstringobrigatóriofirst_namestringobrigatóriolast_namestringterms_acceptedbooleanobrigatóriotrue a resposta é 400 consent_required.privacy_acceptedbooleanobrigatóriomarketing_consentbooleanpadrão: falseperson_typestringFPFJPJcnpj e PF nos demais casos.cpfstringcnpjstringlegal_namestringtrade_namestringphonestringcustom_fieldsobjectnome_do_campo: valor dos campos de perfil personalizados da loja. Os obrigatórios precisam estar aqui.addressobjectPrimeiro endereço salvo do cliente.
address_line1stringaddress_line2stringcomplementstringdistrictstringcitystringstatestringpostal_codestringcountrystringpadrão: BRlabelstringphonestringreferral_codestringaccept_pending_sessionbooleanpadrão: falseExemplo de requisição
curl -X POST "$BASE_URL/api/v1/auth/register" \
-H "Content-Type: application/json" \
-d '{
"email": "maria.souza@example.com",
"password": "MinhaSenha#2026",
"first_name": "Maria",
"last_name": "Souza",
"cpf": "123.456.789-09",
"phone": "11987654321",
"terms_accepted": true,
"privacy_accepted": true,
"address": {
"address_line1": "Avenida Paulista",
"address_line2": "1000",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"postal_code": "01310-100"
}
}'Resposta
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "0b6f0c0c7a1d4e5f8a9b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f",
"expires_at": "2026-10-11T21:10:44Z"
}{
"status": "pending_approval",
"detail": "account_pending_approval"
}O 200 acima acontece quando a loja aprova cadastros manualmente: a conta existe, mas não há token. Se você enviou accept_pending_session: true, a resposta também traz access_token, refresh_token, expires_at e account_status.
Campos da resposta
access_tokenstringrefresh_tokenstringexpires_atstringstatusstringpending_approval200 de aprovação pendente.Erros do cadastro de cliente
| Status | Quando | Corpo |
|---|---|---|
| 400 | Falta email, password ou first_name | {"error":"validation_failed","fields":{"email":"required"}} |
| 400 | Sem aceite de termos/privacidade | {"error":"consent_required","detail":"you must accept the terms of service and privacy policy"} |
| 400 | Senha fraca | {"error":"validation_failed","fields":{"password":"password_too_weak"}} |
| 400 | CPF ou CNPJ inválido | {"error":"validation_failed","fields":{"document":"invalid_cpf","cpf_cnpj":"invalid_cpf"}} |
| 400 | Campo de perfil obrigatório vazio | {"error":"required_field_missing","fields":{"phone":"required"}} |
| 400 | Restrição de CNAE ou consulta de empresa (situação cadastral, inscrição estadual) reprovou | {"error":"cnae_not_accepted","fields":{"cnae":"cnae_not_accepted"}} ou mensagem em português com o motivo em detail |
| 400 | Qualquer outra falha | {"error":"registration_failed"} |
| 403 | Loja só aceita empresas | {"error":"person_type_not_allowed","fields":{"person_type":"person_type_not_allowed"}} |
| 409 | E-mail já cadastrado | {"error":"email_already_registered","fields":{"email":"already_registered"}} |
| 409 | CPF ou CNPJ já cadastrado | {"error":"cpf_already_registered","fields":{"document":"already_registered","cpf":"already_registered"}} (ou cnpj_already_registered) |
| 409 | CNPJ compartilhado por mais de uma conta, ou conta importada que exige código de posse | cnpj_ambiguous, cnpj_ownership_verification_required, cnpj_ownership_verification_failed |
| 429 | Mais de 3 cadastros por minuto do mesmo IP | {"error":"rate limit exceeded",...} |
Os erros de campo vêm no objeto fields. Para ler o código de cada campo, use o valor, não o texto. As mensagens de reprovação de empresa (situação inativa, inscrição estadual irregular, consulta indisponível) saem em português, como retornadas pelo servidor.
Candidatura de seller
/api/v1/auth/vendor-registerPúblicaCandidatar-se como seller (lojista)
Cria, de uma vez, o usuário (tipo seller) e a ficha da empresa. Quando a loja usa pré-moderação, o seller nasce pendente e só consegue entrar depois da aprovação do administrador; a resposta não traz token. Documentos da candidatura são enviados depois, já logado (veja a área do seller). A loja pode desligar este cadastro; nesse caso a resposta é 403 feature_disabled.
Corpo da requisição
emailstringobrigatóriopasswordstringobrigatóriofirst_namestringobrigatóriolast_namestringphonestringcpfstringcompany_namestringobrigatóriocnpjstringobrigatóriocnae_codestringstate_regstringvendor_emailstringvendor_phonestringwebsitestringcitystringstatestringpostal_codestringExemplo de requisição
curl -X POST "$BASE_URL/api/v1/auth/vendor-register" \
-H "Content-Type: application/json" \
-d '{
"email": "contato@lojadojoao.example.com",
"password": "Senha#Forte2026",
"first_name": "João",
"last_name": "Pereira",
"company_name": "Loja do João LTDA",
"cnpj": "11.222.333/0001-81",
"vendor_email": "vendas@lojadojoao.example.com",
"city": "Campinas",
"state": "SP",
"postal_code": "13010-111"
}'Resposta
{
"user": {
"id": "5b0f6a52-3c1e-4d0a-9f1e-6a1f0c2d7e11",
"email": "contato@lojadojoao.example.com",
"first_name": "João",
"last_name": "Pereira",
"user_type": "vendor",
"status": "P"
},
"vendor_id": "9c1e2f4a-7b3d-4a58-8e60-1d2c3b4a5f67"
}Campos da resposta
userobjectid é UUID; user_type é vendor; status é P quando a candidatura aguarda aprovação.vendor_idstringErros da candidatura
| Status | Quando | Corpo |
|---|---|---|
| 400 | Falta email, password, first_name, company_name ou cnpj | {"error":"validation_failed","fields":{"_form":"missing_required_fields"}} |
| 400 | Senha com menos de 8 caracteres | {"error":"validation_failed","fields":{"password":"too_short"}} |
| 400 | CNPJ inválido | {"error":"validation_failed","fields":{"cnpj":"invalid_cnpj"}} |
| 400 | Falha inesperada | {"error":"registration_failed"} |
| 403 | A loja desligou o cadastro de sellers | {"error":"feature_disabled","feature":"vendor_registration"} |
| 409 | E-mail já cadastrado | {"error":"validation_failed","fields":{"email":"already_registered"}} |
| 409 | CPF já cadastrado | {"error":"validation_failed","fields":{"cpf":"already_registered"}} |