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:
{
"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:
- Informe o grupo
ibsCbsdo item no payload (o mesmo shape que a emissão passthrough usa). Item comibsCbsexplícito é override do parceiro: o motor não recalcula nem consulta o espelho para ele. - 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:
{
"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 só 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:
{
"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 com422 IBSCBS_CLASSE_SEM_RESOLVEDOR; cClassTribé o único campo aceito aqui. Qualquer outro (inclusivevBC) devolve400: a base de cálculo do IBS/CBS neste caminho é sempre ovProddo item, e aceitar um campo que não teria efeito seria pior que recusá-lo;- o grupo
ibsCbscompleto (comibsUf,ibsMunecbs) 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 devolve400com 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.