engineAPIengineAPI
// guias

Guia: Sandbox

Teste sua integração com a SEFAZ de homologação sem emitir documentos fiscais reais.

Sandbox (Homologação)

A engineAPI se conecta diretamente ao ambiente de homologação da SEFAZ (o mesmo servidor da Fazenda, mas sem validade fiscal). Você testa com a infraestrutura real sem nenhum risco.

Esta é a versão completa (como funciona, como promover um emissor pra produção, self-service). Pra ver só o que muda entre os dois ambientes numa tabela, veja Homologação vs produção.

O endpoint da API é o mesmo para homologação e produção. A diferença está no campo ambienteFiscal do emissor (Issuer), e a troca é self-service, via um endpoint dedicado (PATCH /v1/companies/{id}/ambiente, ver seção "Promovendo um emissor para produção" abaixo).


Todo emissor nasce em homologação

Ao cadastrar uma empresa (POST /v1/companies), o ambienteFiscal do emissor nasce com o valor 2 (homologação) por padrão. O payload de cadastro não tem um campo environment (nem ambienteFiscal) que você possa enviar:

bash
curl -X POST https://api.engineapi.com.br/v1/companies \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "cnpj": "11222333000181",
    "name": "Empresa Teste Ltda"
  }'
Valor de ambienteFiscalAmbienteComportamento
1ProduçãoDocumentos com validade fiscal real
2 (default de todo emissor novo)HomologaçãoTestes com SEFAZ de teste (sem validade fiscal)

ambienteFiscal não é editável via o PATCH /v1/companies/{id} genérico. O campo está deliberadamente fora da lista de campos aceitos nesse endpoint, para que a troca de ambiente nunca aconteça "de carona" num PATCH de cadastro comum. Enviar { "ambienteFiscal": 1 } nesse endpoint é silenciosamente ignorado (200 OK, campo não muda).

A troca de ambiente tem endpoint dedicado e self-service: PATCH /v1/companies/{id}/ambiente. Ver seção "Promovendo um emissor para produção" abaixo.

Notas emitidas em homologação não têm validade fiscal e não precisam ser canceladas. Emita à vontade para testar.


CNPJ para Testes

Você pode usar seu próprio CNPJ em homologação. O SEFAZ de teste aceita qualquer CNPJ válido (com dígitos verificadores corretos).

CNPJs de teste comuns:

CNPJUso
11222333000181Emissor de testes
99888777000100Destinatário de testes
12345678000195Empresa genérica de testes

Esses CNPJs são fictícios com dígitos verificadores válidos, conferidos contra o algoritmo oficial de cálculo de DV. Podem ser usados livremente em homologação.

CNPJ com dígito verificador inconsistente com os 12 primeiros dígitos é rejeitado pela SEFAZ de homologação com cStat 208 ("CNPJ do emitente inválido"). Use sempre os CNPJs acima ou gere um novo com DV calculado corretamente antes de testar.


Certificado para Homologação

Em homologação, você pode usar:

  • Seu certificado real (funciona normalmente)
  • Certificado de testes (emitido por qualquer AC, mesmo que expirado)

O SEFAZ de homologação aceita certificados com qualquer validade. O upload segue o mesmo contrato de produção: POST /v1/companies/{id}/certificate, campo multipart file, ver Certificados Digitais.


Promovendo um emissor para produção

Trocar ambienteFiscal é self-service, via um endpoint dedicado, separado do PATCH /v1/companies/{id} genérico (que ignora o campo, ver aviso acima). Não existe aprovação do suporte no caminho: quem chama a rota com o valor certo promove o emissor.

bash
curl -X PATCH https://api.engineapi.com.br/v1/companies/ISSUER_ID/ambiente \
  -H "x-api-key: ek_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "ambienteFiscal": 1
  }'
PropriedadeDetalhe
RotaPATCH /v1/companies/{id}/ambiente, endpoint dedicado
AuthMesma do resto de /v1/companies: JWT ou x-api-key. Tanto ek_test_ quanto ek_live_ podem chamar: esta rota não bloqueia ek_test_ como as rotas de emissão fiscal (NFe, NFCe, NFSe, CTe, MDFe) bloqueiam
Body{ "ambienteFiscal": 1 } (Produção) ou { "ambienteFiscal": 2 } (Homologação), sem coerção de string/boolean. Qualquer outro valor → 400
EscopoSó o emissor do seu próprio partner; id de outro tenant devolve 404 sem revelar que o emissor existe
AuditoriaGrava log de auditoria com before/after na mesma transação da troca, sempre
O que este endpoint não fazNão confere se há certificado A1 válido, não reseta numeração/série de documentos, não toca em nenhum outro campo do cadastro: a troca escreve só o ambienteFiscal. Estar "pronto pra produção" (certificado, IE, endereço) é responsabilidade do integrador, ver o checklist abaixo

Resposta de sucesso (200):

json
{
  "data": {
    "id": "5f2c1e40-6b3a-4e1a-9b2c-8f0a1d2e3f4a",
    "cnpj": "11222333000181",
    "ambienteFiscal": 1
  },
  "meta": { "requestId": "req_a1b2c3d4e5", "timestamp": "2026-07-16T12:00:00.000Z" }
}

Corpo inválido (400, ex. { "ambienteFiscal": 3 }):

json
{
  "error": {
    "type": "https://engineapi.com.br/errors/VALIDATION_ERROR",
    "title": "Bad Request",
    "status": 400,
    "detail": "Os dados enviados são inválidos",
    "errors": [
      {
        "field": "ambienteFiscal",
        "message": "ambienteFiscal deve ser exatamente 1 (Produção) ou 2 (Homologação)"
      }
    ],
    "instance": "/v1/companies/5f2c1e40-6b3a-4e1a-9b2c-8f0a1d2e3f4a/ambiente",
    "requestId": "req_a1b2c3d4e5",
    "timestamp": "2026-07-16T12:00:00.000Z"
  }
}

Depois de promover pra produção, sua ek_test_ para de operar esse emissor. ek_test_ só opera emissor com ambienteFiscal: 2 (homologação). Tentar emitir com ek_test_ contra um emissor que você acabou de promover devolve 403 com "Chave de teste não opera emissor de produção. Gere sua ek_live_ no portal." Gere a ek_live_ (exige plano ativo, ver Autenticação) antes ou logo depois de promover o emissor.


Testando Rejeições

Para testar o tratamento de erros no seu código, você pode provocar rejeições específicas (todas voltam como 400 com error.erros[], nunca 422, ver Erros e Rejeições):

RejeiçãoComo provocar
539: DuplicidadeEmita a mesma nota duas vezes (mesmo número/série)
225: NCM inválidoUse NCM com menos de 8 dígitos, ex: "1234"
210: IE inválidaUse uma IE que não bate com a UF do destinatário
204: CNPJ inválidoUse um CNPJ com dígito verificador errado

Comparação: Sandbox vs Produção

Sandbox (ambienteFiscal: 2)Produção (ambienteFiscal: 1)
Validade fiscalSem validadeVálida
Custo por emissãoGratuito (ek_test_ não é faturada)Conforme plano
SEFAZ utilizadoSEFAZ de homologaçãoSEFAZ estadual real
Cancelamento necessárioNãoSim (até 24h NFe / 30min NFCe)
Webhooks disparadosSimSim
XML retornadoSim (teste)Sim (válido)
DANFE / DANFCE (PDF)Sim, gerado do XML autorizado, impresso com SEM VALOR FISCALSim, documento válido
Como ativarDefault de todo emissor novoPATCH /v1/companies/{id}/ambiente com { "ambienteFiscal": 1 }, self-service (ver seção acima)

O DANFE em homologação

GET /v1/nfe/pdf/{accessKey} e GET /v1/nfce/pdf/{accessKey} funcionam normalmente em homologação: o documento é gerado a partir do XML autorizado pela SEFAZ de homologação, e a própria SEFAZ manda imprimir a tarja NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL. Ambiente, CST/CSOSN e informações complementares saem do XML: o PDF é o documento, não uma remontagem.

A resposta só é 409 (DANFE_INDISPONIVEL) quando não existe XML autorizado para aquele documento neste ambiente:

SituaçãoPor quê
Nota autorizada em outro ambienteO XML fica no servidor onde a nota foi emitida; baixar a chave de produção no staging (ou vice-versa) não encontra o arquivo
Nota ainda não autorizadaSem autorização não há chave nem XML, consulte o status antes

Emissor de demonstração (criado pelos seeds de demo da plataforma, não por você): o download de PDF funciona: o provider simulado grava um XML de homologação sintético (mesmo caminho de disco do documento real, itens/CSOSN/informações complementares do SEU payload) para a ACBrLib renderizar o DANFE de teste. O que é fabricado vem declarado dentro do próprio documento: o protocolo (nProt) usa o prefixo DEMO (nunca um número puro, protocolo real da SEFAZ é só dígitos, então não colide com nenhuma faixa real) e o infCpl/xMotivo dizem literalmente "AMBIENTE DE DEMONSTRAÇÃO, documento sintético, sem validade fiscal". Não fica mais o 409 nesse caso.

Um emissor criado por POST /v1/companies não é de demonstração: ele nasce em homologação real (ambienteFiscal: 2) e emite contra a SEFAZ de verdade. Ou seja, na jornada normal de teste com ek_test_ o PDF e o XML são reais.


Checklist: Estou pronto para produção?

·

Emissão testada

Sua integração emite NFe com sucesso em homologação e recebe status: "AUTHORIZED"?

·

Erros tratados

Seu código trata 400 (rejeição SEFAZ, error.erros[]) e exibe mensagem amigável ao usuário?

·

Webhooks configurados

Você tem um endpoint recebendo invoice.authorized e invoice.rejected (PATCH /v1/webhooks/config)?

·

Idempotência implementada

Seu código usa o header Idempotency-Key na emissão e o id do evento no webhook para evitar duplicidade?

·

Certificado de produção

Você tem um certificado e-CNPJ A1 válido e fez o upload (POST /v1/companies/{id}/certificate)?

·

Ambiente de produção liberado

Você chamou PATCH /v1/companies/{id}/ambiente com { "ambienteFiscal": 1 } pra promover o emissor (self-service, ver seção "Promovendo um emissor para produção" acima) e gerou sua ek_live_?


Próximos passos