API Classificações Tributárias

Fornecimento automatizado da Tabela CFF (SEFAZ-RS) com sincronização em tempo real

Visão Geral

Esta API foi construída para expor os dados estruturados de Classificação Tributária da Tabela CFF da SEFAZ, permitindo consultas automatizadas do cadastro de regras do ICMS, IBS e CBS de forma transparente e performática.

Os dados são atualizados a cada 12 horas por um processo em background diretamente dos servidores do governo.

Endpoints Disponíveis
GET
/api/classificacoes

Retorna a lista completa de classificações tributárias com seus respectivos NCMs (Anexos).


GET
/api/classificacoes/{codigo}

Consulta uma Classificação Tributária específica pelo seu código longo (ex: 515001) e seus anexos vinculados.


GET
/api/cst/{codigo}

Retorna os dados descritivos e amigáveis de uma categoria pai (CST) específica de 3 dígitos (ex: 000, 510).

Exemplo de Retorno (Sucesso - HTTP 200)
[
  {
    "CodClassTrib": "000001",
    "Cst": "000",
    "NomeCst": "Tributação integral",
    "NomeClassTrib": "Situações tributadas integralmente pelo IBS e CBS.",
    "PercRedIbs": 0.0,
    "PercRedCbs": 0.0,
    "IndNfce": true,
    "DthIniVig": "2025-05-05 00:00:00",
    "dtAtualizacaoSistema": "2026-05-04 12:05:00"
  }
]
Exemplo de Retorno (CST Amigável - /api/cst/000)
{
  "codigo": "000",
  "descricao": "Tributação integral",
  "Exige Tributação": true,
  "Reduções": {
    "BC": false,
    "Alíquota": false
  },
  "Transferência de Crédito": false,
  "Diferimento": false,
  "Monofásica": false,
  "Crédito Presumido IBS ZFM": false,
  "Ajuste de Crédito": false
}
Possíveis Erros (Falha - HTTP 500 ou 404)

Se houver alguma falha na comunicação com o banco de dados interno ou os parâmetros de configuração (data/config.json) estiverem incorretos, a API retornará o status 500 Erro Interno do Servidor com um JSON detalhando a exceção:

{
  "erro": "Erro interno de processamento",
  "mensagem": "Acesso negado para o usuário 'cclasstrib'@'...' (usando senha: SIM)"
}
Exemplos de Integração
var
  objClient: TRESTClient;
  objRequest: TRESTRequest;
  objResponse: TRESTResponse;
begin
  objClient := TRESTClient.Create('https://cff.nghc.com.br/api/classificacoes/000001');
  objRequest := TRESTRequest.Create(nil);
  objResponse := TRESTResponse.Create(nil);
  try
    objRequest.Client := objClient;
    objRequest.Response := objResponse;
    objRequest.Method := rmGET;
    objRequest.Execute;

    if (objResponse.StatusCode >= 200) and (objResponse.StatusCode <= 299) then
      Writeln(objResponse.Content)
    else
      Writeln('Erro HTTP: ', objResponse.StatusCode);
  finally
    objResponse.Free;
    objRequest.Free;
    objClient.Free;
  end;
end;
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using (var objClient = new HttpClient())
        {
            var objResponse = await objClient.GetAsync("https://cff.nghc.com.br/api/classificacoes/000001");
            
            if (objResponse.IsSuccessStatusCode)
            {
                string strContent = await objResponse.Content.ReadAsStringAsync();
                Console.WriteLine(strContent);
            }
            else
            {
                Console.WriteLine($"Erro HTTP: {(int)objResponse.StatusCode}");
            }
        }
    }
}
const https = require('https');

https.get('https://cff.nghc.com.br/api/classificacoes/000001', (objResponse) => {
  let strData = '';

  if (objResponse.statusCode < 200 || objResponse.statusCode > 299) {
    console.error(`Erro HTTP: ${objResponse.statusCode}`);
    return;
  }

  objResponse.on('data', (chunk) => {
    strData += chunk;
  });

  objResponse.on('end', () => {
    console.log(JSON.parse(strData));
  });
}).on('error', (err) => {
  console.error(`Erro: ${err.message}`);
});
import requests

objResponse = requests.get('https://cff.nghc.com.br/api/classificacoes/000001')

if objResponse.status_code >= 200 and objResponse.status_code <= 299:
    print(objResponse.json())
else:
    print(f"Erro HTTP: {objResponse.status_code}")
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpClient objClient = HttpClient.newHttpClient();
        HttpRequest objRequest = HttpRequest.newBuilder()
                .uri(URI.create("https://cff.nghc.com.br/api/classificacoes/000001"))
                .build();

        HttpResponse<String> objResponse = objClient.send(objRequest, HttpResponse.BodyHandlers.ofString());

        if (objResponse.statusCode() >= 200 && objResponse.statusCode() <= 299) {
            System.out.println(objResponse.body());
        } else {
            System.out.println("Erro HTTP: " + objResponse.statusCode());
        }
    }
}
async function fetchClassificacao(): Promise<void> {
  try {
    const objResponse = await fetch('https://cff.nghc.com.br/api/classificacoes/000001');
    
    if (!objResponse.ok) {
      console.error(`Erro HTTP: ${objResponse.status}`);
      return;
    }
    
    const objData = await objResponse.json();
    console.log(objData);
  } catch (err) {
    console.error('Erro na requisição', err);
  }
}

fetchClassificacao();
<?php
$strUrl = "https://cff.nghc.com.br/api/classificacoes/000001";
$objCh = curl_init();

curl_setopt($objCh, CURLOPT_URL, $strUrl);
curl_setopt($objCh, CURLOPT_RETURNTRANSFER, true);

$strResponse = curl_exec($objCh);
$iHttpCode = curl_getinfo($objCh, CURLINFO_HTTP_CODE);

if ($iHttpCode >= 200 && $iHttpCode <= 299) {
    echo $strResponse;
} else {
    echo "Erro HTTP: " . $iHttpCode;
}

curl_close($objCh);
?>