IntegroBR NFS-e Recebidas e Emitidas — API Pública (1.0)

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.

Autenticação

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.

SDKs oficiais

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.

Paginação

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).

Limite de requisições

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

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).

Webhooks

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.

Conta

Informações da sua conta e do seu consumo no ciclo atual.

Dados da conta atual

Identifica a conta dona da chave de API usada na requisição.

Authorizations:
chaveApi

Responses

Response samples

Content type
application/json
{
  • "id": "5f9a1c2e-7b3d-4e11-9c2a-1a2b3c4d5e6f",
  • "nome": "Empresa Exemplo LTDA",
  • "status": "ATIVA",
  • "ambiente": "PRODUCAO",
  • "criadaEm": "2026-03-10T13:22:00.000Z"
}

Consumo do ciclo de cobrança atual

Franquia, consumo e excedente do ciclo em andamento. Com uma chave SANDBOX, sempre devolve { "temCicloAtivo": false, "ambiente": "SANDBOX" } — sandbox nunca gera cobrança.

Authorizations:
chaveApi

Responses

Response samples

Content type
application/json
{
  • "temCicloAtivo": true,
  • "ciclo": {
    },
  • "franquiaEventos": 2000,
  • "eventosIncluidos": 340,
  • "eventosExcedentes": 0,
  • "saldoExcedenteAberto": 0,
  • "limiteExcedenteAberto": 174.5,
  • "porEmpresa": [
    ],
  • "pausadaPorExcedente": false,
  • "destravaDisponivel": false
}

Empresas

CNPJs monitorados pela sua conta.

Lista as empresas da conta

Só devolve empresas do mesmo ambiente da chave usada (sandbox ou produção).

Authorizations:
chaveApi

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Cadastra uma empresa (CNPJ) para monitoramento

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.

Authorizations:
chaveApi
Request Body schema: application/json
required
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).

Responses

Request samples

Content type
application/json
{
  • "cnpj": "12345678000195",
  • "nomeExibicao": "Filial São Paulo"
}

Response samples

Content type
application/json
{
  • "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"
}

Detalhe de uma empresa

Authorizations:
chaveApi
path Parameters
id
required
string

Id da empresa (o mesmo devolvido em GET /companies).

Responses

Response samples

Content type
application/json
{
  • "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"
}

Solicita a remoção da empresa

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.

Authorizations:
chaveApi
path Parameters
id
required
string

Id da empresa (o mesmo devolvido em GET /companies).

Responses

Response samples

Content type
application/json
{
  • "statusCode": 401,
  • "message": "Chave de API inválida ou revogada.",
  • "error": "Unauthorized"
}

Envia (ou troca) o certificado digital A1 da empresa

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.

Authorizations:
chaveApi
path Parameters
id
required
string

Id da empresa (o mesmo devolvido em GET /companies).

Request Body schema: multipart/form-data
required
certificado
required
string <binary>

Arquivo do certificado A1 (.pfx ou .p12), até 10MB.

senha
required
string

Senha do certificado.

Responses

Response samples

Content type
application/json
{
  • "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"
}

Pausa o monitoramento da empresa

Nenhuma consulta nova é feita ao Ambiente de Dados Nacional até reativar.

Authorizations:
chaveApi
path Parameters
id
required
string

Id da empresa (o mesmo devolvido em GET /companies).

Responses

Response samples

Content type
application/json
{
  • "pausada": true
}

Retoma o monitoramento da empresa

Volta a consultar o Ambiente de Dados Nacional a partir do último NSU confirmado — nunca reprocessa notas já vistas.

Authorizations:
chaveApi
path Parameters
id
required
string

Id da empresa (o mesmo devolvido em GET /companies).

Responses

Response samples

Content type
application/json
{
  • "retomada": true
}

Documentos

Notas fiscais e seus eventos (cancelamento, substituição etc.).

Lista notas fiscais

Lista paginada por cursor, com filtros combináveis.

Authorizations:
chaveApi
query Parameters
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

Responses

Response samples

Content type
application/json
{
  • "itens": [
    ],
  • "proximoCursor": null
}

Detalhe de uma nota fiscal

Inclui o XML original e a linha do tempo de eventos (cancelamento, substituição etc.).

Authorizations:
chaveApi
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "empresaId": "string",
  • "chaveAcesso": "string",
  • "cnpjTomador": "string",
  • "papel": "RECEBIDA",
  • "prestador": {
    },
  • "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": [
    ]
}