REFERÊNCIA V1 · API AUDITÁVEL

Documentação completa da Pricing API

Integre a coleta de dados fiscais, teste uma matriz de alíquotas declarada com fonte explícita e calcule preço-base com trilha auditável.

Abrir simulador Abrir OpenAPI JSON

Visão geral

URL pública: https://pricing.alessandrofortes.com.br

A API não tenta adivinhar NCM, NBS, regime, benefício, alíquota ou exceção. Ela recebe os dados declarados, indica o que falta e registra a evidência usada. Use application/json nos exemplos abaixo.

Estado atual do MVP: não há regra fiscal ativa no catálogo público. Portanto, no modo oficial uma entrada completa devolve REVISAO_FISCAL_NECESSARIA. O modo CENARIO_ALIQUOTAS_DECLARADAS é separado: ele calcula somente CBS, IBS e IS fornecidos por você, registra fonte/versão/hipótese e nunca transforma a matriz em regra vigente.

Quando houver regras ativas, a release precisará de uma aprovacaoRelease assinada em Ed25519 e do pin singular independente PRICING_RELEASE_ATIVA_HOMOLOGADA_JSON_B64. O pin fixa o id, a versao e o hash canônico da única release autorizada. Se não coincidirem, o catálogo é bloqueado; isso impede reproduzir uma release antiga ainda assinada depois que outra release foi aprovada e fixada.

Não há autenticação geral, multiempresa, rate limit ou persistência durável nesta versão. A exceção é a importação administrativa de catálogo, protegida por token. Simulações e regras importadas vivem na memória do processo: são mantidas somente as 100 memórias mais recentes e até 250 regras pendentes; uma memória antiga pode retornar 404 antes mesmo de reiniciar. Não envie dados pessoais, sigilosos ou produção real sem uma camada própria de segurança e persistência.

Comece aqui

Defina a URL uma vez para reutilizar os comandos:

export BASE_URL='https://pricing.alessandrofortes.com.br'

1. Envie o mínimo para iniciar a coleta

curl -sS -X POST "$BASE_URL/v1/simulacoes" \
  -H 'content-type: application/json' \
  --data '{
    "produto": { "descricao": "Cadeira de teste" },
    "valor": { "total": "1000.00", "moeda": "BRL" }
  }'

A resposta usa HTTP 201 e informa quais campos são necessários. Falta de dado fiscal não é erro de transporte.

{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "DADOS_FISCAIS_INSUFICIENTES",
  "resultado": {
    "elegivel": false,
    "motivo": "Dados obrigatórios pendentes.",
    "componentes": []
  },
  "perguntas": [
    {
      "campo": "dataOperacao",
      "pergunta": "Qual é a data da operação (AAAA-MM-DD)?",
      "obrigatoriaParaCalculo": true
    }
  ],
  "classificacao": {
    "sistema": null,
    "codigo": null,
    "confianca": "NAO_CLASSIFICADA"
  },
  "auditoria": {
    "memoria": "/v1/simulacoes/3fa85f64-5717-4562-b3fc-2c963f66afa6/memoria",
    "versaoMotor": "0.4.0"
  }
}

2. Reenvie o cenário preenchido

Reenvie o objeto completo depois de responder às perguntas. Não há atualização pelo mesmo id: cada POST cria uma nova memória auditável.

curl -sS -X POST "$BASE_URL/v1/simulacoes" \
  -H 'content-type: application/json' \
  --data '{
    "produto": { "descricao": "Serviço de consultoria — cenário de teste", "natureza": "SERVICO" },
    "valor": { "total": "1000.00", "moeda": "BRL" },
    "dataOperacao": "2026-08-09",
    "operacao": {
      "tipo": "INTERESTADUAL",
      "origem": { "uf": "SP" },
      "destino": { "uf": "RJ" }
    },
    "contribuinte": { "regime": "REGULAR" },
    "classificacao": { "sistema": "NBS", "codigo": "CODIGO-CONFIRMADO-TESTE" },
    "tratamentos": { "zonaFranca": false, "regimeDiferenciado": false }
  }'

Neste MVP, a resposta continua HTTP 201, mas com revisão fiscal necessária:

{
  "status": "REVISAO_FISCAL_NECESSARIA",
  "resultado": {
    "elegivel": false,
    "motivo": "Esta rota registra a simulação geral. Para preservar o preço final, envie os mesmos dados a POST /v1/simulacoes/preco-base com objetivo.precoFinalAlvo.",
    "baseInformada": { "montante": "1000.00", "moeda": "BRL" },
    "componentes": [
      { "tributo": "IBS", "aliquota": null, "valor": null, "estado": "PENDENTE_DE_REGRA_HOMOLOGADA" },
      { "tributo": "CBS", "aliquota": null, "valor": null, "estado": "PENDENTE_DE_REGRA_HOMOLOGADA" },
      { "tributo": "IS", "aliquota": null, "valor": null, "estado": "PENDENTE_DE_REGRA_HOMOLOGADA" }
    ]
  }
}

Como o fluxo funciona

  1. Envie produto/serviço e valor para POST /v1/simulacoes quando quiser avaliar uma operação com preço informado.
  2. Para preservar um preço final, envie os mesmos dados fiscais, sem valor, para POST /v1/simulacoes/preco-base com objetivo.
  3. Leia perguntas e complete somente com dados fiscais confirmados; reenvie ao mesmo endpoint.
  4. Guarde o id e o endereço de auditoria.memoria, e consulte-o antes de a memória sair da retenção das 100 solicitações mais recentes.
  5. Quando houver REVISAO_FISCAL_NECESSARIA, encaminhe a memória ao responsável tributário; não transforme esse estado em preço ou imposto.
EstadoSignificadoPróxima ação
DADOS_FISCAIS_INSUFICIENTESFaltam campos obrigatórios para avaliar o cenário.Preencher os itens em perguntas e reenviar.
REVISAO_FISCAL_NECESSARIAOs dados estão preenchidos, mas não há regra ativa aplicável.Revisar a operação e a regra com especialista tributário.
CALCULO_DETERMINISTICO_CONCLUIDOUma única regra homologada, ativa e aplicável preservou o preço final alvo.Conferir memória, regra, fonte, vigência e aprovação antes de usar o resultado.
CENARIO_DE_PRECIFICACAO_CONCLUIDOO motor calculou exclusivamente a matriz de planejamento declarada.Conferir fonte, versão, hipótese, comparação atual/futura e arredondamento.
CLASSIFICACAO_DECLARADA_NAO_HOMOLOGADAUm código foi recebido em /v1/classificacoes, sem validação fiscal.Validar a classificação fora da API antes de usá-la em qualquer regra.

Campos da simulação convencional

O corpo deve ser um objeto JSON. Campos ausentes geram perguntas; JSON inválido, um array ou null recebe 422 INVALID_JSON. O endpoint de preço-base reutiliza estes campos fiscais, exceto valor, e acrescenta objetivo.

CampoTipoQuando é obrigatórioObservação
produto.descricaostringSempreDescrição comercial e fiscal declarada.
produto.naturezaBEM ou SERVICOSempreA API pede esse dado; não decide por texto.
valor.totalstring decimalSempreValor total em reais como "1000.00", com duas casas para preservar a precisão auditável.
valor.moedaBRLSempreA API não converte nem presume moeda na simulação convencional.
dataOperacaoAAAA-MM-DDSempreData de referência da operação.
operacao.tipoINTERNA, INTERESTADUAL, IMPORTACAO ou EXPORTACAOSempreDetermina quais locais serão solicitados.
operacao.origem.uf e destino.ufUF com 2 letrasInterna ou interestadualUse letras maiúsculas, por exemplo SP.
operacao.origem.pais e destino.ufISO 3166-1 alfa-2 + UFImportaçãoPaís estrangeiro de origem, como US, e UF de destino. Não use BR ou nome de país.
operacao.origem.uf e destino.paisUF + ISO 3166-1 alfa-2ExportaçãoUF de origem e país estrangeiro de destino, como US. Não use BR ou nome de país.
contribuinte.regimeREGULAR ou SIMPLES_NACIONALSempreRegime declarado do fornecedor.
classificacao.sistema e codigostringSempreInforme código confirmado; o MVP não valida nem infere NCM/NBS.
tratamentos.zonaFrancabooleanSempretrue ou false; não omita.
tratamentos.regimeDiferenciadobooleanSempretrue ou false; não omita.

Referência de endpoints

POST

/v1/simulacoes

Cria uma simulação e uma memória auditável. Use o formato de entrada e os exemplos da seção Comece aqui.

HTTPQuando acontece
201Simulação criada, mesmo se faltarem dados ou não houver regra ativa.
422JSON inválido ou cuja raiz não seja um objeto.
413Corpo acima de 128 KB (128000 bytes).

Campos-chave da resposta: id, status, resultado, perguntas, classificacao, auditoria e alertas.

POST

/v1/simulacoes/preco-base

Resolve o preço-base necessário para preservar um preço final alvo. O endpoint nunca estima tributos: ele só conclui quando uma única regra HOMOLOGADA_E_ATIVA, íntegra, vigente e aplicável cobre o cenário fiscal declarado.

Contrato separado: envie todos os dados fiscais da simulação convencional, mas não envie valor. Acrescente objetivo.tipo: "PRESERVAR_PRECO_FINAL" e um montante BRL canônico com duas casas.
curl -sS -X POST "$BASE_URL/v1/simulacoes/preco-base" \
  -H 'content-type: application/json' \
  --data '{
    "produto": { "descricao": "Serviço de teste — cenário declarado", "natureza": "SERVICO" },
    "dataOperacao": "2026-08-09",
    "operacao": {
      "tipo": "INTERESTADUAL",
      "origem": { "uf": "SP" },
      "destino": { "uf": "RJ" }
    },
    "contribuinte": { "regime": "REGULAR" },
    "classificacao": { "sistema": "NBS", "codigo": "CODIGO-CONFIRMADO-TESTE" },
    "tratamentos": { "zonaFranca": false, "regimeDiferenciado": false },
    "objetivo": {
      "tipo": "PRESERVAR_PRECO_FINAL",
      "precoFinalAlvo": { "montante": "130.00", "moeda": "BRL" }
    }
  }'
CampoRegra
valorNão pertence a este contrato.
objetivo.tipoObrigatório: PRESERVAR_PRECO_FINAL.
objetivo.precoFinalAlvo.montanteString positiva BRL no formato 130.00; não use R$, vírgula ou separador de milhar.
objetivo.precoFinalAlvo.moedaObrigatório: BRL.

O valor do exemplo somente demonstra o formato. Não é preço recomendado, alíquota, benefício ou qualquer parâmetro fiscal.

Campo ausente gera 201 DADOS_FISCAIS_INSUFICIENTES e uma pergunta. Campo presente, mas inválido — ou valor incluído por engano — gera 422 com CAMPO_AMBIGUO, OBJETIVO_INVALIDO, PRECO_FINAL_ALVO_INVALIDO ou MOEDA_NAO_SUPORTADA.

Quando não há regra aplicável

O status continua HTTP 201, mas o resultado é bloqueado para revisão:

{
  "status": "REVISAO_FISCAL_NECESSARIA",
  "resultado": {
    "elegivel": false,
    "codigoMotivo": "SEM_REGRA_HOMOLOGADA_APLICAVEL",
    "motivo": "Não existe regra homologada ativa aplicável ao produto, operação, vigência e tratamento declarados.",
    "precoFinalAlvo": { "montante": "130.00", "moeda": "BRL" },
    "componentes": []
  },
  "auditoria": { "memoria": "/v1/simulacoes/3fa85f64-5717-4562-b3fc-2c963f66afa6/memoria" }
}

CATALOGO_ATIVO_INCONSISTENTE, AMBIGUIDADE_DE_REGRAS_ATIVAS, FORMULA_NAO_SUPORTADA_PARA_PRECO_BASE e ARREDONDAMENTO_SEM_SOLUCAO_EXATA também são motivos de revisão. O motor não escolhe uma regra por aproximação, não combina regras e não força arredondamento.

Quando o cálculo é permitido

Somente CALCULO_DETERMINISTICO_CONCLUIDO entrega resultado.tipo: PRECO_BASE_PARA_PRECO_FINAL_ALVO, precoFinalAlvo, precoBaseNecessario, multiplicador, componentes e verificacao. multiplicador é o valor efetivo após arredondar cada componente; a verificação recompõe o preço final alvo em centavos.

Método, arredondamento e auditoria

GROSS_UP_SOBRE_PRECO_BASE_V1 é apenas o método declarado pela regra homologada; não é uma regra legal genérica. Em forma simbólica, ele procura uma base tal que precoFinalAlvo = precoBaseNecessario + soma(componentes declarados pela regra).

A regra deve declarar composição, componentes, base de cálculo, incidência, parâmetros e arredondamento. O motor aplica o arredondamento por componente e só retorna sucesso quando recompõe exatamente o alvo; sem solução exata, bloqueia com ARREDONDAMENTO_SEM_SOLUCAO_EXATA. O multiplicador teórico declarado e o efetivo com arredondamento ficam separados na memória.

A memória registra entrada, regras consideradas, regra selecionada quando houver, fórmula, operandos em centavos, multiplicador teórico declarado, multiplicador efetivo com arredondamento, política de arredondamento, fonte, vigência, escopo, aprovação, hash e versão do catálogo. Para ativar uma regra, a fonte precisa usar HTTPS em host oficial permitido e a aprovação precisa ter assinatura Ed25519 válida para a chave pública confiável da identidade declarada. O resultado não substitui parecer tributário.

HTTPQuando acontece
201Coleta pendente, revisão fiscal ou cálculo determinístico concluído.
422JSON inválido, valor ambíguo ou objetivo/moeda em formato inválido.
413Corpo acima de 128 KB (128000 bytes).
POST

Cenário de alíquotas declarado

Use POST /v1/simulacoes/preco-base com modoCalculo: "CENARIO_ALIQUOTAS_DECLARADAS" quando você já possui uma matriz para testar. Esse modo pede somente item, natureza, data, preço final e uma matriz CBS/IBS/IS identificada; não pede classificação, origem/destino, regime ou tratamentos.

Não é alíquota vigente: a matriz é uma hipótese de planejamento. A API calcula apenas os percentuais enviados, por fora sobre o preço-base, e guarda a fonte/versão. Ela não converte estudo, planilha ou estimativa em regra fiscal ativa.

Fonte de exemplo oferecida na interface: Portal da Câmara dos Deputados, “Proposta do governo regulamenta impostos criados pela reforma tributária”, 26/04/2024. A página noticia a estimativa do governo de CBS 8,8% e IBS 17,7% (total 26,5%). A resposta a marca como ESTIMATIVA_PUBLICADA_NAO_VIGENTE; ela não inclui IS, que deve ser declarado aplicável ou não pelo usuário.

Essa marca só é usada se os percentuais enviados reproduzirem exatamente a referência (CBS 8.800000%, IBS 17.700000% e IS não aplicável). Se a empresa ajustar a hipótese, mesmo mantendo o link, a resposta informa MATRIZ_DECLARADA_DIVERGENTE_DA_REFERENCIA_PUBLICA: o link fica como contexto, sem atribuir os percentuais alterados à fonte pública.

curl -sS -X POST "$BASE_URL/v1/simulacoes/preco-base" \
  -H 'content-type: application/json' \
  --data '{
    "modoCalculo": "CENARIO_ALIQUOTAS_DECLARADAS",
    "produto": { "descricao": "Serviço mensal de consultoria", "natureza": "SERVICO" },
    "dataOperacao": "2033-01-01",
    "objetivo": { "tipo": "PRESERVAR_PRECO_FINAL", "precoFinalAlvo": { "montante": "100.00", "moeda": "BRL" } },
    "tributacaoAtual": { "componentes": [
      { "tributo": "ISS", "aliquotaPercentual": "5.000000" },
      { "tributo": "PIS", "aliquotaPercentual": "1.650000" },
      { "tributo": "COFINS", "aliquotaPercentual": "7.600000" }
    ] },
    "cenarioAliquotas": {
      "identificacao": "Estimativa do governo 2024 — referência pública da Câmara",
      "versao": "2024-04-24",
      "fonte": {
        "referencia": "Portal da Câmara dos Deputados, 26/04/2024 — estimativa do governo, não vigente.",
        "url": "https://www.camara.leg.br/noticias/1056840-proposta-do-governo-regulamenta-impostos-criados-pela-reforma-tributaria",
        "verificadaEm": "2026-08-10"
      },
      "componentes": [
        { "tributo": "CBS", "aliquotaPercentual": "8.800000" },
        { "tributo": "IBS", "aliquotaPercentual": "17.700000" },
        { "tributo": "IS", "aplicavel": false, "aliquotaPercentual": "0.000000" }
      ]
    }
  }'
{
  "status": "CENARIO_DE_PRECIFICACAO_CONCLUIDO",
  "resultado": {
    "precoFinalAlvo": { "montante": "100.00", "moeda": "BRL" },
    "precoBaseNecessario": { "montante": "79.05", "moeda": "BRL" },
    "componentes": [
      { "tributo": "CBS", "aliquotaPercentual": "8.800000", "montante": "6.96" },
      { "tributo": "IBS", "aliquotaPercentual": "17.700000", "montante": "13.99" },
      { "tributo": "IS", "aliquotaPercentual": "0.000000", "montante": "0.00", "aplicavel": false }
    ],
    "comparativoTributario": {
      "tributosAtuais": { "cargaNominalSomaPercentual": "14.250000" },
      "tributosFuturos": { "cargaNominalSomaPercentual": "26.500000" },
      "comparacao": { "diferencaCargaNominalPontosPercentuais": "12.250000" }
    },
    "verificacao": { "precoFinalRecalculado": "100.00", "preservaPrecoFinalAlvo": true }
  }
}

Os tributos atuais são apenas taxas declaradas para auditoria; sem método de base, créditos ou incidência, a API não inventa seus montantes. Os tributos futuros incluem alíquota e valor usado na conta. O método registra HALF_UP por componente; se não existir resultado exato em centavos, a resposta declara a menor diferença encontrada.

GET

/v1/simulacoes/{id}/memoria

Devolve a memória integral de uma simulação criada no mesmo processo. Substitua {id} pelo valor retornado no POST. Só as 100 solicitações mais recentes são retidas; uma memória antiga pode retornar 404 antes do reinício.

curl -sS "$BASE_URL/v1/simulacoes/SEU-ID/memoria"
{
  "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "criadoEm": "2026-08-09T15:00:00.000Z",
  "versaoMotor": "0.4.0",
  "versaoCatalogo": { "id": "catalogo-sem-release", "versao": "sem-versao", "hash": "sha256-..." },
  "status": "REVISAO_FISCAL_NECESSARIA",
  "entradaNormalizada": { "...": "payload enviado" },
  "perguntasPendentes": [],
  "regrasConsideradas": [],
  "memoriaDeCalculo": { "elegivel": false, "...": "resultado da simulação" },
  "premissas": ["O motor usa somente dados declarados na entrada."],
  "fontes": [{ "id": "EC-132-2023", "url": "https://www.planalto.gov.br/..." }],
  "alertas": ["Este resultado não é parecer tributário..."],
  "reprocessamento": { "permitido": true, "motivo": "Nova versão de regra homologada ou correção de dados de entrada." }
}
HTTPQuando acontece
200Memória encontrada.
404 SIMULACAO_NAO_ENCONTRADAID inexistente, memória perdida após reinício ou removida pela retenção.
POST

/v1/classificacoes

Recebe uma descrição e, opcionalmente, um código declarado. Não consulta tabela fiscal, não estima confiança e não habilita cálculo.

curl -sS -X POST "$BASE_URL/v1/classificacoes" \
  -H 'content-type: application/json' \
  --data '{
    "descricao": "Serviço de consultoria — cenário de teste",
    "sistema": "NBS",
    "codigo": "CODIGO-CONFIRMADO-TESTE"
  }'
{
  "status": "CLASSIFICACAO_DECLARADA_NAO_HOMOLOGADA",
  "sugestao": { "sistema": "NBS", "codigo": "CODIGO-CONFIRMADO-TESTE" },
  "confianca": "NAO_DETERMINADA",
  "explicacao": "Código declarado recebido; o MVP não o valida nem o usa para cálculo sem homologação.",
  "fontes": [
    {
      "id": "EC-132-2023",
      "titulo": "Emenda Constitucional nº 132, de 20 de dezembro de 2023",
      "url": "https://www.planalto.gov.br/ccivil_03/constituicao/emendas/emc/emc132.htm",
      "verificadaEm": "2026-08-09"
    },
    {
      "id": "LC-214-2025",
      "titulo": "Lei Complementar nº 214, de 16 de janeiro de 2025 — texto compilado",
      "url": "https://www.planalto.gov.br/ccivil_03/leis/lcp/lcp214compilado.htm",
      "verificadaEm": "2026-08-09"
    }
  ],
  "alerta": "Qualquer IA futura só poderá sugerir classificação, nunca ativar uma regra de cálculo."
}

Sem descricao, retorna DADOS_FISCAIS_INSUFICIENTES. Com descrição mas sem código, retorna REVISAO_FISCAL_NECESSARIA.

GET

/v1/regras

Lista regras homologadas ativas carregadas na release atual e regras importadas pendentes. Os filtros são opcionais e cumulativos: vigenciaEm, origem e destino. vigenciaEm deve ser uma data real canônica; origem e destino aceitam UF brasileira ou país ISO 3166-1 alfa-2 conforme o tipo da operação.

curl -sS "$BASE_URL/v1/regras?vigenciaEm=2027-01-01&origem=SP&destino=RJ"
{
  "regras": [],
  "estadoCatalogo": "SEM_REGRA_HOMOLOGADA_ATIVA",
  "releaseCatalogo": { "id": "catalogo-sem-release", "versao": "sem-versao", "hash": "sha256-..." },
  "diagnosticos": [],
  "fontes": [
    { "id": "EC-132-2023", "titulo": "Emenda Constitucional nº 132...", "url": "https://www.planalto.gov.br/..." },
    { "id": "LC-214-2025", "titulo": "Lei Complementar nº 214...", "url": "https://www.planalto.gov.br/..." }
  ]
}

A fórmula não é exposta por esta rota. Uma regra ativa mostra identidade, escopo, vigência, fonte e resumo da aprovação; uma regra importada aparece como PENDENTE_HOMOLOGACAO. A release ativa é controlada na publicação, não pela importação pública: ela exige fontes HTTPS em hosts oficiais exatos, aprovações Ed25519 verificáveis e uma aprovacaoRelease assinada. O pin independente PRICING_RELEASE_ATIVA_HOMOLOGADA_JSON_B64 precisa coincidir com releaseCatalogo.id, releaseCatalogo.versao e releaseCatalogo.hash; isso bloqueia replay de uma release antiga assinada. CATALOGO_ATIVO_DISPONIVEL ainda não prova que uma regra é aplicável ao cenário enviado.

GET

/healthz

Use no monitoramento técnico. Não prova que há regra fiscal ativa. releaseSha identifica o SHA Git e deploymentId identifica a transação única da instância publicada; ambos são null localmente sem as variáveis de runtime. Juntos distinguem uma nova publicação do mesmo SHA e não são o hash do catálogo. Se o catálogo estiver inconsistente, retorna HTTP 503 com status: "blocked" para impedir publicação silenciosa nesse estado.

curl -sS "$BASE_URL/healthz"
{ "status": "ok", "versaoMotor": "0.4.0", "estadoCatalogo": "SEM_REGRA_HOMOLOGADA_ATIVA", "releaseSha": "sha-git-da-release-em-execucao", "deploymentId": "id-da-publicacao-em-execucao" }
GET

/openapi.json

Especificação OpenAPI 3.1 com servidores, schemas, request bodies, parâmetros, exemplos e respostas. Importe-a em Postman, Insomnia ou outro cliente compatível.

Erros e cabeçalhos

HTTPCódigoMotivo
400URL_INVALIDAO alvo da requisição HTTP não pôde ser interpretado com segurança.
413PAYLOAD_TOO_LARGEO corpo passou de 128 KB (128000 bytes).
403CATALOGO_IMPORTACAO_DESABILITADAToken administrativo ausente, inválido ou não configurado.
422INVALID_JSONO corpo não é JSON válido ou não é um objeto JSON.
422CAMPO_AMBIGUOvalor foi enviado ao endpoint de preço-base.
422OBJETIVO_INVALIDO, PRECO_FINAL_ALVO_INVALIDO ou MOEDA_NAO_SUPORTADAO objetivo de preservar preço final não atende ao contrato BRL.
422IMPORTACAO_INVALIDANenhuma regra do lote foi aceita.
422VIGENCIA_INVALIDAO filtro vigenciaEm não é uma data real canônica.
404SIMULACAO_NAO_ENCONTRADAMemória inexistente, perdida após reinício ou removida pela retenção.
404NOT_FOUND ou ROTA_NAO_ENCONTRADARecurso estático ou rota não existe.

O envelope de erro tem esta forma:

{
  "erro": { "code": "INVALID_JSON", "mensagem": "Corpo JSON inválido ou excede 128 KB." },
  "meta": { "versaoMotor": "0.4.0", "estadoVerificacao": "SEM_REGRA_HOMOLOGADA_ATIVA" }
}

As respostas JSON usam content-type: application/json; charset=utf-8, cache-control: no-store e x-content-type-options: nosniff. CORS permite GET, POST e OPTIONS somente com content-type; o cabeçalho administrativo não é liberado para navegador. Use a importação apenas por cliente administrativo fora da interface pública.

Auditoria e segurança fiscal

  • Cada simulação gera um identificador e uma memória com entrada, perguntas, regras consideradas, resultado, premissas, fontes, alertas e possibilidade de reprocessamento. Apenas as 100 solicitações mais recentes ficam disponíveis no processo.
  • Uma memória de preço-base também registra regra selecionada, fórmula declarada, operandos em centavos, multiplicador teórico declarado, multiplicador efetivo após arredondamento, hash e versão da release do catálogo.
  • No cenário declarado, a memória registra a matriz recebida, sua fonte, versão, estado de verificação, tributos atuais declarados, tributos futuros usados e a diferença nominal; a matriz não aparece como regra selecionada nem ativa o catálogo.
  • Uma classificação declarada mantém confiança NAO_HOMOLOGADA ou NAO_DETERMINADA. Ela não valida código e não decide cálculo.
  • Sem uma regra ativa aplicável, IBS, CBS e IS permanecem sem alíquota e sem valor.
  • Não use uma resposta da API como parecer tributário, autorização de emissão fiscal ou decisão jurídica.
  • Para uma operação real, guarde o request original, a memória retornada, a fonte oficial, a vigência e a aprovação do especialista fora deste MVP. A fonte deve estar em HTTPS e nos hosts oficiais aceitos; a identidade do aprovador deve constar na lista confiável e a assinatura Ed25519 deve conferir com sua chave pública.
  • A assinatura protege a integridade da regra aprovada, mas não substitui a revisão tributária. Ela cobre a representação JSON canônica completa da regra, exceto seu próprio hash e assinatura. A chave privada de assinatura nunca é enviada à API, incluída no catálogo, exposta no navegador, registrada em CI/CD ou versionada no repositório.

Fontes oficiais de referência

As fontes abaixo estão registradas na documentação do projeto. A memória devolve as referências carregadas pelo motor e a regra selecionada deve registrar sua fonte específica. Nenhuma delas está, por si só, parametrizada como regra de cálculo.

Fontes de transição e regulamentos não equivalem a uma alíquota final universal. Cada regra exige trecho, versão, vigência, escopo e aprovação identificada antes de ativar cálculo.