documentação pública

Consultas, monitoramento e webhooks: a referência da API.

Tudo o que a API publica hoje — processos, publicações do diário, jurisprudência, monitores e webhooks — com contratos, custos e exemplos. Se você decide e não integra, comece pelas três perguntas logo abaixo.

Primeira requisição

Base URL: https://api.lexnode.com.br

Autenticação: Authorization: Bearer lapi_live_...

curl -G "https://api.lexnode.com.br/v1/publications" \
  -H "Authorization: Bearer lapi_live_sua_chave" \
  --data-urlencode "oabNumber=123456" \
  --data-urlencode "oabState=SP"
# → as publicações dessa OAB, em JSON.

Sua primeira resposta em 60 segundos

Crie uma chave no portal, cole a chave no lugar de lapi_live_sua_chave e rode os três comandos na ordem. Nenhum deles consome crédito: descobrir que a integração funciona não gasta franquia.

  1. Passo 1

    Prove a chave

    curl -H "Authorization: Bearer lapi_live_sua_chave" \
      https://api.lexnode.com.br/v1/usage

    Responde na hora, do próprio motor, e devolve o consumo do período com o saldo restante. Se voltar 200, a credencial está válida e o resto da travessia funciona.

  2. Passo 2

    Ponha o motor a vigiar

    curl -X POST "https://api.lexnode.com.br/v1/monitors" \
      -H "Authorization: Bearer lapi_live_sua_chave" \
      -H "Content-Type: application/json" \
      -d '{"type":"OAB","oabNumber":"123456","oabState":"SP"}'

    Cadastra a inscrição na OAB e encerra a consulta periódica: a varredura dos diários passa a acontecer no servidor, todo dia, com o seu programa desligado.

  3. Passo 3

    Colha o que chegou

    curl -H "Authorization: Bearer lapi_live_sua_chave" \
      "https://api.lexnode.com.br/v1/events?limit=50"

    Devolve o acumulado desde a sua última leitura e avança o marcador. É a mesma resposta que o webhook entrega — quem prefere receber cadastra um endpoint e não chama mais nada.

Prefere clicar a digitar?

Importe a coleção no Postman, no Insomnia ou no Bruno: as mesmas chamadas, mais as de processo, diário, jurisprudência e webhooks, já com a autenticação configurada e o custo de cada uma na descrição.

Baixar a coleção

Para quem decide, antes da parte técnica

Recebo as publicações da minha OAB automaticamente?

Sim. Um monitor de OAB varre o diário oficial e cada publicação nova chega ao seu sistema por webhook — ninguém precisa ficar consultando.

Quanto custa cada consulta?

Cada operação tem custo fixo em créditos, listado na tabela desta página — e toda resposta da API confirma o valor cobrado. Os planos estão em /precos.

O sistema que meu escritório já usa consegue conectar?

Qualquer sistema que fale HTTP consegue. Quem integra é o fornecedor do seu software (ou o seu dev), usando esta referência; o escritório só colhe o resultado.

Receber as publicações de uma OAB em quatro passos

É o caminho mais usado, e o que mais economiza chamadas: você cadastra a OAB uma vez e o motor avisa quando sai publicação. Não é preciso consultar de tempos em tempos para descobrir novidade — a novidade é que chega até você.

  1. Passo 1

    Cadastre o endereço que recebe

    POST /v1/webhooks/endpoints

    A URL do seu sistema (ou do seu fluxo de automação) e os eventos que ela aceita. Comece por PUBLICATION_CREATED. Guarde o segredo devolvido: é com ele que a assinatura de cada entrega é conferida.

  2. Passo 2

    Cadastre a OAB a acompanhar

    POST /v1/monitors { "type": "OAB", "oabNumber": "123456", "oabState": "SP" }

    A varredura passa a rodar sozinha, uma vez por edição do diário. Não custa crédito, e é ela que substitui a consulta em laço.

  3. Passo 3

    Receba o aviso

    PUBLICATION_CREATED → seu endpoint

    Chega processo, tribunal, data e um trecho do teor. Já dá para triar sem nenhuma chamada de volta.

  4. Passo 4

    Leia o ato quando precisar do teor

    GET /v1/publications/{publicationKey}?maxTextChars=4000

    Custa 0 créditos. Use maxTextChars para não receber uma pauta inteira quando bastava o começo do ato, e guarde o ETag: relendo com If-None-Match, a resposta volta sem corpo.

Usa n8n, Make ou outra ferramenta de automação? Os quatro passos são requisições HTTP comuns — nenhum passo exige escrever código. O nó que recebe o webhook é o passo 3, e a conferência da assinatura está descrita em webhooks.

Pesquisar jurisprudência em quatro chamadas

A pesquisa de acórdãos vive sob /v1/publications e trabalha com resultado congelado: a busca vira um recurso permanente, e reabri-la depois não custa crédito nem muda o resultado.

  1. Passo 1

    Confira a cobertura

    GET /v1/publications/corpus/coverage

    Diz se o tribunal, o período e a matéria que você quer já estão indexados — e quais matérias ficam fora do acervo. Custa 0 créditos e é o que separa “não existe julgado” de “ainda não foi colhido”.

  2. Passo 2

    Pesquise e congele

    POST /v1/publications/text-searches

    Devolve os acórdãos ranqueados com relator, órgão julgador, data de julgamento e classe — e grava o resultado como um recurso permanente, com id próprio.

  3. Passo 3

    Leia o teor

    GET /v1/publications/text-searches/{searchId}

    Traz o teor de cada acerto e não custa crédito. A mesma busca reaberta amanhã devolve o mesmo resultado — é o que torna a citação reproduzível numa peça. Para receber o teor já no passo 2, mande hydrate: true: é esta mesma leitura, na mesma chamada e sem crédito extra.

  4. Passo 4

    Acompanhe o tema

    POST /v1/publications/text-alerts

    Transforma a pesquisa em vigília permanente: cada julgado novo que casa com a consulta chega ao seu endpoint como PUBLICATION_TEXT_ALERT_MATCHED.

O que o acervo cobre, por matéria

Uma pesquisa vazia só é resposta quando se sabe se a matéria está no acervo. A lista abaixo é a declaração do motor — a mesma que a rota de cobertura devolve, ali com estado e contagem por tribunal.

No acervo

  • Justiça estadual

    Cível, família e sucessões, consumidor, empresarial e criminal de competência estadual: publicações do diário oficial dos tribunais de justiça e o acervo estruturado de acórdãos do tribunal do Distrito Federal.

  • Justiça federal

    Previdenciário, tributário e administrativo em juízo federal: publicações do diário oficial dos tribunais regionais federais.

  • Direito federal infraconstitucional

    Uniformização da lei federal pelo tribunal superior: espelho estruturado dos acórdãos, inteiros teores e publicações do diário oficial. Os precedentes qualificados têm rota própria.

  • Trabalhista

    Publicações do diário oficial dos tribunais regionais do trabalho e do tribunal superior do trabalho: sentença, acórdão e despacho como publicados, não um acervo indexado por ementa.

  • Militar

    Publicações do diário oficial do tribunal superior militar e das justiças militares estaduais.

  • Tributário administrativo

    Acórdãos do contencioso administrativo fiscal federal, com ementa, decisão e inteiro teor.

Fora do acervo

  • Eleitoral

    Jurisprudência dos tribunais regionais eleitorais e do tribunal superior eleitoral.

  • Constitucional

    Jurisprudência do tribunal constitucional: controle de constitucionalidade e recurso extraordinário.

  • Previdenciário administrativo

    Decisões do contencioso administrativo previdenciário, antes do juízo federal.

  • Atos normativos do Judiciário

    Resoluções, provimentos e recomendações do conselho nacional do Judiciário.

  • Controle externo de contas

    Acórdãos do tribunal de contas federal.

Autenticação
As rotas usam Authorization: Bearer lapi_live_.... A chave de teste lapi_test_ (criada no portal) relê do acervo o que a conta já buscou com a chave de produção — consulte primeiro com a chave de produção, e o processo passa a responder à chave de teste. Publicação do diário só pelo número do processo e por 7 dias após a consulta de produção; o processo não tem esse prazo. A chave de teste não serve busca no diário por OAB, texto, parte ou período. Nada do que ela faz debita créditos.
Cobertura atual
Processos e movimentações, publicações do diário oficial, jurisprudência, monitores de OAB, de processo e de termo, assinaturas de processo, busca assíncrona, lote de snapshots, calendário forense, webhooks, canal para agentes de IA (MCP) e visibilidade de uso.
Contrato versionado
Superfície /v1 com evolução aditiva: campos e rotas só entram somando; mudança incompatível exige rota nova. Swagger UI e openapi.json são a referência oficial.
Tipos TypeScript
@lexnode/legal-data-sdk traz o contrato inteiro como tipos gerados do openapi.json — requisições, respostas e erros de cada rota —, sem cliente HTTP embutido: você escolhe o transporte e o compilador confere o resto. Instalação e uso na seção "Tipos TypeScript" desta página.

entradas documentadas

Como a API recebe as consultas hoje

Os contratos abaixo refletem os filtros realmente definidos nos schemas públicos da API neste momento.

POST /v1/legal-norms/resolve
Resolve a norma federal citada no registro oficial: prova que o ato consta e devolve o que o registro declara — apelidos, ementa, alterações permanentes e se foi revogado no todo, convertido em lei ou rejeitado. Não confere o teor do artigo nem afirma vigência; ausência de revogação declarada não é prova de que a norma esteja em vigor. Citação que não se entende e tipo de ato fora do registro são recusados antes da consulta e não custam crédito.
POST /v1/publications/text-searches
A pesquisa de jurisprudência. Devolve os acórdãos ranqueados com a citação completa — relator, órgão julgador, data de julgamento e classe — e congela o resultado num recurso permanente. Com hydrate: true o teor vem já nesta resposta, sem crédito adicional; sem ele, reabra com GET .../{searchId}, que também não custa crédito.
GET /v1/publications/corpus/coverage
Consulte antes de pesquisar: diz se o tribunal e o período que você quer já estão indexados, e traz em areas a cobertura por matéria — inclusive as que ficam fora do acervo. Custa 0 créditos e é o que distingue “não há julgado” de “ainda não foi colhido”.
GET /v1/publications
Aceita processNumber, ou oabNumber com oabState, ou tribunalCode — que entende tanto a sigla (STJ) quanto o apelido da fonte. Também suporta availableFrom, availableTo, page, pageSize e includeRaw.
GET /v1/court-calendar
Os dias em que o prazo não corre no tribunal, na janela pedida, a 0 créditos. O tribunal vai em court, pela sigla (court=TJSP) ou pelo apelido da fonte, e a janela em from/to no formato AAAA-MM-DD. Cada entrada traz kind: HOLIDAY para dia sem expediente e RECESS para o período em que o curso do prazo fica suspenso. A resposta traz coverage: camada a camada, o estado dela nesta consulta — janela sem entradas só significa que não há dia sem expediente nas camadas marcadas como CONSULTED.
POST /v1/processes/search
Exige tribunalAlias — pela sigla (TJSP) ou pelo apelido da fonte (api_publica_tjsp), os dois valem — e pelo menos um filtro adicional, como number, classCode, courtBodyCode, degree, filedFrom/filedTo ou updatedFrom/updatedTo.
POST /v1/subscriptions
Declara interesse legítimo num processo — é o que autoriza o motor a servir do acervo o que outro cliente já buscou. Aceita o tribunal pela sigla (TJSP) ou pelo apelido da fonte, e exige o escopo Assinaturas (escrita). GET lista o que está declarado; o cabeçalho X-Office-Id recorta a lista pelo sub-tenant.
POST /v1/monitors
Cria um monitor de processo ou de OAB. A varredura roda sozinha e as novidades chegam por webhook — o par que transforma consulta em acompanhamento.
POST /v1/webhooks/endpoints
Cadastra o endpoint receptor por API — escopo Gerenciar webhooks (WEBHOOKS_WRITE). O signingSecret aparece uma única vez; rotação, entrega de teste e replay também são operações da API.
GET /v1/processes/{numero}/snapshot
Processo + movimentações em uma chamada só. Para carteiras inteiras, POST /v1/processes/snapshot-batch resolve o lote em uma requisição.
GET /v1/events
Os eventos que o motor produziu para a conta, com o estado de entrega de cada um. Com undeliveredOnly=true, mostra o que nunca chegou ao seu receptor — é daqui que sai o eventId do replay. Custa 0 créditos.
GET /
A descoberta, sem autenticação: versão, URL da documentação, do OpenAPI e da sonda de saúde — e o bloco stability, com a política de versionamento e a lista de rotas depreciadas. Vazia é a resposta desejada: nenhuma rota tem data de desligamento.
GET /v1/usage
Saldo e consumo de créditos do ciclo atual, sem custo. Toda resposta da API também confirma a cobrança daquela chamada em meta.credits.

Créditos por operação

O plano dá um saldo mensal de créditos. O custo é fixo por operação e toda resposta confirma a cobrança em meta.credits.

Além do saldo, há dois tetos de chamadas, e eles contam coisas diferentes. O por minuto conta toda requisição. O por dia conta apenas as que precisam consultar a fonte — o que já está no acervo não gasta o teto diário. Ao estourar qualquer um deles a resposta é 429 RATE_LIMITED com Retry-After, e o campo details.window diz qual dos dois foi.

Não é preciso esperar a recusa para saber quanto resta: toda resposta traz RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset do teto por minuto. Eles descrevem só essa janela — o consumo do dia e do ciclo se consulta em GET /v1/usage, que não custa crédito e discrimina por operação e por cliente seu. Na resposta de sucesso o Reset é a janela inteira em segundos; quem for recusado recebe no 429 o instante exato em que ela reabre.

Os números de cada plano — vazão, franquia, monitores, teto por chave e os tetos por requisição — estão reunidos em limites e cotas.

OperaçãoCréditos
Descoberta, saúde, tribunais, calendário forense0
POST /v1/processes/search1 com dado fresco no lake · 3 consultando a fonte
GET /v1/processes/{numero}1 com dado fresco no lake · 3 consultando a fonte
GET /v1/processes/{numero}/related1
GET /v1/processes/{numero}/movements5
GET /v1/processes/{numero}/snapshot8
POST /v1/processes/snapshot-batch8 por item concluído
GET /v1/publications por processo2
GET /v1/publications por OAB5
GET /v1/publications por janela de tribunal ou por texto8
GET /v1/publications/{publicationKey}0
POST /v1/publications/text-searches3 (+1 por fatia nova de colheita)
POST /v1/publications/corpus/harvest-requests1 por fatia nova
POST /v1/legal-norms/resolve3 · citação não entendida ou fora do alcance do registro: 0
Vigílias de texto, monitores (processo, OAB, termo), assinaturas, jobs de busca, webhooks, uso0

Erros e comportamento

Todo erro chega no envelope { error: { code, message, requestId, class, retryable } }. Recurso de outra conta responde 404, nunca 403 — fora do seu escopo, o recurso não existe.

codeHTTPVale reenviar?
VALIDATION_ERROR400não
UNAUTHORIZED401não
QUOTA_EXCEEDED402não
INSUFFICIENT_SCOPE · LGPD_FORBIDDEN403não
PLAN_FEATURE_NOT_INCLUDED403não
PROCESS_NOT_FOUND · MOVEMENTS_NOT_AVAILABLE · RESOURCE_NOT_FOUND404não
RESOURCE_CONFLICT409não
RATE_LIMITED429sim
UPSTREAM_RATE_LIMITED429sim
INTERNAL_ERROR500não
UPSTREAM_UNAVAILABLE502sim
UPSTREAM_TIMEOUT504sim

O header opcional X-Request-Id é ecoado na resposta e serve ao rastreio em qualquer rota; na busca textual e no job de busca ele funciona também como chave de idempotência, e reenviar o mesmo valor reapresenta o resultado sem nova cobrança. Nas demais rotas ele não deduplica nada. X-Office-Id atribui a chamada a um sub-tenant seu na medição de uso — e recorta o que a leitura enxerga: com ele, monitores, jobs de busca e assinaturas alcançam o que foi atribuído àquele sub-tenant e o que não foi atribuído a nenhum; sem ele, a conta inteira. A fronteira entre contas é sempre a chave de API, nunca este header.

Monitores + webhooks: o acompanhamento sem polling

Sete tipos de evento chegam assinados (HMAC-SHA256) no endpoint do seu sistema, com política de reentrega documentada. O guia traz payloads de exemplo e o código de verificação da assinatura.

Guia de webhooks

tipos typescript

O contrato inteiro no seu editor

O pacote @lexnode/legal-data-sdk traz requisições, respostas e erros de cada rota como tipos gerados do openapi.json. Não embute cliente HTTP: você escolhe o transporte (fetch, axios, openapi-fetch) e o compilador confere o resto. A versão do pacote acompanha a do contrato.

Ver o pacote no npm

Instalação

npm install -D @lexnode/legal-data-sdk

Uso

import type { paths, operations } from "@lexnode/legal-data-sdk";

// Uma operação inteira, pela rota e pelo método:
type SearchProcesses = paths["/v1/processes/search"]["post"];

// Ou pelo operationId — aqui, o corpo de sucesso de listTribunals:
type Tribunals =
  operations["listTribunals"]["responses"][200]["content"]["application/json"]["data"];

exemplos de integração

Snippets prontos para stacks comuns nesse tipo de operação

Selecione a linguagem e o endpoint publicado que você quer integrar. As rotas dinâmicas já entram comprocessNumbere os parâmetros obrigatórios no snippet.

Exemplo de integração
GET/v1/publications

BFFs, workers, APIs internas e serviços SaaS.

Recupera as publicações do diário oficial de uma OAB — o mesmo filtro que alimenta monitores e webhooks.

Endpoint
Linguagem
const API_BASE_URL = "https://api.lexnode.com.br"; const API_KEY = process.env.LEXNODE_API_KEY; if (!API_KEY) { throw new Error("LEXNODE_API_KEY is required"); } const oabNumber = "123456"; const oabState = "SP"; const page = 1; const pageSize = 20; const url = new URL(API_BASE_URL + `/v1/publications`); url.searchParams.set("oabNumber", String(oabNumber)); url.searchParams.set("oabState", String(oabState)); url.searchParams.set("page", String(page)); url.searchParams.set("pageSize", String(pageSize)); const response = await fetch(url, { method: "GET", headers: { Authorization: "Bearer " + API_KEY, "Content-Type": "application/json", }, }); if (!response.ok) { throw new Error("LexNode request failed: " + response.status); } const result = await response.json(); console.log(result.data);

referência viva da API

Endpoints públicos disponíveis agora

Esta lista é carregada a partir do openapi.json da API. A UI completa do Swagger continua disponível em paralelo para consulta direta.

Spec atual
Aguardando carregamento

Versão: -

Operações mapeadas: 0

Autenticação
Bearer API key

As rotas publicadas em /v1 usam o header Authorization: Bearer lapi_live_....

No modal Authorize do Swagger UI, cole apenas lapi_live_.... O prefixo Bearer já é adicionado automaticamente.

Status
Carregando…

Origem: https://api.lexnode.com.br/openapi.json