Documentação da API NCM
API REST em JSON, respostas e erros em português. Autenticação via header X-API-Key.
Ainda não tem key? Gere uma grátis.
⚡ Quickstart
Base URL:
https://apincm-kb2xbt7jka-rj.a.run.app Consultar um código NCM:
curl -H "X-API-Key: SUA_KEY" \
"https://apincm-kb2xbt7jka-rj.a.run.app/v1/ncm/01012100" 🔐 Autenticação
Toda requisição deve enviar a key no header X-API-Key.
A key é gerada em /api e enviada por e-mail.
X-API-Key: SUA_KEY
Toda resposta autenticada inclui os headers X-RateLimit-Limit e
X-RateLimit-Remaining com o seu limite e o saldo restante.
📚 Endpoints
GET /v1/ncm/{codigo} Free+
Detalhe de um código NCM: descrição, hierarquia (capítulo/posição/subposição) e alíquotas de IPI e II.
Parâmetros (path)
codigo— 8 dígitos, sem pontos (ex.:01012100)
Exemplo de resposta
{
"codigo": "01012100",
"codigoFormatado": "0101.21.00",
"descricao": "-- Reprodutores de raça pura",
"capitulo": 1,
"descricaoCapitulo": "Animais vivos.",
"posicao": "0101",
"descricaoPosicao": "Cavalos, asininos e muares, vivos.",
"subposicao": "0101.21",
"unidade": "UN",
"ipi": 0,
"ii": 0,
"referenciaDados": "2026-07-10T21:57:16.860Z"
}
Retorna 400 parametro_invalido se o código não tiver exatamente 8 dígitos e
404 nao_encontrado quando o código não consta na tabela vigente.
GET /v1/capitulos Free+
Lista os capítulos vigentes da tabela NCM (numerados de 1 a 99, alguns reservados/sem uso) com a contagem de códigos de cada um.
Parâmetros
Nenhum.
Exemplo de resposta
{
"total": 97,
"referenciaDados": "2026-07-10T21:57:16.860Z",
"capitulos": [
{ "numero": 1, "descricao": "Animais vivos.", "total": 82 },
{ "numero": 2, "descricao": "Carnes e miudezas, comestíveis.", "total": 82 }
]
} GET /v1/capitulos/{n} Free+
Detalhe de um capítulo: descrição e todas as posições (4 dígitos) que ele contém, com a contagem de códigos de cada posição.
Parâmetros (path)
n— número do capítulo, de 1 a 99 (ex.:85)
Exemplo de resposta
{
"numero": 1,
"descricao": "Animais vivos.",
"total": 82,
"referenciaDados": "2026-07-10T21:57:16.860Z",
"posicoes": [
{ "codigo": "0101", "descricao": "Cavalos, asininos e muares, vivos.", "total": 8 },
{ "codigo": "0102", "descricao": "Animais vivos da espécie bovina.", "total": 6 }
]
}
Retorna 400 parametro_invalido se n não estiver entre 1 e 99 e
404 nao_encontrado quando o capítulo não existe na tabela vigente.
GET /v1/ncm?busca=&pagina= Pro+
Busca textual (accent/case-insensitive) na descrição dos códigos NCM. Resposta paginada (20 por página).
Parâmetros (query)
busca— termo de busca, mínimo 2 caracteres (ex.:parafuso)pagina— página do resultado, começa em 1 (opcional)
Exemplo curl
curl -H "X-API-Key: SUA_KEY" \
"https://apincm-kb2xbt7jka-rj.a.run.app/v1/ncm?busca=parafuso&pagina=1" Exemplo de resposta
{
"total": 34,
"pagina": 1,
"totalPaginas": 2,
"porPagina": 20,
"referenciaDados": "2026-07-10T21:57:16.860Z",
"resultados": [
{
"codigo": "73181200",
"codigoFormatado": "7318.12.00",
"descricao": "-- Outros parafusos para madeira",
"capitulo": 73,
"descricaoCapitulo": "Obras de ferro fundido, ferro ou aço.",
"posicao": "7318",
"descricaoPosicao": "Parafusos, pinos ou pernos, roscados, porcas...",
"subposicao": "7318.12",
"unidade": "UN",
"ipi": 6.5,
"ii": 16
}
]
}
Retorna 400 parametro_invalido se busca tiver menos de 2 caracteres.
POST /v1/classificar Pro+
Classificador por descrição livre — sugere os NCMs mais prováveis para uma descrição de mercadoria, com um score de aderência de 0 a 1. Reduz erro de enquadramento fiscal.
Corpo (JSON)
descricao— texto livre, de 3 a 500 caracteres (ex.:"parafuso de aço inox 5mm")
Exemplo curl
curl -X POST -H "X-API-Key: SUA_KEY" -H "Content-Type: application/json" \
-d '{"descricao": "parafuso de aço inox 5mm"}' \
"https://apincm-kb2xbt7jka-rj.a.run.app/v1/classificar" Exemplo de resposta
{
"descricao": "parafuso de aço inox 5mm",
"total": 2,
"referenciaDados": "2026-07-10T21:57:16.860Z",
"sugestoes": [
{
"codigo": "73181400",
"codigoFormatado": "7318.14.00",
"descricao": "-- Parafusos autoperfurantes",
"capitulo": 73,
"descricaoCapitulo": "Obras de ferro fundido, ferro ou aço.",
"posicao": "7318",
"descricaoPosicao": "Parafusos, pinos ou pernos, roscados, porcas...",
"subposicao": "7318.14",
"unidade": "UN",
"ipi": 6.5,
"ii": 16,
"score": 0.67
}
]
}
Retorna 400 parametro_invalido se descricao estiver ausente ou fora
da faixa de 3 a 500 caracteres. Método GET nesta rota retorna
405 metodo_nao_permitido.
🚨 Códigos de erro
Erros são retornados em JSON, em português, no formato { "erro", "mensagem" }:
{
"erro": "limite_excedido",
"mensagem": "Limite de requisições atingido. Consulte X-RateLimit-Remaining ou faça upgrade do plano."
} | HTTP | Campo erro | Quando ocorre |
|---|---|---|
400 | parametro_invalido | Parâmetro ausente ou inválido (ex.: código sem 8 dígitos, capítulo fora de 1–99, descrição fora de 3–500 caracteres) |
401 | nao_autenticado | Header X-API-Key ausente |
401 | chave_invalida | Key informada não existe ou foi revogada |
403 | tier_insuficiente | Endpoint requer um plano superior ao da sua key (ex.: busca e classificador exigem Pro) |
404 | nao_encontrado | Código NCM ou capítulo inexistente na tabela vigente |
404 | rota_nao_encontrada | Caminho não corresponde a nenhum endpoint da API |
405 | metodo_nao_permitido | Método HTTP não suportado pela rota (ex.: DELETE em qualquer rota, GET em /v1/classificar) |
429 | limite_excedido | Limite do plano atingido — resposta inclui header Retry-After |
500 | erro_interno | Falha inesperada no servidor — tente novamente |
📈 Limites por plano
| Plano | Limite | Endpoints |
|---|---|---|
| Free | 50 req/mês | Consulta por código, lista e detalhe de capítulos |
| Pro | 10.000 req/dia | + busca textual (/v1/ncm?busca=) e classificador por descrição (POST /v1/classificar) |
| Business | 100.000 req/dia | Mesmos endpoints do Pro, com limite maior para uso em produção |
O plano Free reinicia mensalmente; Pro e Business reiniciam à meia-noite (horário de Brasília).
Acompanhe seu saldo pelos headers X-RateLimit-Limit e X-RateLimit-Remaining
(presentes em toda resposta autenticada) e Retry-After (presente em respostas 429).
Estourou o limite? Veja os planos Pro e Business —
os 20 primeiros ganham 50% off vitalício.
Pronto para começar?
Gerar API key grátis →