> ## Documentation Index
> Fetch the complete documentation index at: https://docs.engineapi.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Combustíveis

> 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.

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 exige 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

| 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     | Tanto faz para a tributação monofásica (CST `02` e `61` valem nos dois regimes, inclusive Simples). Fora dela, o caminho provado é o **Simples Nacional** (`crt: 1`) com `csosn`. Ver [O que ainda não emite](#o-que-ainda-nao-emite) |

<h2 id="quando-o-grupo-obrigatrio">
  Quando o grupo é obrigatório
</h2>

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
```

<Warning>
  **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.
</Warning>

<Warning>
  **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.
</Warning>

## 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 theme={null}
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 theme={null}
{
  "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 theme={null}
<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 |

<Info>
  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.
</Info>

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](mailto:suporte@engineapi.com.br). A decisão foi não
expor campo fiscal sem caso de uso, não "esquecemos".

<Info>
  **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.
</Info>

## Tributação monofásica (CST 02 e 61)

Combustível não é tributado por alíquota percentual: desde a NT 2023.001 o ICMS
é **monofásico e ad rem**, isto é, um valor em **reais por unidade de medida**,
cobrado uma vez só na cadeia. No documento isso é um grupo próprio de ICMS, com
dois casos:

| Situação                                                                         | CST  | O que informar                               |
| -------------------------------------------------------------------------------- | ---- | -------------------------------------------- |
| Você é quem apura o imposto (produtor, importador, distribuidora)                | `02` | `qBCMono`, `adRemICMS`, `vICMSMono`          |
| O imposto já foi cobrado antes na cadeia: **revenda** (posto, revendedor de GLP) | `61` | `qBCMonoRet`, `adRemICMSRet`, `vICMSMonoRet` |

* **A base é QUANTIDADE, não reais.** `qBCMono`/`qBCMonoRet` é a quantidade tributada na unidade do produto (litro, quilograma).
* **A alíquota é ad rem: R\$ por unidade.** `adRemICMS`/`adRemICMSRet` não é percentual. É o valor por litro ou por quilo definido na legislação para aquele produto ANP.
* **O valor é o produto dos dois.** `vICMSMono` = `qBCMono` × `adRemICMS`. A SEFAZ refaz essa conta e rejeita a nota se o resultado diferir em mais de R\$ 0,01.
* **Vale no Simples Nacional.** A regra que proíbe CST em emissor do Simples abre exceção explícita para os CST monofásicos: um posto no Simples revende com `61`, não com CSOSN.
* **Exige o grupo `combustivel` no mesmo item.** Sem o código da ANP, o CST monofásico é proibido pela SEFAZ (rejeição `959`). Conferimos que o grupo existe; se o código ANP informado é de um produto que a SEFAZ trata como monofásico, quem confere é ela.
* **Os três campos precisam ser maiores que zero e caber no documento.** A alíquota ad rem vai até R\$ 999,9999 por unidade e a quantidade até 11 dígitos inteiros; valor que arredonda para `0,00` declara ao Fisco que não houve imposto, e é recusado antes de emitir.
* **GO exige `cBenef` no CST 61: informe o código da tabela da sua UF.** Algumas
  UFs (medido: GO) tratam o CST 61 como benefício fiscal e rejeitam a nota
  (`cStat 930`) sem o código do benefício. `items[].cBenef` é passthrough: 8 ou
  10 caracteres alfanuméricos da tabela de benefícios da sua UF, ou o literal
  `"SEM CBENEF"` quando a UF não exige nenhum. Consulte a tabela de benefícios
  fiscais da SEFAZ da sua UF para o código correto: a engineAPI não calcula
  nem confere o valor.

```json theme={null}
"items": [
  {
    "codigo": "GLP13",
    "descricao": "GAS LIQUEFEITO DE PETROLEO - BOTIJAO 13KG",
    "ncm": "27111910",
    "cBenef": "GO810003",
    "cfop": "5656",
    "unidade": "kg",
    "quantidade": 13,
    "valorUnitario": 8.45,
    "icms": {
      "origem": 0,
      "cst": "61",
      "qBCMonoRet": 13,
      "adRemICMSRet": 1.2196,
      "vICMSMonoRet": 15.85
    },
    "combustivel": {
      "cProdANP": "210203001",
      "descANP": "GLP",
      "ufConsumo": "GO",
      "pGLP": 60.5,
      "pGNn": 39.5,
      "pGNi": 0,
      "vPart": 4.35
    }
  }
]
```

No XML, `cBenef` sai no grupo `prod` (irmão de `CEST`/`CFOP`, nunca dentro do
`ICMS`), e o item traz o grupo `ICMS61` (estrutura validada contra o XSD
oficial da NF-e 4.00), com os totais monofásicos no grupo `ICMSTot`:

```xml theme={null}
<prod>
  ...
  <NCM>27111910</NCM>
  <cBenef>GO810003</cBenef>
  <CFOP>5656</CFOP>
  ...
</prod>
<imposto>
  <ICMS>
    <ICMS61>
      <orig>0</orig>
      <CST>61</CST>
      <qBCMonoRet>13.0000</qBCMonoRet>
      <adRemICMSRet>1.2196</adRemICMSRet>
      <vICMSMonoRet>15.85</vICMSMonoRet>
    </ICMS61>
  </ICMS>
</imposto>
```

### NFC-e: só o CST 61

O leiaute da NFC-e (modelo 65) tem uma lista fechada de CST, e o único
monofásico dela é o `61`. É o suficiente para o balcão do posto e da
revendedora de GLP, que é sempre revenda. Tributação monofásica **própria**
(CST `02`) sai em NF-e (modelo 55): tentar na NFC-e devolve `422` antes de
consumir número, em vez da rejeição `766` da SEFAZ.

### O que ainda não emite na monofasia

<Warning>
  **CST 15 e 53 não são suportados.** O `15` (tributação própria com
  responsabilidade por retenção do imposto do biocombustível) e o `53`
  (monofásica com diferimento) exigem campos que este contrato não expõe:
  `qBCMonoReten`, `adRemICMSReten`, `vICMSMonoReten`, `pRedAdRem`,
  `motRedAdRem`, `vICMSMonoOp`, `vICMSMonoDif`. Informar o CST ou qualquer um
  desses campos devolve `422` nomeando o motivo, em vez de emitir um documento
  incompleto. Se a sua operação precisa deles, fale com o suporte.
</Warning>

<Info>
  **A alíquota ad rem não é conferida contra a tabela da ANP.** A conferência
  oficial (a alíquota informada tem que ser a da legislação para aquele produto)
  está marcada como implementação futura na própria nota técnica, e a engineAPI
  não a antecipa. O que validamos é a coerência entre os números que você
  informou: quantidade × alíquota tem que dar o valor.
</Info>

## Erros comuns

| O que aconteceu                                                                                   | Resposta                                             | Como corrigir                                                                                                            |
| ------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| CFOP de combustível sem o bloco `combustivel` (**NF-e**)                                          | `422 COMBUSTIVEL_GRUPO_OBRIGATORIO`                  | Informe o bloco. Se o produto não é combustível, troque o CFOP. Na NFC-e a regra é opcional por UF e não recusamos antes |
| 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                                      |
| CST monofásico sem um dos três campos do grupo                                                    | `422 ICMS_MONOFASICO_INCOMPLETO` (evita `767`/`769`) | Informe quantidade, alíquota ad rem e valor juntos                                                                       |
| `vICMSMonoRet` diferente de `qBCMonoRet` × `adRemICMSRet`                                         | `422 ICMS_MONOFASICO_INVALIDO` (evita `962`/`966`)   | Refaça a conta. A alíquota é R\$ por unidade e a base é quantidade, não reais                                            |
| CST `02` numa NFC-e                                                                               | `422 ICMS_MONOFASICO_INVALIDO` (evita `766`)         | Use CST `61` (revenda) ou emita NF-e                                                                                     |
| CST monofásico sem o bloco `combustivel`                                                          | `422 ICMS_MONOFASICO_SEM_COMBUSTIVEL` (evita `959`)  | Informe o código da ANP no mesmo item                                                                                    |
| CST `15` ou `53`                                                                                  | `422 ICMS_MONOFASICO_NAO_SUPORTADO`                  | Ainda não emitimos retenção nem diferimento monofásico                                                                   |

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

<Warning>
  **ICMS por substituição tributária (CST 60 / CSOSN 500) não é suportado.**
  Combustível é ST em boa parte das UFs. No Regime Normal, o leiaute exige o
  grupo de repasse (`vBCSTRet`, `vICMSSTRet`) que este contrato não expõe;
  informar ICMS-ST manualmente devolve `422 ICMS_ST_NAO_SUPORTADO`. No
  Simples, `csosn: "500"` é válido na forma do leiaute, mas a Regra de
  Validação da NT 2024.001 exige o CEST do produto e um CFOP específico de
  retorno de ST: nenhum dos dois é resolvido automaticamente hoje, e o
  código sozinho recusa com `422 CSOSN_NAO_SUPORTADO`. Para combustível, o
  caminho natural hoje é a **tributação monofásica** (CST `02` e `61`, seção
  acima); o **Simples Nacional com `csosn: "102"`** segue valendo para o que
  não é monofásico. Se a sua operação é ST, avise o suporte antes de integrar.
</Warning>

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 os campos
`CODIF`, `qTemp`, `CIDE`, `pBio` e `origComb`. O bloco `combustivel` vale para
NF-e **e** NFC-e.

## 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`).
* **NT 2023.001** (Tributação Monofásica sobre Combustíveis), grupo N do item
  (regras `N12-20`, `N12-30`, `N12-100`, `N37a-10`, `N39-10`, `N43a-10`,
  `N45-10`) e grupo W do total (`W06b.1-10`, `W06c-10`, `W06d.1-10`,
  `W06e-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](/guides/errors): todos os `code` de negócio da API.
* [Emitir NF-e](/guides/emitir-nfe): o payload completo, campo a campo.
