NFS-e de São Paulo: resumo das mudanças dos manuais 3.3.7, 3.3.8 e 3.3.9
Válido a partir de [DATA DA IMPLANTAÇÃO]. O detalhamento campo a campo, com exemplos e perguntas frequentes, está na página completa.
O essencial
- A Prefeitura de São Paulo publicou o manual 3.3.9 em 01/10/2026, já valendo.
- Nas notas com IBS e CBS, a prefeitura descarta o Valor Total Recebido informado separadamente e o preenche com o valor da nota.
- Os valores repassados a terceiros devem ir no valor da nota e sair da base de cálculo por documentos de reembolso.
- As notas enviadas sem documentos de reembolso continuam sendo emitidas como hoje, sem recusa nova. A NFE.io só recusa quando os documentos de reembolso são enviados com valores que não fecham a diferença ou com dados incompletos, mesmo que a prefeitura aceitasse a nota.
Formato recomendado (notas com IBS e CBS)
Envie o total da nota em servicesAmount e cada repasse em ibsCbs.thirdPartyReimbursements.documents, sem paidAmount.
{
"servicesAmount": 1414.22,
"ibsCbs": {
"classCode": "000001",
"thirdPartyReimbursements": {
"documents": [
{
"otherNationalDfe": { "dfeType": "1", "dfeKey": "<chave de 50 caracteres>" },
"supplier": { "type": "LegalEntity", "name": "FORNECEDOR LTDA", "federalTaxNumber": 12345678000190 },
"issueDate": "2026-10-01",
"accrualOn": "2026-10-01",
"reimbursementType": "AdAgencyMediaReimbursement",
"amount": 1386.63
}
]
}
}
}
Resultado: a NFS-e sai com R$ 1.414,22, e a base de cálculo fica em R$ 27,59.
O que a NFE.io faz com o paidAmount
Notas sem IBS e CBS (sem ibsCbs.classCode): nada muda. O paidAmount continua indo como Valor Total Recebido (ValorTotalRecebido).
Notas com IBS e CBS (com ibsCbs.classCode): o paidAmount nunca vai como Valor Total Recebido. Ele só decide o valor da nota (ValorFinalCobrado):
| Situação | O que acontece com o paidAmount | Campo que vira o valor da NFS-e |
|---|---|---|
| Não informado | — | Valor do serviço ¹ |
| Menor ou igual ao valor do serviço ¹ | Ignorado | Valor do serviço ¹ |
| Acima do valor do serviço ¹, mas não acima da receita própria ² (a diferença é só multa e juros) | Transferido | paidAmount |
| Acima da receita própria ², sem documentos de reembolso | Ignorado | Valor do serviço ¹, como a prefeitura já emite desde 01/10 |
Acima da receita própria ², com documentos cuja soma de amount é exatamente a diferença | Transferido; os documentos tiram os repasses da base | paidAmount |
| Acima da receita própria ², com documentos que não fecham a diferença | Nota recusada antes do envio, com [E1003] | — |
¹ Valor do serviço = o primeiro campo informado entre serviceAmountDetails.finalChargedAmount, serviceAmountDetails.initialChargedAmount e servicesAmount.
² Receita própria = serviceAmountDetails.finalChargedAmount, quando informado, porque ele já inclui multa e juros. Sem ele, é o valor do serviço ¹ + serviceAmountDetails.fineAmount + serviceAmountDetails.interestAmount. Com finalChargedAmount informado, o que o paidAmount passar dele é tratado como repasse.
O paidAmount no leiaute com IBS e CBS é um formato de transição. Quando o tratamento for desligado, com aviso prévio:
- o
paidAmountpassa a ser ignorado; - o valor da nota vem sempre do valor do serviço ¹.
Outras mudanças atendidas pela NFE.io
| Tema | Manual | Comportamento |
|---|---|---|
| Valor Inicial Cobrado não aceito (erro 640) | 3.3.7 | O initialChargedAmount é enviado como valor final cobrado. Não é preciso mudar a integração |
| Tributos federais (PIS, COFINS, CSLL) | 3.3.6 e 3.3.7 | pisAmount/cofinsAmount são os valores próprios. Os valores retidos vão somados como contribuições retidas, e o código de retenção é calculado automaticamente |
| Caracteres permitidos (Latin-1) | 3.3.8 | Caracteres fora do Latin-1 (emojis, aspas curvas, travessão) são recusados antes do envio, com [E1002] |
| Tamanho do endereço | XSD v02-6 | O Logradouro é cortado em 50 caracteres. O Bairro é abreviado e, se ainda passar, cortado em 30 |
| Documentos de reembolso incompletos | 3.3.9 | Recusados antes do envio, com [E1004], indicando o campo |
Mensagens da NFE.io
| Código | Quando | O que fazer |
|---|---|---|
[E1002] | Caractere fora do Latin-1 | Trocar o caractere indicado |
[E1003] | Documentos de reembolso que não fecham a diferença entre o paidAmount e o valor do serviço | Ajustar os valores dos documentos |
[E1004] | Documento de reembolso incompleto | Completar o campo indicado |
Nos três casos, a nota não é enviada à prefeitura.
Recomendações
- Leiaute com IBS e CBS: passe a enviar o total em
servicesAmountcom os documentos de reembolso, sempaidAmount. - Notas emitidas desde 01/10/2026 com Valor Recebido: elas saíram com o valor do serviço, e não com o total. Avalie com a contabilidade se é preciso cancelar e emitir de novo.
- Documentação completa dos campos: Layout NFS-e com IBS/CBS.
Fontes oficiais: