engineAPIengineAPI
// guias

Migrar da Nuvem Fiscal

Guia de migração da Nuvem Fiscal para engineAPI: mapeamento de endpoints, campos e diferenças de comportamento.

Migrar da Nuvem Fiscal

A Nuvem Fiscal anunciou desativação em 31/07/2026. Este guia mapeia o contrato público dela (api.nuvemfiscal.com.br/openapi/swagger.json) para o da engineAPI, campo a campo.

Tempo estimado de migração: 4–8 horas de desenvolvimento

A Nuvem Fiscal expõe o leiaute bruto da SEFAZ em JSON (mesma estrutura do XML: infNFe.ide, infNFe.det[].imposto.ICMS.ICMS00, etc.). A engineAPI abstrai isso num payload plano. A migração não é só trocar nomes de campo: é escrever uma camada de tradução do leiaute bruto para o formato abstraído, daí o tempo maior que os outros guias desta coleção.


Diferenças Principais

AspectoNuvem FiscalengineAPI
AutenticaçãoOAuth 2.0 client credentials: POST https://auth.nuvemfiscal.com.br/oauth/token troca client_id/client_secret por um token, usado depois em Authorization: Bearer {token}x-api-key: {key} (integração server-to-server) ou Authorization: Bearer {jwt} (dashboard, via POST /v1/auth/login), sem passo de troca de token
Payload do documentoLeiaute bruto da SEFAZ em JSON (infNFe.ide, infNFe.emit, infNFe.det[].prod, infNFe.det[].imposto), mesma estrutura do XMLPayload plano em camelCase (items[], destinatario, pagamentos[]); a engineAPI monta o XML por trás
Identificação do emissorVai dentro do próprio documento: infNFe.emit.CNPJ. A empresa precisa estar cadastrada (POST /empresas) e com certificado ativo antesissuerId (UUID) no body, retornado por POST /v1/companies. Opcional com 1 emissor cadastrado; obrigatório com 2+
AmbienteCampo ambiente ("homologacao" / "producao") dentro de CADA pedido de emissãoAmarrado ao emissor (ambienteFiscal). Todo emissor nasce em homologação; promover para produção é self-service via PATCH /v1/companies/{id}/ambiente, ver Sandbox
Cancelamentojustificativa opcional, a API preenche automaticamente se vaziajustificativa obrigatória, mínimo 15 caracteres
Webhooks/eventosNão há webhook nativo documentado no OpenAPI público; consulta é por polling (GET /nfe/{id}, GET /nfe/eventos/{id})Webhooks configuráveis (PATCH /v1/webhooks/config), com payload padronizado e assinatura HMAC

Mapeamento de Endpoints

Nuvem FiscalengineAPINotas
POST /empresasPOST /v1/companiesNuvem Fiscal usa snake_case (cpf_cnpj, nome_razao_social); engineAPI usa camelCase (cnpj, name); ver mapeamento de campos
GET /empresas/{cpf_cnpj}GET /v1/companies/{id}Identificador muda de CNPJ (string) para UUID interno
PUT /empresas/{cpf_cnpj}/certificadoPOST /v1/companies/{id}/certificateNuvem Fiscal aceita certificado em JSON base64 (certificado, password) ou multipart (/certificado/upload); engineAPI só multipart/form-data, campo file
POST /nfePOST /v1/nfePayload raiz completamente diferente, ver Mapeamento de Campos
GET /nfe/{id}GET /v1/nfe/{id}N/A
POST /nfe/{id}/cancelamentoPOST /v1/nfe/{idOuChave}/cancelarjustificativa opcional lá, obrigatória (mín. 15 caracteres) aqui
POST /nfe/{id}/carta-correcaoPOST /v1/nfe/{accessKey}/carta-correcaoN/A
GET /nfe/{id}/xmlGET /v1/nfe/xml/{accessKey}N/A
GET /nfe/{id}/pdfGET /v1/nfe/pdf/{accessKey}N/A
POST /nfcePOST /v1/nfceNuvem Fiscal usa o MESMO leiaute bruto do /nfe (modelo NFC-e); engineAPI tem um payload próprio e mais simples (destCPF/destNome em vez de destinatário completo)
POST /nfce/{id}/cancelamentoPOST /v1/nfce/{idOuChave}/cancelarN/A
GET /nfce/{id}/xmlGET /v1/nfce/xml/{accessKey}N/A
GET /nfce/{id}/pdfGET /v1/nfce/pdf/{accessKey}N/A
POST /nfse/dpsPOST /v1/nfseNuvem Fiscal exige o infDPS bruto do Sistema Nacional NFS-e (ADN); engineAPI abstrai em tomador/servico, mas ambos carregam o mesmo cTribNac nacional
GET /nfse/{id}GET /v1/nfse/{id}N/A
POST /nfse/{id}/cancelamentoPOST /v1/nfse/{id}/cancelarN/A
GET /nfse/{id}/xmlGET /v1/nfse/xml/{id}N/A

Mapeamento de Campos

Raiz (NFe/NFCe: infNFe.ide)

Campo Nuvem FiscalCampo engineAPINotas
ambienteN/ASem equivalente por requisição: o ambiente é do emissor (ambienteFiscal), não do pedido. Ver Sandbox
infNFe.ide.natOpnaturezaOperacaoN/A
infNFe.ide.serieserieN/A
infNFe.ide.nNFnumeroAusente na engineAPI = alocado automaticamente
infNFe.ide.tpNFtpNFN/A
infNFe.ide.idDestidDestN/A
infNFe.ide.indFinalindFinalN/A
infNFe.ide.indPresindPresN/A
infNFe.ide.finNFefinNFeN/A
infNFe.emit.CNPJN/ASem equivalente: engineAPI identifica o emissor por issuerId (UUID), não por CNPJ dentro do documento

Destinatário (infNFe.dest)

Campo Nuvem FiscalCampo engineAPINotas
infNFe.dest.CNPJ / infNFe.dest.CPFdestinatario.cnpjCpfCampo único (11 a 14 dígitos), não há CNPJ/CPF separados
infNFe.dest.xNomedestinatario.nomeN/A
infNFe.dest.indIEDestdestinatario.indicadorIEN/A
infNFe.dest.IEdestinatario.ieN/A
infNFe.dest.emaildestinatario.emailN/A
infNFe.dest.enderDest.xLgrdestinatario.endereco.logradouroN/A
infNFe.dest.enderDest.nrodestinatario.endereco.numeroN/A
infNFe.dest.enderDest.xCpldestinatario.endereco.complementoN/A
infNFe.dest.enderDest.xBairrodestinatario.endereco.bairroN/A
infNFe.dest.enderDest.cMundestinatario.endereco.codigoMunicipioCódigo IBGE
infNFe.dest.enderDest.xMundestinatario.endereco.municipioN/A
infNFe.dest.enderDest.UFdestinatario.endereco.ufN/A
infNFe.dest.enderDest.CEPdestinatario.endereco.cepN/A

Item: produto (infNFe.det[].prod)

Campo Nuvem FiscalCampo engineAPINotas
infNFe.det[].nItemN/ANão existe campo de número por item na engineAPI: o índice do array já identifica o item
infNFe.det[].prod.cProditems[].codigoN/A
infNFe.det[].prod.cEANitems[].eanAusente na engineAPI = "SEM GTIN"
infNFe.det[].prod.xProditems[].descricaoN/A
infNFe.det[].prod.NCMitems[].ncmN/A
infNFe.det[].prod.CESTitems[].cestN/A
infNFe.det[].prod.CFOPitems[].cfopN/A
infNFe.det[].prod.uComitems[].unidadeN/A
infNFe.det[].prod.qComitems[].quantidadeN/A
infNFe.det[].prod.vUnComitems[].valorUnitarioN/A
infNFe.det[].prod.vProditems[].valorTotalOpcional na engineAPI, recalculado se ausente
infNFe.det[].prod.vDescitems[].descontoDesconto incondicional

Item: tributos (infNFe.det[].imposto)

O grupo imposto da Nuvem Fiscal é um union por CST/CSOSN: cada situação tributária tem seu próprio objeto (ICMS00, ICMS10, ICMS20... ICMSSN101, ICMSSN102...). A engineAPI usa um único objeto flexível por item (items[].icms), sem sub-tipar por CST.

Campo Nuvem FiscalCampo engineAPINotas
imposto.ICMS.ICMS00.orig (ou equivalente nos demais ICMSxx)items[].icms.origemN/A
imposto.ICMS.ICMS00.CSTitems[].icms.cstRegime Lucro Real/Presumido
imposto.ICMS.ICMSSN101.CSOSN (ou demais ICMSSNxxx)items[].icms.csosnRegime Simples Nacional
imposto.ICMS.ICMS00.vBCitems[].icms.baseCalculoN/A
imposto.ICMS.ICMS00.pICMSitems[].icms.aliquotaN/A
imposto.ICMS.ICMS00.vICMSitems[].icms.valorN/A
imposto.PIS.PISAliq.CSTitems[].pis.cstN/A
imposto.PIS.PISAliq.vBCitems[].pis.baseCalculoN/A
imposto.PIS.PISAliq.pPISitems[].pis.aliquotaN/A
imposto.PIS.PISAliq.vPISitems[].pis.valorN/A
imposto.COFINS.COFINSAliq.CSTitems[].cofins.cstN/A
imposto.COFINS.COFINSAliq.vBCitems[].cofins.baseCalculoN/A
imposto.COFINS.COFINSAliq.pCOFINSitems[].cofins.aliquotaN/A
imposto.COFINS.COFINSAliq.vCOFINSitems[].cofins.valorN/A
imposto.IPI.IPITrib.CSTitems[].ipi.cstSó NF-e: a NFC-e não tem IPI no leiaute
imposto.IPI.IPITrib.vBCitems[].ipi.baseCalculoN/A
imposto.IPI.IPITrib.pIPIitems[].ipi.aliquotaN/A
imposto.IPI.IPITrib.vIPIitems[].ipi.valorN/A
imposto.IPI.cEnqitems[].ipi.cEnqN/A

Pagamento (infNFe.pag)

Campo Nuvem FiscalCampo engineAPINotas
infNFe.pag.detPag[].tPagpagamentos[].formaCódigo SEFAZ da forma de pagamento
infNFe.pag.detPag[].vPagpagamentos[].valorN/A
infNFe.pag.vTrocotrocoN/A

Empresa (cadastro do emissor)

Campo Nuvem FiscalCampo engineAPINotas
cpf_cnpjcnpjN/A
nome_razao_socialnameN/A
nome_fantasiatradeNameN/A
inscricao_estadualieN/A
inscricao_municipalimN/A
fonephoneN/A
emailemailN/A
endereco.logradouroaddressSem equivalente aninhado: engineAPI usa campos PLANOS na raiz do body, não um objeto endereco
endereco.numeronumberN/A
endereco.complementocomplementN/A
endereco.bairroneighborhoodN/A
endereco.codigo_municipioibgeCodeN/A
endereco.cidadecityN/A
endereco.ufstateN/A
endereco.cepcepN/A

NFS-e (infDPS)

Campo Nuvem FiscalCampo engineAPINotas
infDPS.toma.CNPJ / infDPS.toma.CPFtomador.cnpjCpfCampo único
infDPS.toma.xNometomador.razaoSocialN/A
infDPS.toma.IMtomador.inscricaoMunicipalN/A
infDPS.serv.cServ.cTribNacdpsNacional.cTribNacCódigo de tributação nacional do ISSQN (6 dígitos)
infDPS.serv.cServ.cTribMunservico.codigoTributacaoMunicipioN/A
infDPS.serv.cServ.xDescServservico.discriminacaoN/A
infDPS.valores.vServPrest.vServservico.valorServicosN/A
infDPS.dCompetcompetenciaN/A

Diferenças importantes


Checklist de Migração

·

Criar conta na engineAPI

Registre-se em app.engineapi.com.br e gere sua API Key.

·

Cadastrar empresas emissoras

POST /v1/companies para cada CNPJ, convertendo os campos conforme a tabela Empresa. Atenção ao endereço, que deixa de ser aninhado.

·

Upload dos certificados

POST /v1/companies/{id}/certificate (multipart, campo file) com o .pfx de cada empresa. A Nuvem Fiscal aceitava base64 em JSON, a engineAPI só multipart.

·

Testar em homologação

Todo emissor novo já nasce em homologação (ambienteFiscal: 2). Emita notas de teste e valide os mapeamentos, sem precisar de um campo ambiente por requisição.

·

Escrever a camada de tradução do payload

Converta o leiaute bruto (infNFe.ide/dest/det/imposto) para o payload plano da engineAPI (naturezaOperacao, destinatario, items[], pagamentos[]) usando as tabelas acima: é o passo que consome a maior parte do tempo estimado.

·

Adaptar o cancelamento

Passe a enviar justificativa com pelo menos 15 caracteres em todo cancelamento. Na Nuvem Fiscal esse campo era opcional.

·

Configurar webhooks

Troque o polling por PATCH /v1/webhooks/config para receber eventos em tempo real.

·

Migrar para produção

Promover o emissor para produção é self-service, ver Sandbox.

·

Desativar a integração com a Nuvem Fiscal

Após validar a estabilidade por 1–2 semanas, encerre a integração antiga.


Próximos passos