Pular para o conteúdo principal

Authentication

O Levfone Connect usa duas camadas de autenticação, com propósitos distintos. Confundi-las é a causa mais frequente de erro 401 na integração inicial.

CamadaEndpointO que autenticaValidade
SistemaPOST /oauth/tokenA aplicação1 hora
VendedorPOST /sellers/sessionO funcionário e sua lojaDefinida pelo PDV Parceiro

Camada 1 — Autenticação de sistema

OAuth 2.0 client_credentials, conforme RFC 6749 §4.4. Autentica a aplicação, não a pessoa.

curl -X POST https://api.sandbox.levfone.com/v1/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=$CLIENT_ID" \
-d "client_secret=$CLIENT_SECRET" \
-d "scope=sales:authorize"

Escopos

EscopoAPIPermite
catalog:readPartner PDVPlanos, produtos e serviços
inventory:readPartner PDVConsulta de IMEI
sales:readPartner PDVStatus de venda
sales:authorizeSales AuthorizationAutorizar, confirmar e cancelar

Solicite apenas os escopos que você usa. Escopo excedente é achado de auditoria.

Renovação

Renove o token antes de expires_in, com margem de pelo menos 60 segundos. Não renove a cada chamada: isso multiplica o custo por nada e derruba você no rate limit de emissão.

Camada 2 — Sessão do vendedor

Identifica o funcionário e retorna o contexto de loja. Implementada pelo PDV Parceiro, consumida pela Levfone.

curl -X POST https://{host}/v1/sellers/session \
-H "Authorization: Bearer $SYSTEM_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Request-Id: $(uuidgen)" \
-H "X-Correlation-Id: $(uuidgen)" \
-d '{ "username": "vendedor.1234", "password": "..." }'
{
"success": true,
"message": "",
"timestamp": "2026-07-23T14:10:02.118Z",
"data": {
"sellerId": "SL-8891",
"sellerName": "Vendedor Exemplo",
"taxId": "12345678909",
"storeId": "ST-0042",
"storeName": "Loja Exemplo",
"storeCnpj": "12345678000199",
"storeAddress": {
"street": "Av. Paulista, 1000, Sala 12",
"city": "São Paulo",
"state": "SP",
"zipCode": "01310100"
},
"role": "SELLER",
"accessToken": "sess_...",
"expiresAt": "2026-07-23T22:10:02.118Z"
},
"error": null
}

O storeId é obrigatório em todas as chamadas seguintes de catálogo, estoque e vendas. Chamada sem ele retorna store_context_required.

O taxId (CPF do vendedor, sem máscara) é o que a Levfone usa para vincular a sessão ao cadastro interno do vendedor — o PDV Parceiro precisa ter esse dado disponível para retorná-lo.

storeCnpj e storeAddress (logradouro, cidade, UF, CEP — todos obrigatórios) identificam a loja para fins de cadastro e contrato do lado da Levfone. O PDV Parceiro precisa ter esses dados de cadastro da loja disponíveis para devolvê-los nesta mesma resposta.

Tratamento da credencial

Nesta versão a credencial do vendedor trafega pela Levfone. Isso é uma decisão consciente e temporária, com restrições contratuais:

  • A senha é writeOnly. Nunca é persistida pela Levfone, em nenhum meio.
  • Nunca é registrada em log, nem em log de depuração, nem em APM.
  • É descartada imediatamente após o encaminhamento.
  • TLS 1.2 ou superior é obrigatório. mTLS é recomendado.
Caminho para a v2

A v2 substitui o encaminhamento de credencial por OIDC Authorization Code + PKCE hospedado pelo PDV Parceiro: o vendedor autentica em tela do próprio PDV e a senha nunca passa pela Levfone. Parceiros que já suportam OIDC podem adotar o fluxo antecipadamente — fale com o time de integração.

Headers obrigatórios

Authorization: Bearer <token>
Content-Type: application/json
Accept: application/json
X-Request-Id: <uuid-v4>
X-Correlation-Id: <uuid-v4>
Idempotency-Key: <uuid-v4>
HeaderQuandoPapel
X-Request-IdToda chamadaIdentifica uma requisição. Novo a cada retry.
X-Correlation-IdToda chamadaIdentifica uma jornada de venda inteira. O mesmo do início ao fim.
Idempotency-KeyPOST de escritaImpede execução dupla. Retenção de 24 horas.

A distinção entre os dois primeiros importa no suporte: com o X-Correlation-Id reconstruímos a jornada completa do cliente em segundos. Sem ele, cada chamada é um evento isolado e a investigação leva horas.

Erros de autenticação

CódigoHTTPCausa provável
missing_token401Header Authorization ausente
invalid_token401Token malformado ou assinatura inválida
expired_token401Renove antes de expires_in
insufficient_scope403Token válido, escopo insuficiente
invalid_client401Credencial de outro ambiente
store_context_required400storeId ausente

Catálogo completo em Errors.