C
Confisped API v1

Documentação · v1.0.0 · Maio 2026

API de Integração Confisped v1

A nova API do Confisped com Reforma Tributária 2026 nativa — CBS, IBS-UF, IBS-Mun e IS retornados em todos os endpoints. Bearer token, REST limpo, JSON moderno. Tributação ajustada automaticamente pelo perfil emissor (Indústria, Atacado, Varejo, CD) cadastrado na sua conta.

O que é

A API de Integração Confisped v1 é consumida pelo sistema (ERP, retaguarda, app) do cliente contratado. Expõe a base oficial de tributação Confisped — NCM, EAN, segmentos, alíquotas estaduais e federais — em formato JSON, ajustada ao perfil emissor cadastrado (Indústria, Atacado, Varejo ou CD).

A grande novidade da v1 é a inclusão dos tributos da Reforma Tributária 2026 (CBS, IBS-UF, IBS-Mun, IS) em todas as respostas, sem custo adicional.

⚠ API privada com Bearer token. Não é uma API aberta — só clientes com contrato vigente recebem chave. Solicite a sua pela equipe Confisped.

Reforma nativa

CBS, IBS-UF, IBS-Mun e IS em cada resposta. Vigência 2026 (informativa) + alíquotas plenas 2027+.

Bearer token

Autenticação moderna por header. Token de 64 chars, rotacionável, com cota mensal e escopo configurável.

50.000 reqs/mês

Cota padrão. Customizável por contrato. Counter resetado mensalmente. Sem cobrança por overage — só bloqueio.

Perfil do Emissor — automático pelo cadastro

A tributação retornada nas consultas varia conforme o perfil emissor da sua empresa. Você não passa o perfil em cada requisição — ele é lido do cadastro do seu tenant na Confisped e aplicado automaticamente. Para alterar perfil, atualize o cadastro com o suporte.

INDUSTRIA
  • Recolhe IPI nas saídas
  • Cobra ICMS-ST do destinatário quando aplicável (CST 10/30)
  • PIS/COFINS plenos (concentrado se monofásico)
  • CFOPs 5101/6101 (saída de fabricação)
ATACADO
  • Recebe ICMS-ST já retido pela indústria (CST 60)
  • MVA ajustado em revendas interestaduais
  • PIS/COFINS CST 04 (zero) quando NCM é monofásico
  • Não cobra IPI · CFOPs 5102/5405
VAREJO
  • Foco em CSOSN (Simples) ou CST 60 (ST recebido)
  • DIFAL em vendas interestaduais a consumidor não-contribuinte
  • Tributos finais pra emissão de NFC-e/cupom
  • CFOP 5102 normal · 5405 com ST
CD (Central de Distribuição)
  • Transferência entre filiais — CFOP 5151/6151
  • Sem tributação efetiva no movimento (LC 87/96)
  • CST 00 · retorno simbólico via 5152
  • Identificado automaticamente via matriz_filial do cadastro

💡 Quando empresa tem perfil misto (ex: indústria que também atua no atacado), a Confisped pode emitir 2 chaves separadas, uma pra cada modalidade fiscal — entre em contato pra configurar.

Quickstart — 5 minutos

1. Solicitar chave e-mail · 2 min 2. Bearer no header Authorization: Bearer ck_... 3. Receber JSON tributação atual + Reforma
  1. 1

    Solicite sua chave

    Envie e-mail pra confisped@gmail.com informando: razão social, CNPJ, nome do sistema integrador.

  2. 2

    Teste a autenticação

    Use o endpoint /me pra confirmar que sua chave funciona:

    # bash / curl
    curl -H "Authorization: Bearer ck_SUA_CHAVE_AQUI" \
      https://srv1634928.hstgr.cloud/api/v1/me
    // Node.js (fetch nativo)
    const r = await fetch('https://srv1634928.hstgr.cloud/api/v1/me', {
      headers: { 'Authorization': 'Bearer ' + process.env.CONFISPED_TOKEN }
    });
    const json = await r.json();
    console.log(json.data);
    # Python (requests)
    import requests, os
    r = requests.get(
      'https://srv1634928.hstgr.cloud/api/v1/me',
      headers={'Authorization': f'Bearer {os.getenv("CONFISPED_TOKEN")}'}
    )
    print(r.json()['data'])
    // PHP (cURL)
    <?php
    $ch = curl_init('https://srv1634928.hstgr.cloud/api/v1/me');
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . getenv('CONFISPED_TOKEN')]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $json = json_decode(curl_exec($ch), true);
    print_r($json['data']);
  3. 3

    Faça sua primeira consulta

    Busca tributação de um NCM:

    curl -H "Authorization: Bearer ck_SUA_CHAVE_AQUI" \
      "https://srv1634928.hstgr.cloud/api/v1/produtos/ncm/3306.10.00?uf=MS"
    const r = await fetch('https://srv1634928.hstgr.cloud/api/v1/produtos/ncm/3306.10.00?uf=MS', {
      headers: { 'Authorization': 'Bearer ' + process.env.CONFISPED_TOKEN }
    });
    const json = await r.json();
    console.log(json.data.tributacao);
    import requests, os
    r = requests.get(
      'https://srv1634928.hstgr.cloud/api/v1/produtos/ncm/3306.10.00',
      headers={'Authorization': f'Bearer {os.getenv("CONFISPED_TOKEN")}'},
      params={'uf': 'MS'}
    )
    print(r.json()['data']['tributacao'])
    <?php
    $ch = curl_init('https://srv1634928.hstgr.cloud/api/v1/produtos/ncm/3306.10.00?uf=MS');
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . getenv('CONFISPED_TOKEN')]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $json = json_decode(curl_exec($ch), true);
    print_r($json['data']['tributacao']);

URL base

Todas as requisições usam a base:

https://srv1634928.hstgr.cloud/api/v1

⚠ Durante o lançamento estamos servindo do subdomínio técnico. Após estabilização migraremos pra api.confisped.com.br/v1. A URL antiga continuará respondendo por 12 meses após o anúncio.

Autenticação

Cliente envia Authorization: Bearer ck_... Middleware valida chave ativa Verifica cota mensal Carrega Tenant + perfil emissor 401 chave inválida/revogada 429 cota esgotada Mapper aplica perfil 200 JSON com tributação

Toda requisição precisa do header Authorization com sua chave no formato Bearer:

Authorization: Bearer ck_a1b2c3d4e5f6g7h8...

Sua chave começa com ck_ (Confisped Key) seguido de 64 caracteres hexadecimais. Guarde com segurança — não exponha em código cliente (browser, app mobile), use sempre no backend.

⚠ Em caso de vazamento: contacte imediatamente a equipe Confisped pra revogar e gerar nova chave. Toda revogação é instantânea.

Segurança da chave — escopo, IP, cota e expiração

Além do Bearer token, cada chave tem controles adicionais configurados pela equipe Confisped (não são autoconfiguráveis via API):

Escopo por função

A chave pode ser restrita a funções específicas (ex: só produtos). Chamada fora do escopo retorna 403 forbidden com o campo escopo_permitido na resposta. Escopo irrestrito libera todas as funções.

Allowlist de IP por chave

A chave pode ser amarrada aos servidores autorizados da sua retaguarda. Dois formatos: IP exato ("203.0.113.7") ou prefixo com * ("191.37.*"). Requisição de IP fora da lista retorna 403 forbidden ("IP não autorizado para esta chave"). Lista vazia = qualquer IP. Pra incluir/alterar IPs, solicite à equipe Confisped.

Cota mensal com reset automático

Cada chave tem contador mensal de requisições (padrão 50.000). O contador reseta automaticamente na virada do mês. Cota esgotada retorna 429 too_many_requests até o próximo mês (ou aumento de plano). Acompanhe pelo meta.cota_usada das respostas ou pelo GET /me.

Expiração e revogação

A chave pode ter data de expiração (expira_em no GET /me). Chave expirada ou revogada retorna 401 unauthorized imediatamente — a revogação é instantânea, sem período de graça.

Convenções

Resposta padrão (sucesso)

{
  "meta": {
    "request_id": "req_a1b2c3d4e5f6g7h8",
    "duration_ms": 23,
    "version": "1.0.0",
    "timestamp": "2026-05-22T14:30:00.000Z",
    "cota_mensal": 50000,
    "cota_usada": 137
  },
  "data": { /* payload do recurso */ }
}

Resposta padrão (erro)

{
  "meta": { "request_id": "req_...", "duration_ms": 5 },
  "erro": {
    "codigo": "not_found",
    "mensagem": "NCM 99999999 sem cadastro na base Confisped"
  }
}

Códigos HTTP e erros detalhados

Toda resposta de erro segue o formato { meta, erro: { codigo, mensagem } }. Use o campo erro.codigo pra tratar programaticamente — a mensagem pode mudar.

HTTPCódigoMensagem exemploAção recomendada
200(sucesso)
400invalid_ncm"NCM mal formatado..."Valide formato 4-10 dígitos antes de enviar
400invalid_uf"UF deve ter 2 letras..."Use UF maiúscula (ex: MS, SP)
400invalid_ean"EAN/GTIN deve ter 8 a 14 dígitos."Valide o EAN antes de enviar (só dígitos)
400invalid_descricao"Descrição é obrigatória (3 a 500 caracteres)."Envie descricao no body do solicitar-cadastro
400invalid_tipo_operacao"tipo_operacao inválido..."Use B2C_FINAL_PF, B2B_USO_CONSUMO, B2B_ATIVO_IMOB ou B2B_REVENDA
400invalid_valor"valor_operacao deve ser número positivo."Envie número > 0
400invalid_aliquota_interestadual"aliquota_interestadual deve ser número entre 0.01 e 100..."Use número (ex: 12 ou 7)
400invalid_aliquota_interna"aliquota_interna deve ser número entre 0.01 e 100..."Use número (ex: 17 ou 18)
400invalid_xml"XML não enviado ou vazio..."Envie o XML como text/xml no body ou JSON {"xml":"..."}
400invalid_tipo"tipo deve ser \"mercantil\" ou \"produto\""Corrija o query param tipo do /atualizacoes
401unauthorized"Token Bearer ausente"Adicione header Authorization: Bearer <chave>
401unauthorized"Chave inválida ou revogada"Verifique chave; gere nova se foi revogada
401unauthorized"Chave expirada"Solicite renovação ao admin
403forbidden"Conta do cliente suspensa"Regularize pagamento ou contate suporte
403forbidden"Função ... não está no escopo desta chave"Chave tem escopo restrito; solicite ampliação. Veja Segurança da chave
403forbidden"IP x.x.x.x não autorizado para esta chave"Solicite à equipe Confisped a inclusão do IP na allowlist da chave
404not_found"NCM/EAN XXX sem cadastro"Recurso não existe na base; pra EAN, use o solicitar-cadastro
404endpoint_not_found"Endpoint não existe"Verifique URL contra a doc (a resposta lista os endpoints disponíveis)
409ja_existe_global"EAN já existe na base global Confisped"Não precisa solicitar cadastro — consulte GET /produtos/ean/:ean
409ja_cadastrado"EAN já cadastrado (produto ativo)"Produto já existe no seu tenant — consulte por EAN
409solicitacao_ativa"Já existe solicitação em andamento para este EAN"Aguarde a classificação; consulte por EAN depois (202 enquanto em análise)
429too_many_requests"Cota mensal esgotada"Backoff exponencial; aguarde reset automático na virada do mês ou aumente o plano
500internal_error"Falha interna"Tente novamente em 30s; se persistir abra ticket com request_id

Endpoints

GET /me Diagnóstico

Retorna informações da chave atual — útil pra testar autenticação e ver cota disponível.

Resposta 200

{
  "meta": { ... },
  "data": {
    "chave": "ck_a1b2c3…ef8d",
    "nome": "Integração ERP Cliente X",
    "tenant": { "id": "cl...", "nome": "Empresa Y", "plano": "PRO" },
    "cota": { "mensal": 50000, "usado_mes_atual": 137, "mes_referencia": "2026-05" },
    "escopo": "irrestrito",
    "criada_em": "2026-05-22T13:00:00Z",
    "expira_em": null
  }
}
GET /produtos/ncm/{ncm} Consulta por NCM

Retorna a tributação completa do NCM informado — tributos atuais (ICMS, PIS, COFINS, IPI) e tributos da Reforma 2026 (CBS, IBS-UF, IBS-Mun, IS).

Path params

ncmNCM 4-10 dígitos (com ou sem ponto). Ex: 33061000, 3306.10.00

Query params (opcionais)

NomeValoresDefault
uf2 letras (ex: MS, SP)UF cadastrada no tenant

💡 Perfil emissor (Indústria/Atacado/Varejo/CD) e regime fiscal (Simples/Real/Presumido) não são parâmetros — saem automaticamente do cadastro do tenant dono da chave. Veja Perfis.

Exemplo de chamada

curl -H "Authorization: Bearer ck_SUA_CHAVE" \
  "https://srv1634928.hstgr.cloud/api/v1/produtos/ncm/3306.10.00?uf=MS"
const r = await fetch('https://srv1634928.hstgr.cloud/api/v1/produtos/ncm/3306.10.00?uf=MS', {
  headers: { 'Authorization': 'Bearer ' + process.env.CONFISPED_TOKEN }
});
const json = await r.json();
console.log(json.data.tributacao);
import requests, os
r = requests.get(
  'https://srv1634928.hstgr.cloud/api/v1/produtos/ncm/3306.10.00',
  headers={'Authorization': f'Bearer {os.getenv("CONFISPED_TOKEN")}'},
  params={'uf': 'MS'}
)
print(r.json()['data']['tributacao'])
<?php
$ch = curl_init('https://srv1634928.hstgr.cloud/api/v1/produtos/ncm/3306.10.00?uf=MS');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . getenv('CONFISPED_TOKEN')]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = json_decode(curl_exec($ch), true);
print_r($json['data']['tributacao']);

Resposta 200 (resumida — exemplo Atacado/Simples)

{
  "meta": { "version": "1.0.0", "duration_ms": 28, ... },
  "data": {
    "ncm": "33061000",
    "descricao": "Cremes dentais",
    "cest": "20.058.00",
    "setor": "Higiene",
    "uf_referencia": "MS",
    "emissor": {
      "perfil": "ATACADO",
      "regime": "SIMPLES",
      "uf": "MS",
      "matriz_filial": "MATRIZ"
    },
    "tributacao": {
      "atual": {
        "ipi":    { "aliquota": 0, "cobra": false, "observacao": "IPI só é recolhido pela indústria — perfil ATACADO não cobra" },
        "pis":    { "aliquota": 1.65, "cst": "01" },
        "cofins": { "aliquota": 7.60, "cst": "01" },
        "icms": {
          "regime": "SIMPLES",
          "perfil_tratamento": "ICMS_ST_RECEBIDO",
          "csosn": "500",
          "aliquota_st_recebida": 17,
          "mva_original": 35.42,
          "mva_ajustado": 41.18,
          "observacao": "ICMS já foi retido pela indústria — revendedor lança CSOSN 500"
        },
        "fcp_aliquota": 0,
        "tem_substituicao_tributaria": true
      },
      "reforma": {
        "vigencia_2026": "2026 — fase informativa...",
        "cbs": {
          "ativo": true,
          "aliquota_referencia": 8.5,
          "aliquota_2026": 0.9,
          "cst": "000",
          "cclass_trib": "000001",
          "norma_legal": "LC 214/2025 art 7º"
        },
        "ibs": {
          "uf":  { "ativo": true, "aliquota": 17.5, "cst": "000" },
          "municipio": { "ativo": true, "aliquota": 0, "codigo_ibge_municipio": "5003702" }
        },
        "is": { "aplicavel": false },
        "classificacao": { "categoria": "Padrão", "dispositivo": "Art 7º LC 214/2025" }
      }
    },
    "operacoes_sugeridas": {
      "venda_interna": "5405",
      "venda_interestadual": "6404",
      "venda_consumidor_final_interestadual": "6108",
      "observacao": "Atacado revende — CFOP indica revenda"
    }
  }
}
GET /produtos/ean/{ean} Disponível

Busca produto e tributação por código de barras (EAN/GTIN). Útil pra integração com PDV, leitor de balança, app mobile. A busca prioriza a base global Confisped e depois os produtos do seu tenant — o campo escopo indica a origem. Se o EAN não existir, solicite o cadastro via POST /produtos/ean/{ean}/solicitar-cadastro.

Path params

eanEAN/GTIN de 8 a 14 dígitos. Ex: 7894900664003

💡 Não há query params — UF, perfil emissor e regime saem do cadastro do tenant dono da chave. Só produtos aprovados (status ATIVO) são retornados; produto em auditoria/quarentena responde 202 em_analise.

Exemplo de chamada

curl -H "Authorization: Bearer ck_SUA_CHAVE" \
  "https://srv1634928.hstgr.cloud/api/v1/produtos/ean/7894900664003"

Resposta 200 (resumida)

{
  "meta": { ... },
  "data": {
    "ean": "7894900664003",
    "descricao": "Refresco lata 350ml — marca X",
    "ncm": "22021000",
    "cest": "03.007.00",
    "status": "ATIVO",
    "escopo": "global",   /* "global" (base Confisped) ou "cliente" (produto do seu tenant) */
    "confianca": "ALTA",
    "fonte": "ROBO_CAD",
    "atualizado_em": "2026-07-01T12:00:00.000Z",
    "tributacao": {
      "atual":   { /* ICMS, PIS, COFINS, IPI — mesmo formato do /produtos/ncm */ },
      "reforma": { /* CBS, IBS-UF, IBS-Mun, IS */ }
    }
  }
}

O bloco tributacao vem preenchido quando o produto tem NCM com cadastro Mercantil ativo; caso contrário retorna null.

Resposta 202 (EAN em análise)

{
  "meta": { ... },
  "ean": "7894900664003",
  "status": "em_analise",
  "mensagem": "EAN 7894900664003 está em análise/classificação na Confisped — ainda não liberado para consulta. Tente novamente em breve."
}

Resposta 404 (EAN sem cadastro)

{
  "meta": { "request_id": "req_..." },
  "erro": {
    "codigo": "not_found",
    "mensagem": "EAN 7894900664003 não está cadastrado na base Confisped",
    "dica": "Solicite cadastro via POST /api/v1/produtos/ean/7894900664003/solicitar-cadastro"
  }
}

Erros específicos

HTTPCódigoQuando ocorre
400invalid_eanEAN/GTIN fora do formato 8 a 14 dígitos
POST /produtos/ean/{ean}/solicitar-cadastro Disponível

Solicita o cadastro tributário de um EAN que ainda não existe na base Confisped. A solicitação entra na fila do Robo_Cad (classificação automática + revisão da equipe). Retorna um protocolo — depois consulte GET /produtos/ean/{ean} pra checar (202 enquanto em análise, 200 quando aprovado).

Path params

eanEAN/GTIN de 8 a 14 dígitos

Body (JSON)

CampoTipoDescrição
descricaostringObrigatório — descrição do produto (3 a 500 caracteres)
codigo_internostring?Código interno no seu ERP (até 50 caracteres)
ncm_sugeridostring?NCM que você acredita ser o correto (até 10 dígitos) — ajuda a classificação
observacaostring?Texto livre pra equipe (até 500 caracteres)

Exemplo de chamada

curl -X POST -H "Authorization: Bearer ck_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"descricao":"Refresco lata 350ml sabor guaraná","codigo_interno":"A2","ncm_sugerido":"22021000"}' \
  "https://srv1634928.hstgr.cloud/api/v1/produtos/ean/7894900664003/solicitar-cadastro"

Resposta 201 (solicitação criada)

{
  "meta": { ... },
  "data": {
    "protocolo": "cl9x7...",
    "status": "AGUARDANDO",
    "ean": "7894900664003",
    "descricao": "Refresco lata 350ml sabor guaraná",
    "criado_em": "2026-07-09T14:30:00.000Z",
    "mensagem": "Solicitação enviada ao Robo_Cad. Consulte GET /api/v1/produtos/ean/7894900664003 depois pra checar."
  }
}

Resposta 409 (duplicidade)

{
  "meta": { ... },
  "erro": {
    "codigo": "solicitacao_ativa",   /* ou "ja_existe_global" / "ja_cadastrado" */
    "mensagem": "Já existe solicitação em andamento para este EAN",
    "produto_id": null,
    "solicitacao_id": "cl8w2..."
  }
}

Erros específicos

HTTPCódigoQuando ocorre
400invalid_eanEAN/GTIN fora do formato 8 a 14 dígitos
400invalid_descricaoDescrição ausente ou com menos de 3 caracteres (máx 500)
409ja_existe_globalEAN já existe na base global Confisped — consulte direto por EAN
409ja_cadastradoEAN já cadastrado como produto ativo no seu tenant
409solicitacao_ativaJá existe solicitação em andamento pra este EAN — aguarde a classificação
POST /produtos/revisao Disponível

Revisão fiscal em lote (até 300 itens). Cliente envia lista da própria base; sistema devolve tributação + flag divergencia: true se algum tributo enviado (ICMS, PIS, COFINS, NCM) diferir do cadastro Confisped.

Body (JSON array)

CampoTipoDescrição
codinternostringCódigo interno do produto no seu ERP (obrigatório)
eanstringCódigo de barras (obrigatório)
descricaostringDescrição do produto (obrigatório)
ncmstring?NCM cadastrado no seu lado (opcional — compara com o oficial)
icmsnumber?Alíquota ICMS cadastrada (opcional)
pisnumber?Alíquota PIS cadastrada (opcional)
cofinsnumber?Alíquota COFINS cadastrada (opcional)
icmsCststring?CST do ICMS (opcional)
csosnstring?CSOSN (Simples Nacional, opcional)
cfopstring?CFOP cadastrado (opcional)

Limites: 300 itens por request · 1 request a cada 30 segundos.

Exemplo de chamada

curl -X POST -H "Authorization: Bearer ck_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '[
    {"codinterno":"A1","ean":"7891000100103","descricao":"Leite Condensado","ncm":"04029900","icms":0,"pis":0,"cofins":0},
    {"codinterno":"A2","ean":"7891000051405","descricao":"Biscoito recheado","ncm":"19053100","icms":17,"pis":1.65,"cofins":7.6}
  ]' \
  "https://srv1634928.hstgr.cloud/api/v1/produtos/revisao"

Resposta 200 (resumida)

{
  "meta": { ... },
  "data": {
    "total_itens": 2,
    "com_divergencia": 1,
    "itens": [
      {
        "codinterno": "A2",
        "ncm": "19053100",
        "divergencia": true,
        "divergencias_detectadas": ["ncm", "pis"],
        "tributacao": { /* tributação oficial Confisped */ }
      }
    ]
  }
}

Erros específicos

HTTPCódigoQuando ocorre
400batch_too_largeArray com mais de 300 itens
429rate_limitedChamada antes de aguardar 30s desde a última
💡 Sugestão de uso: Recomendado pra carga inicial. Envie em lotes de 300. Persista o mercantil_id de cada resposta pra usar depois no /atualizacoes.
POST /difal/calcular Disponível

Cálculo de DIFAL (Diferencial de Alíquota do ICMS) em operações interestaduais — LC 190/2022 + EC 87/2015. Uma operação por request (body é um objeto único, não array). Retorna base de cálculo, ICMS interestadual/interno, DIFAL, FCP, responsavel pelo recolhimento e memorial com a memória de cálculo passo a passo.

Body (JSON — objeto único)

CampoTipoDescrição
uf_origemstringObrigatório — UF de origem (2 letras, ex: SP)
uf_destinostringObrigatório — UF de destino (2 letras, ex: MS)
tipo_operacaostringObrigatórioB2C_FINAL_PF (consumidor final PF → remetente recolhe), B2B_USO_CONSUMO (empresa pra consumo → destinatário recolhe), B2B_ATIVO_IMOB (ativo imobilizado → destinatário recolhe), B2B_REVENDA (revenda → sem DIFAL)
valor_operacaonumberObrigatório — valor da operação, número positivo
aliquota_interestadualnumberObrigatório — alíquota interestadual (0.01 a 100, ex: 12 ou 7)
aliquota_internanumberObrigatório — alíquota interna da UF destino (0.01 a 100, ex: 17 ou 18)
fcp_aliquotanumber?Alíquota do FCP da UF destino. Default 0
valor_com_icmsboolean?Se o valor da operação já embute ICMS (caso geral). Default true; false ativa o cálculo "por dentro" (LC 190/2022)
ncmstring?NCM do produto (até 10 dígitos) — informativo, entra no memorial e no registro persistido
persistirboolean?Se true, grava o cálculo (audit trail) e retorna calculo_id. Default false
observacaostring?Texto livre (até 500 caracteres) — entra no memorial

Exemplo de chamada

curl -X POST -H "Authorization: Bearer ck_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"uf_origem":"SP","uf_destino":"MS","tipo_operacao":"B2C_FINAL_PF","valor_operacao":1000,"aliquota_interestadual":7,"aliquota_interna":17,"fcp_aliquota":2}' \
  "https://srv1634928.hstgr.cloud/api/v1/difal/calcular"

Resposta 200 (objeto único)

{
  "meta": { ... },
  "data": {
    "calculo_id": null,   /* preenchido quando persistir=true */
    "uf_origem": "SP",
    "uf_destino": "MS",
    "tipo_operacao": "B2C_FINAL_PF",
    "responsavel": "REMETENTE",   /* REMETENTE | DESTINATARIO | NAO_APLICAVEL */
    "ncm": null,
    "base_calculo": 1000.00,
    "icms_interestadual": 70.00,
    "icms_interno": 170.00,
    "difal_calculado": 100.00,
    "fcp_calculado": 20.00,
    "total_devido": 120.00,
    "aliquotas": {
      "interestadual": 7,
      "interna": 17,
      "fcp": 2,
      "difal": 10
    },
    "memorial": "Operação: B2C — consumidor final pessoa física\nUF origem → UF destino: SP → MS\n..."
  }
}

Erros específicos

HTTPCódigoQuando ocorre
400invalid_ufuf_origem/uf_destino fora do formato 2 letras
400invalid_tipo_operacaoValor fora de B2C_FINAL_PF, B2B_USO_CONSUMO, B2B_ATIVO_IMOB, B2B_REVENDA
400invalid_valorvalor_operacao ausente, zero ou negativo
400invalid_aliquota_interestadualFora do intervalo 0.01–100
400invalid_aliquota_internaFora do intervalo 0.01–100
Observações: em B2B_REVENDA e em operação interna (origem = destino) o DIFAL não se aplica — a API retorna difal_calculado: 0 com responsavel: "NAO_APLICAVEL" e o memorial explica o motivo. O campo memorial é uma string com quebras de linha (\n) — pronta pra exibir/anexar como memória de cálculo.
GET /atualizacoes Disponível

Lista mudanças incrementais pra sincronização do seu ERP — registros da base Mercantil (tributação por NCM/UF) ou produtos (global + seu tenant) alterados desde a data informada. Rodar 1x por dia no início ou fim do dia.

Query params (opcionais)

NomeValoresDefault
sinceData/hora inicial (YYYY-MM-DD ou ISO 8601)últimas 24h
tipomercantil (tributação por NCM/UF) ou produto (EANs do seu tenant + globais)mercantil
takeQuantidade máxima de itens (até 1000)200

Exemplo de chamada

curl -H "Authorization: Bearer ck_SUA_CHAVE" \
  "https://srv1634928.hstgr.cloud/api/v1/atualizacoes?since=2026-07-08&tipo=mercantil&take=500"

Resposta 200 (tipo=mercantil)

{
  "meta": {
    "since": "2026-07-08T00:00:00.000Z",
    "tipo": "mercantil",
    "total": 42,
    "truncado": false,   /* true = tem mais páginas; avance o since pro último atualizado_em */
    ...
  },
  "data": [
    {
      "tipo": "mercantil",
      "id": "cl7k1...",
      "ncm": "22021000",
      "ncm_ex": null,
      "uf": "MS",
      "descricao": "Refrescos e refrigerantes",
      "cest": "03.007.00",
      "status": "ATIVO",
      "reforma": { "cbs": 8.5, "ibs_uf": 17.5, "ibs_municipio": 0 },
      "atualizado_em": "2026-07-08T18:22:41.000Z"
    }
  ]
}

Com tipo=produto, cada item traz ean, descricao, ncm, cest, status, escopo (global|cliente), confianca e atualizado_em. Só produtos aprovados (ATIVO) entram na lista.

Erros específicos

HTTPCódigoQuando ocorre
400invalid_tipotipo diferente de mercantil ou produto
💡 Boas práticas: Execute todos os dias automaticamente. Persista o maior atualizado_em recebido e use como since da próxima chamada. Quando meta.truncado vier true, repita a chamada avançando o since até esvaziar.
GET /divergencias Disponível

Lista divergências fiscais detectadas no Monitoramento de XMLs (upload manual, Cofre ou webhook /monitoramento/xml). Cada resultado é um XML importado com pelo menos 1 divergência, incluindo os itens divergentes com o comparativo cliente × Confisped (NCM, CEST, CFOP, alíquota ICMS).

Query params (opcionais)

NomeValoresDefault
cnpjCNPJ (só dígitos) — filtra XMLs onde o CNPJ é emissor ou destinatário. Útil pra retaguarda que atende vários clientessem filtro
sinceData/hora inicial da importação (YYYY-MM-DD ou ISO 8601)últimos 30 dias
takeQuantidade máxima de XMLs (até 500)200

🔒 O escopo é sempre o tenant da chave — o filtro cnpj não vaza dados de outros tenants.

Exemplo de chamada

curl -H "Authorization: Bearer ck_SUA_CHAVE" \
  "https://srv1634928.hstgr.cloud/api/v1/divergencias?since=2026-07-01&take=100"

Resposta 200 (resumida)

{
  "meta": { "since": "2026-07-01T00:00:00.000Z", "cnpj_filtro": null, "total": 3, "truncado": false, ... },
  "data": [
    {
      "xml_id": "cl9z4...",
      "tipo": "NFE",
      "chave_acesso": "50260731920542000106550010000012341000012349",
      "numero": "1234",
      "serie": "1",
      "emissor": { "cnpj": "31920542000106", "razao_social": "Distribuidora X LTDA" },
      "destinatario": { "cnpj": "11222333000144", "razao_social": "Mercado Y LTDA" },
      "data_emissao": "2026-07-05T10:12:00.000Z",
      "valor_total": 4520.80,
      "total_divergencias": 2,
      "importado_em": "2026-07-05T10:15:33.000Z",
      "itens_com_divergencia": [
        {
          "ean": "7894900664003",
          "codigo_produto": "A2",
          "descricao": "Refresco lata 350ml",
          "divergencias_detectadas": ["ncm", "aliq_icms"],
          "cliente":   { "ncm": "22021000", "cest": "03.007.00", "cfop": "5405", "aliq_icms": 12 },
          "confisped": { "ncm": "22021000", "cest": "03.007.00", "cfop": "5405", "aliq_icms": 17 },
          "recorrente": true,
          "resolvido": false
        }
      ]
    }
  ]
}

Cada XML retorna no máximo 50 itens divergentes. XMLs sem divergência não aparecem na lista.

GET /revisoes Disponível

Lista produtos (do seu tenant + base global) que precisam de revisão fiscal — status REVISAR ou PENDENTE. Cada item traz o motivo_revisao (aguardando classificação, confiança baixa, sem NCM etc.).

Query params (opcionais)

NomeValoresDefault
statusREVISAR, PENDENTE ou TODOSTODOS
takeQuantidade máxima de itens (até 500)100
skipOffset pra paginação0

Exemplo de chamada

curl -H "Authorization: Bearer ck_SUA_CHAVE" \
  "https://srv1634928.hstgr.cloud/api/v1/revisoes?status=PENDENTE&take=100&skip=0"

Resposta 200 (resumida)

{
  "meta": {
    "total": 248,        /* total geral pro filtro (independente da página) */
    "take": 100,
    "skip": 0,
    "truncado": true,    /* true = tem mais páginas; incremente o skip */
    ...
  },
  "data": [
    {
      "id": "cl8p3...",
      "ean": "7894900664003",
      "codigo_interno": "A2",
      "descricao": "Refresco lata 350ml",
      "ncm": null,
      "cest": null,
      "status": "PENDENTE",
      "confianca": null,
      "escopo": "cliente",
      "motivo_revisao": "Aguardando classificação inicial",
      "criado_em": "2026-07-08T09:00:00.000Z",
      "atualizado_em": "2026-07-08T09:00:00.000Z"
    }
  ]
}
POST /monitoramento/xml Disponível

Webhook de NF-e em tempo real — seu ERP/retaguarda empurra o XML da nota assim que emite/recebe, e o Monitoramento Confisped processa na mesma engine do upload manual e do Cofre, detectando divergências fiscais item a item. Idempotente: a chave de acesso da NF-e é única — reenviar o mesmo XML retorna 200 duplicado sem reprocessar.

Body — dois formatos aceitos

Content-TypeBody
text/xml ou application/xmlXML da NF-e direto no body (texto puro)
application/jsonWrapper JSON: { "xml": "<NFe>...</NFe>" }

Limite: 10 MB por request · 1 XML por chamada.

Exemplo de chamada

# XML direto no body
curl -X POST -H "Authorization: Bearer ck_SUA_CHAVE" \
  -H "Content-Type: text/xml" \
  --data-binary @nota-fiscal.xml \
  "https://srv1634928.hstgr.cloud/api/v1/monitoramento/xml"

# ou wrapper JSON
curl -X POST -H "Authorization: Bearer ck_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"xml":"<nfeProc>...</nfeProc>"}' \
  "https://srv1634928.hstgr.cloud/api/v1/monitoramento/xml"

Resposta 201 (XML processado)

{
  "meta": { ... },
  "data": {
    "ok": true,
    "xml_id": "cl9z4...",
    "chave_acesso": "50260731920542000106550010000012341000012349",
    "numero_documento": "1234",
    "tipo": "NFE",
    "total_itens": 18,
    "total_divergencias": 2,
    "mensagem": "XML processado com 2 divergência(s) fiscal(is) detectada(s)."
  }
}

Resposta 200 (duplicado — idempotência)

{
  "meta": { ... },
  "data": {
    "ok": true,
    "duplicado": true,
    "xml_id": "cl9z4...",
    "chave_acesso": "50260731920542000106550010000012341000012349",
    "mensagem": "XML já foi importado anteriormente (idempotência por chave de acesso)."
  }
}

Erros específicos

HTTPCódigoQuando ocorre
400invalid_xmlXML não enviado, vazio ou malformado (não parseável como NF-e)
💡 Fluxo sugerido: empurre cada XML na emissão/recebimento e consulte GET /divergencias periodicamente pra puxar o comparativo detalhado dos itens divergentes.
GET /apuracao/cbs Em breve PRO

Consulta apuração CBS oficial (Receita Federal) do CNPJ informado, competência informada. Disponível só pra CNPJs com procuração e-CAC ativa outorgada à Confisped. Vigência prática: a partir de jul/2026 quando a Plataforma RTC entrar em produção.

Query params

NomeObrig.Valores
cnpjsim14 dígitos (sem máscara)
competenciasimYYYY-MM (mês de apuração)

Exemplo de chamada

curl -H "Authorization: Bearer ck_SUA_CHAVE" \
  "https://srv1634928.hstgr.cloud/api/v1/apuracao/cbs?cnpj=31920542000106&competencia=2026-08"

Resposta 200 (resumida)

{
  "meta": { ... },
  "data": {
    "cnpj": "31920542000106",
    "competencia": "2026-08",
    "status": "APURADO",
    "debito_total": 12340.55,
    "credito_total": 8210.30,
    "saldo_devedor": 4130.25,
    "fonte": "Receita Federal RTC",
    "consultado_em": "2026-09-15T10:00:00Z",
    "itens": [ /* detalhamento por operação */ ]
  }
}

Erros específicos

HTTPCódigoQuando ocorre
403procuracao_inativaCNPJ sem procuração e-CAC ativa outorgada à Confisped
404competencia_indisponivelMês futuro ou anterior à vigência da Plataforma RTC
Aviso: A procuração e-CAC deve ser outorgada pelo CNPJ destinatário através do Portal e-CAC → Procurações → Confisped (CNPJ 31.920.542/0001-06). É revogável a qualquer tempo.

Novidades v1.1 — multi-empresa, PIS/COFINS explícito e lote

Perfil e regime por requisição recurso contratual

Integradores que consultam em nome de várias empresas (retaguardas/plataformas multi-cliente) podem, mediante habilitação contratual da chave, passar o contexto do emissor na própria chamada. Chaves sem essa habilitação continuam usando o perfil/regime do cadastro (o envio dos parâmetros retorna 403 perfil_por_request_nao_habilitado). Ao usar o recurso, é obrigatório identificar a empresa consultada (cnpj= ou empresa_ref=) — a identificação fica na trilha de auditoria e volta no eco.

GET /api/v1/produtos/ncm/1509.10.00?uf=RO&perfil=VAREJO&regime=real&cnpj=00000000000191
ParâmetroValoresEfeito
perfilINDUSTRIA · ATACADO · VAREJO · CDCST de PIS/COFINS na saída (mono: 04 no revendedor × 02 na indústria), IPI, CFOP
regimereal · presumido · simplesalíquotas (1,65/7,6 × 0,65/3,0) e CST × CSOSN
crt1 · 2 · 3 · 4atalho: 1/2/4 → simples; 3 → real (use regime=presumido quando for o caso)

A resposta ecoa a origem dos parâmetros para a sua trilha de auditoria:

"emissor": { "perfil": "VAREJO", "regime": "REAL", "uf": "RO",
  "origem_parametros": "request", "empresa_consultada": "00000000000191" }

Bloco pis_cofins — regime do produto inequívoco

"pis_cofins": {
  "regime_produto": "MONOFASICO",   // MONOFASICO | ALIQUOTA_ZERO | ST | TRIBUTADO
  "cst_saida": "04", "cst_entrada": "75",
  "aliquota_pis": 0, "aliquota_cofins": 0,
  "amparo_legal": "Lei 10.147/2000, art. 1º, I",   // ← chaves internas Confisped
  "vigencia": "2001-05-01"
}

CST de entrada segue a tabela oficial: 50 (com crédito, não-cumulativo), 73 (alíquota zero), 75 (monofásico). amparo_legal e vigencia são retornados apenas em chaves de integração interna Confisped — fale com o comercial para habilitar no seu plano.

Lote — POST /produtos/ncm/lote

POST /api/v1/produtos/ncm/lote
{ "ncms": ["1509.10.00", "8708.99.90", "..."], "uf": "MS", "perfil": "VAREJO", "regime": "real" }

Até 200 NCMs por chamada; cada item consome 1 unidade da cota. Itens com erro não derrubam o lote — cada um volta com data ou erro individual.

404 com semântica

O 404 agora distingue duas conclusões fiscais diferentes: ncm_inexistente_tipi (o código não existe na TIPI vigente — extinto/inválido, corrija o cadastro do produto) e sem_cadastro (existe na TIPI, mas ainda não temos a tributação na base — solicite via /produtos/ean/:ean/solicitar-cadastro). O campo ncm_existe_tipi acompanha o erro.

Sugestão de NCM — POST /produtos/sugerir interno

POST /api/v1/produtos/sugerir
{ "descricao": "AZEITE GALLO E.V. VIDRO 250ML", "ean": "5601252123456", "ncm_informado": "15091000" }

→ { "sugestoes": [
      { "ncm": "15091000", "descricao": "Azeite de oliva virgem", "confianca": 0.97, "fonte": "EAN" },
      { "ncm": "15099000", "descricao": "Outros azeites de oliva", "confianca": 0.41, "fonte": "descricao" }
    ],
    "ncm_informado_valido": true }

Motor de classificação do Robo_Cad (base verificada por EAN + modelo estatístico por descrição + validação TIPI). Disponível para integrações internas Confisped; demais chaves recebem 403 escopo_negado.

Dica de cache: use o campo atualizado_em (presente em toda resposta de NCM) para invalidar seu cache local sem adivinhação.

Boas práticas

Recomendações pra integrações robustas e econômicas em cota:

Cache local por NCM

Guarde a resposta no seu lado 24h; tributação não muda frequentemente. Use mercantil_id + atualizado_em pra invalidar.

Retry com backoff exponencial

429 e 5xx: tente em 1s, 2s, 4s, 8s (máx 5 tentativas). Nunca retry imediato.

Idempotência via request_id

Todo response tem meta.request_id. Use no log do seu lado pra correlacionar com nosso log se precisar de suporte.

Persista os IDs Confisped

Guarde ids.mercantil_id e ids.segmento_id no seu banco. Na próxima atualização de NCM, você bate na sua base sem buscar tudo de novo.

Não envie a mesma consulta em paralelo (n+1)

Se vai consultar 1000 NCMs, use lotes (endpoint POST /produtos/revisao, até 300 itens) em vez de 1000 chamadas paralelas.

Migrando da v2.0 (Figura Fiscal)?

A v1 do Confisped é a sucessora natural da v2.6 do Figura Fiscal. Mantemos suporte à v2.6 enquanto durar a transição, mas todo cliente é incentivado a migrar pelos motivos abaixo.

v2.6 (legado)

  • Auth na URL (/{id}/{cnpj}/{token}) — token vaza nos logs HTTP
  • Sem campos da Reforma (CBS/IBS/IS)
  • Campos misturados (snake_case + camelCase inconsistentes)
  • Sem request_id pra debug

v1 (recomendada)

  • Bearer token no header — não vaza nos logs do servidor
  • CBS, IBS-UF, IBS-Mun, IS em toda resposta
  • JSON consistente {meta, data} em sucesso e erro
  • request_id em toda resposta pra você dar match no nosso log
  • Cota e uso visíveis na resposta

Produtos de teste

Use estes NCMs reais cadastrados na base oficial Confisped pra validar sua integração. Substitua ck_SUA_CHAVE pelo seu token.

NCMDescriçãoEAN típicoCenário esperadoAção
3306.10.00 Cremes dentais 7896094901193 Higiene · ICMS-ST recebido (CST 60/CSOSN 500) Testar →
04029900 Leite condensado 7891000100103 Cesta básica · PIS/COFINS zero Testar →
22021000 Refresco em lata 7894900664003 Bebida adoçada · Reforma SELETIVO (IS 8%) Testar →
30049029 Medicamento referência 7891317005634 Farmácia · Lista positiva PIS/COFINS Testar →
27101259 Combustível diesel B-S10 7896001285477 Monofásico · ANP código presente Testar →
19053100 Biscoito recheado 7891000051405 Tributação normal Testar →
84713019 Notebook (bem de capital) 7898904421572 Alíquota IPI diferenciada Testar →
💡 Pra testar com sua chave use o curl/Postman da seção acima. Clicar em "Testar →" abre a URL direto no navegador e vai retornar 401 unauthorized porque o header Bearer não é enviado.

FAQ — Perguntas frequentes

Qual o limite de requisições por mês?

50.000 requisições/mês é a cota padrão por chave. O contador reseta no dia 1 de cada mês. Quando esgota, a API retorna HTTP 429 too_many_requests até o próximo reset. Plano maior está disponível sob demanda — contate a equipe comercial.

Que código de retorno terei se o NCM não tiver cadastro?

A API responde HTTP 404 com erro.codigo: "not_found". Como alternativa, sugerimos tentar GET /produtos/ean/:ean ou abrir ticket pra solicitar a inclusão do NCM na base.

Como rotacionar minha chave?

Revogue a antiga só depois que a nova estiver no ar — chaves são imediatas (não há período de graça). Fluxo recomendado: (1) crie nova chave, (2) atualize seu sistema, (3) valide tudo funcionando, (4) só então revogue a antiga.

Qual a diferença entre CBS e IBS?

CBS é federal (substitui PIS/COFINS). IBS é estadual + municipal (substitui ICMS + ISS). Os dois compõem o IVA Dual da Reforma Tributária 2026.

Atendo Indústria e Atacado ao mesmo tempo — como fazer?

Crie 2 chaves separadas (1 por perfil) e use a chave conforme a operação fiscal. A Confisped emite as chaves vinculadas ao mesmo tenant, mas com cadastros de perfil distintos.

Tenho status 429 — devo tentar de novo imediatamente?

Não. Faça backoff exponencial (1s, 2s, 4s, 8s). Se a cota esgotou no mês, só desbloqueia no mês seguinte ou via aumento de plano. Retry imediato em 429 pode levar a bloqueio adicional.

Changelog

Histórico de versões da API. Use o badge de impacto pra avaliar se precisa atualizar sua integração.

LANÇAMENTO MAIOR MENOR CORREÇÃO
VersãoDataImpactoDescrição
1.1.0 09/07/2026 MENOR Documentado POST /produtos/ean/:ean/solicitar-cadastro (cadastro via Robo_Cad com protocolo); novos endpoints POST /monitoramento/xml (webhook de NF-e, idempotente por chave de acesso) e GET /revisoes; allowlist de IP por chave (403 pra IP não autorizado); correções na doc de /difal/calcular (body/resposta reais), /atualizacoes (since/tipo/take) e /divergencias (resposta real).
1.0.0 22/05/2026 LANÇAMENTO Versão inicial com endpoints /me e /produtos/ncm/:ncm, autenticação Bearer, 4 perfis emissor, Reforma Tributária 2026 (CBS, IBS-UF, IBS-Mun, IS), matriz UF×Perfil completa.

Postman Collection

Importe nossa collection no Postman pra testar todos os endpoints com sua chave em segundos. Inclui exemplos prontos pra todos os endpoints (disponíveis + planejados).

Como importar no Postman →

Em 3 passos

  1. 1
    Baixe a collection usando o botão laranja acima. Você terá um arquivo confisped-v1.postman_collection.json.
  2. 2
    Importe no Postman: abra o Postman → File → Import → arraste o arquivo .json baixado.
  3. 3
    Edite a variável token da collection com sua chave Bearer (recebida da equipe Confisped). A variável base_url já vem preenchida com o endpoint de produção.

Suporte

E-mail técnico: confisped@gmail.com

WhatsApp comercial: (67) 9650-3250

Ao reportar problema, inclua: request_id da resposta, endpoint chamado, payload enviado (sem expor token).

Status page: Acompanhe a saúde da API em tempo real em https://stats.uptimerobot.com/Af1W3RIipE (página pública UptimeRobot).