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âmetro | Obrigatório | Descrição |
|---|---|---|
codigo | Sim | Código NCM/NBS, de 2 a 9 dígitos numéricos. |
uf | Sim | Sigla 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
| Campo | Descrição |
|---|---|
codigo | Código NCM, NBS ou item da LC 116. |
ex | Exceção da TIPI, quando houver. |
tipo | 0 = NCM (produto) · 1 = NBS (serviço) · 2 = LC 116 (serviço). |
descricao | Descrição do item. |
nacionalfederal | Alíquota aproximada de tributos federais para produto nacional (%). |
importadosfederal | Alíquota aproximada de tributos federais para produto importado (%). |
estadual | Alíquota aproximada de tributos estaduais (%). |
municipal | Alíquota aproximada de tributos municipais (%). |
vigenciainicio / vigenciafim | Período de validade da tabela (AAAA-MM-DD). |
versao | Versão da tabela IBPT. |
fonte | Fonte informada pelo IBPT, a ser impressa no documento fiscal. |
uf | Estado 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
}
}
| Status | Significado |
|---|---|
| 400 | Parâmetro ausente ou inválido. |
| 404 | NCM não encontrado para a UF informada. |
| 500 | Erro interno. Tente novamente mais tarde. |
| 503 | Serviç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.
Perguntas frequentes
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.