Conceitos
Conta, chave de API e empresas
| Conceito | O que é |
|---|---|
| Conta | o seu sistema (o ERP) como cliente da API. Uma conta tem chaves de API e empresas |
| Chave de API | credencial nfe_... da conta. Pode haver várias (uma por ambiente, por sistema...) e cada uma pode ser revogada sozinha |
| Empresa | um CNPJ emitente, com regime tributário, endereço, inscrição estadual e certificado digital A1 próprios. Uma conta pode ter várias |
Uma chave só enxerga as empresas da própria conta. Se o seu ERP atende várias lojas (ou vários CNPJs), cadastre cada CNPJ como uma empresa e diga qual emite em cada chamada com cnpj_emitente. Quem tem uma única empresa pode omitir o campo.
Ambiente: homologação e produção
Cada empresa está em um de dois ambientes:
- Homologação: a SEFAZ de teste. As notas não têm valor fiscal, têm numeração própria e levam o texto obrigatório de homologação. É onde toda empresa nasce.
- Produção: notas reais, com valor jurídico. A troca é por
PUT /empresas/{cnpj}/ambientee só libera com certificado válido, inscrição estadual e as tabelas fiscais da plataforma validadas (detalhes).
As notas ficam presas ao ambiente em que foram emitidas. Ao passar para produção você pode reaproveitar as mesmas ref: na produção elas começam do zero. As consultas olham sempre o ambiente atual da empresa.
A ref: identificador da nota e proteção contra duplicidade
Toda emissão leva uma ref na URL (POST /nfe?ref=PEDIDO-1001). É um texto seu, de 1 a 60 caracteres (letras, números, ponto, hífen e sublinhado), único por empresa e ambiente. Use o identificador da venda no seu sistema.
A ref faz três coisas:
- Idempotência. Se a rede cair e você repetir o
POSTcom a mesmarefe o mesmo conteúdo, recebe o estado da nota que já existe, sem emitir outra. É seguro repetir à vontade. - Consulta. Você acompanha e opera a nota por ela:
GET /nfe/{ref},DELETE /nfe/{ref}... - Correção. Uma nota rejeitada pela SEFAZ aceita o reenvio corrigido na mesma
ref, com o mesmo número fiscal.
Detalhes das regras de reenvio em Emitir NF-e.
Estados da nota
O campo status da nota é um destes:
status |
Significa | É final? |
|---|---|---|
processando_autorizacao |
aceita pela API e na fila, ou enviada e aguardando a SEFAZ | não |
autorizado |
a SEFAZ autorizou: a nota existe e vale | sim (aceita eventos) |
erro_autorizacao |
a SEFAZ rejeitou. status_sefaz, mensagem_sefaz e mensagem dizem por quê. Corrija e reenvie na mesma ref |
não (reenviável) |
erro_validacao |
parou por uma pendência de cálculo ou cadastro, antes de chegar à SEFAZ. mensagem diz o que corrigir. Reenvie na mesma ref |
não (reenviável) |
denegado |
a SEFAZ denegou o uso (problema fiscal do emitente ou do destinatário): o número foi consumido e a nota não vale | sim |
cancelado |
o cancelamento foi registrado | sim |
inutilizado |
o número da nota foi inutilizado: ela nunca existiu na SEFAZ | sim |
┌─────────────── erro_autorizacao ◄──────┐
│ erro_validacao │ (reenvio corrigido, mesma ref)
POST /nfe ─► processando_autorizacao ─► autorizado ─► cancelado
│ (DELETE /nfe/{ref})
└─────────────► denegado
O que é síncrono e o que não é
A API valida na hora tudo o que dá para validar sem a SEFAZ e responde 422 antes de gastar um número da série: formato, campos que faltam, tributos que o motor não consegue calcular, totais que não fecham, certificado vencido, produção bloqueada. Quando o POST /nfe responde 202, a nota foi aceita e já tem número reservado.
Daí em diante tudo o que depende da SEFAZ é assíncrono: emitir, cancelar, corrigir e inutilizar respondem 202 e o resultado chega depois. Você escolhe como saber dele:
- Webhook (recomendado): a plataforma chama o seu endereço a cada mudança de estado. Veja Webhooks.
- Consulta (polling):
GET /nfe/{ref}até ostatusficar final. Comece a cada 2 segundos e aumente o intervalo. - Os dois juntos: webhook para reagir rápido e uma consulta periódica das notas pendentes como rede de segurança. É o que recomendamos em produção.
O que a plataforma calcula por você
Você informa a venda (destinatário, itens, valores, pagamento). A plataforma:
- calcula ICMS, DIFAL, FCP, PIS, COFINS, IPI e IBS/CBS conforme o regime da empresa e a operação, e define o CFOP;
- monta o XML no leiaute oficial, assina com o certificado da empresa e valida contra o XSD;
- reserva o número da NF-e em sequência, sem buracos nem duplicidade, mesmo com várias lojas emitindo ao mesmo tempo;
- envia, trata as respostas da SEFAZ (inclusive timeouts: antes de reenviar ela consulta a chave, para nunca emitir uma nota duplicada) e gera o DANFE.
Se o seu ERP já calcula os tributos, você pode informá-los por item (CFOP, situação tributária, alíquotas) e a plataforma passa a usar o que você mandou: é o modo híbrido. Os valores de imposto (base de cálculo, valor do ICMS...) são sempre calculados pela API.
Responsabilidade fiscal: os parâmetros que você informa valem mais que as regras da plataforma, e a responsabilidade por eles é sua. Cenários que o motor ainda não cobre (por exemplo ICMS-ST como substituto) são recusados com
422 validacao_fiscal, em vez de a plataforma "chutar".
Vem do Focus NFe?
A API segue o mesmo estilo (chave por HTTP Basic ou Bearer, ref na query, items[], nomes como nome_destinatario e codigo_ncm, cnpj_emitente, DELETE /nfe/{ref} com justificativa, POST /nfe/inutilizacao), então boa parte de um cliente já escrito para ele pode ser reaproveitada. Mas não é um clone: confira estas diferenças antes.
| Assunto | Aqui |
|---|---|
| Cancelar e inutilizar | assíncronos: respondem 202 e o estado muda depois (GET /nfe/{ref} ou webhook). Não esperam a SEFAZ |
| Cancelar | exige "confirmo": true (afirma que a mercadoria não saiu) |
| Campo desconhecido | recusado com 422 e o caminho do campo. Nunca ignorado em silêncio |
Valores de imposto (icms_valor, pis_valor...) |
recusados: a API calcula os valores a partir dos parâmetros que você informa (modo híbrido) |
valor_total |
opcional, mas se vier a nota só sai se o total calculado fechar com ele |
| Campos centrais | conferem com o estilo do Focus. Os demais (pagamentos, intermediador, parâmetros fiscais além da situação tributária) são desta API, no mesmo estilo: use Emitir NF-e como contrato, não a documentação de outro serviço |
| Estados e códigos | status e codigo de erro são os desta documentação (estados, erros) |