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.
Pré-requisitos
| Item | Detalhe |
|---|---|
| Emissor cadastrado | Com certificado A1 instalado e ambienteFiscal definido |
| Código ANP do produto | 9 dígitos da tabela SIMP da ANP (ex.: 210203001 = GLP). Código inexistente na tabela é rejeitado pela SEFAZ com 761 |
| CFOP correto | Operação com combustível usa a faixa 651–667 (ex.: 5656 venda a consumidor final de combustível adquirido de terceiros) |
| Regime do emissor | Hoje 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:
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:
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 validauTribcontra o produto ANP).
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):
{
"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):
<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
| Campo | Obrigatório | Formato | Observação |
|---|---|---|---|
cProdANP | Sim | 9 dígitos | Código do produto na tabela SIMP da ANP |
descANP | Sim | 2 a 95 caracteres | Descrição do produto conforme a ANP |
ufConsumo | Sim | 2 letras | UF de consumo. "EX" para exterior |
pGLP | Só GLP | 0 a 100 | Percentual de GLP derivado de petróleo |
pGNn | Só GLP | 0 a 100 | Percentual de gás natural nacional |
pGNi | Só GLP | 0 a 100 | Percentual de gás natural importado |
vPart | Só GLP | R$, 2 casas | Valor 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 aconteceu | Resposta | Como corrigir |
|---|---|---|
CFOP de combustível sem o bloco combustivel | 422 COMBUSTIVEL_GRUPO_OBRIGATORIO | Informe o bloco. Se o produto não é combustível, troque o CFOP |
GLP com pGLP + pGNn + pGNi diferente de 100 nas 4 casas do documento | 422 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,00 | 422 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 kg | 422 COMBUSTIVEL_INVALIDO (evita a rejeição 854) | Use "unidade": "kg" e a quantidade em quilogramas |
| Percentuais de GLP em outro produto ANP | 422 COMBUSTIVEL_INVALIDO (evita a rejeição 461) | Remova os percentuais ou corrija o cProdANP |
cProdANP com 9 dígitos, mas todos zeros | 422 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_INVALIDO | Use a sigla de 2 letras da UF de consumo |
Campo do leiaute fora deste contrato (CODIF, qTemp, CIDE, encerrante, pBio, origComb) | 400 nomeando o campo | Remova o campo. Ele não seria escrito no documento |
cProdANP que não existe na tabela da ANP | 400 com erros[] da SEFAZ (761) | Consulte a tabela SIMP da ANP e corrija o código |
CFOP indComb = 2 sem transportador | 400 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
combdentro deprod. - Catálogo de erros: todos os
codede negócio da API. - Emitir NF-e: o payload completo, campo a campo.