Documentação
MCP Painel →

NF-e · Nota Fiscal eletrônica · modelo 55 chave ace_

POST /nfe/emitir

Nota fiscal entre empresas/pessoas, com destinatário (endereço obrigatório). O emitente (sua empresa) vem da configuração — você não envia dados do emitente na emissão. Compartilha o mesmo certificado A1 da NFC-e/MDF-e/CT-e/DCe (série própria serie_nfe). Cobra 1 unidade por nota autorizada e por CC-e aceita; rejeição não cobra.

Antes de emitir (uma vez): envie o certificado (POST /nfe/certificado com certificado_base64+senha) e configure série/ambiente (PUT /nfe/configuracao · {"ambiente":2,"serie_nfe":1,"inscricao_estadual":"ISENTO"}). O ICMS é escolhido pelo regime tributário do emitente: Simples Nacional usa CSOSN; Lucro Real/Presumido usa CST.
Configuração (uma vez)
# 1) certificado A1 (compartilhado)
curl -X POST .../api/v1/nfe/certificado \
  -H "Authorization: Bearer ace_SEU_TOKEN" \
  -d '{"certificado_base64":"MIIK...","senha":"1234"}'

# 2) série + ambiente (2=homolog, 1=produção)
curl -X PUT .../api/v1/nfe/configuracao \
  -H "Authorization: Bearer ace_SEU_TOKEN" \
  -d '{"ambiente":2,"serie_nfe":1,
       "inscricao_estadual":"ISENTO"}'
$b64 = base64_encode(file_get_contents('cert.pfx'));
$cli->nfe()->enviarCertificado($b64, '1234');
$cli->nfe()->configurar([
  'ambiente' => 2,
  'serie_nfe' => 1,
  'inscricao_estadual' => 'ISENTO',
]);
Api.EnviarCertificado('nfe',
  CertToBase64('cert.pfx'), '1234').Free;
Api.Put('nfe/configuracao',
  JSONFromStr('{"ambiente":2,"serie_nfe":1}')).Free;

Cabeçalho da nota

Todos opcionais (têm padrão). Enviados na raiz do JSON.

CampoPadrãoValores
natureza_operacaoVENDA DE MERCADORIAtexto livre
tipo_operacao10=entrada, 1=saída
destino_operacao11=interna, 2=interestadual, 3=exterior (deve casar com o CFOP: 5xxx interno, 6xxx interestadual)
finalidade11=normal, 2=complementar, 3=ajuste, 4=devolução
consumidor_final10=não, 1=sim
presenca10=n/a, 1=presencial, 2=internet, 3=teleatendimento, 4=NFC-e domicílio, 9=outros
data_saidaagoraISO-8601 (ex.: 2026-07-26T10:00:00-03:00)
info_complementartexto livre (infCpl da nota)
Cabeçalho (exemplo)
{
  "natureza_operacao": "VENDA DE MERCADORIA",
  "tipo_operacao": 1,
  "destino_operacao": 1,
  "finalidade": 1,
  "consumidor_final": 1,
  "presenca": 1,
  "info_complementar": "Pedido 12345"
}

Destinatário obrigatório

CampoDescrição
documentoobrig.CPF (11 díg) ou CNPJ (14 díg), só números
nomeobrig.Nome / razão social
indicador_iepadrão 91=contribuinte ICMS, 2=isento, 9=não contribuinte
inscricao_estadualopc.Obrigatória se indicador_ie=1
emailopc.Para envio da nota
enderecoobrig.objeto (ver abaixo)

Endereço (do destinatário)

Campo
logradouro, numero, bairro, cidade, uf, cepobrig.
cod_municipio — código IBGE de 7 dígitosobrig.
complemento, telefoneopc.
Destinatário (exemplo)
{
  "destinatario": {
    "documento": "12345678000195",
    "nome": "CLIENTE DESTINATARIO LTDA",
    "indicador_ie": 9,
    "inscricao_estadual": null,
    "email": "[email protected]",
    "endereco": {
      "logradouro": "AV BRASIL", "numero": "100",
      "complemento": "SALA 2", "bairro": "CENTRO",
      "cod_municipio": "3304557",
      "cidade": "RIO DE JANEIRO",
      "uf": "RJ", "cep": "20090003"
    }
  }
}

Itens / produtos obrigatório

Lista produtos[] com 1+ item. Cada item:

CampoDescrição
codigoobrig.Código interno do produto
descricaoobrig.Descrição do item
ncmobrig.NCM (8 díg)
cfopobrig.CFOP (4 díg) — casa com destino_operacao
unidadeobrig.UN, KG, CX, L…
quantidadeobrig.número
valor_unitarioobrig.número (o total do item = qtd × unit)
eanSEM GTINCódigo de barras
origem00=nacional, 1=import. direta, 2=import. mercado interno…
csosn102Simples Nacional (só regime Simples)
cst_icms00Lucro Real/Presumido
aliq_icms18% de ICMS (regime normal)
cst_pis / cst_cofins07CST PIS/COFINS
Impostos automáticos: se o emitente é Simples Nacional, o item usa ICMSSN com o csosn (padrão 102 — sem permissão de crédito). Se é Lucro Real/Presumido, usa ICMS com cst_icms + aliq_icms. PIS/COFINS saem com CST 07 (isento) por padrão.
Produtos (exemplo)
{
  "produtos": [
    {
      "codigo": "001",
      "ean": "7896292301382",
      "descricao": "REFRIGERANTE LATA 350ML",
      "ncm": "22021000",
      "cfop": "5102",
      "unidade": "UN",
      "quantidade": 2,
      "valor_unitario": 5.50,
      "origem": 0,
      "csosn": "102",
      // regime normal, use:
      "cst_icms": "00", "aliq_icms": 18
    }
  ]
}

Totais, frete e transporte opcionais

CampoDescrição
totais.freteValor do frete (somado ao total da nota)
totais.seguroValor do seguro (somado)
totais.descontoDesconto (subtraído)
totais.outrosOutras despesas (somado)
frete.tipoModalidade: 0=emitente, 1=destinatário, 2=terceiros, 3=próprio remet., 4=próprio dest., 9=sem frete (padrão)
transporte.razao_social, cnpj_cpf, inscricao_estadual, endereco, municipio, ufTransportadora
transporte.placa, placa_uf, codigo_anttVeículo
transporte.volumes[]quantidade, especie, marca, numeracao, peso_liquido, peso_bruto

O total da nota (vNF) é calculado: soma dos itens + frete + seguro + outros − desconto.

Totais + transporte
{
  "totais": { "frete": "10.00", "desconto": "5.00" },
  "frete": { "tipo": 0 },
  "transporte": {
    "razao_social": "TRANSPORTES XYZ LTDA",
    "cnpj_cpf": "99888777000166",
    "placa": "ABC1D23", "placa_uf": "RJ",
    "volumes": [
      { "quantidade": 2, "especie": "CAIXA",
        "peso_bruto": "12.500" }
    ]
  }
}

Pagamento opcional

Objeto pagamento com formas[] e troco. Se omitido, assume 1 forma "à vista" (01) no valor da nota. Os campos de cada forma são os mesmos da NFC-e — veja a tabela completa em NFC-e.

01 dinheiro02 cheque03 cartão crédito
04 cartão débito05 crédito loja10 vale alimentação
11 vale refeição12 vale presente13 vale combustível
14 duplicata mercantil15 boleto16 depósito bancário
17 PIX dinâmico18 transf. / carteira digital19 fidelidade / cashback
20 PIX estático21 crédito em loja22 pgto. eletrônico não informado
90 sem pagamento99 outros exige descricao
Meio eletrônico exige tipo_integracao. Para 03 04 10 11 12 13 17 18 19 20 21PIX incluído — a SEFAZ obriga o grupo card; sem ele a nota volta com rejeição 391. Preenchemos tipo_integracao: 2 (não integrado) quando você não manda. E forma: "99" exige descricao — sem ela devolvemos 422 na hora.
Pagamento
{
  "pagamento": {
    "formas": [
      { "forma": "01", "valor": 6.00 },
      { "forma": "17", "valor": 5.00 },
      { "forma": "99", "valor": 1.00,
        "descricao": "Vale do funcionário" }
    ],
    "troco": 0
  }
}

Emitir — requisição completa

POST /nfe/emitir

Resposta 200: nfe_id (use nas demais chamadas), numero, serie, chave (44 díg), protocolo e status (autorizada).

Requisição completa
curl -X POST .../api/v1/nfe/emitir \
  -H "Authorization: Bearer ace_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "natureza_operacao": "VENDA DE MERCADORIA",
    "finalidade": 1, "destino_operacao": 1,
    "destinatario": {
      "documento": "12345678000195", "nome": "CLIENTE LTDA",
      "indicador_ie": 9,
      "endereco": {"logradouro":"AV BRASIL","numero":"100",
        "bairro":"CENTRO","cod_municipio":"3304557",
        "cidade":"RIO DE JANEIRO","uf":"RJ","cep":"20090003"}
    },
    "produtos": [
      {"codigo":"001","descricao":"PRODUTO X","ncm":"22021000",
       "cfop":"5102","unidade":"UN","quantidade":1,
       "valor_unitario":10.00,"origem":0}
    ],
    "totais": {"frete":"0.00","desconto":"0.00"},
    "pagamento": {"formas":[{"forma":"01","valor":10.00}]},
    "info_complementar": "Pedido 12345"
  }'
$nota = $cli->nfe()->emitir([
  'destinatario' => [ /* ... */ ],
  'produtos'     => [ /* ... */ ],
  'pagamento'    => ['formas'=>[['forma'=>'01','valor'=>10]]],
]);
echo $nota['status'], $nota['chave'];
R := Api.EmitirNFe(JSONFromStr(JsonDaNota));
try
  Id  := R.Int('nfe_id');
  Cha := R.Str('chave');
finally R.Free; end;
200 · data
{ "nfe_id": 33, "numero": 6, "serie": 1,
  "chave": "33260712345678000195550010000000061...",
  "protocolo": "133260000012345",
  "status": "autorizada" }

Baixar XML e DANFE

GET /nfe/{id}/xml
GET /nfe/{id}/danfe

Devolvem o arquivo direto (não o envelope JSON): o XML autorizado e o DANFE em PDF. {id} = o nfe_id da emissão.

Download
curl .../api/v1/nfe/33/xml \
  -H "Authorization: Bearer ace_SEU_TOKEN" -o nota.xml

curl .../api/v1/nfe/33/danfe \
  -H "Authorization: Bearer ace_SEU_TOKEN" -o nota.pdf
$cli->nfe()->xml(33, 'nota.xml');
$cli->nfe()->danfe(33, 'nota.pdf');
// sem 2º arg: devolve ['bytes','content_type','filename']
Api.BaixarXML('nfe', 33, 'nota.xml');
Api.BaixarPDF('nfe', 33, 'nota.pdf');

Cancelar

POST /nfe/{id}/cancelar

Body: {"justificativa":"..."} — 15 a 255 caracteres. Só dentro do prazo legal (24h para pleno efeito).

Carta de Correção (CC-e) cobra 1 un.

POST /nfe/{id}/carta-correcao
GET /nfe/{id}/carta-correcao

Body: {"correcao":"texto de 15 a 1000 caracteres"}. A sequência é automática (até 20 por nota). GET lista as CC-e da nota. Não corrige valores/impostos, destinatário nem datas.

Pré-visualizar · Listar · Detalhe

POST /nfe/pre-visualizar não cobra
GET /nfe ?limit&offset
GET /nfe/{id}

Pré-visualizar gera o XML/rascunho sem transmitir à SEFAZ (mesmo corpo do emitir). Listar traz o campo nfes; detalhe traz a nota + eventos.

Cancelar / CC-e
curl -X POST .../api/v1/nfe/33/cancelar \
  -H "Authorization: Bearer ace_SEU_TOKEN" \
  -d '{"justificativa":"Erro nos dados da nota fiscal"}'

curl -X POST .../api/v1/nfe/33/carta-correcao \
  -H "Authorization: Bearer ace_SEU_TOKEN" \
  -d '{"correcao":"Endereco de entrega correto: Rua X, 50"}'
$cli->nfe()->cancelar(33, 'Erro nos dados da nota');
$cli->nfe()->cartaCorrecao(33, 'Transporte por conta do dest.');
$cli->nfe()->listarCartasCorrecao(33);
$cli->nfe()->listar(50, 0);
$cli->nfe()->obter(33);
Api.Cancelar('nfe', 33, 'Erro nos dados').Free;
Api.Post('nfe/33/carta-correcao',
  JSONFromStr('{"correcao":"..."}')).Free;
CC-e · 200 · data
{ "cce_id": 4, "sequencia": 1,
  "protocolo": "133...", "status": "aprovada" }

Erros específicos da NF-e

HTTP · codeQuando
422 emissao_rejeitadaSEFAZ recusou — o motivo vem na message (ex.: "sem informação de endereço do destinatário", "CFOP interestadual e idDest ≠ 2", duplicidade). Não cobra.
422 correcao_rejeitada · correcao_invalidaCC-e recusada pela SEFAZ ou texto fora de 15–1000
422 cancelamento_rejeitado · justificativa_curtaCancelamento fora do prazo, ou justificativa < 15 caracteres
403 produto_nao_vinculado · produto_suspensoEmpresa sem o produto nfe ativo
404 nota_nao_encontrada · nota_indisponivel{id} inexistente ou sem XML/DANFE
Diferença para a NFC-e: a NF-e (55) é para venda a outra empresa/pessoa e exige destinatário completo; a NFC-e (65) é o cupom ao consumidor final, aceita anônimo e usa CSC. As duas compartilham emitente e certificado.
Erro · exemplo
{ "ok": false, "status": 422,
  "error": {
    "code": "emissao_rejeitada",
    "message": "Rejeicao 794: NF-e sem a informacao
      de endereco do destinatario" },
  "data": { "nfe_id": 34 } }