Pular para o conteúdo principal
Disponibilidade

Estes três grupos estão em liberação. Confirme com o suporte se já estão ativos na sua conta antes de alterar sua integração — enviá-los antes da liberação faz os campos serem ignorados, e a nota sai sem o grupo.

Medicamentos, rastreabilidade e retenções federais

Esta página cobre três grupos do leiaute da NF-e que costumam aparecer juntos na distribuição farmacêutica e na venda a órgãos públicos:

GrupoTagOnde entra no payload
Medicamentosmed (K01)items[].medicineDetail
Rastreabilidade de loterastro (I80)items[].trackingDetails[]
Retenção de tributos federaisretTrib (W23)totals.withheldTaxes

Medicamento e rastreabilidade são dois grupos, não um

Até 2018, lote, validade e fabricação ficavam dentro do grupo de medicamentos. A NT 2018.005 separou os dois:

  • O grupo med ficou apenas com registro ANVISA, motivo da isenção e preço máximo ao consumidor.
  • Lote, quantidade, fabricação e validade passaram para o grupo rastro, que é o mesmo usado por agrotóxicos, produtos veterinários, bebidas e embalagens.

Vale conferir esse ponto na sua modelagem: é comum a integração ser construída tratando tudo como um grupo só, o que resulta em XML recusado.

Informar medicineDetail obriga informar trackingDetails

É a regra K01-20 do Manual de Orientação ao Contribuinte. Medicamento sem os campos de rastreabilidade é recusado com a rejeição 873 ("Operação com medicamentos e não informado os campos de rastreabilidade"). Nossa API valida isso na entrada e devolve 400 com mensagem explícita, antes de enviar o documento à SEFAZ.

O caminho inverso é livre: trackingDetails sozinho é válido para qualquer produto rastreável.

Grupo de medicamentos (medicineDetail)

CampoTagObrigatórioObservação
anvisaCodecProdANVISASim11 ou 13 dígitos, ou o literal ISENTO
exemptionReasonxMotivoIsencaoNãoAté 255 caracteres. Para medicamento isento, informe o número da decisão (por exemplo, a RDC da ANVISA)
maximumPricevPMCSim no leiauteSe não houver preço tabelado, informe 0 — omitido, é emitido como 0.00

Grupo de rastreabilidade (trackingDetails)

É uma lista: aceita até 500 lotes por item. Vários lotes numa mesma linha da nota é o caso normal em distribuição hospitalar.

CampoTagObrigatórioObservação
batchNumbernLoteSim1 a 20 caracteres
batchQuantityqLoteSimMaior que zero, até 8 dígitos inteiros e 3 decimais
manufactureOndFabSimEmitido no XML como AAAA-MM-DD
expireOndValSimEmitido como AAAA-MM-DD. Se a validade não especificar o dia, informe o último dia do mês
aggregationCodecAgregNãoAté 20 caracteres

Exemplo — item de medicamento com dois lotes

{
"code": "MED-001",
"description": "FOLINATO DE CALCIO 10MG/ML 30ML INJ",
"ncm": "30045010",
"cfop": 5102,
"unit": "CX",
"quantity": 5,
"unitAmount": 120.00,
"totalAmount": 600.00,
"unitTax": "CX",
"tax": {
"icms": { "origin": "0", "cst": "00", "baseTax": 600.00, "rate": 18.00, "amount": 108.00 }
},
"medicineDetail": {
"anvisaCode": "1004310310091",
"maximumPrice": 0
},
"trackingDetails": [
{
"batchNumber": "188918",
"batchQuantity": 2.000,
"manufactureOn": "2026-06-17",
"expireOn": "2028-06-01"
},
{
"batchNumber": "190455",
"batchQuantity": 3.000,
"manufactureOn": "2026-07-02",
"expireOn": "2028-07-01"
}
]
}
Grupos de produto específico são mutuamente exclusivos — e o conflito é silencioso

O leiaute aceita no máximo um entre medicineDetail, vehicleDetail e fuelDetail por item. A API não recusa o envio de mais de um: ela resolve o conflito sozinha, na ordem de precedência medicamento → veículo → combustível, e os demais grupos simplesmente não saem no XML — sem erro e sem aviso. Garanta na sua integração que só um deles é preenchido.

O grupo trackingDetails não faz parte dessa exclusividade — ele é irmão deles e pode acompanhar qualquer um.

Retenção de tributos federais (withheldTaxes)

Aplica-se quando a fonte pagadora retém tributos federais — tipicamente a venda a órgão ou hospital público (IN SRF 480/2004; Lei 10.833/2003, arts. 30 a 36; Lei 7.450/85, art. 52).

CampoTagObservação
pisAmountvRetPISValor retido de PIS
cofinsAmountvRetCOFINSValor retido de COFINS
csllAmountvRetCSLLValor retido de CSLL
irrfBasisvBCIRRFBase de cálculo do IRRF
irrfAmountvIRRFValor retido do IRRF
socialSecurityBasisvBCRetPrevBase de cálculo da retenção da Previdência Social
socialSecurityAmountvRetPrevValor da retenção da Previdência Social

Todos os campos são opcionais e todos aceitam no máximo 13 dígitos inteiros.

Os valores são informados por você, não calculados

A plataforma não apura retenção federal. O que você enviar é o que vai para o documento. Se precisar do cálculo automático, fale com o suporte — hoje isso não é feito pela API.

Valor zero é o mesmo que não informar

O leiaute tipa esses campos de um jeito que não aceita zero0 e 0.00 são recusados pelo schema da SEFAZ. Por isso, campo com valor zero é omitido do XML, e o grupo inteiro desaparece quando nenhum valor é informado. Não é preciso tratar isso na sua integração — pode enviar zero à vontade, que a plataforma cuida de omitir.

Exemplo — totais com IRRF retido

{
"totals": {
"icms": {
"invoiceAmount": 600.00
},
"withheldTaxes": {
"irrfBasis": 600.00,
"irrfAmount": 9.00,
"pisAmount": 3.90,
"cofinsAmount": 18.00,
"csllAmount": 6.00
}
}
}
Retenção não altera o valor da nota

retTrib registra o que a fonte pagadora retém do pagamento. O valor do documento (vNF) e o total com reforma tributária (vNFTot) permanecem inalterados — mesmo comportamento do ISS retido (vISSRet).

Rejeições que esses grupos evitam

CódigoDescriçãoCausa comumRecusado antes da SEFAZ?
215Falha no schema do XMLanvisaCode fora do padrão (11/13 dígitos ou ISENTO)400 na entrada
215Falha no schema do XMLValor de retenção acima de 13 dígitos inteiros, ou negativo400 na entrada
215Falha no schema do XMLLote sem batchNumber, batchQuantity, manufactureOn ou expireOn; batchNumber acima de 20 caracteres400 na entrada
873Operação com medicamentos e não informado os campos de rastreabilidademedicineDetail enviado sem trackingDetails400 na entrada

Em todos esses casos a API recusa na entrada, com 400 e a mensagem apontando o campo — você não descobre o problema só depois da ida à SEFAZ.

Valor de retenção igual a zero não está nesta lista: ele não gera rejeição nem 400, porque a plataforma omite a tag antes de montar o XML (ver o aviso acima).

Veja também

NFE.io

A NFE.io é uma empresa de tecnologia que fornece soluções para automatizar e simplificar a emissão e gestão de notas fiscais eletrônicas. Com suas ferramentas, as empresas podem economizar tempo e reduzir erros, aumentando a eficiência e precisão do processo de emissão de notas fiscais.

Um dos principais cases de sucesso da NFE.io é a implementação da solução na empresa de transporte Rodonaves. Com a automatização da emissão e gestão de notas fiscais eletrônicas, a Rodonaves conseguiu reduzir em até 80% o tempo gasto nesse processo, o que se traduziu em uma significativa melhoria na eficiência operacional. Além disso, a empresa também conseguiu eliminar erros e atrasos na emissão de notas fiscais, o que melhorou a relação com seus clientes e aumentou a confiança dos órgãos fiscais.

Outro exemplo é a implementação da NFE.io na empresa de comércio eletrônico, a Loja Integrada. Com a automatização da emissão de notas fiscais, a Loja Integrada conseguiu aumentar a velocidade de emissão de notas em até 10 vezes, o que permitiu que a empresa atendesse a uma maior quantidade de clientes e, consequentemente, aumentar as suas vendas.

Além desses exemplos, a NFE.io também tem outros cases de sucesso com empresas de setores como indústria, construção, varejo e serviços, mostrando a versatilidade e eficácia da sua solução.

Em resumo, a NFE.io é uma empresa de tecnologia que oferece soluções para automatizar e simplificar a emissão e gestão de notas fiscais eletrônicas, ajudando as empresas a economizar tempo e reduzir erros, melhorando a eficiência e precisão do processo. Com cases de sucesso em diferentes setores, a NFE.io tem se destacado como uma empresa líder em automação fiscal.