🔐 Documentação de Autenticação de Cliente
📋 Visão Geral
A autenticação de cliente permite que o consumidor final acesse recursos protegidos da loja — como pedidos, endereços, lista de desejos e carteira — por meio de um token JWT.
O fluxo começa com a verificação de existência do cadastro, avança para o login (por e-mail ou documento) e, quando a loja exige autenticação multifator (MFA), inclui uma etapa adicional de confirmação antes de emitir o token definitivo.
🔄 Fluxo de Autenticação
1. Verificar existência do cadastro
Antes de apresentar o formulário de login ou cadastro, utilize POST /customer/login/check para verificar se o cliente já possui registro na loja.
A resposta retorna "exists" ou "not-exists", permitindo ao frontend direcionar o usuário para o fluxo correto sem expor dados do cliente.
2. Realizar o login
Com o cadastro confirmado, autentique o cliente por um dos dois métodos disponíveis:
POST /customer/login/email— login por e-mail e senhaPOST /customer/login/document— login por CPF ou CNPJ e senha- Todos os endpoints de autenticação são públicos — não exigem
Authorizationheader na requisição. - O campo
documentnos endpoints de login aceita CPF e CNPJ com ou sem formatação — caracteres especiais são removidos automaticamente antes da validação. - O
mfaTokené temporário e expira após um curto período. Caso expire, o cliente deve reiniciar o fluxo de login. - O envio de código MFA via
mfa/sendé suportado apenas para as opçõesemail,sms,whatsappeexternal. A opçãoapp(TOTP) não é elegível para esse endpoint. - Quando a loja utiliza MFA com opção
appe a chave ainda não foi persistida para o cliente, o camposecretKeypode ser enviado noPOST /customer/login/mfapara registrá-la durante a confirmação.
Em caso de sucesso sem MFA, a resposta retorna diretamente o token JWT definitivo.
3. Concluir o MFA (quando exigido)
Quando a loja exige autenticação multifator, o login não retorna o token — retorna um mfaToken temporário.
Utilize POST /customer/login/mfa/send para enviar o código ao canal escolhido (e-mail, SMS, WhatsApp ou serviço externo) e POST /customer/login/mfa para confirmar o código e receber o token definitivo.
🪙 Token JWT
O token retornado após o login deve ser enviado no header de todas as requisições que exigem cliente autenticado:
1Authorization: Bearer {token}O token não possui um prazo de expiração fixo por padrão — sua validade depende da configuração da loja.
🛡️ Autenticação Multifator (MFA)
O MFA é ativado por configuração da loja. Quando ativo, o fluxo de login é estendido:
| Etapa | Endpoint | Descrição |
|---|---|---|
| Login inicial | POST /customer/login/email ou /document | Retorna mfaToken em vez do token definitivo |
| Enviar código | POST /customer/login/mfa/send | Dispara o código para o canal escolhido (e-mail, SMS, WhatsApp, externo) |
| Confirmar código | POST /customer/login/mfa | Valida o código e retorna o token definitivo |
app (autenticador TOTP) não passa pelo mfa/send — o código é gerado diretamente pelo aplicativo autenticador.📌 Notas e Considerações
🔎 Verificar Cliente Existente
/customer/login/check
Verifica se um e-mail ou documento já está cadastrado na loja
📋 Descrição
Endpoint responsável por verificar a existência de um cliente na loja a partir de um e-mail ou documento (CPF/CNPJ).
Útil para evitar duplicidade de registros e direcionar corretamente o fluxo do frontend — orientando o usuário para o formulário de login quando o cadastro existe, ou para o de criação quando não existe.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Content-Type | application/json | Tipo de conteúdo |
📦 Parâmetros do Corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
identification | string | ✅ Sim | E-mail ou documento (CPF/CNPJ) para verificação — máximo 255 caracteres |
1{2 "identification": "cliente@exemplo.com"3}💡 Exemplo de Requisição
1curl --request POST \2 --url '{{MAIN_URL}}/customer/login/check' \3 --header 'Content-Type: application/json' \4 --data '{5 "identification": "cliente@exemplo.com"6 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
Cliente existe
1{2 "status": true,3 "data": "exists"4}Cliente não existe
1{2 "status": true,3 "data": "not-exists"4}⚠️ Possíveis Erros
> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.
| Código do Erro | HTTP | Descrição |
|---|---|---|
INVALID_REQUEST_PAYLOAD | 400 | Campo identification obrigatório não informado ou inválido |
🔎 Verificar canais de venda que o cliente possui login
/customer/login/check-sales-channel
Retorna os canais de venda que o cliente possui acesso.
📋 Descrição
Endpoint responsável por retornar os canais de venda que um cliente pode acessar a partir de um e-mail.
Útil para evitar fazer redirects entre lojas ou trocar o canal de venda direcionando para o canal de venda desejado.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Content-Type | application/json | Tipo de conteúdo |
📦 Parâmetros do Corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
identification | string | ✅ Sim | E-mail para verificação — máximo 255 caracteres |
1{2 "identification": "cliente@exemplo.com"3}💡 Exemplo de Requisição
1curl --request POST \2 --url '{{MAIN_URL}}/customer/login/check-sales-channel' \3 --header 'Content-Type: application/json' \4 --data '{5 "identification": "cliente@exemplo.com"6 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
Cliente existe
1{2 "status": true,3 "data": [4 {5 "id": 1,6 "domain": "teste.uappi.store"7 }8 ]9}🔐 Login de Cliente por Documento
/customer/login/document
Autentica um cliente na loja usando documento (CPF/CNPJ) e senha
📋 Descrição
Endpoint responsável por autenticar um cliente na loja por meio de documento (CPF ou CNPJ) e senha.
Em caso de sucesso, retorna um token JWT que deve ser enviado no header Authorization: Bearer {token} em todas as requisições que exigem o cliente autenticado.
Quando a loja exige autenticação multifator (MFA), o login não retorna o token diretamente — retorna um mfaToken temporário que deve ser utilizado para concluir o segundo fator de verificação.
O campo document aceita CPF e CNPJ em qualquer formato, incluindo o formato alfanumérico — caracteres especiais são removidos automaticamente antes da validação.
Se a loja tiver um app de CAPTCHA instalado, ativo, com chave configurada e com esta rota habilitada, a requisição precisa incluir o header X-Recaptcha-Token, validado junto ao provedor antes da senha ser verificada; se a validação falhar, o login é bloqueado sem que a senha seja checada (fail-closed). Quando a validação passa, a resposta inclui o header Uappi-Recaptcha: success.
Se qualquer uma dessas condições não for atendida (nenhum app instalado, app inativo, sem chave configurada, ou esta rota não configurada no app), o recaptcha é ignorado — o login segue o fluxo normal, sem nenhuma chamada de recaptcha, e o header X-Recaptcha-Token é ignorado se enviado. Não há nenhum erro nesse caso.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Content-Type | application/json | Tipo de conteúdo |
🏷️ Headers Opcionais
| Header | Valor | Descrição |
|---|---|---|
X-Recaptcha-Token | Token gerado pelo widget do provedor de CAPTCHA no frontend | Só é validado se o app de recaptcha estiver instalado, ativo, configurado e com esta rota habilitada — caso contrário é ignorado (bypass) |
📦 Parâmetros do Corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
document | string | ✅ Sim | CPF ou CNPJ do cliente, incluindo o formato alfanumérico — caracteres especiais removidos automaticamente — máximo 100 caracteres |
password | string | ✅ Sim | Senha do cliente — mínimo 8, máximo 64 caracteres |
12345678901, 123.456.789-01, 123 456 789 01Formatos aceitos para CNPJ: 12345678000190, 12.345.678/0001-90, 12 345 678 0001 90
CNPJ também aceita o formato alfanumérico da Receita Federal (letras nas 12 primeiras posições, dígitos verificadores sempre numéricos), por exemplo: 12ABC34501DE35, 12.ABC.345/01DE-35. O documento é normalizado automaticamente para maiúsculas antes da validação — entrada em minúsculas ou case misto é aceita normalmente.
1{2 "document": "123.456.789-01",3 "password": "minhasenha123"4}💡 Exemplo de Requisição
1curl --request POST \2 --url '{{MAIN_URL}}/customer/login/document' \3 --header 'Content-Type: application/json' \4 --header 'X-Recaptcha-Token: 03AGdBq27...' \5 --data '{6 "document": "123.456.789-01",7 "password": "minhasenha123"8 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
Quando o recaptcha foi validado com sucesso, a resposta inclui o header Uappi-Recaptcha: success. Se o recaptcha foi ignorado (nenhum app pronto para esta rota), o header não é enviado.
1{2 "status": true,3 "data": {4 "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."5 }6}Resposta quando MFA é obrigatório
Quando o servidor exige autenticação multifator, o token não é retornado — em vez disso, é retornado um mfaToken temporário para prosseguir com a validação.
1{2 "status": true,3 "data": {4 "mfaToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."5 }6}⚠️ Possíveis Erros
> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.
| Código do Erro | HTTP | Descrição |
|---|---|---|
UAPPI_STORE_INVALID_LOGIN | 401 | Credenciais inválidas — documento ou senha incorretos |
UAPPI_STORE_CUSTOMER_AUTH_NOT_FOUND | 401 | Cliente sem senha configurada — o cliente existe mas não possui senha (comum em clientes importados); um e-mail de recuperação de senha é disparado automaticamente |
UAPPI_AUTH_DISABLED | 403 | Recurso desativado — autenticação desabilitada para este canal |
UAPPI_AUTH_NOT_FOUND | 404 | Recurso não encontrado |
UAPPI_APP_RECAPTCHA_TOKEN_MISSING | 400 | Token ausente — o app de recaptcha está pronto para esta rota, mas o header X-Recaptcha-Token não foi enviado ou está vazio |
UAPPI_APP_RECAPTCHA_TOKEN_INVALID | 400 | Token inválido — o provedor rejeitou o token |
UAPPI_APP_RECAPTCHA_TOKEN_EXPIRED_OR_DUPLICATED | 400 | Token expirado ou já utilizado — o provedor identificou o token como timeout-or-duplicate |
UAPPI_APP_RECAPTCHA_SCORE_TOO_LOW | 400 | Score abaixo do mínimo — reCAPTCHA v3, score retornado pelo provedor menor que o threshold configurado para esta rota |
UAPPI_APP_RECAPTCHA_ACTION_MISMATCH | 400 | Action divergente — reCAPTCHA v3, o action retornado pelo provedor não corresponde a esta rota |
UAPPI_APP_RECAPTCHA_FAIL | 400 | Falha de infraestrutura na validação — erro ou timeout (5s) na comunicação com o provedor, fail-closed |
🔐 Login de Cliente por Email
/customer/login/email
Autentica um cliente na loja usando e-mail e senha
📋 Descrição
Endpoint responsável por autenticar um cliente na loja por meio de e-mail e senha.
Em caso de sucesso, retorna um token JWT que deve ser enviado no header Authorization: Bearer {token} em todas as requisições que exigem o cliente autenticado.
Quando a loja exige autenticação multifator (MFA), o login não retorna o token diretamente — retorna um mfaToken temporário que deve ser utilizado para concluir o segundo fator de verificação.
Se a loja tiver um app de CAPTCHA instalado, ativo, com chave configurada e com esta rota habilitada, a requisição precisa incluir o header X-Recaptcha-Token, validado junto ao provedor antes da senha ser verificada; se a validação falhar, o login é bloqueado sem que a senha seja checada (fail-closed). Quando a validação passa, a resposta inclui o header Uappi-Recaptcha: success.
Se qualquer uma dessas condições não for atendida (nenhum app instalado, app inativo, sem chave configurada, ou esta rota não configurada no app), o recaptcha é ignorado — o login segue o fluxo normal, sem nenhuma chamada de recaptcha, e o header X-Recaptcha-Token é ignorado se enviado. Não há nenhum erro nesse caso.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Content-Type | application/json | Tipo de conteúdo |
🏷️ Headers Opcionais
| Header | Valor | Descrição |
|---|---|---|
X-Recaptcha-Token | Token gerado pelo widget do provedor de CAPTCHA no frontend | Só é validado se o app de recaptcha estiver instalado, ativo, configurado e com esta rota habilitada — caso contrário é ignorado (bypass) |
📦 Parâmetros do Corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
email | string | ✅ Sim | E-mail do cliente — máximo 255 caracteres |
password | string | ✅ Sim | Senha do cliente — mínimo 8, máximo 64 caracteres |
1{2 "email": "cliente@exemplo.com",3 "password": "minhasenha123"4}💡 Exemplo de Requisição
1curl --request POST \2 --url '{{MAIN_URL}}/customer/login/email' \3 --header 'Content-Type: application/json' \4 --header 'X-Recaptcha-Token: 03AGdBq27...' \5 --data '{6 "email": "cliente@exemplo.com",7 "password": "minhasenha123"8 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
Quando o recaptcha foi validado com sucesso, a resposta inclui o header Uappi-Recaptcha: success. Se o recaptcha foi ignorado (nenhum app pronto para esta rota), o header não é enviado.
1{2 "status": true,3 "data": {4 "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."5 }6}Resposta quando MFA é obrigatório
Quando o servidor exige autenticação multifator, o token não é retornado — em vez disso, é retornado um mfaToken temporário para prosseguir com a validação.
1{2 "status": true,3 "data": {4 "mfaToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."5 }6}⚠️ Possíveis Erros
> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.
| Código do Erro | HTTP | Descrição |
|---|---|---|
UAPPI_STORE_INVALID_LOGIN | 401 | Credenciais inválidas — e-mail ou senha incorretos |
UAPPI_STORE_CUSTOMER_AUTH_NOT_FOUND | 401 | Cliente sem senha configurada — o cliente existe mas não possui senha (comum em clientes importados); um e-mail de recuperação de senha é disparado automaticamente |
UAPPI_AUTH_DISABLED | 403 | Recurso desativado — autenticação desabilitada para este canal |
UAPPI_AUTH_NOT_FOUND | 404 | Recurso não encontrado |
UAPPI_APP_RECAPTCHA_TOKEN_MISSING | 400 | Token ausente — o app de recaptcha está pronto para esta rota, mas o header X-Recaptcha-Token não foi enviado ou está vazio |
UAPPI_APP_RECAPTCHA_TOKEN_INVALID | 400 | Token inválido — o provedor rejeitou o token |
UAPPI_APP_RECAPTCHA_TOKEN_EXPIRED_OR_DUPLICATED | 400 | Token expirado ou já utilizado — o provedor identificou o token como timeout-or-duplicate |
UAPPI_APP_RECAPTCHA_SCORE_TOO_LOW | 400 | Score abaixo do mínimo — reCAPTCHA v3, score retornado pelo provedor menor que o threshold configurado para esta rota |
UAPPI_APP_RECAPTCHA_ACTION_MISMATCH | 400 | Action divergente — reCAPTCHA v3, o action retornado pelo provedor não corresponde a esta rota |
UAPPI_APP_RECAPTCHA_FAIL | 400 | Falha de infraestrutura na validação — erro ou timeout (5s) na comunicação com o provedor, fail-closed |
🔐 Confirmação de Login MFA de Cliente
/customer/login/mfa
Conclui o login MFA de cliente
📋 Descrição
Endpoint responsável por concluir o login quando a loja exige autenticação multifator — recebe o mfaToken retornado no login inicial, a opção MFA selecionada e o código de verificação, e retorna o token JWT definitivo.
Para a opção app (TOTP), o campo secretKey pode ser enviado quando a chave MFA ainda não foi persistida para o cliente — o sistema registra a chave durante a confirmação.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Content-Type | application/json | Tipo de conteúdo |
📦 Parâmetros do Corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
mfaToken | string | ✅ Sim | Token MFA temporário retornado no login inicial |
mfaOptionId | integer | ✅ Sim | ID da opção MFA selecionada pelo cliente |
code | string | ✅ Sim | Código MFA de 6 dígitos |
secretKey | string | ❌ Não | Chave TOTP — usado apenas na opção app quando a chave ainda não foi registrada |
💡 Exemplo de Requisição
1curl --request POST \2 --url '{{MAIN_URL}}/customer/login/mfa' \3 --header 'Content-Type: application/json' \4 --data '{5 "mfaToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJI...",6 "mfaOptionId": 1,7 "code": "123456",8 "secretKey": "JBSWY3DPEHPK3PXP"9 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": {4 "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJI..."5 }6}⚠️ Possíveis Erros
> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.
| Código do Erro | HTTP | Descrição |
|---|---|---|
INVALID_REQUEST_PAYLOAD | 400 | Payload inválido — campos obrigatórios ausentes ou com formato incorreto |
UAPPI_STORE_CUSTOMER_MFA_CODE_INVALID | 400 | Código MFA inválido |
UAPPI_STORE_CUSTOMER_MFA_CODE_EXPIRED | 400 | Código MFA expirado |
UAPPI_STORE_CUSTOMER_MFA_CODE_ATTEMPTS_EXCEEDED | 400 | Limite de tentativas de validação do código excedido |
UAPPI_STORE_CUSTOMER_MFA_NO_VALID_OPTION | 400 | Opção MFA inválida para o contexto atual |
INVALID_MFA_TOKEN | 401 | Token MFA inválido |
EXPIRED_MFA_TOKEN | 403 | Token MFA expirado — reinicie o fluxo de login |
UAPPI_STORE_CUSTOMER_NOT_FOUND | 404 | Cliente não encontrado |
📨 Envio de Desafio MFA no Login de Cliente
/customer/login/mfa/send
Envia desafio MFA para login de cliente
📋 Descrição
Endpoint responsável por enviar um novo código MFA para uma opção notificável elegível no fluxo de login.
Tipos aceitos para envio: email, sms, whatsapp e external. A opção app (TOTP) não é elegível — o código é gerado diretamente pelo aplicativo autenticador, sem necessidade de envio.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Content-Type | application/json | Tipo de conteúdo |
📦 Parâmetros do Corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
mfaToken | string | ✅ Sim | Token MFA temporário retornado no login inicial |
mfaOptionId | integer | ✅ Sim | ID da opção MFA notificável — email, sms, whatsapp ou external |
💡 Exemplo de Requisição
1curl --request POST \2 --url '{{MAIN_URL}}/customer/login/mfa/send' \3 --header 'Content-Type: application/json' \4 --data '{5 "mfaToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJI...",6 "mfaOptionId": 27 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": true4}⚠️ Possíveis Erros
> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.
| Código do Erro | HTTP | Descrição |
|---|---|---|
INVALID_REQUEST_PAYLOAD | 400 | Payload inválido — campos obrigatórios ausentes ou com formato incorreto |
UAPPI_STORE_CUSTOMER_MFA_NO_VALID_OPTION | 400 | Opção MFA inválida ou não elegível para envio |
INVALID_MFA_TOKEN | 401 | Token MFA inválido |
EXPIRED_MFA_TOKEN | 403 | Token MFA expirado — reinicie o fluxo de login |
UAPPI_STORE_CUSTOMER_NOT_FOUND | 404 | Cliente não encontrado |
UAPPI_STORE_CUSTOMER_MFA_EXTERNAL_OPTION_CONNECTION_ERROR | 502 | Falha de conexão ao serviço externo da opção MFA |
UAPPI_STORE_CUSTOMER_MFA_EXTERNAL_OPTION_CLIENT_ERROR | 502 | Serviço externo retornou erro de cliente |
UAPPI_STORE_CUSTOMER_MFA_EXTERNAL_OPTION_SERVER_ERROR | 502 | Serviço externo retornou erro de servidor |
UAPPI_STORE_CUSTOMER_MFA_EXTERNAL_OPTION_UNKNOWN_ERROR | 502 | Falha desconhecida ao acionar serviço externo |
UAPPI_STORE_CUSTOMER_MFA_EXTERNAL_OPTION_TIMEOUT_ERROR | 502 | Timeout ao acionar serviço externo |