Pular para conteudo principal
portal do desenvolvedor

a API do Dualisia
em uma página.

Autenticação, endpoints, limites e formato de erro. O contrato legível por máquina está em /openapi.json — esta página é a versão para ler.

quickstart

a primeira chamada não precisa de chave.

A apuração pública aceita um XML de NF-e direto, sem cadastro. É o caminho mais curto para ver o formato da resposta.

# Apura CBS/IBS de uma NF-e
curl -X POST https://dualisia.com.br/api/calculadora \
-F "xml=@nota.xml" \
-F "ano=2027"
autenticação

API key por escritório, com scope.

Os endpoints sob /api/v1 exigem a chave da organização. O owner do escritório gera em Configurações → API keys, e ela aparece uma única vez. Cada chave tem scopes (read:clients, read:documents) e só enxerga dados da própria organização.

# Lista os clientes do escritório
curl https://dualisia.com.br/api/v1/clients \
-H "Authorization: Bearer dlai_live_xxx"
endpoints

quatro chamadas, todas implementadas.

Esta lista é a superfície pública inteira. Nada de endpoint "em breve": o que está aqui responde hoje, e o que responde hoje está aqui.

POST /api/calculadora · Apura CBS e IBS de uma NF-e. Público, sem chave. [pública]
POST /api/simulador · Projeta a carga ano a ano, de 2026 a 2033. Público, sem chave. [pública]
GET /api/v1/clients · Lista os clientes PJ do escritório. [read:clients]
GET /api/v1/documents · Lista as NF-e já processadas. [read:documents]
limites

rate limit explícito no header.

Toda resposta — sucesso ou erro — traz os campos estruturados do IETF, para o agente se auto-limitar antes de bater no teto:

RateLimit-Policy: "calculadora";q=10;w=60
RateLimit: "calculadora";r=9;t=57

q é a cota, w a janela em segundos, r o que resta e t os segundos até a janela reabrir. Os headers históricos X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset continuam saindo. O 429 traz também Retry-After e o campo retryAfter no corpo.

/api/calculadora · 10 req/min por IP · arquivo até 5 MB
/api/simulador · 5 req/min por IP ·
/api/v1/clients · 60 req/min por chave · limit máximo 100
/api/v1/documents · 60 req/min por chave · limit máximo 100
versionamento

o contrato não muda embaixo de você.

A versão maior vive no caminho: /api/v1. Mudança que quebra contrato não é publicada na mesma versão — ela ganha um caminho novo, /api/v2, e o anterior continua respondendo. Os endpoints públicos de cálculo (/api/calculadora e /api/simulador) seguem o mesmo compromisso.

O que conta como mudança que quebra: remover endpoint, campo ou valor de enum; tornar obrigatório um parâmetro que era opcional; mudar o tipo de um campo; mudar o significado de um code de erro. O que não conta, e pode entrar sem versão nova: campo novo na resposta, endpoint novo, valor novo em enum de saída, e correção de cálculo por mudança na legislação — esta última sempre acompanhada da base legal na própria resposta.

Quando uma versão entrar em depreciação, o aviso vem no próprio tráfego, antes de qualquer desligamento:

Deprecation: Sun, 01 Nov 2026 00:00:00 GMT
Sunset: Sun, 01 Feb 2027 00:00:00 GMT
Link: </developers#versionamento>; rel="deprecation"

Deprecation marca quando a versão passou a ser desaconselhada; Sunset, a data em que ela deixa de responder. O intervalo entre as duas é de no mínimo 90 dias. Hoje nenhuma versão está depreciada, e por isso esses dois headers não aparecem — o Link com rel="deprecation" sai em toda resposta da API e aponta para esta seção.

erros

um formato só, com código estável e dica.

Todo erro da API responde JSON com code — estável, para ramificar em código — e hint, dizendo o que fazer para corrigir. error repete message por compatibilidade com clientes antigos.

{
"error": "Arquivo excede limite de 5MB",
"code": "payload_too_large",
"message": "Arquivo excede limite de 5MB",
"hint": "Reduza o tamanho do arquivo e tente de novo.",
"docs": "https://dualisia.com.br/developers#erros"
}

Caminho inexistente sob /api responde 404 em JSON com code: not_found — nunca HTML.

para agentes

tudo que importa está em formato de máquina.

GET /openapi.json · Especificação OpenAPI 3.1 da API
GET /openapi.yaml · A mesma spec, em YAML
GET /llms.txt · Resumo do produto e quando usá-lo
GET /sitemap.xml · Páginas públicas indexáveis

Qualquer página pública também responde em Markdown: mande Accept: text/markdown na mesma URL. As respostas carregam Vary: Accept, então a variante certa nunca sai do cache trocada.

cli e sdk

CLI no npm, SDK ainda não.

O pacote dualisia-cli (licença MIT) está publicado no npm e envolve os quatro endpoints acima. Rode sem instalar com npx dualisia-cli --help, ou instale global com npm i -g dualisia-cli. O código-fonte é aberto em github.com/munhoz-iago/dualisia-cli.

Não há SDK oficial em nenhuma linguagem — a API é REST puro e qualquer cliente HTTP serve. Diga em /contato de qual linguagem você precisa primeiro.

API key em 30 segundos.

Entre no painel, vá em Configurações → API keys e gere uma chave. Restrito ao owner do escritório.