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
- cURL
- Node.js
- Python
Resposta (201)
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:
refresh_token novo que veio na resposta: reapresentar o
antigo devolve 401.
Para encerrar a sessão:
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:
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
- Acesse o Dashboard → app.engineapi.com.br
- Vá em Configurações → API Keys
- 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) - Copie e guarde. Ela é exibida uma única vez
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.- cURL
- Node.js / SDK
- Python
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 responde400(“informe issuerId: sua conta tem N emissores”) em vez de emitir pelo CNPJ errado; - um
issuerIdque não pertence ao partner autenticado responde404(isolamento entre tenants).
- NFS-e:
issuerIdé obrigatório no corpo da requisiçã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úblicaPOST /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.