Cada município configura o sistema nacional do seu jeito: se aderiu ao convênio, que alíquota de ISS vale para cada serviço, que regimes especiais e retenções existem. O ADN publica essa configuração e Nfse a expõe em leituras que devolvem o objeto de dentro da resposta, com as chaves da API como vieram.
Os parâmetros ajudam a preencher a DPS sem tentativa e erro, em especial c_trib_nac e a alíquota.
Convênio do município
{:ok, agreement} = Nfse.municipal_agreement(client, "2927408")O código do município é o de sete dígitos do IBGE (2927408 é Salvador).
Alíquota de um serviço
O código do serviço é o c_trib_nac completo, com nove dígitos: 01.04.01.000. A biblioteca aceita com ou sem pontos e monta o formato que a API exige. A competência é um Date.
{:ok, rate} = Nfse.rate(client, "2927408", "010401000", ~D[2026-11-01])
{:ok, history} = Nfse.rate_history(client, "2927408", "01.04.01.000")Regimes especiais, retenções e benefícios
{:ok, regimes} = Nfse.special_regimes(client, "2927408", "01.04.01.000", ~D[2026-11-01])
{:ok, withholdings} = Nfse.withholdings(client, "2927408", ~D[2026-11-01])
{:ok, benefit} = Nfse.benefit(client, "2927408", "0000001", ~D[2026-11-01])Erros
Argumentos malformados voltam como %Nfse.Error{kind: :validation} antes da rede, com cada caminho (c_mun, c_serv, competencia, n_beneficio):
{:error, %Nfse.Error{kind: :validation, details: details}} =
Nfse.rate(client, "292740", "0104", "2026-11-01")
details
#=> [
#=> %{path: "c_mun", error: :pattern},
#=> %{path: "c_serv", error: :length},
#=> %{path: "competencia", error: :type}
#=> ]Quando o município não tem o dado, o ADN responde 404 com uma mensagem, que vira %Nfse.Error{kind: :not_found} com o texto em messages:
case Nfse.rate(client, "2927408", "01.04.01.000", ~D[2026-11-01]) do
{:ok, rate} -> rate
{:error, %Nfse.Error{kind: :not_found, messages: [%{description: description}]}} -> description
endUma resposta 200 sem o objeto esperado é :unexpected.
O que fica de fora
As operações de alteração (POST .../{idManut}) pertencem ao próprio município e não existem na biblioteca. As chaves beneficio e regimesEspeciais da resposta são suposições, já que o swagger não as mostra e nenhuma resposta com sucesso foi vista (veja Nfse.Parametros).