Troubleshooting
Guia de resolução para os erros mais comuns na emissão de NFS-e através do Sistema Nacional (ADN).
Erros de Autenticação
E4007 - Não foi possível obter o certificado de cliente
Mensagem: Não foi possível obter o certificado de cliente.
Causa: Falha na autenticação mTLS (mutual TLS). O servidor não conseguiu validar o certificado digital.
Soluções:
- Confirme que a senha do certificado está correta
- Verifique se o certificado não está expirado
- Certifique-se de que o certificado possui a cadeia completa de certificação
# Verificar validade do certificado
import base64
from cryptography import x509
from cryptography.hazmat.backends import default_backend
pfx_b64 = "MIIOOwIBAzCC..." # Seu certificado
pfx_bytes = base64.b64decode(pfx_b64)
# Se usar openssl para verificar:
# openssl pkcs12 -in certificado.pfx -info -nokeys
Erros de Ambiente
E0006 - Ambiente diverge
Mensagem: Ambiente informado diverge do ambiente de recebimento para o qual o emitente enviou a DPS.
Causa: O campo tp_amb não corresponde ao ambiente configurado no conector.
Solução: O conector computa tp_amb automaticamente. Não passe este campo nos parâmetros:
# ERRADO - não passe tp_amb
params = {
"inf_dps": {
"tp_amb": "1", # Remova esta linha
...
}
}
# CORRETO - deixe o conector calcular
params = {
"inf_dps": {
# tp_amb será calculado com base no environment da conexão
...
}
}
E0037 - Município inexistente no convênio
Mensagem: O código do município emissor informado na DPS é inexistente no cadastro de convênio municipal do sistema nacional.
Causa: O município não está conveniado ao Sistema Nacional NFS-e.
Solução: Verifique se o município está conveniado:
result = run_connection_action(
"adn-nfse",
"get_by_codigo_municipio_convenio",
{"codigoMunicipio": "3304557"}
)
if result["data"]["parametros_convenio"]["aderente_ambiente_nacional"] != 1:
print("Município não está conveniado ao Sistema Nacional!")
Nota: O ambiente
producao-restrita(homologação) pode ter mais municípios conveniados do que o ambienteproducao.
Erros de Código de Tributação
E0310 - Código não existe
Mensagem: O código de tributação nacional informado não existe conforme a lista de serviços nacional do Sistema Nacional NFS-e.
Causa: O código c_trib_nac não é um código válido na lista nacional.
Solução:
- Use códigos de 6 dígitos no formato
AABBCC - Consulte a lista oficial de códigos
# Códigos válidos (exemplos)
codigos_validos = [
"010101", # Análise e desenvolvimento de sistemas
"010601", # Consultoria em informática
"170101", # Assessoria ou consultoria
"171901", # Contabilidade
]
E0312 - Código não administrado pelo município
Mensagem: O código de tributação nacional informado não está administrado pelo município de incidência do ISSQN na data de competência informada na DPS, conforme a lista de serviços nacional do Sistema Nacional NFS-e.
Causa: O código de tributação existe, mas o município não o parametrizou/administra.
Soluções:
- Entre em contato com a prefeitura do município para verificar quais códigos estão habilitados
- Use um código diferente que seja administrado pelo município
- Aguarde o município fazer a parametrização no Painel Administrativo Municipal
# Consultar alíquota para verificar se código está parametrizado
result = run_connection_action(
"adn-nfse",
"get_by_codigo_municipio_by_codigo_servico_by_competencia_aliquota",
{
"codigoMunicipio": "3304557",
"codigoServico": "01.01.01.000",
"competencia": "2025-12"
}
)
if result.get("status") == "error" and "404" in result.get("message", ""):
print("Código não está parametrizado para este município")
Importante: Este erro é muito comum porque a parametrização depende de cada município. Em ambiente de homologação, a disponibilidade de códigos pode ser diferente do ambiente de produção.
Erros de Data/Hora
E0008 - Data de emissão futura
Mensagem: A data de emissão da DPS não pode ser posterior à data do seu processamento.
Causa: O campo dh_emi tem data/hora no futuro.
Solução: O conector calcula dh_emi automaticamente. Não passe este campo:
# ERRADO
params = {
"inf_dps": {
"dh_emi": "2025-12-31T10:00:00-03:00", # Data futura
...
}
}
# CORRETO - deixe o conector calcular
params = {
"inf_dps": {
# dh_emi será a data/hora atual
...
}
}
E0009 - Data de emissão muito antiga
Mensagem: A data de emissão da DPS não pode ser anterior a X dias da data atual.
Causa: O campo dh_emi tem data muito antiga.
Solução: Emita a NFS-e com data atual. O limite geralmente é de 10 dias retroativos.
Erros de Formato
Padrão de campo inválido
Mensagem: inf_dps..serv..c_serv..c_trib_nac does not match pattern [0-9]{6}
Causa: Campo não segue o formato esperado.
Soluções por campo:
| Campo | Formato | Exemplo |
|---|---|---|
c_trib_nac | 6 dígitos numéricos | 010101 |
c_nbs | 9 dígitos numéricos | 115011000 |
cnpj | 14 dígitos numéricos | 12345678000199 |
cpf | 11 dígitos numéricos | 12345678901 |
c_loc_emi | 7 dígitos (código IBGE) | 3304557 |
serie | Numérico | 1 |
n_dps | Numérico | 1 |
Erros de Comunicação
RNG6159 - Não foi possível identificar a mensagem
Mensagem: Não foi possível identificar a mensagem de requisição.
Causa: Problema no formato do payload JSON ou na compressão GZIP/Base64.
Solução: Este erro geralmente indica problema interno do conector. Se ocorrer:
- Verifique se todos os campos obrigatórios estão presentes
- Confirme que os valores estão em formato string quando esperado
- Tente novamente após alguns minutos (pode ser instabilidade da API)
Timeout ou Connection Reset
Causa: Problemas de rede ou indisponibilidade temporária da API.
Soluções:
- Verifique sua conexão com a internet
- Tente novamente após alguns minutos
- Verifique o status do serviço no portal da NFS-e
Erros de Assinatura Digital
Assinatura inválida
Causa: Problema na geração da assinatura XMLDSig.
Soluções:
- Verifique se o certificado é válido e não está expirado
- Confirme que o certificado possui a chave privada
- Certifique-se de que o certificado é ICP-Brasil com "Autenticação do Cliente"
Dicas Gerais
1. Use ambiente de homologação primeiro
Configure environment: "producao-restrita" para testar antes de ir para produção.
2. Verifique o município antes de emitir
# Verificar convênio
result = run_connection_action(
"adn-nfse",
"get_by_codigo_municipio_convenio",
{"codigoMunicipio": codigo_municipio}
)
3. Simplifique o payload
Comece com o mínimo de campos obrigatórios e vá adicionando conforme necessário.
4. Consulte a documentação oficial
5. Analise o erro completo
O campo message do erro contém o JSON completo da resposta da API, incluindo código e descrição detalhada:
import json
result = run_connection_action("adn-nfse", "post_nfse", params)
if result.get("status") == "error":
message = result.get("message", "")
if "HTTP 400:" in message:
json_str = message.split("HTTP 400:")[1].strip()
error_data = json.loads(json_str)
for erro in error_data.get("erros", []):
print(f"Código: {erro['Codigo']}")
print(f"Descrição: {erro['Descricao']}")