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 respostas.
Os dois motivos abaixo aparecem dentro de
details.itensNaoResolvidos (NF-e/NFC-e) na
resposta 422 de Emissão assistida.
Procurando data de obrigatoriedade ou o cronograma da Reforma? Isso está em Reforma
Tributária: datas que importam.Espelho fiscal divergente
Um dos motivos possíveis dentro dedetails.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:
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.
cClassTrib
explícito resolve o caso: ele diz qual tratamento se aplica àquela mercadoria.
NCM multiclasse
Outro motivo dentro dedetails.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:
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.
Pergunta de fato para o comerciante
Para parte dos NCMs multiclasse a LC 214/2025 separa as classes por um fato que o comerciante sabe responder: para que o produto é vendido, de que tipo ele é. Nesses casos o item traz tambémconfirmacao_classe_necessaria, com a pergunta e as opções em
linguagem de fato, sem número de classe:
POST /v1/fiscal/classification/classe/confirm-merchant, enviando issuerId,
contextoId e um destes campos:
fato: o identificador da opção escolhida;resposta: o texto livre do comerciante. O motor só confirma se a resposta trouxer o fato inteiro de uma das opções; resposta parcial, contraditória ou que o motor não conseguiu ler voltastatus: pendentee nada é gravado.
cClassTrib e a fonte (artigo e item do anexo da LC 214)
que sustentam a classe, e a próxima emissão do mesmo item (mesma empresa, descrição,
código e EAN) sai com essa classe. Alguns fatos não dão classe reduzida (por exemplo,
sal sem iodo ou ração para animal de estimação): a confirmação volta pendente com o
motivo, e a saída é falar com o contador ou informar a tributação. A pergunta deixa de
valer, e o item pergunta de novo, quando as classes vigentes do NCM mudam. NCM sem um
fato da lei que separe as classes não traz pergunta: siga pelas candidatas, abaixo.
Dois códigos irmãos aparecem no mesmo lugar:
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:
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.
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.
Guardar a classe por produto
A escolha vale para o produto, não para a nota. Depois de informaribsCbs.cClassTrib numa emissão (ou confirmar no painel / em
POST /v1/fiscal/classification/classe), o motor guarda a classe no cadastro
daquele item naquele emissor. A próxima emissão do mesmo código sem a classe
no payload reusa a lembrança, desde que ela continue entre as candidatas
vigentes e seja admissível no modelo do documento.
Se o conjunto de candidatas do NCM mudar (nova classe divergente, classe
removida, alíquota alterada), a lembrança fica pendente e o 422 NCM_MULTICLASSE
volta a pedir confirmação, com a lista atualizada. Um emissor nunca herda a
escolha de outro.
Quando sua classe derruba uma classe confirmada
A classe que você informa na emissão sempre vence, inclusive quando o produto já tinha uma classe confirmada emPOST /v1/fiscal/classification/classe. A emissão não
trava, o documento sai com a classe do payload e o cadastro passa a registrar que foi
você quem a escolheu.
O que a API faz a mais nesse caso: guarda a classe que foi derrubada e devolve o
produto em GET /v1/fiscal/classification/pendentes com o motivo
deslocou_confirmada, junto da classe anterior e da data do deslocamento:
POST /v1/fiscal/classification/classe: a confirmação limpa o marcador e o item sai da
lista, valendo tanto para a classe nova quanto para a antiga.
Duas coisas que não acontecem:
- produto cuja classe anterior não estava confirmada (veio de uma emissão anterior,
origem
informado) não gera marcador nem entra na lista. É o caso comum de quem mandacClassTribem toda nota, e enchê-lo de avisos não ajudaria ninguém; - classe confirmada que é reinformada igual continua confirmada, sem marcador e fora da lista.
motivo é um campo aditivo: os valores pendente e candidatas_mudaram continuam com o
mesmo significado, e deslocou_confirmada entrou ao lado deles. cClassTribAnterior e
deslocouEm vêm null nos outros dois motivos.
Para listar as candidatas sem emitir:
candidatas[] com nome, descricao, anexo e percentuais. É o
mesmo shape do 422. garantia é sempre false.
Veja também
- Erros e respostas: o catálogo completo, RFC 7807, códigos HTTP e pré-voo do emissor.
- Cérebro Fiscal: o que é a emissão assistida e como ativar na sua conta.
- Changelog fiscal: o que é uma mudança de regra, o
422na emissão, e os ciclos dos últimos 90 dias.