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.
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.
- 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)
- 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
- 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
- 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_filialdo 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
Solicite sua chave
Envie e-mail pra confisped@gmail.com informando: razão social, CNPJ, nome do sistema integrador.
-
2
Teste a autenticação
Use o endpoint
/mepra 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
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
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.
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.
| HTTP | Código | Mensagem exemplo | Ação recomendada |
|---|---|---|---|
200 | (sucesso) | — | — |
400 | invalid_ncm | "NCM mal formatado..." | Valide formato 4-10 dígitos antes de enviar |
400 | invalid_uf | "UF deve ter 2 letras..." | Use UF maiúscula (ex: MS, SP) |
400 | invalid_ean | "EAN/GTIN deve ter 8 a 14 dígitos." | Valide o EAN antes de enviar (só dígitos) |
400 | invalid_descricao | "Descrição é obrigatória (3 a 500 caracteres)." | Envie descricao no body do solicitar-cadastro |
400 | invalid_tipo_operacao | "tipo_operacao inválido..." | Use B2C_FINAL_PF, B2B_USO_CONSUMO, B2B_ATIVO_IMOB ou B2B_REVENDA |
400 | invalid_valor | "valor_operacao deve ser número positivo." | Envie número > 0 |
400 | invalid_aliquota_interestadual | "aliquota_interestadual deve ser número entre 0.01 e 100..." | Use número (ex: 12 ou 7) |
400 | invalid_aliquota_interna | "aliquota_interna deve ser número entre 0.01 e 100..." | Use número (ex: 17 ou 18) |
400 | invalid_xml | "XML não enviado ou vazio..." | Envie o XML como text/xml no body ou JSON {"xml":"..."} |
400 | invalid_tipo | "tipo deve ser \"mercantil\" ou \"produto\"" | Corrija o query param tipo do /atualizacoes |
401 | unauthorized | "Token Bearer ausente" | Adicione header Authorization: Bearer <chave> |
401 | unauthorized | "Chave inválida ou revogada" | Verifique chave; gere nova se foi revogada |
401 | unauthorized | "Chave expirada" | Solicite renovação ao admin |
403 | forbidden | "Conta do cliente suspensa" | Regularize pagamento ou contate suporte |
403 | forbidden | "Função ... não está no escopo desta chave" | Chave tem escopo restrito; solicite ampliação. Veja Segurança da chave |
403 | forbidden | "IP x.x.x.x não autorizado para esta chave" | Solicite à equipe Confisped a inclusão do IP na allowlist da chave |
404 | not_found | "NCM/EAN XXX sem cadastro" | Recurso não existe na base; pra EAN, use o solicitar-cadastro |
404 | endpoint_not_found | "Endpoint não existe" | Verifique URL contra a doc (a resposta lista os endpoints disponíveis) |
409 | ja_existe_global | "EAN já existe na base global Confisped" | Não precisa solicitar cadastro — consulte GET /produtos/ean/:ean |
409 | ja_cadastrado | "EAN já cadastrado (produto ativo)" | Produto já existe no seu tenant — consulte por EAN |
409 | solicitacao_ativa | "Já existe solicitação em andamento para este EAN" | Aguarde a classificação; consulte por EAN depois (202 enquanto em análise) |
429 | too_many_requests | "Cota mensal esgotada" | Backoff exponencial; aguarde reset automático na virada do mês ou aumente o plano |
500 | internal_error | "Falha interna" | Tente novamente em 30s; se persistir abra ticket com request_id |
Endpoints
/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
}
}
/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
ncm | NCM 4-10 dígitos (com ou sem ponto). Ex: 33061000, 3306.10.00 |
Query params (opcionais)
| Nome | Valores | Default |
|---|---|---|
uf | 2 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"
}
}
}
/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
ean | EAN/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
| HTTP | Código | Quando ocorre |
|---|---|---|
400 | invalid_ean | EAN/GTIN fora do formato 8 a 14 dígitos |
/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
ean | EAN/GTIN de 8 a 14 dígitos |
Body (JSON)
| Campo | Tipo | Descrição |
|---|---|---|
descricao | string | Obrigatório — descrição do produto (3 a 500 caracteres) |
codigo_interno | string? | Código interno no seu ERP (até 50 caracteres) |
ncm_sugerido | string? | NCM que você acredita ser o correto (até 10 dígitos) — ajuda a classificação |
observacao | string? | 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
| HTTP | Código | Quando ocorre |
|---|---|---|
400 | invalid_ean | EAN/GTIN fora do formato 8 a 14 dígitos |
400 | invalid_descricao | Descrição ausente ou com menos de 3 caracteres (máx 500) |
409 | ja_existe_global | EAN já existe na base global Confisped — consulte direto por EAN |
409 | ja_cadastrado | EAN já cadastrado como produto ativo no seu tenant |
409 | solicitacao_ativa | Já existe solicitação em andamento pra este EAN — aguarde a classificação |
/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)
| Campo | Tipo | Descrição |
|---|---|---|
codinterno | string | Código interno do produto no seu ERP (obrigatório) |
ean | string | Código de barras (obrigatório) |
descricao | string | Descrição do produto (obrigatório) |
ncm | string? | NCM cadastrado no seu lado (opcional — compara com o oficial) |
icms | number? | Alíquota ICMS cadastrada (opcional) |
pis | number? | Alíquota PIS cadastrada (opcional) |
cofins | number? | Alíquota COFINS cadastrada (opcional) |
icmsCst | string? | CST do ICMS (opcional) |
csosn | string? | CSOSN (Simples Nacional, opcional) |
cfop | string? | 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
| HTTP | Código | Quando ocorre |
|---|---|---|
400 | batch_too_large | Array com mais de 300 itens |
429 | rate_limited | Chamada antes de aguardar 30s desde a última |
mercantil_id de cada resposta pra usar depois no /atualizacoes.
/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)
| Campo | Tipo | Descrição |
|---|---|---|
uf_origem | string | Obrigatório — UF de origem (2 letras, ex: SP) |
uf_destino | string | Obrigatório — UF de destino (2 letras, ex: MS) |
tipo_operacao | string | Obrigatório — B2C_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_operacao | number | Obrigatório — valor da operação, número positivo |
aliquota_interestadual | number | Obrigatório — alíquota interestadual (0.01 a 100, ex: 12 ou 7) |
aliquota_interna | number | Obrigatório — alíquota interna da UF destino (0.01 a 100, ex: 17 ou 18) |
fcp_aliquota | number? | Alíquota do FCP da UF destino. Default 0 |
valor_com_icms | boolean? | Se o valor da operação já embute ICMS (caso geral). Default true; false ativa o cálculo "por dentro" (LC 190/2022) |
ncm | string? | NCM do produto (até 10 dígitos) — informativo, entra no memorial e no registro persistido |
persistir | boolean? | Se true, grava o cálculo (audit trail) e retorna calculo_id. Default false |
observacao | string? | 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
| HTTP | Código | Quando ocorre |
|---|---|---|
400 | invalid_uf | uf_origem/uf_destino fora do formato 2 letras |
400 | invalid_tipo_operacao | Valor fora de B2C_FINAL_PF, B2B_USO_CONSUMO, B2B_ATIVO_IMOB, B2B_REVENDA |
400 | invalid_valor | valor_operacao ausente, zero ou negativo |
400 | invalid_aliquota_interestadual | Fora do intervalo 0.01–100 |
400 | invalid_aliquota_interna | Fora do intervalo 0.01–100 |
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.
/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)
| Nome | Valores | Default |
|---|---|---|
since | Data/hora inicial (YYYY-MM-DD ou ISO 8601) | últimas 24h |
tipo | mercantil (tributação por NCM/UF) ou produto (EANs do seu tenant + globais) | mercantil |
take | Quantidade 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
| HTTP | Código | Quando ocorre |
|---|---|---|
400 | invalid_tipo | tipo diferente de mercantil ou produto |
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.
/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)
| Nome | Valores | Default |
|---|---|---|
cnpj | CNPJ (só dígitos) — filtra XMLs onde o CNPJ é emissor ou destinatário. Útil pra retaguarda que atende vários clientes | sem filtro |
since | Data/hora inicial da importação (YYYY-MM-DD ou ISO 8601) | últimos 30 dias |
take | Quantidade 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.
/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)
| Nome | Valores | Default |
|---|---|---|
status | REVISAR, PENDENTE ou TODOS | TODOS |
take | Quantidade máxima de itens (até 500) | 100 |
skip | Offset pra paginação | 0 |
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"
}
]
}
/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-Type | Body |
|---|---|
text/xml ou application/xml | XML da NF-e direto no body (texto puro) |
application/json | Wrapper 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
| HTTP | Código | Quando ocorre |
|---|---|---|
400 | invalid_xml | XML não enviado, vazio ou malformado (não parseável como NF-e) |
/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
| Nome | Obrig. | Valores |
|---|---|---|
cnpj | sim | 14 dígitos (sem máscara) |
competencia | sim | YYYY-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
| HTTP | Código | Quando ocorre |
|---|---|---|
403 | procuracao_inativa | CNPJ sem procuração e-CAC ativa outorgada à Confisped |
404 | competencia_indisponivel | Mês futuro ou anterior à vigência da Plataforma RTC |
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®ime=real&cnpj=00000000000191
| Parâmetro | Valores | Efeito |
|---|---|---|
| perfil | INDUSTRIA · ATACADO · VAREJO · CD | CST de PIS/COFINS na saída (mono: 04 no revendedor × 02 na indústria), IPI, CFOP |
| regime | real · presumido · simples | alíquotas (1,65/7,6 × 0,65/3,0) e CST × CSOSN |
| crt | 1 · 2 · 3 · 4 | atalho: 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_idpra 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_idem 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.
| NCM | Descrição | EAN típico | Cenário esperado | Açã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 → |
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.
| Versão | Data | Impacto | Descriçã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).
Em 3 passos
-
1
Baixe a collection usando o botão laranja acima. Você terá um arquivo
confisped-v1.postman_collection.json. -
2
Importe no Postman: abra o Postman → File → Import → arraste o arquivo
.jsonbaixado. -
3
Edite a variável
tokenda collection com sua chave Bearer (recebida da equipe Confisped). A variávelbase_urljá 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).