engineAPIengineAPI
// guias

Guia: Reforma Tributária — erros de IBS/CBS

Detalhe completo dos 422 específicos da Reforma Tributária na emissão assistida: espelho fiscal divergente, NCM multiclasse e como informar cClassTrib.

Reforma Tributária: erros de IBS/CBS

Esta página é o detalhe completo dos dois motivos de 422 específicos da Reforma Tributária (IBS/CBS) dentro da emissão assistida (resolverTributacao: true). O catálogo enxuto de todos os erros da API — formato RFC 7807, tabela de códigos HTTP, pré-voo do emissor — está em Erros e Rejeições.

Os dois motivos abaixo aparecem dentro de details.itensNaoResolvidos (NFe/NFCe) na resposta 422 de Emissão assistida.


Espelho fiscal divergente

Um dos motivos possíveis dentro de details.itensNaoResolvidos. Acontece quando a redução de IBS/CBS que temos espelhada para o NCM não bate com a tabela oficial de classificação tributária para a classe (cClassTrib) daquele mesmo NCM:

json
{
  "index": 0,
  "motivo": "NCM 21069090: o espelho fiscal está divergente da tabela oficial para a classe 200003 (gravado 60/60/60, oficial 100/100/100) — informe ibsCbs.cClassTrib explicitamente ou envie a tributação manualmente. Ref.: https://docs.engineapi.com.br/guides/errors#espelho-fiscal-divergente"
}

Os números entre parênteses são, nesta ordem, IBS-UF / IBS-Municipal / CBS.

Por que recusamos antes de transmitir: a SEFAZ valida o percentual de redução de cada tributo contra o cClassTrib do item (NT 2025.002) e rejeita a combinação incoerente — cStat 1034 no IBS-UF, 1046 no IBS-Municipal, 1063 na CBS. Ou seja, o documento não chega a existir de qualquer forma. A diferença é o que você recebe: em vez de um código da SEFAZ sem contexto — produzido por um dado que está do nosso lado, não no seu payload —, você recebe este 422 local dizendo qual NCM, quais são os dois números em conflito e o que fazer. Nada é transmitido.

Como seguir agora, sem esperar a correção do dado:

  1. Informe o grupo ibsCbs do item no payload (o mesmo shape que a emissão passthrough usa). Item com ibsCbs explícito é override do parceiro: o motor não recalcula nem consulta o espelho para ele.
  2. Ou emita esse item sem resolverTributacao, com a tributação que o seu ERP já tem.

Um mesmo NCM pode pertencer a mais de um anexo de redução com tratamentos diferentes — qual deles vale depende do produto real, não do código NCM. Por isso o cClassTrib explícito resolve o caso: ele diz qual tratamento se aplica àquela mercadoria.

NCM multiclasse

Outro motivo dentro de details.itensNaoResolvidos, e o mais comum em alimento: o NCM aparece em mais de um anexo da LC 214/2025, com percentuais diferentes. Quem decide qual vale é o produto real, não o código — então o motor não escolhe sozinho:

json
{
  "index": 0,
  "code": "NCM_MULTICLASSE",
  "motivo": "NCM 21069090: este NCM aparece em mais de um anexo da LC 214/2025, com tratamentos diferentes — quem decide é o produto, não o código. Classes vigentes: 200003 (Anexo 1, IBS-UF 100%, IBS-Mun 100%, CBS 100%); 200011 (Anexo 6, IBS-UF 100%, IBS-Mun 100%, CBS 100%, depende de condição da operação); 200033 (Anexo 6, IBS-UF 60%, IBS-Mun 60%, CBS 60%). Informe ibsCbs.cClassTrib com a classe do seu produto, ou envie a tributação manualmente. Ref.: https://docs.engineapi.com.br/guides/errors#ncm-multiclasse",
  "candidatas": [
    {
      "cClassTrib": "200003",
      "nome": "Vendas de produtos destinados à alimentação humana (Anexo I)",
      "anexo": "1",
      "cst": "200",
      "pRedIBSUF": 100,
      "pRedIBSMun": 100,
      "pRedCBS": 100,
      "automatica": true,
      "motivoDescarte": null
    },
    {
      "cClassTrib": "200033",
      "nome": "Anexo VI",
      "anexo": "6",
      "cst": "200",
      "pRedIBSUF": 60,
      "pRedIBSMun": 60,
      "pRedCBS": 60,
      "automatica": true,
      "motivoDescarte": null
    }
  ]
}

candidatas traz todas as classes vigentes daquele NCM, com o anexo que as sustenta e os percentuais de cada tributo — é o suficiente para escolher sem uma segunda requisição. Quando o marcador automatica vem falso, aquela classe vale se você a informar explicitamente, porque o tratamento dela depende de um fato da operação (adquirente, destinação, habilitação) que o NCM sozinho não revela.

Dois códigos irmãos aparecem no mesmo lugar:

| code | Quando | |---|---| | NCM_MULTICLASSE | 2+ classes vigentes com tratamentos diferentes | | NCM_SEM_CLASSE_AUTOMATICA | todas as classes do NCM dependem de condição da operação, ou não são admitidas neste modelo de documento | | CCLASSTRIB_INVALIDO_PARA_NCM | você informou uma classe que não consta dos anexos vigentes daquele NCM — inclusive quando o NCM não tem anexo nenhum (tributação integral) | | CCLASSTRIB_INADMISSIVEL_NO_MODELO | você informou uma classe que a tabela oficial não admite neste modelo de documento (indNFe = 0 em NF-e, indNFCe = 0 em NFC-e). A SEFAZ rejeitaria com cStat 1025 |

Informando só a classe (ibsCbs.cClassTrib)

Para desempatar, você não precisa calcular os seis percentuais. Basta informar a classe e ligar a emissão assistida — o motor busca os percentuais oficiais dela:

json
{
  "resolverTributacao": true,
  "items": [
    { "descricao": "Preparação alimentícia", "ncm": "21069090", "quantidade": 2, "valorUnitario": 5, "ibsCbs": { "cClassTrib": "200003" } }
  ]
}

A resposta declara a classe estampada em tributacao.ibsCbs.classe, com o código, o anexo que o sustenta e a origem da escolha (informada, quando ela veio de você; resolvida, quando o motor elegeu) — o que permite auditar depois qual anexo sustentou o número que foi assinado.

Três regras deste formato:

  • ele exige "resolverTributacao": true. Sem a flag ninguém resolve os percentuais, e o grupo iria incompleto para o documento — a API recusa antes com 422 IBSCBS_CLASSE_SEM_RESOLVEDOR;
  • cClassTrib é o único campo aceito aqui. Qualquer outro (inclusive vBC) devolve 400: a base de cálculo do IBS/CBS neste caminho é sempre o vProd do item, e aceitar um campo que não teria efeito seria pior que recusá-lo;
  • o grupo ibsCbs completo (com ibsUf, ibsMun e cbs) continua sendo passthrough puro, como sempre foi: o motor não toca nele. Grupo pela metade não vira "dica" em silêncio — falha nos dois formatos e devolve 400 com a mensagem do campo que faltou.

A classe que você informa vence a eleição automática, mas não vence a tabela oficial: classe inadmissível no modelo do documento é 422 CCLASSTRIB_INADMISSIVEL_NO_MODELO (a SEFAZ rejeitaria com cStat 1025). Uma classe condicionada a fato da operação — adquirente, destinação, habilitação — é aceita em NF-e (você conhece a operação) e recusada em NFC-e, onde a tabela oficial a marca como não admitida.


Veja também