Emissão e eventos assíncronos
Emissão, cancelamento, carta de correção e inutilização são assíncronos: o POST devolve
202 Accepted com um jobId e o processamento (cálculo de impostos, assinatura, transmissão à
SEFAZ) acontece em segundos, em segundo plano.
📦 DC-e (modelo 99). A Declaração de Conteúdo eletrônica usa este mesmo modelo:
POST /dce→202 { jobId }→ polling/webhook →GET /dce/{jobId}; cancelamento emPOST /dce/cancelamentos(pela chave de acesso, comjustificativa≥ 15 caracteres). O corpo é mais simples que o da NF-e (sem impostos: remetente, destinatário, itens, transporte) e o remetente deve ser não contribuinte de ICMS (contribuinte emite NF-e — rejeição 812). O resultado do job trazxmlUrl/daceUrljá no scheme da API (/api/integracao/dce/{chave}/xml|dace, headerX-Api-Key), e o webhookjob.concluidoinclui odceId. Cota própria por plano (Free 5/dia →402; pagos = franquia da NF-e + 15%).POST /api/integracao/dce { "referenciaExterna": "envio-1001", "cnpjEmitente": "43636483000128", "tpEmit": 1, "remetente": { "nome": "Vendedor Exemplo", "cpf": "52998224725", "endereco": { "logradouro": "Rua A", "numero": "1", "bairro": "Centro", "codigoMunicipio": "3550308", "municipio": "São Paulo", "uf": "SP", "cep": "01000000" } }, "destinatario": { "nome": "Comprador Exemplo", "cpf": "11144477735", "endereco": { "logradouro": "Av. B", "numero": "2", "bairro": "Centro", "codigoMunicipio": "3550308", "municipio": "São Paulo", "uf": "SP", "cep": "01000000" } }, "itens": [{ "descricao": "Livro usado", "ncm": "49019900", "quantidade": 1, "valorUnitario": 45.9 }], "transporte": { "modalidade": 1 } }
tpEmit: 1 = Marketplace (a plataforma assina; identificação preenchida automaticamente) ou 2 = Emissor próprio (remetente = o próprio emitente); Transportadora/ECT não estão disponíveis. OGET /dce/{jobId}devolvedceId,chaveAcesso,protocolo,cStat,xmlUrledaceUrl.
Por que assíncrono?
A SEFAZ pode demorar ou oscilar. O modelo de jobs desacopla seu sistema dessa latência: você nunca
fica preso num request de 30 s, e a idempotência por referenciaExterna elimina o risco
clássico de "timeout → reenvio → nota duplicada".
Idempotência
Envie sempre referenciaExterna (ex.: número do pedido). Ela é única por empresa: um segundo
POST com a mesma referência retorna 202 com o job original — nunca cria outra nota.
Emissão
POST /api/integracao/emissoes
{
"referenciaExterna": "pedido-1001",
"cnpjEmitente": "43636483000128",
"serie": 2,
"cpfCnpjCliente": "12345678000190",
"codigoOperacao": "VENDA",
"itens": [
{ "codigoProduto": "CANETA-AZ", "quantidade": 100, "valorUnitario": 2.50, "desconto": 10.00 }
],
"frete": 25.00,
"seguro": null,
"outrasDespesas": null,
"pagamentos": [ { "forma": "17", "valor": 265.00, "aVista": true } ],
"transporte": {
"modFrete": 1,
"transportadora": { "cnpjCpf": "11222333000144", "nome": "Transportadora X",
"inscricaoEstadual": null, "endereco": null, "municipio": null, "uf": null },
"volumes": [ { "quantidade": 2, "especie": "CAIXA", "marca": null, "numeracao": null,
"pesoLiquido": 10.5, "pesoBruto": 11.0 } ]
},
"cobranca": {
"duplicatas": [ { "numero": "001", "vencimento": "2026-07-10", "valor": 265.00 } ]
},
"observacoes": "Pedido nº 1001. Mercadoria sai do depósito 2.",
"troco": 0,
"chavesReferenciadas": ["35260612345678000190550010000000011234567890"],
"autorizadosDownloadXml": ["12345678000190"],
"localEntrega": {
"cpfCnpj": "12345678000190",
"endereco": { "logradouro": "Av. Entrega", "numero": "50", "bairro": "Centro",
"municipio": "São Paulo", "codigoMunicipioIbge": "3550308", "uf": "SP", "cep": "01000-000" }
}
}
Campos avançados (opcionais)
chavesReferenciadas: chaves de NF-e referenciadas (44 dígitos) — obrigatório em devolução / complementar / ajuste (grupoNFref).autorizadosDownloadXml: CNPJs/CPFs autorizados a baixar o XML na SEFAZ (contador, transportadora) — grupoautXML.localEntrega/localRetirada: endereço de entrega/retirada quando difere do destinatário.troco: quando informado, a soma dospagamentosdeve ser total da nota + troco.transporte.veiculo:{ placa, uf, rntc }para frete rodoviário próprio/de terceiros.cliente(opcional): cria ou atualiza o cadastro do destinatário na hora da emissão, pelocpfCnpjCliente— dispensa oPUT /clientes/{cpfCnpj}separado quando o comprador vem junto com o pedido (é o que os canais de venda fazem). Só destinatário no Brasil; cliente no exterior continua pelo upsert de clientes comidEstrangeiro."cliente": { "nome": "João Souza", "nomeFantasia": null, "email": "joao@example.com", "telefone": "12999991234", "inscricaoEstadual": null, "indicadorIe": null, "tipoPessoa": null, "endereco": { "logradouro": "Rua das Flores", "numero": "120", "complemento": "apto 31", "bairro": "Centro", "municipio": "São José dos Campos", "uf": "SP", "cep": "12210-100", "codigoMunicipioIbge": null } }Regras: campo preenchido vence o cadastro (é o dado mais recente do próprio comprador); campo vazio nunca apaga o que já estava; o endereço substitui o atual por inteiro quando vem (rua nova com complemento antigo não existe) e, ausente, o atual fica.
tipoPessoaomitido sai do tamanho do documento (14 dígitos = jurídica);indicadorIeomitido é1quando há inscrição estadual e9sem.codigoMunicipioIbgeomitido é derivado de município + UF (a UF aceita sigla ou nome). O que o bloco não carrega (código do cliente, grupo, SUFRAMA) é preservado. O cadastro é gravado antes da nota e vale mesmo que a emissão seja rejeitada depois. Município que não resolve no IBGE, endereço incompleto ou CPF/CNPJ inválido fazem o job falhar com a mensagem iniciada porDados do comprador impedem a emissão:— sem consumir numeração.serie(opcional): número da série de numeração a usar (não o identificador). Omitido, a emissão usa a série padrão do emitente. Série inexistente para aquele CNPJ faz o job falhar com mensagem explícita, sem consumir numeração. Cadastre as séries em Cadastros → Séries de numeração (veja Séries de numeração). O mesmo campo existe noPOST /api/integracao/dce.Por item:
pedidoCompra(xPed),itemPedidoCompra(nItemPed),infoAdicional(infAdProd),codigoBeneficioFiscal(cBenef) erastro(lote/validade — só se o emitente tiver o segmento Rastreabilidade habilitado):[{ "lote": "L1", "quantidade": 10, "fabricacao": "2026-01-01", "validade": "2027-01-01" }].Por item, importação (
importacao) — Declaração de Importação (DI/DUIMP) + Imposto de Importação, só se o emitente tiver o segmento Importação habilitado. O II/DI não são calculados, vêm informados da declaração da Receita; ovalorIItotaliza novIIda nota:"importacao": { "baseCalculoII": 1000.00, "despesasAduaneiras": 30.00, "valorII": 80.00, "iof": 0, "declaracoes": [{ "numeroDocumento": "2412345678", "dataRegistro": "2026-06-10", "localDesembaraco": "PORTO DE SANTOS", "ufDesembaraco": "SP", "dataDesembaraco": "2026-06-12", "viaTransporte": 1, "formaIntermediacao": 1, "codigoExportador": "EXP-001", "valorAfrmm": 12.00, "adicoes": [{ "numero": 1, "sequencial": 1, "codigoFabricante": "FAB-001", "valorDesconto": 0 }] }] }viaTransporte1=marítima…13=reboque;formaIntermediacao1=conta própria, 2=conta e ordem, 3=encomenda (2/3 aceitamcnpjAdquirente/cpfAdquirente/ufTerceiro).Exportação (operação com CFOP 7xxx, só se o emitente tiver o segmento Exportação habilitado): a nota leva o grupo
exportae o destinatário precisa ser estrangeiro. EmcpfCnpjClienteinforme oidEstrangeirodo cliente exterior (sem CPF/CNPJ). No corpo da emissão:"exportacao": { "ufSaidaPais": "SP", "localEmbarque": "Porto de Santos", "localDespacho": null }Opcionalmente, drawback/exportação indireta por item (
detExport):"exportacoes": [ { "numeroDrawback": "20260000001" }, { "registroExportacao": "2026000123", "chaveNFeExportacao": "35260...", "quantidade": 2 } ]ufSaidaPaisé a UF brasileira de saída (porto/aeroporto), não "EX"; o ICMS sai CST 41 (imune/não tributado) eidDest = 3. Na exportação indireta, achaveNFeExportacaoé auto-referenciada no grupoNFrefda nota (a SEFAZ exige; deve ser NF-e válida da contraparte).Segmentos (liberados por flag no emitente — detalhes). Por item: combustível (
combustivel:codigoAnp,descricaoAnp,percentualGlp/percentualGasNacional/percentualGasImportado,ufConsumo,cide,encerrante…), veículo novo (veiculo:chassi,descricaoCor,potencia,cilindradas,anoModelo,condicaoVeiculo,tipoOperacao…) e medicamento (medicamento:codigoAnvisa,valorPmc,motivoIsencao). Na nota, intermediador/marketplace (intermediador:cnpj+idCadIntermediador→ marcaindIntermed)."intermediador": { "cnpj": "12345678000199", "idCadIntermediador": "MARKETPLACE-123" }Como na tela, esses grupos só vão ao XML se o emitente tiver o respectivo segmento habilitado.
codigoIndicadorOperacao(cIndOp, Reforma Tributária — NT 2025.002 v1.40): "Código Indicador do Local da Operação", exigido só em operações de nicho (ex.: leilão judicial / licitação do poder público). É um passthrough opcional na nota. Vigência 03/08/2026 — a SEFAZ só aceita o campo a partir do schema v1.40; antes disso, não informe."codigoIndicadorOperacao": "010104"Emitente, cliente, operação e produtos são referenciados pelos identificadores dos cadastros (CNPJ, CPF/CNPJ, códigos) — sincronize-os antes com os upserts.
valorUnitarioé opcional (default: o do cadastro do produto);descontoé por item.frete/seguro/outrasDespesassão da nota, rateados proporcionalmente entre os itens, e entram na base de cálculo dos impostos.pagamentos:formaé o código tPag da NF-e ("01"dinheiro,"03"cartão de crédito,"04"cartão de débito,"15"boleto,"17"PIX dinâmico,"20"PIX estático…); a soma deve fechar com o total da nota. Omitido → "sem pagamento" (tPag 90).transporte.modFrete(campomodFrete):0= por conta do emitente (CIF),1= do destinatário (FOB),2= de terceiros,3/4= próprio,9= sem transporte (default).observacoes(opcional, até ~2000 caracteres): informações complementares do emitente — entram noinfCpldo XML e na seção "Dados adicionais" do DANFE, antes da frase dos tributos aproximados (IBPT).Os impostos não são enviados — são calculados pela matriz de impostos configurada no portal.
Eventos
POST /api/integracao/cancelamentos
{ "referenciaExterna": "canc-1001", "chaveAcesso": "35260...", "justificativa": "Pedido cancelado pelo cliente" }
POST /api/integracao/cartas-correcao
{ "referenciaExterna": "cce-1001", "chaveAcesso": "35260...", "correcao": "Endereço de entrega: bloco B, não bloco A" }
POST /api/integracao/inutilizacoes
{ "referenciaExterna": "inut-2026-01", "cnpjEmitente": "43636483000128",
"serie": 1, "numeroInicial": 15, "numeroFinal": 15, "justificativa": "Falha de transmissão queimou o numero" }
Justificativa/correção: mínimo 15 caracteres (regra SEFAZ). Cancelamento em regra só nas primeiras 24 h.
Consultando o job
GET /api/integracao/emissoes/{jobId} (emissão)
GET /api/integracao/eventos/{jobId} (cancelamento, CC-e, inutilização)
{
"jobId": "...",
"tipo": "Emissao",
"status": "Concluido",
"referenciaExterna": "pedido-1001",
"erro": null,
"resultado": { "chaveAcesso": "35260...", "numero": 1, "serie": 1, "protocolo": "1352600..." },
"criadoEmUtc": "2026-06-12T14:00:00Z",
"processadoEmUtc": "2026-06-12T14:00:03Z"
}
status |
Significado |
|---|---|
Pendente |
Na fila |
Processando |
Transmitindo à SEFAZ |
Concluido |
Sucesso — resultado preenchido |
Falha |
erro traz o motivo (validação, rejeição SEFAZ com código, comunicação) |
Falha é terminal — o job não é retentado automaticamente (a decisão de negócio é sua).
Corrija a causa e envie um novo POST com outra referenciaExterna.
Nota rejeitada pela SEFAZ
Quando a SEFAZ recebe e recusa a nota, o job fica Concluido e o resultado traz a nota com
status Rejeitada (ou Denegada), cStat e motivo. Nas rejeições de cadastro do emitente
(245, 203, 781, 230, 231, 164, 163, 213 e 301) vem também orientacao: a explicação e os passos, para
você mostrar ao usuário em vez do texto cru da SEFAZ. Nos demais códigos, orientacao é null.
"resultado": {
"status": "Rejeitada", "cStat": 245, "motivo": "Rejeição: CNPJ Emitente não cadastrado",
"orientacao": {
"cStat": 245,
"titulo": "A SEFAZ não encontrou este CNPJ no cadastro de emissores de NF-e",
"explicacao": "A SEFAZ da sua UF não reconhece o CNPJ do emitente como emissor de NF-e. ...",
"passos": ["Confira se o CNPJ do emitente está correto em Cadastros → Emitentes.", "..."],
"credenciamento": {
"uf": "SP", "valeParaHomologacao": true,
"orientacao": "Em São Paulo, o MEI precisa pedir o credenciamento como emissor de NF-e ...",
"linkOficial": "https://servicos.sp.gov.br/fcarta/61E12444-9765-4974-9D98-11CF77E6FE95",
"norma": "Portaria CAT 162/2008, art. 2º e art. 7º, §4º, item 5",
"somenteRegimes": [4]
},
"linkAjuda": "/ajuda/troubleshooting#rejeicoes-de-cadastro-do-emitente"
}
}
credenciamento só vem quando a rejeição pode ser falta de credenciamento e a UF do emitente
tem essa exigência confirmada em fonte oficial para o regime dele (somenteRegimes vazio = todos;
4 = MEI). Nos outros casos é null. A tabela completa está em GET /api/credenciamento-nfe
(portal).
Em vez de polling, configure um webhook — o Notavia chama seu sistema quando o job termina.