engineAPIengineAPI
// guias

Guia: Combustíveis (GLP, gasolina, diesel)

Como emitir NF-e de combustível com o grupo comb: código ANP, percentuais de GLP e as recusas que evitam a rejeição da SEFAZ.

Combustíveis: o grupo comb da NF-e

Vender combustível ou lubrificante muda uma coisa no payload: o item ganha o bloco combustivel, com o código do produto na ANP. Sem ele, uma NF-e com CFOP de combustível é rejeitada pela SEFAZ com 660 - CFOP de Combustível e não informado grupo de combustível.

O motor é passthrough aqui: nada é calculado, os valores que você informa são os transmitidos. O que a engineAPI faz é recusar antes o que a SEFAZ rejeitaria depois, para você não queimar número fiscal descobrindo.

Gatilho é o CFOP

CFOP de operação com combustível exige o grupo. Não é o NCM que decide

GLP tem regra própria

cProdANP 210203001: percentuais somando 100, vPart e unidade em kg

Recusa em vez de rejeição

422 local, antes da numeração: nenhum número fiscal é consumido


Pré-requisitos

ItemDetalhe
Emissor cadastradoCom certificado A1 instalado e ambienteFiscal definido
Código ANP do produto9 dígitos da tabela SIMP da ANP (ex.: 210203001 = GLP). Código inexistente na tabela é rejeitado pela SEFAZ com 761
CFOP corretoOperação com combustível usa a faixa 651–667 (ex.: 5656 venda a consumidor final de combustível adquirido de terceiros)
Regime do emissorHoje o caminho provado é o Simples Nacional (crt: 1) com csosn. Ver O que ainda não emite

Quando o grupo é obrigatório

A regra oficial (MOC 7.0, Anexo I, LA01-20) é: CFOP marcado com indComb = 1 ou 2 na Tabela CFOP exige o grupo comb. É o CFOP que decide, não o NCM.

A engineAPI recusa antes, com 422 COMBUSTIVEL_GRUPO_OBRIGATORIO, quando o item usa um desses 63 CFOP e não traz o bloco combustivel. A lista sai da coluna indComb da Tabela CFOP publicada no Portal Nacional da NF-e (extração de 04/08/2026, todos vigentes).

indComb = 1, exigem só o grupo comb:

font-mono text-sm bg-slate-800 text-[var(--eng-glow)] rounded px-1.5 py-0.5
1663 1664
2663 2664
3651 3652 3653
5653 5656 5663 5664 5665 5667
6663 6664 6665

indComb = 2, exigem o grupo comb mais a identificação do transportador:

font-mono text-sm bg-slate-800 text-[var(--eng-glow)] rounded px-1.5 py-0.5
1651 1652 1653 1657 1658 1659 1660 1661 1662
2651 2652 2653 2657 2658 2659 2660 2661 2662
3667
5651 5652 5654 5655 5657 5658 5659 5660 5661 5662 5666
6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6666 6667
7651 7654 7667

Nos CFOP indComb = 2, informe também o transportador. A regra X04-10 do MOC exige a identificação do transportador (CNPJ/CPF) na venda de combustível com esses CFOP, e a SEFAZ rejeita com 362 - Venda de combustível sem informação do Transportador. A engineAPI não recusa esse caso antes: a regra é facultativa por UF e tem três exceções (só vale para finNFe: 1, só para os códigos ANP da seção 8.11.2 do MOC, e não se aplica com transportador no exterior) que este contrato ainda não modela. Preencha transporte.transportadora.cnpjCpf nessas operações. Quando não há circulação física, o MOC admite o CNPJ do próprio emitente.

NCM de combustível com CFOP genérico não é recusado, e isso é deliberado. Um item de NCM 27111910 (GLP) com CFOP 5102 é autorizado pela SEFAZ sem o grupo comb (medido em homologação: protocolo 152260027546119). Não existe regra de validação que ligue NCM ao grupo, então não inventamos uma: recusar fecharia emissões que a SEFAZ aceita hoje. Se o seu produto é combustível, o CFOP certo é o das listas acima, e aí o grupo passa a ser exigido.


Emitindo GLP (gás de cozinha)

O caso mais regrado do leiaute. Além do código ANP, o GLP exige:

  • pGLP + pGNn + pGNi = 100 (percentuais de GLP de petróleo, gás natural nacional e gás natural importado);
  • vPart, o valor de partida por quilograma, sem ICMS;
  • unidade kg (a SEFAZ valida uTrib contra o produto ANP).
bash
curl -X POST https://api.engineapi.com.br/v1/nfe \
  -H "x-api-key: ek_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "naturezaOperacao": "Venda de combustivel a consumidor final",
    "indFinal": 1,
    "destinatario": {
      "cnpjCpf": "12345678000199",
      "nome": "Cliente Exemplo LTDA",
      "indicadorIE": 9,
      "endereco": {
        "logradouro": "Rua A", "numero": "100", "bairro": "Centro",
        "codigoMunicipio": "5211701", "municipio": "JANDAIA",
        "uf": "GO", "cep": "75950000"
      }
    },
    "items": [
      {
        "codigo": "GLP13",
        "descricao": "GAS LIQUEFEITO DE PETROLEO - BOTIJAO 13KG",
        "ncm": "27111910",
        "cfop": "5656",
        "unidade": "kg",
        "quantidade": 13,
        "valorUnitario": 8.45,
        "icms": { "origem": 0, "csosn": "102" },
        "combustivel": {
          "cProdANP": "210203001",
          "descANP": "GLP",
          "ufConsumo": "GO",
          "pGLP": 60.5,
          "pGNn": 39.5,
          "pGNi": 0,
          "vPart": 4.35
        }
      }
    ],
    "pagamentos": [{ "forma": "01", "valor": 109.85 }]
  }'

Resposta

Mesma resposta de qualquer NF-e: o grupo de combustível não muda o envelope (valores abaixo são ilustrativos; accessKey e protocol vêm da SEFAZ):

json
{
  "data": {
    "id": "3f1c8a0e-2b7d-4c11-9f2a-0d5e6c7b8a90",
    "status": "AUTHORIZED",
    "accessKey": "52260810340101000165550010000001231234567890",
    "protocol": "152260027500000",
    "number": 123,
    "series": 1
  },
  "meta": { "requestId": "req_...", "timestamp": "2026-08-04T17:13:20.000Z" }
}

O que sai no XML

O grupo vira o bloco <comb> dentro de <prod>, com a ordem exata do leiaute (estrutura validada contra o XSD oficial da NF-e 4.00):

xml
<prod>
  <cProd>GLP13</cProd>
  <NCM>27111910</NCM>
  <CFOP>5656</CFOP>
  <uCom>kg</uCom>
  <qCom>13.0000</qCom>
  <vUnCom>8.4500000000</vUnCom>
  <vProd>109.85</vProd>
  <uTrib>kg</uTrib>
  <indTot>1</indTot>
  <comb>
    <cProdANP>210203001</cProdANP>
    <descANP>GLP</descANP>
    <pGLP>60.5000</pGLP>
    <pGNn>39.5000</pGNn>
    <pGNi>0.0000</pGNi>
    <vPart>4.35</vPart>
    <UFCons>GO</UFCons>
  </comb>
</prod>

Recupere o XML autorizado com GET /v1/nfe/xml/{accessKey}: ele é o artefato real que a SEFAZ recebeu, nunca uma remontagem.


Campos do bloco combustivel

CampoObrigatórioFormatoObservação
cProdANPSim9 dígitosCódigo do produto na tabela SIMP da ANP
descANPSim2 a 95 caracteresDescrição do produto conforme a ANP
ufConsumoSim2 letrasUF de consumo. "EX" para exterior
pGLPSó GLP0 a 100Percentual de GLP derivado de petróleo
pGNnSó GLP0 a 100Percentual de gás natural nacional
pGNiSó GLP0 a 100Percentual de gás natural importado
vPartSó GLPR$, 2 casasValor de partida por quilograma, sem ICMS

Fora do GLP, informar pGLP/pGNn/pGNi/vPart devolve 422: o leiaute reserva esses campos ao cProdANP 210203001, e o gerador do documento os descartaria. Recusar é melhor do que emitir uma nota sem o que você declarou.

Não fazem parte deste contrato (ainda): CODIF, qTemp, CIDE, encerrante, pBio e origComb. Mandar qualquer um deles devolve 400 nomeando o campo, em vez de aceitar e deixar de fora do documento. Se você precisa de algum, fale com o suporte. A decisão foi não expor campo fiscal sem caso de uso, não "esquecemos".

Percentuais e vPart são validados pelo valor que vai para o documento, não pelo que você digitou. O documento carrega os percentuais com 4 casas e o vPart com 2: 33.33333 três vezes soma 100 na sua conta mas grava 99.9999 (a SEFAZ rejeitaria com 855), e vPart: 0.004 grava 0.00, que some do documento (856). Nos dois casos a API recusa antes, com COMBUSTIVEL_INVALIDO, citando o valor arredondado.


Erros comuns

O que aconteceuRespostaComo corrigir
CFOP de combustível sem o bloco combustivel422 COMBUSTIVEL_GRUPO_OBRIGATORIOInforme o bloco. Se o produto não é combustível, troque o CFOP
GLP com pGLP + pGNn + pGNi diferente de 100 nas 4 casas do documento422 COMBUSTIVEL_INVALIDO (evita a rejeição 855)Ajuste os percentuais. Campo ausente conta como zero, e a mensagem cita a soma arredondada
GLP sem vPart, com vPart: 0, ou com valor que arredonda para 0,00422 COMBUSTIVEL_INVALIDO (evita a rejeição 856)Informe o valor de partida por quilograma; ele precisa chegar a pelo menos R$ 0,01 no documento
GLP com unidade diferente de kg422 COMBUSTIVEL_INVALIDO (evita a rejeição 854)Use "unidade": "kg" e a quantidade em quilogramas
Percentuais de GLP em outro produto ANP422 COMBUSTIVEL_INVALIDO (evita a rejeição 461)Remova os percentuais ou corrija o cProdANP
cProdANP com 9 dígitos, mas todos zeros422 COMBUSTIVEL_INVALIDO (evita a rejeição 660)O grupo sumiria do documento. Informe o código real da tabela SIMP
ufConsumo que não é UF nem "EX"422 COMBUSTIVEL_INVALIDOUse a sigla de 2 letras da UF de consumo
Campo do leiaute fora deste contrato (CODIF, qTemp, CIDE, encerrante, pBio, origComb)400 nomeando o campoRemova o campo. Ele não seria escrito no documento
cProdANP que não existe na tabela da ANP400 com erros[] da SEFAZ (761)Consulte a tabela SIMP da ANP e corrija o código
CFOP indComb = 2 sem transportador400 com erros[] da SEFAZ (362)Informe transporte.transportadora. Esta a API não recusa antes, ver o aviso acima

Todos os 422 acima são locais: acontecem antes de qualquer chamada à SEFAZ e antes da numeração, então nada é emitido e nenhum número fiscal é consumido. Em lote (POST /v1/nfe/batch) o item falha no pré-voo e sai FAILED com o mesmo code, sem retry.


O que ainda não emite

ICMS por substituição tributária (CST 60 / CSOSN 500) não é suportado. Combustível é ST em boa parte das UFs, e o leiaute exige o grupo de repasse (vBCSTRet, vICMSSTRet) que este contrato não expõe. Informar ICMS-ST devolve 422 ICMS_ST_NAO_SUPORTADO. O caminho que emite hoje é o Simples Nacional com csosn: "102", e é ele que está no exemplo acima. Se a sua operação é ST, avise o suporte antes de integrar.

Também fora do contrato por ora: o grupo encerrante (leitura do bico da bomba), exigido por algumas UFs na NFC-e de posto revendedor, e o grupo comb na própria NFC-e. Hoje o bloco combustivel vale só para a NF-e (modelo 55).


Referências

  • MOC 7.0, Anexo I, grupo "LA. Item / Combustível" (regras LA01-20, LA02-10, LA03c-10, LA03c-20, LA03d-10), grupo I (I13-20) e grupo X (X04-10).
  • Tabela CFOP do Portal Nacional da NF-e (Documentos > Diversos), coluna indComb.
  • Leiaute NF-e 4.00, elemento comb dentro de prod.
  • Catálogo de erros: todos os code de negócio da API.
  • Emitir NF-e: o payload completo, campo a campo.