Dados de referência. Confirme as alíquotas vigentes na fonte oficial: receita.fazenda.gov.br

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 →