Pular para o conteúdo
Gratuita · Sem cadastro · JSON

API de Tributação IBPT por NCM e UF

Consulte a carga tributária aproximada de produtos e serviços (Lei 12.741/2012) com os dados oficiais do IBPT, um NCM por vez ou a tabela completa de um estado.

GEThttps://api-ibpt.seunegocionanuvem.com.br/api_ibpt.php?codigo=22030000&uf=SP

Recursos

Consulta por NCM

Alíquotas federal (nacional e importado), estadual e municipal de um código.

Download por estado

Todos os NCMs de uma UF em um único JSON, compactado com gzip.

Sempre atualizada

A base mantém apenas a versão vigente da tabela de cada estado.

Pública

Sem chave de acesso e com CORS liberado para uso direto no navegador.

Endpoints

GETConsulta individual

https://api-ibpt.seunegocionanuvem.com.br/api_ibpt.php?codigo={NCM}&uf={UF}
ParâmetroObrigatórioDescrição
codigoSimCódigo NCM/NBS, de 2 a 9 dígitos numéricos.
ufSimSigla do estado (ex.: SP, MG).

Exemplo de retorno 200 (valores ilustrativos):

{
  "codigo": "22030000",
  "ex": null,
  "tipo": 0,
  "descricao": "Cervejas de malte.",
  "nacionalfederal": "18.12",
  "importadosfederal": "21.30",
  "estadual": "20.00",
  "municipal": "0.00",
  "vigenciainicio": "2025-09-20",
  "vigenciafim": "2025-10-31",
  "versao": "25.2.E",
  "fonte": "IBPT/empresometro.com.br",
  "uf": "SP"
}

GETTodos os NCMs de um estado

https://api-ibpt.seunegocionanuvem.com.br/api_ibpt_json.php?uf={UF}

Retorna a versão da tabela, a UF, o total de registros e o array ncm. Use também &codigo={NCM} para filtrar um código específico. A resposta é enviada com gzip e cabeçalho ETag: reenvie-o em If-None-Match e a API responde 304 quando a tabela não mudou, evitando baixar tudo de novo.

{
  "versao": "25.2.E",
  "uf": "SP",
  "total": 12146,
  "ncm": [
    {
      "codigo": "00000000",
      "ex": null,
      "tipo": 0,
      "descricao": "PRODUTO NAO ESPECIFICADO NA LISTA DE NCM",
      "nacionalfederal": "13.45",
      "importadosfederal": "15.45",
      "estadual": "18.00",
      "municipal": "0.00",
      "vigenciainicio": "2025-09-20",
      "vigenciafim": "2025-10-31",
      "versao": "25.2.E",
      "fonte": "IBPT/empresometro.com.br",
      "uf": "SP"
    }
  ]
}

Campos do retorno

CampoDescrição
codigoCódigo NCM, NBS ou item da LC 116.
exExceção da TIPI, quando houver.
tipo0 = NCM (produto) · 1 = NBS (serviço) · 2 = LC 116 (serviço).
descricaoDescrição do item.
nacionalfederalAlíquota aproximada de tributos federais para produto nacional (%).
importadosfederalAlíquota aproximada de tributos federais para produto importado (%).
estadualAlíquota aproximada de tributos estaduais (%).
municipalAlíquota aproximada de tributos municipais (%).
vigenciainicio / vigenciafimPeríodo de validade da tabela (AAAA-MM-DD).
versaoVersão da tabela IBPT.
fonteFonte informada pelo IBPT, a ser impressa no documento fiscal.
ufEstado da consulta.

Os percentuais são enviados como texto com ponto decimal (ex.: "18.12").

Erros

Em caso de erro, o status HTTP indica o problema e o corpo segue o formato:

{
  "error": {
    "message": "UF inválida. Use uma sigla de 2 letras válida",
    "code": 400
  }
}
StatusSignificado
400Parâmetro ausente ou inválido.
404NCM não encontrado para a UF informada.
500Erro interno. Tente novamente mais tarde.
503Serviço temporariamente sobrecarregado. Aguarde os segundos indicados em Retry-After.

Exemplos de integração

<?php
$codigo = '22030000';
$uf = 'SP';

// Consulta individual
$url = 'https://api-ibpt.seunegocionanuvem.com.br/api_ibpt.php?' . http_build_query([
    'codigo' => $codigo,
    'uf'     => $uf,
]);

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Accept: application/json'],
    CURLOPT_TIMEOUT        => 15,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$data = json_decode($response, true);

if ($httpCode === 200) {
    echo "Federal (nacional): {$data['nacionalfederal']}%\n";
    echo "Estadual: {$data['estadual']}%\n";
    echo "Municipal: {$data['municipal']}%\n";
} else {
    echo "Erro {$httpCode}: " . ($data['error']['message'] ?? 'falha na consulta') . "\n";
}

// Todos os NCMs de uma UF (resposta compactada com gzip)
$ch = curl_init('https://api-ibpt.seunegocionanuvem.com.br/api_ibpt_json.php?uf=' . $uf);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING       => '', // aceita e descompacta gzip automaticamente
    CURLOPT_TIMEOUT        => 60,
]);
$json = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 200) {
    file_put_contents("ncm_{$uf}.json", $json);
    $tabela = json_decode($json, true);
    echo "Arquivo ncm_{$uf}.json salvo. Total: {$tabela['total']}\n";
}
using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        // Descompacta gzip automaticamente
        using var client = new HttpClient(new HttpClientHandler
        {
            AutomaticDecompression = DecompressionMethods.GZip
        });

        // Consulta individual
        var url = "https://api-ibpt.seunegocionanuvem.com.br/api_ibpt.php?codigo=22030000&uf=SP";
        var response = await client.GetAsync(url);
        var json = await response.Content.ReadAsStringAsync();
        using var doc = JsonDocument.Parse(json);
        var root = doc.RootElement;

        if (response.IsSuccessStatusCode)
        {
            Console.WriteLine($"Descrição: {root.GetProperty("descricao")}");
            Console.WriteLine($"Federal (nacional): {root.GetProperty("nacionalfederal")}%");
            Console.WriteLine($"Federal (importado): {root.GetProperty("importadosfederal")}%");
            Console.WriteLine($"Estadual: {root.GetProperty("estadual")}%");
            Console.WriteLine($"Municipal: {root.GetProperty("municipal")}%");
        }
        else
        {
            Console.WriteLine($"Erro {(int)response.StatusCode}: {root.GetProperty("error").GetProperty("message")}");
        }

        // Todos os NCMs de uma UF
        var jsonUf = await client.GetStringAsync("https://api-ibpt.seunegocionanuvem.com.br/api_ibpt_json.php?uf=SP");
        await File.WriteAllTextAsync("ncm_SP.json", jsonUf);
        Console.WriteLine("Arquivo ncm_SP.json salvo.");
    }
}
uses
  System.SysUtils, System.IOUtils, System.JSON,
  System.Net.HttpClient, System.Net.URLClient;

var
  Http: THTTPClient;
  Resp: IHTTPResponse;
  Data: TJSONValue;
begin
  Http := THTTPClient.Create;
  try
    // Descompacta gzip automaticamente
    Http.AutomaticDecompression := [THTTPCompressionMethod.GZip];

    // Consulta individual
    Resp := Http.Get('https://api-ibpt.seunegocionanuvem.com.br/api_ibpt.php?codigo=22030000&uf=SP');
    Data := TJSONObject.ParseJSONValue(Resp.ContentAsString(TEncoding.UTF8));
    try
      if Resp.StatusCode = 200 then
      begin
        WriteLn('Descrição: ' + Data.GetValue<string>('descricao'));
        WriteLn('Federal (nacional): ' + Data.GetValue<string>('nacionalfederal') + '%');
      end
      else
        WriteLn('Erro: ' + Data.GetValue<string>('error.message'));
    finally
      Data.Free;
    end;

    // Todos os NCMs de uma UF
    Resp := Http.Get('https://api-ibpt.seunegocionanuvem.com.br/api_ibpt_json.php?uf=SP');
    TFile.WriteAllText('ncm_SP.json', Resp.ContentAsString(TEncoding.UTF8), TEncoding.UTF8);
    WriteLn('Arquivo ncm_SP.json salvo.');
  finally
    Http.Free;
  end;
end.
// Funciona direto no navegador (CORS liberado) ou no Node.js 18+
const url = 'https://api-ibpt.seunegocionanuvem.com.br/api_ibpt.php?codigo=22030000&uf=SP';

const resposta = await fetch(url);
const dados = await resposta.json();

if (resposta.ok) {
  console.log(`Federal (nacional): ${dados.nacionalfederal}%`);
  console.log(`Estadual: ${dados.estadual}%`);
  console.log(`Municipal: ${dados.municipal}%`);
} else {
  console.error(`Erro ${resposta.status}: ${dados.error.message}`);
}

// Todos os NCMs de uma UF
const tabela = await (await fetch('https://api-ibpt.seunegocionanuvem.com.br/api_ibpt_json.php?uf=SP')).json();
console.log(`Versão ${tabela.versao}: ${tabela.total} registros`);
# Consulta individual
curl "https://api-ibpt.seunegocionanuvem.com.br/api_ibpt.php?codigo=22030000&uf=SP"

# Todos os NCMs de SP, compactado e salvo em arquivo
curl --compressed -o ncm_SP.json "https://api-ibpt.seunegocionanuvem.com.br/api_ibpt_json.php?uf=SP"

Pesquisar tributação

Consulte um NCM direto pelo navegador.

Informe de 2 a 9 dígitos numéricos.

Perguntas frequentes

Sim. A API é pública e gratuita, sem necessidade de cadastro ou chave de acesso.

Das tabelas oficiais publicadas pelo IBPT (Instituto Brasileiro de Planejamento e Tributação). A base contém apenas a versão vigente de cada estado.

Para informar ao consumidor o valor aproximado dos tributos federais, estaduais e municipais em notas e cupons fiscais, conforme a Lei 12.741/2012 (Lei da Transparência Fiscal).

Faça um GET em https://api-ibpt.seunegocionanuvem.com.br/api_ibpt_json.php?uf=SP, trocando SP pela UF desejada. O retorno é um JSON com a versão, o total de registros e a lista completa de NCMs.