Pular para o conteúdo principal
Abrir no ChatGPTAbrir no Claude

Conferir a alíquota de ICMS antes de emitir

Antes de emitir cada nota, consulte a alíquota de ICMS do NCM de cada item na UF de destino e avise quando a confianca for a_confirmar. A consulta não recebe dado da sua empresa.

Escopo consultas:lerAmbiente: sandbox

1. Um NCM​

GET /v1/icms/aliquotas?ncm=&uf=&inicio=&fim= devolve a alíquota período a período. O exemplo completo, com tratamento de 429, está em Primeira chamada:

consulta.sh
#!/bin/sh
# Consulta a alíquota de ICMS de um NCM e trata o 429 (espera o Retry-After).
# Precisa de RMF_API_URL (comece pelo sandbox) e RMF_API_KEY no ambiente. Requer curl e jq.
set -eu
: "${RMF_API_URL:?defina RMF_API_URL (sandbox: https://sandbox.api.rmfestrategia.com/v1)}"
: "${RMF_API_KEY:?defina RMF_API_KEY (chave rmf_test_ no sandbox)}"

tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT

for tentativa in 1 2 3 4 5; do
# RMF_SIMULAR_429=1 pede ao sandbox um 429 na primeira tentativa (X-Sandbox-Simular: limite), para ver a espera funcionar
simular=""; [ "$tentativa" = 1 ] && [ "${RMF_SIMULAR_429:-}" = 1 ] && simular="X-Sandbox-Simular: limite"
status=$(curl -sS -G "$RMF_API_URL/icms/aliquotas" \
--data-urlencode ncm=85414121 --data-urlencode uf=SP \
--data-urlencode inicio=2026-10 --data-urlencode fim=2026-10 \
-H "Authorization: Bearer $RMF_API_KEY" -H 'Accept: application/json' ${simular:+-H "$simular"} \
-D "$tmp/cabecalhos" -o "$tmp/corpo" -w '%{http_code}')
if [ "$status" = 429 ]; then
espera=$(awk -F': ' 'tolower($1)=="retry-after" {print int($2)}' "$tmp/cabecalhos")
echo "429: aguardando ${espera:-1}s (tentativa $tentativa)" >&2
sleep "${espera:-1}"
continue
fi
if [ "$status" -ge 400 ]; then # application/problem+json
jq -r '"\(.codigo) (\(.request_id)): \(.detail)"' "$tmp/corpo" >&2
exit 1
fi
jq -r '.periodos[0] | "aliquota_interna=\(.aliquota_interna) aliquota_st=\(.aliquota_st) confianca=\(.confianca)"' "$tmp/corpo"
exit 0
done
echo "limite_excedido: tente mais tarde" >&2
exit 1
Exemplo testado no CI contra o sandbox

2. Vários itens de uma vez​

POST /v1/icms/aliquotas/consultas aceita até 500 pares de NCM, UF e competência por chamada. Um item inválido não derruba o lote: ele volta com o erro do item (por exemplo, ncm_invalido, com a mensagem "Use 8 dígitos, sem ponto.") e os demais seguem. Acima de 500 itens a resposta é 413 lote_grande_demais.

3. Decida pela confiança​

confiancaO que fazer no seu sistema
confirmadaUse o valor
provavelUse e deixe o item visível para conferência
a_confirmarMostre um aviso ao usuário e confirme antes de usar em apuração

Guarde a versao_base junto do resultado: é o que permite reproduzir a consulta depois.

4. Veja o que a base cobre​

GET /v1/icms/cobertura mostra, por UF, o que a base cobre. Hoje só SP tem mapa da lei; as demais UFs usam a alíquota padrão do estado e, por isso, toda alíquota fora de SP sai a_confirmar, com na_st e aliquota_st nulos. A cobertura cresce com a base: consulte o endpoint em vez de fixar a lista no seu código.

Próximos passos​