API do TributoX
Integre análises fiscais ao seu software. Você envia a demanda ou a operação e recebe um resultado estruturado, com a análise, a base legal citada e um nível de confiança, pronto para o seu sistema mostrar ao usuário.
A API é uma capacidade contratada. Não há cadastro aberto, chave emitida pelo próprio desenvolvedor, créditos gratuitos nem ambiente público: o acesso começa numa demonstração, passa por proposta e contrato e termina numa credencial exclusiva entregue pelo time. Esta página e a especificação OpenAPI pública (sem chave) são a referência do contrato.
Comece por aqui
- ContrateAgende a demonstração. Depois da proposta e do contrato, o time habilita o seu parceiro.
- Receba a credencialChave exclusiva, com escopos, empresas autorizadas e limites definidos no contrato.
- Chame a APIHTTP com JSON, a chave no backend. Comece pelo /auditar (síncrono) ou pelo /sugerir (assíncrono).
- Leia campo a campoCada decisão vem determinada, inconclusiva ou em revisão necessária, com fundamento e o que falta.
Antes de começar
O que você precisa
- Um contrato ativo, com o parceiro habilitado pelo time
- A chave de API exclusiva, entregue por canal seguro
- Um backend para chamar. A chave nunca deve chegar ao navegador
- A demanda fiscal em texto e, opcional, um contexto (regime, UF, CNAE, segmento, atividade) ou a operação a auditar
O que instalar
Nada. Não existe SDK nem CLI: é HTTP com JSON, então use o que a sua linguagem já tem.
Pacotes de terceiros com o nome tributox no npm ou PyPI não são nossos e não funcionam com esta API.
Processo de contratação
Do primeiro contato ao primeiro consumo, em oito passos. Cada um é conduzido pelo time; nenhum depende de cadastro no site.
- Agende a demonstraçãoPelo mesmo agendamento do site, em /signup. Você mostra o sistema e o caso de uso; o time mostra a análise fiscal funcionando.
- Qualificação comercialO time entende o volume esperado, as empresas atendidas, os escopos necessários e os requisitos de segurança e de dados.
- PropostaProposta com escopos, limites por minuto, cota mensal e vigência. O preço é por volume e contrato, nunca por tabela aberta.
- ContratoAssinatura do contrato, com as condições de tratamento de dados (LGPD) combinadas com o parceiro.
- Habilitação do parceiroO time cadastra o parceiro, as empresas autorizadas e ativa o contrato. Sem essa ativação, nenhuma chave de parceiro funciona.
- Escopos e limites configuradosO time configura o teto de escopos do parceiro, o limite por minuto, a cota mensal e a validade das chaves.
- Credencial exclusiva entregue com segurançaA chave é emitida pelo time, exclusiva do seu sistema, e entregue por canal seguro. Ela aparece uma única vez; guarde no cofre de segredos do seu backend.
- Seu sistema consome a APIA integração roda em produção com a credencial contratada. Revogação, suspensão e rotação passam pelo time, a qualquer momento.
A chave contratada acessa a API real, sem ambiente separado. Durante a integração, use dados fictícios: nada de CNPJ, nota fiscal ou documento real de cliente até a operação começar. A chave nunca deve ir para o navegador nem para o repositório.
Autenticação
Máquina a máquina, por chave de API. Mande a chave no header Authorization: Bearer <chave> ou X-API-Key: <chave>. Nenhuma chamada é anônima; sem chave válida, a API responde 401.
Chave de API
Emitida pelo time para o seu sistema, depois do contrato, e usada só no seu backend. O TributoX guarda apenas o hash da chave, nunca o valor em claro.
- Enviada em
Authorization: BearerouX-API-Key - Revogação, suspensão e rotação pelo time, com efeito na chamada seguinte
- Chave de parceiro: escopos, empresas autorizadas, limites e validade definidos no contrato
- Consumo medido por chave, para atribuição por consumidor
curl https://api.tributox.studiolabsai.com/api/fiscal/v1/sugerir \
-H "Authorization: Bearer $TRIBUTOX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"demanda": "Empresa de serviços no Simples. O Fator R muda o anexo?",
"contexto": { "regime": "simples", "uf": "SP" }
}'
# 202 Accepted
# { "job_id": "3f2b9c1e-7a4d-4e8b-9c2a-1d5e6f7a8b9c", "status": "pendente" }Escopos e permissões
Por contratoExige chave de parceiro contratado, habilitado pelo time. Cada rota pede um escopo; a chave só funciona dentro do teto de escopos do contrato.
| Escopo | Rotas | Para que serve |
|---|---|---|
fiscal:sugerir | POST /api/fiscal/v1/sugerir | Cria sugestões fiscais fundamentadas (assíncronas). |
fiscal:auditar | POST /api/fiscal/v1/auditar | Audita uma operação ou NF-e na mesma chamada. |
fiscal:lotes | POST /api/fiscal/v1/lotes | Cria um lote de 1 a 100 operações para auditoria assíncrona. |
fiscal:resultados | GET /api/fiscal/v1/sugestao/{job_id} e GET /api/fiscal/v1/lotes/{lote_id} | Lê o resultado de jobs e de lotes. |
- O contrato define o teto de escopos do parceiro. A chave recebe escopos dentro desse teto, nunca acima.
- A autorização é conferida a cada requisição, na ordem: chave ativa, não expirada e não suspensa; parceiro ativo e dentro da vigência; escopo da rota; empresa autorizada; limite por minuto e cota mensal.
- Escopo ausente responde 403 com erro escopo_insuficiente. Ampliar escopo é alteração de contrato, feita pelo time.
- Chaves anteriores ao modelo de parceiros, sem vínculo com um parceiro, seguem como antes: sem escopos, sem header de empresa e sem cota mensal.
HTTP/1.1 403 Forbidden
{ "detail": "A chave nao tem o escopo exigido por esta rota.", "erro": "escopo_insuficiente" }Autorização por empresa (X-TributoX-CNPJ)
Por contratoExige chave de parceiro contratado. Software houses e ERPs atendem várias empresas com a mesma credencial: o header diz em nome de quem a chamada é feita, e o contrato diz quais empresas o parceiro pode atender.
- O contrato lista as empresas que o parceiro pode atender. Quem integra um ERP ou software com várias empresas clientes envia, em cada chamada, o header X-TributoX-CNPJ com o CNPJ da empresa em nome de quem chama.
- Parceiro com empresas cadastradas: o header é obrigatório. Sem ele, 400 com erro cnpj_obrigatorio. CNPJ fora da lista, 403 com erro cnpj_nao_autorizado.
- Parceiro sem empresas cadastradas: o header é opcional e só é registrado no job, para rastreabilidade.
- Formato: os 14 dígitos do CNPJ, com ou sem pontuação. O TributoX normaliza antes de comparar.
- Inclusão ou desativação de empresa é feita pelo time; o parceiro não altera a lista.
curl https://api.tributox.studiolabsai.com/api/fiscal/v1/auditar \
-H "Authorization: Bearer $TRIBUTOX_API_KEY" \
-H "X-TributoX-CNPJ: 12345678000199" \
-H "Idempotency-Key: pedido-erp-000123" \
-H "Content-Type: application/json" \
-d '{ "entrada": "Venda de produção própria, NCM 84713012, de SP para BA em 2026-03-10, origem 0, para contribuinte do ICMS, emitente no Simples Nacional." }'
# Repetir a mesma chamada devolve a resposta guardada, com o header Idempotent-Replayed: true.Idempotência (Idempotency-Key)
Repita uma chamada sem duplicar o job nem o consumo, por exemplo depois de um timeout de rede. Vale para as chaves de parceiro contratado; nas rotas POST de sugerir, auditar e lotes.
- Header opcional Idempotency-Key (até 255 caracteres) nos POST /sugerir, /auditar e /lotes. Use um identificador do seu lado, como o id da operação no ERP.
- Mesma chave e mesmo corpo: a API devolve a resposta guardada, com o header Idempotent-Replayed: true, sem criar outro job nem contar de novo.
- Mesma chave com corpo diferente: 422 com erro idempotency_key_reutilizada.
- Mesma chave ainda em andamento: 409 com erro requisicao_em_andamento. Espere e repita a mesma chamada.
- A chave vale por 24 horas, por chave de API e por rota.
Endpoints
Base https://api.tributox.studiolabsai.com. A versão fica no path (/api/fiscal/v1). A especificação OpenAPI de todos eles está em /api/fiscal/v1/openapi.json.
| Método | Recurso | Para que serve | Escopo (parceiro) |
|---|---|---|---|
| POST | /api/fiscal/v1/sugerir | Cria uma sugestão fiscal fundamentada. Retorna 202 e o job_id; a geração roda em background. | fiscal:sugerir |
| GET | /api/fiscal/v1/sugestao/{job_id} | Busca o resultado pelo job_id. 202 enquanto processa, 200 com o resultado quando concluído. | fiscal:resultados |
| POST | /api/fiscal/v1/auditar | Audita uma operação (texto da venda ou XML da NF-e) e responde na mesma chamada, com as decisões de ICMS e a fonte de cada uma. | fiscal:auditar |
| POST | /api/fiscal/v1/lotes | Envia de 1 a 100 operações de uma vez. Retorna 202 com o lote_id e um job_id por item; cada item é auditado de forma assíncrona pelo mesmo motor do /auditar. Exige chave de parceiro contratado. | fiscal:lotes |
| GET | /api/fiscal/v1/lotes/{lote_id} | Consulta o lote: contagem por estado e, por item, job_id, referencia, status e resultado. Exige chave de parceiro contratado. | fiscal:resultados |
| GET | /api/fiscal/v1/openapi.json | Especificação OpenAPI só desta API, sem chave. Use para gerar cliente ou validar respostas. | Sem chave |
Fluxo assíncrono
Uma sugestão leva alguns segundos, então a API é assíncrona. Você cria, recebe um job_id e consulta o resultado por polling. A notificação por webhook está no roadmap.
- CriarPOST /sugerir com a demanda. Retorna 202 e o job_id, com status pendente.
- ProcessarO TributoX busca a norma na base, gera a sugestão e confere as citações. Status processando.
- ConsultarGET /sugestao/{job_id}. Enquanto roda, devolve 202. Cada consulta conta no limite por minuto da chave.
- LerQuando concluído, o GET devolve 200 com o resultado estruturado e a base legal.
curl https://api.tributox.studiolabsai.com/api/fiscal/v1/sugestao/3f2b9c1e-7a4d-4e8b-9c2a-1d5e6f7a8b9c \ -H "Authorization: Bearer $TRIBUTOX_API_KEY" # 202 enquanto processa · 200 quando concluído
Resposta estruturada
O resultado vem em campos: sugestao, regras, campos_afetados, excecoes, base_legal e um nível de confianca.
Quando a base não sustenta a resposta, vem confianca: baixa, base_legal: [] e a sugestão pede verificação, em vez de citar uma norma que não foi encontrada.
Status possíveis: pendente, processando, concluido e erro. Com erro, a consulta volta 200 com resultado: null; crie um job novo. Falha momentânea do provedor de IA não vira erro: o job conclui com confianca: baixa e a sugestão pede para tentar de novo.
{
"job_id": "3f2b9c1e-7a4d-4e8b-9c2a-1d5e6f7a8b9c",
"status": "concluido",
"resultado": {
"sugestao": "Com Fator R ≥ 28%, a atividade tributa pelo Anexo III…",
"regras": ["Fator R = folha 12m / receita 12m (LC 123/2006)."],
"campos_afetados": ["anexo", "aliquota_efetiva"],
"excecoes": ["Fator R apurado mês a mês…"],
"base_legal": ["LC 123/2006, art. 18, §5º-J"],
"confianca": "alta",
"aviso": "Confirme a folha dos últimos 12 meses."
}
}Auditar operação
POST/api/fiscal/v1/auditarSíncrono: você manda o texto da venda ou o XML da NF-e no campo entrada e a resposta vem na mesma chamada, em alguns segundos. Quem decide alíquota interestadual, CFOP e DIFAL é um motor de regras versionado; a IA só lê a entrada e explica o resultado.
| Campo | O que traz |
|---|---|
fonte | motor_interno quando o NCM tem regra no motor; rag quando não tem. Com rag, nenhum código é preenchido e status vem revisao_necessaria. |
entrada_extraida | O que foi lido da entrada. Campo vazio quer dizer não informado, nunca deduzido. |
regras_icms | Alíquota interestadual, CFOP e DIFAL, cada um com status (determinado, inconclusivo ou revisao_necessaria), fundamentos e o que faltou. |
dados_fiscais | CSOSN, CST e CFOP do motor. null quando a fonte é rag. |
insights_ia | Explicação em texto das decisões do motor. Não decide código nem alíquota. |
curl https://api.tributox.studiolabsai.com/api/fiscal/v1/auditar \
-H "X-API-Key: $TRIBUTOX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"entrada": "Venda de produção própria, NCM 84713012, de SP para BA em 2026-03-10, origem 0, para contribuinte do ICMS, emitente no Simples Nacional."
}'{
"sucesso": true,
"fonte": "rag",
"status": "revisao_necessaria",
"entrada_extraida": { "ncm": "84713012", "uf_origem": "SP", "uf_destino": "BA", "…": "…" },
"regras_icms": {
"versao_regras": "icms-interestadual-1.0.0",
"aliquota_interestadual": { "status": "determinado", "valor": "7.00", "fundamentos": ["Resolução do Senado Federal nº 22/1989, …"], "motivo": "…", "faltando": [] },
"cfop": { "status": "determinado", "valor": "6101", "fundamentos": ["…"], "motivo": "…", "faltando": [] },
"difal": { "status": "inconclusivo", "valor": null, "fundamentos": [], "motivo": "Faltam dados para decidir o DIFAL.", "faltando": ["finalidade_aquisicao"] }
},
"dados_fiscais": null,
"rag": { "sugestao": "…", "base_legal": [], "confianca": "baixa", "…": "…" },
"insights_ia": "…"
}Decisão com status inconclusivo ou revisao_necessaria vem sem valor, com o motivo e os campos que faltaram. Entrada vazia ou sem NCM, UF ou regime legíveis responde 422. Quando a entrada traz um CFOP, a resposta inclui também regras_icms.cfop_informado, conferido contra o calculado. O schema campo a campo está na especificação OpenAPI.
Lotes
POST/api/fiscal/v1/lotesPor contratoPara volume: envie até 100 operações numa chamada e acompanhe o lote. Exige chave de parceiro contratado, com os escopos fiscal:lotes (criar) e fiscal:resultados (ler). O processamento é assíncrono, item a item, com o mesmo motor do /auditar.
- POST /lotes com itens de 1 a 100; cada item traz entrada (até 16.000 caracteres lidos) e referencia, o identificador da operação no seu sistema.
- Resposta 202 com lote_id, total e job_ids (um por item, na ordem enviada). Cada item é auditado de forma assíncrona, com o mesmo motor e as mesmas regras do /auditar. Mais de 100 itens ou entrada acima de 16.000 caracteres: 422.
- GET /lotes/{lote_id} responde 202 enquanto houver item pendente ou processando e 200 quando todos terminarem, com status, total, contagem por estado (pendente, processando, concluido, erro) e, por item, job_id, referencia, status, resultado e erro (só a classe da falha). Consulte por polling, respeitando o limite por minuto.
- Lote e jobs de outra chave do mesmo parceiro são visíveis; de outro parceiro, 404. Resultados ficam legíveis por 90 dias.
- Use Idempotency-Key no POST para não duplicar o lote numa nova tentativa.
curl https://api.tributox.studiolabsai.com/api/fiscal/v1/lotes \
-H "Authorization: Bearer $TRIBUTOX_API_KEY" \
-H "X-TributoX-CNPJ: 12345678000199" \
-H "Idempotency-Key: lote-2026-03-0001" \
-H "Content-Type: application/json" \
-d '{
"itens": [
{ "referencia": "PED-1001", "entrada": "Venda de produção própria, NCM 84713012, de SP para BA em 2026-03-10, origem 0, para contribuinte do ICMS, emitente no Simples Nacional." },
{ "referencia": "PED-1002", "entrada": "Venda de mercadoria, NCM 84713012, de SP para MG em 2026-03-11, origem 0, para contribuinte do ICMS, emitente no Lucro Presumido." }
]
}'
# 202 Accepted (um job_id por item, na ordem enviada)
# { "lote_id": "9d4c7e21-5b3a-4f60-8a1e-2c7d9b0e4f13", "total": 2,
# "job_ids": [ "3f2b9c1e-7a4d-4e8b-9c2a-1d5e6f7a8b9c", "5e1d0a7b-2c3f-4d9e-8a6b-0f1e2d3c4b5a" ] }curl https://api.tributox.studiolabsai.com/api/fiscal/v1/lotes/9d4c7e21-5b3a-4f60-8a1e-2c7d9b0e4f13 \
-H "Authorization: Bearer $TRIBUTOX_API_KEY"
# 202 enquanto houver item pendente ou processando; 200 quando todos terminarem
# { "lote_id": "…", "status": "processando", "total": 2, "criado_em": "2026-11-03T12:00:00",
# "contagem": { "pendente": 0, "processando": 1, "concluido": 1, "erro": 0 },
# "itens": [ { "job_id": "…", "referencia": "PED-1001", "status": "concluido", "resultado": { … }, "erro": null },
# { "job_id": "…", "referencia": "PED-1002", "status": "processando", "resultado": null, "erro": null } ] }Guia de integração com ERP
Como um ERP ou software fiscal envia uma operação e recebe de volta uma análise estruturada. O mesmo padrão vale para sistemas contábeis e plataformas financeiras.
Guarde a chave no backend
Variável de ambiente ou cofre de segredos do servidor do ERP. Nunca no aplicativo do usuário nem no navegador.
Monte a entrada
O texto da operação (NCM, origem, destino, data, regime, destinatário) ou o XML da NF-e no campo entrada. Até 16.000 caracteres são lidos.
Chame o /auditar
Resposta síncrona. Envie X-TributoX-CNPJ e Idempotency-Key quando o contrato pedir. Trate 429 e 503 com espera pelo Retry-After; 422 indica entrada a corrigir. Volume grande: use lotes.
Leia campo a campo
Para cada decisão em regras_icms: determinado tem valor e fundamento; inconclusivo e revisao_necessaria trazem motivo e a lista faltando.
Mostre no fluxo do ERP
Compare com o que o ERP vai emitir. Diferença em decisão determinada vira alerta; inconclusivo vira pedido do dado que falta.
Guarde a trilha
Salve versao_regras e os fundamentos junto da operação, para mostrar de onde veio cada conferência.
import os, time, httpx
API = "https://api.tributox.studiolabsai.com/api/fiscal/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['TRIBUTOX_API_KEY']}"}
def auditar(entrada: str):
for tentativa in range(3):
r = httpx.post(f"{API}/auditar", json={"entrada": entrada}, headers=HEADERS, timeout=60)
if r.status_code in (429, 503):
time.sleep(int(r.headers.get("Retry-After", "5")))
continue
r.raise_for_status() # 401, 413, 422: corrigir o pedido
return r.json()
raise RuntimeError("API indisponível depois de 3 tentativas")
res = auditar("Venda de produção própria, NCM 84713012, de SP para BA em 2026-03-10, "
"origem 0, para contribuinte do ICMS, emitente no Simples Nacional.")
for campo in ("aliquota_interestadual", "cfop", "difal"):
d = res["regras_icms"][campo]
print(campo, d["status"], d["valor"], d["faltando"])const API = "https://api.tributox.studiolabsai.com/api/fiscal/v1";
const headers = { Authorization: `Bearer ${process.env.TRIBUTOX_API_KEY}`, "Content-Type": "application/json" };
export async function sugerir(demanda: string, contexto?: Record<string, string>) {
const criar = await fetch(`${API}/sugerir`, { method: "POST", headers, body: JSON.stringify({ demanda, contexto }) });
if (criar.status !== 202) throw new Error(`criar: ${criar.status}`);
const { job_id } = (await criar.json()) as { job_id: string };
for (let i = 0; i < 30; i++) {
await new Promise((r) => setTimeout(r, 2000)); // cada consulta conta no limite por minuto
const r = await fetch(`${API}/sugestao/${job_id}`, { headers });
if (r.status === 202) continue;
if (r.status === 429) { await new Promise((ok) => setTimeout(ok, Number(r.headers.get("Retry-After") ?? 5) * 1000)); continue; }
const job = await r.json();
if (job.status === "erro") throw new Error("job com erro: crie outro");
return job.resultado; // sugestao, regras, excecoes, base_legal, confianca, aviso
}
throw new Error("tempo esgotado");
}Limites e consumo
O consumo é medido por chave, para atribuição por consumidor. O volume contratado, o limite por minuto e, para parceiros, a cota mensal são combinados no contrato. Não há plano gratuito nem cota automática para quem não tem contrato.
Requisições por minuto
Cada chave pode ter um limite por minuto, combinado no contrato (na chave de parceiro, vale o limite do parceiro quando a chave não tem o seu). A janela é de um minuto pelo relógio do servidor e vale para todas as rotas da v1, inclusive o polling e as tentativas recusadas.
Headers de limite
Com limite ativo na chave, toda resposta traz X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. Acima do limite, 429 com Retry-After (segundos até a janela reabrir).
Cota mensal do parceiro
Chave de parceiro contratado: o contrato pode fixar uma cota mensal, contada pelos jobs do parceiro no mês de Brasília. Ao atingir, 429 com erro cota_mensal_atingida. Sem cota no contrato, não há teto mensal.
Tamanho do corpo
Até 50 MB por requisição (acima disso, 413). No /auditar e em cada item de lote, só os primeiros 16.000 caracteres da entrada são lidos na análise. Lote: de 1 a 100 itens.
Retenção dos resultados
Resultados de jobs e lotes ficam legíveis por 90 dias. Guarde no seu sistema o que precisa manter além disso.
Falha do controle
Se o contador do limite estiver indisponível, a requisição é recusada com 503 e Retry-After, em vez de passar sem controle.
HTTP/1.1 429 Too Many Requests
Retry-After: 23
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 23
{ "detail": "Limite de 60 requisicoes por minuto atingido para esta chave." }Erros
| Status | Motivo | O que fazer |
|---|---|---|
400 | erro: cnpj_obrigatorio Por contrato | O parceiro tem empresas cadastradas no contrato e a chamada veio sem o header X-TributoX-CNPJ. Envie o CNPJ da empresa em nome de quem você chama. |
401 | Chave de API necessaria / Chave de API invalida / Chave de API expirada | Sem chave, chave inválida ou revogada, ou chave expirada (quando o contrato define validade). Nenhuma chamada é anônima. Chave expirada: peça a renovação ao time. |
403 | erro: chave_suspensa Por contrato | A chave foi suspensa pelo time. Reativação só pelo time; repetir a chamada não resolve. |
403 | erro: contrato_inativo Por contrato | O contrato do parceiro não está ativo (suspenso, encerrado ou fora do período de vigência). Fale com o time. |
403 | erro: escopo_insuficiente Por contrato | A chave não tem o escopo que a rota exige (por exemplo fiscal:lotes). Escopo novo exige ajuste do contrato. |
403 | erro: cnpj_nao_autorizado Por contrato | O CNPJ do header X-TributoX-CNPJ não está entre as empresas autorizadas do parceiro. Inclusão de empresa é feita pelo time. |
404 | Job nao encontrado | Job ou lote inexistente, ou de outro parceiro ou outra chave sem vínculo. Confira o job_id ou o lote_id retornado na criação. |
409 | erro: requisicao_em_andamento | Outra chamada com o mesmo Idempotency-Key ainda está em andamento. Espere e repita; não crie outra chave para o mesmo pedido. |
413 | Corpo da requisição muito grande | O corpo passou de 50 MB. Envie só a operação ou a NF-e que quer analisar. |
422 | demanda obrigatoria / entrada obrigatoria / Nao foi possivel extrair NCM/UF/regime da entrada. | Campo obrigatório vazio (detail em texto), corpo fora do schema (detail em lista, com o campo em loc) ou, no /auditar, entrada sem NCM, UF ou regime legíveis. Corrija o pedido; repetir igual não resolve. |
422 | erro: idempotency_key_reutilizada | O mesmo Idempotency-Key já foi usado com um corpo diferente. Use uma chave nova para um pedido novo. |
429 | Limite de N requisicoes por minuto atingido | A chave passou do limite por minuto. Espere os segundos do header Retry-After e repita. |
429 | erro: cota_mensal_atingida Por contrato | O parceiro usou a cota mensal do contrato (mês de Brasília). Novas chamadas voltam no mês seguinte ou com ajuste de contrato, combinado com o time. |
503 | Limite de requisicoes indisponivel / provedor_indisponivel | A requisição não foi processada. Controle de limite indisponível: Retry-After de 5 s. No /auditar, provedor de IA indisponível: corpo com erro provedor_indisponivel e Retry-After de 30 s. Repita depois do Retry-After. |
500 | Erro interno | Falha inesperada, sem corpo estável. Repita com espera crescente e, se persistir, informe o horário ao time. |
O 202 não é erro: é a resposta de criação e a de consulta enquanto o job ainda processa. Todo erro vem como JSON com o campo detail; os erros de contrato trazem também o campo erro, com um código estável para tratar no seu sistema. Linhas marcadas como contrato valem para chaves de parceiro contratado.
Versionamento e OpenAPI
- A versão fica no path: /api/fiscal/v1. A especificação de cada versão sai em /api/fiscal/v1/openapi.json.
- Mudanças aditivas entram na v1 sem aviso: campo novo na resposta, campo opcional novo no pedido, valor novo documentado num status. Ignore campos que você não conhece.
- Remover ou renomear campo, mudar tipo ou significado, ou tornar obrigatório o que era opcional só acontece numa nova versão no path.
- Quando uma nova versão sair, a anterior fica marcada como deprecated na especificação e continua no ar por pelo menos 90 dias, com aviso ao parceiro.
curl https://api.tributox.studiolabsai.com/api/fiscal/v1/openapi.json
Segurança e LGPD
Chaves e isolamento
A chave fica guardada só em forma de hash e pode ser revogada, suspensa ou rotacionada pelo time a qualquer momento; pode ter validade. Cada chave só enxerga os próprios jobs (e, no mesmo parceiro, os das outras chaves do parceiro): job de outro parceiro responde 404. Mande só o necessário para a análise, sem dado pessoal.
Escopos e autorização por empresa
Chave de parceiro contratado tem escopos dentro do teto do contrato e só atende as empresas autorizadas (header X-TributoX-CNPJ). A conferência acontece no servidor a cada requisição.
Rastreabilidade
Cada chamada fica registrada por chave, com o status e a versão das regras de ICMS usadas (versao_regras), para auditoria do lado do parceiro e do TributoX.
Segurança e LGPD
Banco de dados e servidores da aplicação no Brasil (São Paulo), com tráfego criptografado. O processamento de IA usa fornecedores nos EUA, sob contrato. As condições de tratamento de dados são combinadas com cada parceiro.
Superfície pública
A especificação publicada cobre só a API fiscal. As rotas internas da plataforma não fazem parte do contrato.
Roadmap
Ainda não disponível. O que está no plano da API, para você saber o que vem, sem confundir com o contrato atual. Idempotência e lotes já estão disponíveis para parceiros contratados.
- Notificação por webhook do resultado (hoje o acompanhamento é por polling).
- Mais tipos de análise (enquadramento, simulação da Reforma, oportunidades) via endpoint.
- LexFeed por endpoint e por push.
Portal de autoatendimento para desenvolvedores não faz parte do roadmap: a API é um modelo contratado, com credencial exclusiva entregue pelo time depois do contrato.
