Skip to main content
A engineAPI suporta dois métodos de autenticação. Como cada credencial chega até a chamada:

API Key

Para automações, SDKs e integrações server-to-server: o caso comum de software house. Gerada no cadastro ou no Dashboard, nunca expira (até ser revogada).

JWT (Bearer Token)

Para o dashboard e sessões de usuário. Obtenha via POST /v1/auth/login e use no header Authorization.
POST /v1/auth/resend-verification e GET /v1/auth/verification-status mexem só na conta do JWT, inclusive quando o login ainda não tem parceiro vinculado (por exemplo, operador da plataforma no painel admin).
Cadastro pelo site (POST /v1/auth/register) cria a conta na hora e responde 202: pedido de acesso já aprovado, partner no plano Dev (R$ 0), convite de dono por e-mail e assinatura ativa, tudo na mesma transação, e a senha é criada no aceite do convite. E-mail já em uso devolve a mesma resposta sem criar nada; o teto é de 3 contas por IP a cada 24 h e e-mail descartável recusa com 422. Os limites por IP se aplicam também a e-mails já usados. Ver Quickstart para o passo a passo. Quem libera um pedido pelo admin, inclusive SUPERADMIN, recebe só o prefixo e um aviso, sem a chave de API nem o link de aceite. O convite chega por e-mail ao dono, que gera a chave no próprio painel depois de aceitá-lo. POST /v1/auth/register-partner continua existindo para provisionamento manual por um parceiro com papel SUPERADMIN.

Método 1: JWT (Bearer Token)

Use quando seu backend/dashboard faz login com e-mail e senha.

Obtendo o token

Resposta (201)
A resposta é 201 Created, não 200 OK (versões anteriores desta doc afirmavam 200). Trate qualquer resposta 2xx como sucesso, em vez de checar um código exato.
Toda resposta de sucesso vem envelopada em { data, meta }: meta.requestId/meta.timestamp são preenchidos automaticamente pelo interceptor global. Isso vale para todas as respostas desta documentação, não só o login.

Usando o token

Expiração e renovação

O login devolve access_token e refresh_token. Quando o access token expira, troque-o por um par novo:
A rotação é obrigatória: o refresh token usado morre na mesma chamada. Guarde sempre o refresh_token novo que veio na resposta: reapresentar o antigo devolve 401. Para encerrar a sessão:
O logout invalida o access token na hora: ele não continua valendo até expirar. Trocar a senha também derruba todas as sessões abertas.
Nunca exponha seu token no frontend, em logs ou em repositórios públicos. Use variáveis de ambiente.

Verificação em duas etapas (2FA)

Contas com acesso privilegiado (superadmin da plataforma e dono de parceiro, PartnerMember.role = OWNER) são obrigadas a usar um aplicativo autenticador (TOTP, RFC 6238). Para as demais é opcional, ligável em Configurações → Segurança. Quando a conta tem 2FA ativo, o POST /v1/auth/login responde sem access_token:
Conclua com o código de 6 dígitos do autenticador:
Clientes que preferem uma chamada só podem mandar o código junto no login (totpCode no corpo do POST /v1/auth/login). Os dois formatos de resposta do login (sessão completa ou 2FA pendente) são as alternativas do 200 declaradas no contrato OpenAPI. Perdeu o celular? Envie um dos códigos de recuperação em recoveryCode no lugar de totpCode. Cada código funciona uma única vez, e o titular (mais o dono da plataforma) recebe um e-mail avisando que um deles foi usado.

Bloqueio por tentativas de login

Tentativas falhas bloqueiam progressivamente, por e-mail e por IP: 5 falhas → 1 minuto, 10 → 15 minutos, 15 → 1 hora, 20 → 4 horas. Um balde sem falha nova por 1 hora zera sozinho, e um login bem-sucedido limpa o balde do e-mail. Enquanto o bloqueio vale, a senha certa também é recusada. A resposta é sempre a mesma (401 Credenciais inválidas) para senha errada, e-mail inexistente, código 2FA errado e conta bloqueada: a API não confirma quais e-mails existem.

Método 2: API Key

Use em automações de longa duração, SDKs ou integrações server-to-server sem sessão de login.

Gerando uma API Key

  1. Acesse o Dashboard → app.engineapi.com.br
  2. Vá em Configurações → API Keys
  3. Gere a key de teste (ek_test_), disponível sem assinatura paga, ou a key de produção (ek_live_), que exige uma subscription ACTIVE (403 sem plano pago)
  4. Copie e guarde. Ela é exibida uma única vez
A conta criada pelo site ou aprovada pelo admin nasce sem chave. A de teste e a de produção são geradas no painel; a de produção exige plano pago ativo. Via API (sessão JWT do dashboard):

Usando a API Key

/v1/companies aceita x-api-key ou JWT (ApiKeyGuard, mesmo escopo de partner nos dois casos); este exemplo funciona de ponta a ponta.
A ek_test_ só opera emissores em homologação (ambienteFiscal=2) ou marcados como sandbox. Usá-la contra um emissor de produção retorna 403. Emissões com ek_test_ não são faturadas.

Multi-tenancy

Um único token (JWT) ou API Key gerencia múltiplos CNPJs emissores (Issuer) sob o mesmo Partner:
Seleção explícita de emissor: NF-e, NFC-e e NFS-e aceitam issuerId (UUID) no corpo da emissão para escolher qual CNPJ emite a nota.
  • NF-e / NFC-e: issuerId é opcional:
    • se você tem um único emissor, pode omitir: a API usa o seu emissor (retrocompatível);
    • se você tem dois ou mais emissores, informe issuerId; sem ele a API responde 400 (“informe issuerId: sua conta tem N emissores”) em vez de emitir pelo CNPJ errado;
    • um issuerId que não pertence ao partner autenticado responde 404 (isolamento entre tenants).
  • NFS-e: issuerId é obrigatório no corpo da requisição.
O issuerId (UUID) é retornado ao criar uma empresa via POST /v1/companies.

Reenviar convite de dono

Se o convite não chegar ou tiver expirado, use Não recebeu o convite? no sucesso do cadastro ou na tela do convite. Informe o e-mail do cadastro para receber outro link, válido por sete dias. O novo link substitui os anteriores. A API pública POST /auth/invite/resend recebe { "email": "dono@example.com" } e responde 202 com mensagem neutra, inclusive para e-mail inexistente ou conta já ativa. Só reenvia convites de dono ainda não aceitos. O quarto pedido em uma hora por e-mail ou o sexto em um minuto por IP responde 429. O e-mail é normalizado antes da contagem; o token nunca aparece na resposta ou nos logs.