Pular para o conteúdo
KalviIBS/CBS para serviços

A regra tributária fora do seu código

Manter tabela de CST, cClassTrib, redução e calendário dentro do seu ERP significa alguém do seu time lendo nota técnica todo mês — e a conta chega quando um cliente é autuado por causa de uma tabela desatualizada.

Veja numa chamada de verdade

Nota de serviço médico, Lucro Presumido, competência de novembro de 2026:

TypeScript
import { Kalvi } from "kalvi-nfse";

const nfse = new Kalvi({ apiKey: process.env.KALVI_API_KEY });
const r = await nfse.classify({
  service_code: "04.01",
  tax_regime: "LUCRO_PRESUMIDO",
  municipality_code: "4113700",
  competence_date: "2026-11-10",
});
console.log(r.candidates[0].cClassTrib, r.candidates[0].cst, r.tables_version);

Resposta da API, recortada para caber:

JSON
{
  "api_version": "1",
  "tables_version": "2026-11-03",
  "service_code": "04.01",
  "service_description": "Medicina e biomedicina.",
  "confidence": "high",
  "candidates": [
    {
      "cst": "200",
      "cClassTrib": "200029",
      "short_name": "Fornecimento dos serviços de saúde humana (Anexo III)",
      "confidence": "high",
      "reduction": { "ibs_pct": 60, "cbs_pct": 60, "article": "art. 130" },
      "rates_status": "applied",
      "rates": {
        "ibs_uf_pct": 0.1, "ibs_mun_pct": 0, "cbs_pct": 0.9,
        "effective": { "ibs_uf_pct": 0.04, "ibs_mun_pct": 0, "cbs_pct": 0.36 },
        "year": 2026, "test_phase": true
      }
    }
  ],
  "calendar": {
    "mandatory_from": "2026-10-01",
    "simples_mandatory_from": "2027-01-01",
    "mandatory_now": true
  }
}

Os mesmos exemplos em Python e curl estão na referência da API.

Por que vale

Cinco linhas e acabou

Instala o pacote, passa o item da LC 116, o regime, o município e a competência. Recebe os candidatos com justificativa e a fonte de cada regra.

Você sabe qual tabela respondeu

Toda resposta traz a versão da tabela usada. Guarde junto do resultado e meses depois você explica por que a resposta era aquela.

Erra para o lado seguro

Quando a fonte oficial não cobre o caso, a resposta diz que não sabe. Não inventamos alíquota para preencher campo.

De onde vem a regra

A tabela vigente é a 2026-11-03 e traz 479 regras de rejeição do grupo IBS/CBS, 173 códigos cClassTrib e 539 subitens da LC 116, convertidos de 43 normas oficiais — cada regra com o ato, o artigo e a data de vigência. As mais citadas:

NFS-e nacional — Anexo B: NBS2 e Lista de Serviço Nacional v1.01 (2026-01-22)NFS-e nacional — Anexo VIII Tabela de Correlação Item LC 116 × NBS × cClassTrib × cIndOp v1.02.00 (2026-10-26)NT SE/CGNFS-e 009/2026 v1.01 (2026-10-01) — Anexo VI Leiautes e RN RTC IBS/CBS v1.04.01, planilha RN DPS_NFS-eIT 2025.002 v1.71 (NF-e) — tabelas cClassTrib, CST, cCredPres, alíquotas padrão; dados da tabela online SVRS (publicação 2026-10-30)

Toda resposta da API diz qual tables_version respondeu. O que mudou em cada versão fica em tabelas e changelog, as rejeições explicadas uma por uma em rejeições de NFS-e, e dá para conferir uma nota sua sem cadastro.

Quanto custa

Grátis

comece por aqui

R$ 0

200 notas conferidas por mês

  • Sem cartão
  • API completa já no grátis
  • Até 3 chaves
  • Mesmas tabelas e as mesmas fontes dos planos pagos

Start

R$ 49,90/mês

5 mil notas conferidas por mês

  • Sem cobrança de excedente
  • Até 3 chaves
  • Pix ou cartão, sem fidelidade

Anual: R$ 499 por ano — dois meses de graça

Assinar o Start

Criar conta grátis ver todos os planos

Perguntas frequentes

O pacote tem a regra dentro?

Não. O pacote é fino: chama a API, cuida da chave, repete quando a falha é nossa e tipa a resposta. A regra fica do nosso lado, e é por isso que atualizar a tabela não exige você publicar versão nova.

Em quais linguagens dá para usar?

Em qualquer uma que faça uma chamada HTTP. Temos pacote pronto para TypeScript e exemplos em Python e curl na documentação.

O que acontece se a API cair?

O pacote repete sozinho, com espera crescente. E a chamada que falhou por culpa nossa não consome o seu limite: ela aparece numa coluna separada do extrato.

Dá para testar sem falar com vendedor?

É o único jeito. Cria a chave, usa as 200 chamadas por mês e decide depois. Não mandamos e-mail de venda.