Download OpenAPI specification:
API para consultar e gerenciar, de forma programática, as NFS-e (notas de serviço) monitoradas pela sua conta IntegroBR — os mesmos dados que aparecem no painel, disponíveis para integração com o seu ERP, sistema contábil ou automação interna.
Toda chamada exige uma chave de API no cabeçalho Authorization:
Authorization: Bearer ibr_live_xxxxxxxxxxxxxxxxxxxxxxxx
Gere uma chave em Painel → Chaves de API
(/painel/chaves-api). Ela é exibida uma única vez no momento da
criação — se perder, revogue e crie outra.
Existem dois ambientes de chave, e eles nunca se misturam:
| Prefixo | Ambiente | O que você vê |
|---|---|---|
ibr_test_... |
Sandbox | Só empresas cadastradas como SANDBOX — dados de teste, nunca reais, nunca geram cobrança. |
ibr_live_... |
Produção | Só empresas cadastradas como PRODUCAO — dados fiscais reais da sua conta. |
Tentar acessar um recurso do ambiente errado com uma chave (ex.: pedir o detalhe de uma empresa de produção usando uma chave sandbox) devolve 404 — nunca 403 — pra não revelar se o recurso existe no outro ambiente.
Clientes oficiais, de código aberto, cobrindo todas as rotas desta página (incluindo paginação por cursor e verificação de assinatura de webhook).
| Linguagem | Instalação | Repositório |
|---|---|---|
| Node.js / TypeScript | npm install @integrobr/nfse-sdk |
github.com/integrobr/integrobr-sdk-node |
| PHP | composer require integrobr/nfse-sdk |
github.com/integrobr/integrobr-sdk-php |
| Ruby | gem install integrobr-nfse-sdk |
github.com/integrobr/integrobr-sdk-ruby |
Não usa Node, PHP ou Ruby? Qualquer cliente HTTP serve — a API é REST simples, sem exigir nenhum SDK.
GET /documents usa paginação por cursor (é a única lista que pode
crescer sem limite prático). A resposta sempre traz:
{ "itens": [ /* ... */ ], "proximoCursor": "id-do-ultimo-item-ou-null" }
Passe o valor de proximoCursor de volta no parâmetro cursor da
próxima chamada — ele é o id do último item da página anterior, não um
token opaco. proximoCursor: null significa que não há mais páginas.
Um cursor que não existe mais (nunca existiu, ou o item foi removido
entre uma chamada e outra) não gera erro — a resposta vem com
itens: [] e proximoCursor: null, como se a paginação tivesse
chegado ao fim.
GET /companies não é paginado — devolve um array direto com todas
as empresas da conta (o volume esperado é baixo o suficiente pra não
precisar).
120 requisições por minuto, por chave de API (janela fixa de 60s).
Passar do limite devolve 429 Too Many Requests:
{ "message": "Limite de requisições excedido. Tente novamente em instantes.", "code": "RATE_LIMITED" }
Erros seguem sempre o mesmo formato:
{ "statusCode": 404, "message": "Empresa não encontrada nesta conta.", "error": "Not Found" }
message pode ser uma string única ou uma lista de strings (erro de
validação de campos, um item por campo inválido).
Configure webhooks pelo painel (Painel → Webhooks) para ser
avisado em tempo real, sem precisar ficar consultando GET /documents.
Dois eventos existem hoje:
NOTA_RECEBIDA — uma nota nova foi capturada.EVENTO_FISCAL_RECEBIDO — um evento (cancelamento, substituição etc.)
foi capturado para uma nota já conhecida.Toda entrega é um POST com o corpo:
{ "tipo": "NOTA_RECEBIDA", "dados": { /* mesmo formato de um item de GET /documents */ } }
E dois cabeçalhos:
| Cabeçalho | Conteúdo |
|---|---|
X-IntegroBR-Event |
O mesmo valor de tipo do corpo. |
X-IntegroBR-Signature |
HMAC-SHA256 (hex) do corpo bruto da requisição, usando o segredo do seu webhook como chave. |
Verifique a assinatura antes de confiar no payload (exemplo em Node.js):
const crypto = require("crypto");
function assinaturaValida(corpoBruto, assinaturaRecebida, segredo) {
const esperada = crypto.createHmac("sha256", segredo).update(corpoBruto).digest("hex");
return crypto.timingSafeEqual(Buffer.from(esperada), Buffer.from(assinaturaRecebida));
}
Entregas com falha (timeout, conexão recusada, resposta não-2xx) são reenviadas com backoff exponencial. O segredo do webhook só é exibido uma vez, na criação (ou ao rotacionar) — guarde com o mesmo cuidado de uma senha.
Identifica a conta dona da chave de API usada na requisição.
{- "id": "5f9a1c2e-7b3d-4e11-9c2a-1a2b3c4d5e6f",
- "nome": "Empresa Exemplo LTDA",
- "status": "ATIVA",
- "ambiente": "PRODUCAO",
- "criadaEm": "2026-03-10T13:22:00.000Z"
}Franquia, consumo e excedente do ciclo em andamento. Com uma chave
SANDBOX, sempre devolve { "temCicloAtivo": false, "ambiente": "SANDBOX" }
— sandbox nunca gera cobrança.
{- "temCicloAtivo": true,
- "ciclo": {
- "id": "b7f63b53-584e-4e3c-ac1f-dcf47d1188f9",
- "status": "ATIVO",
- "dataInicio": "2026-07-17T16:50:46.690Z",
- "dataFim": "2026-08-16T16:50:46.690Z",
- "plano": {
- "id": "cb898015-0152-4d5b-8de4-7a4a5d34c860",
- "nome": "Growth",
- "precoMensal": "349",
- "franquiaEventos": 2000,
- "precoUnitarioExcedente": "0.19"
}
}, - "franquiaEventos": 2000,
- "eventosIncluidos": 340,
- "eventosExcedentes": 0,
- "saldoExcedenteAberto": 0,
- "limiteExcedenteAberto": 174.5,
- "porEmpresa": [
- {
- "empresaId": "32cecfd5-4d1d-4421-b901-16fadabafe15",
- "quantidade": 340
}
], - "pausadaPorExcedente": false,
- "destravaDisponivel": false
}Só devolve empresas do mesmo ambiente da chave usada (sandbox ou produção).
[- {
- "id": "string",
- "cnpj": "string",
- "ambiente": "SANDBOX",
- "ambienteAdn": "HOMOLOGACAO",
- "escopoMonitoramento": "RECEBIDAS",
- "nomeExibicao": "string",
- "razaoSocial": "string",
- "estado": "DRAFT",
- "nsuInicial": "string",
- "nsuUltimoConfirmado": "string",
- "ultimaConsultaEm": "2019-08-24T14:15:22Z",
- "monitorarDesde": "2019-08-24T14:15:22Z",
- "certificadoValidoAte": "2019-08-24T14:15:22Z",
- "criadaEm": "2019-08-24T14:15:22Z",
- "atualizadaEm": "2019-08-24T14:15:22Z"
}
]Cadastra o CNPJ na conta. Ele nasce em estado DRAFT (produção) —
o próximo passo é enviar o certificado A1 em
POST /companies/{id}/certificate. Com chave sandbox, a empresa já
nasce ACTIVE, sem certificado.
| cnpj required | string >= 11 characters Só dígitos. |
| nomeExibicao | string |
| nsuInicial | integer >= 0 Avançado — de onde retomar a consulta ao ADN, se este CNPJ já era monitorado por outro sistema. Ausência = 0 (histórico completo). |
{- "cnpj": "12345678000195",
- "nomeExibicao": "Filial São Paulo"
}{- "id": "string",
- "cnpj": "string",
- "ambiente": "SANDBOX",
- "ambienteAdn": "HOMOLOGACAO",
- "escopoMonitoramento": "RECEBIDAS",
- "nomeExibicao": "string",
- "razaoSocial": "string",
- "estado": "DRAFT",
- "nsuInicial": "string",
- "nsuUltimoConfirmado": "string",
- "ultimaConsultaEm": "2019-08-24T14:15:22Z",
- "monitorarDesde": "2019-08-24T14:15:22Z",
- "certificadoValidoAte": "2019-08-24T14:15:22Z",
- "criadaEm": "2019-08-24T14:15:22Z",
- "atualizadaEm": "2019-08-24T14:15:22Z"
}| id required | string Id da empresa (o mesmo devolvido em |
{- "id": "string",
- "cnpj": "string",
- "ambiente": "SANDBOX",
- "ambienteAdn": "HOMOLOGACAO",
- "escopoMonitoramento": "RECEBIDAS",
- "nomeExibicao": "string",
- "razaoSocial": "string",
- "estado": "DRAFT",
- "nsuInicial": "string",
- "nsuUltimoConfirmado": "string",
- "ultimaConsultaEm": "2019-08-24T14:15:22Z",
- "monitorarDesde": "2019-08-24T14:15:22Z",
- "certificadoValidoAte": "2019-08-24T14:15:22Z",
- "criadaEm": "2019-08-24T14:15:22Z",
- "atualizadaEm": "2019-08-24T14:15:22Z"
}Inicia a remoção definitiva da empresa. Uma vez que ela já foi
monitorada de verdade (passou por ACTIVE), a remoção é um
processo de dois passos com um período de segurança entre eles,
pra preservar o histórico fiscal — o segundo passo (confirmação)
é feito pelo painel, não pela API pública.
| id required | string Id da empresa (o mesmo devolvido em |
{- "statusCode": 401,
- "message": "Chave de API inválida ou revogada.",
- "error": "Unauthorized"
}Multipart/form-data com o arquivo .pfx/.p12 no campo
certificado e a senha no campo senha. O certificado precisa ser
o e-CNPJ da própria empresa cadastrada — certificados de outro CNPJ
são rejeitados. Não disponível para empresas SANDBOX (nunca usam
certificado real).
Se a empresa já estiver ativa e monitorando (certificado vencendo ou revogado), enviar um novo aqui só troca o material — o monitoramento continua de onde parou, sem reiniciar a análise de histórico.
| id required | string Id da empresa (o mesmo devolvido em |
| certificado required | string <binary> Arquivo do certificado A1 (.pfx ou .p12), até 10MB. |
| senha required | string Senha do certificado. |
{- "id": "string",
- "cnpj": "string",
- "ambiente": "SANDBOX",
- "ambienteAdn": "HOMOLOGACAO",
- "escopoMonitoramento": "RECEBIDAS",
- "nomeExibicao": "string",
- "razaoSocial": "string",
- "estado": "DRAFT",
- "nsuInicial": "string",
- "nsuUltimoConfirmado": "string",
- "ultimaConsultaEm": "2019-08-24T14:15:22Z",
- "monitorarDesde": "2019-08-24T14:15:22Z",
- "certificadoValidoAte": "2019-08-24T14:15:22Z",
- "criadaEm": "2019-08-24T14:15:22Z",
- "atualizadaEm": "2019-08-24T14:15:22Z"
}Volta a consultar o Ambiente de Dados Nacional a partir do último NSU confirmado — nunca reprocessa notas já vistas.
| id required | string Id da empresa (o mesmo devolvido em |
{- "retomada": true
}Lista paginada por cursor, com filtros combináveis.
| cnpjs | string Example: cnpjs=12345678000190,98765432000110 Um ou vários CNPJs separados por vírgula. Ausente = todos os CNPJs da conta. |
| situacao | string (SituacaoNota) Enum: "AUTORIZADA" "CANCELADA" "SUBSTITUIDA" |
| papel | string (PapelNota) Enum: "RECEBIDA" "EMITIDA" Ausente = respeita o escopo de monitoramento configurado em cada empresa. |
| prestador | string Filtra por CNPJ/CPF ou nome do prestador (contém, sem diferenciar maiúsculas). |
| numero | string Número da nota (contém). |
| chaveAcesso | string |
| valorMinCentavos | integer >= 0 |
| valorMaxCentavos | integer >= 0 |
| dataInicio | string <date-time> Filtra por data de emissão (ISO 8601), início do intervalo. |
| dataFim | string <date-time> Filtra por data de emissão (ISO 8601), fim do intervalo. |
| cursor | string Id do último item da página anterior. |
| limite | integer [ 1 .. 100 ] Default: 20 |
{- "itens": [
- {
- "id": "8a1b2c3d-4e5f-6789-abcd-ef0123456789",
- "numero": "1024",
- "nsu": "720",
- "chaveAcesso": "35260712345678000190550010000010241123456789",
- "prestador": {
- "documento": "12345678000190",
- "nome": "Prestador Exemplo LTDA"
}, - "cnpjTomador": "98765432000110",
- "papel": "RECEBIDA",
- "valorServicos": "1500.00",
- "situacao": "AUTORIZADA",
- "dataEmissao": "2026-07-15T10:30:00.000Z",
- "recebidaEm": "2026-07-15T10:31:12.000Z",
- "quantidadeEventos": 0
}
], - "proximoCursor": null
}Inclui o XML original e a linha do tempo de eventos (cancelamento, substituição etc.).
| id required | string |
{- "id": "string",
- "empresaId": "string",
- "chaveAcesso": "string",
- "cnpjTomador": "string",
- "papel": "RECEBIDA",
- "prestador": {
- "documento": "string",
- "nome": "string"
}, - "numero": "string",
- "serie": "string",
- "dataEmissao": "2019-08-24T14:15:22Z",
- "municipio": "string",
- "descricaoServico": "string",
- "valorServicos": "string",
- "situacao": "AUTORIZADA",
- "nsu": "string",
- "recebidaEm": "2019-08-24T14:15:22Z",
- "xmlOriginal": "string",
- "eventos": [
- {
- "id": "string",
- "tipo": "string",
- "sequencia": 0,
- "dataEvento": "2019-08-24T14:15:22Z",
- "recebidoEm": "2019-08-24T14:15:22Z",
- "nsu": "string",
- "situacaoResultante": "AUTORIZADA",
- "xmlOriginal": "string"
}
]
}