Pular para o conteúdo

Documentação da Clean API

Consulte as instruções de autenticação, os endpoints disponíveis e os exemplos para desenvolver sua integração.

Beta

O acesso depende de liberação para o escritório e dos recursos contratados.

Endereço base
https://api.cleanjuris.com.br/v1
Autenticação
Chave pessoal no cabeçalho Authorization
Versão
1.0.0

Início rápido

Três passos até a primeira resposta: crie a chave, chame /eu para confirmar quem você é e siga para o recurso que interessa.

A API é REST sobre HTTPS, fala JSON nos dois sentidos e responde em português. Todo endereço começa por https://api.cleanjuris.com.br/v1.

1. Crie sua chave. Quando a API estiver liberada para o escritório, abra Configurações › Integrações › API e webhooks, selecione os escopos necessários e guarde a chave exibida.

2. Confirme a chave
curl https://api.cleanjuris.com.br/v1/eu \
  -H "Authorization: Bearer cjk_live_SUA_CHAVE"
Resposta
{
  "usuario": {
    "id": "0a5f0b62-2f2c-4c0a-9d59-2f39a1c1f001",
    "nome": "Ana Ribeiro",
    "papel": "advogado"
  },
  "escritorio": { "id": "7f2a1c30-9b41-4a2e-8f2b-1d4c5e6a7b88" },
  "chave": {
    "id": "5c1d9e70-4b2a-4f18-9c33-8a7b6c5d4e21",
    "nome": "Automação n8n",
    "prefixo": "cjk_live_9f2a1c3",
    "expira_em": "2027-03-02T00:00:00Z",
    "escopos": ["prazos:read", "processos:read"]
  },
  "escopos_efetivos": ["prazos:read"],
  "categorias_desligadas": ["financeiro", "processos"],
  "quota": { "limite_dia": 3000, "usado": 137 }
}

Se isso funcionou, a chave está válida. Compare os dois campos de escopo antes de concluir o que ela alcança: chave.escopos é o que foi marcado na criação e escopos_efetivos é o que vale agora, já descontadas as categorias que o escritório desligou (listadas em categorias_desligadas). quota vem null quando a medição não estava disponível no momento da chamada.

3. Prazos que vencem nos próximos 15 dias
curl "https://api.cleanjuris.com.br/v1/prazos?dias=15" \
  -H "Authorization: Bearer cjk_live_SUA_CHAVE"

A resposta nunca passa das permissões de quem criou a chave

A chave herda o que aquela pessoa enxerga dentro do sistema. Processo que ela não acompanha, evento privado de um colega e categoria de dado que o escritório desligou não aparecem, mesmo com o escopo marcado na chave.

Autenticação

Uma chave pessoal no cabeçalho Authorization. Sem OAuth, sem troca de token, sem sessão.

Toda chamada leva o cabeçalho Authorization: Bearer cjk_live_…. A chave começa sempre por cjk_live_, e os primeiros caracteres dela aparecem no sistema para a pessoa reconhecer qual é.

  • Onde criar: dentro do Clean Juris, em Configurações › Integrações › API e webhooks. Quem cria é a pessoa que vai responder pela automação.
  • Validade: 30, 90 ou 365 dias, ou sem validade. Chave que expira sozinha é a escolha mais segura para automação de terceiro.
  • Uma vez só: o código completo aparece na criação e não é mostrado de novo. Guarde no cofre de senhas da automação; se perder, revogue e crie outra.
  • Revogação: a qualquer momento, na mesma tela, com efeito a partir da próxima requisição. A chave é relida do banco a cada requisição, então não existe cache que a mantenha viva: a primeira chamada depois da revogação já responde 401 com o código chave_revogada.

Trate a chave como senha

Ela vale enquanto existir. Nunca coloque a chave em código versionado, em URL, em front-end de navegador nem em log. Se ela vazou, revogue primeiro e crie a nova depois.

Escopos

A chave só alcança o que foi marcado na criação. Chamar fora do escopo devolve 403 dizendo qual escopo faltou.

Selecione apenas os escopos necessários. Uma automação que só monta um relatório de prazos não precisa de escrita em lugar nenhum, e uma chave sem escrita não consegue mudar nada mesmo que o código dela tenha um bug.

Escopos disponíveis na versão 1 da API e o que cada um libera
EscopoO que libera
processos:readLer a capa, as partes e os andamentos de um processo pelo número CNJ.
processos:writeCadastrar processo e alterar os dados dele.
prazos:readListar prazos a vencer, consultar os tipos e calcular a data fatal.
prazos:writeCriar prazo e marcar prazo como cumprido.
agenda:readLer compromissos e audiências de um período.
agenda:writeCriar compromisso, marcar audiência, remarcar e cancelar.
tarefas:readListar quadros e tarefas do escritório e da pessoa dona da chave.
tarefas:writeCriar, editar, mover e concluir tarefa, e vincular prazo a tarefa.
pessoas:readLer os processos de uma pessoa e verificar conflito de interesses.
pessoas:writeCadastrar pessoa e alterar o cadastro dela.
intimacoes:readListar intimações recebidas e ler o teor publicado pelo tribunal.
intimacoes:writeMarcar intimação como tratada.
webhooks:manageCriar, editar e remover as assinaturas de webhook do escritório.

Marcar escrita implica leitura na mesma categoria. O acesso efetivo é sempre a interseção de três coisas: os escopos da chave, as categorias que o escritório mantém ligadas e o que a pessoa dona da chave já enxerga no sistema.

Financeiro não tem escopo nesta versão

Valores, lançamentos e contas a receber ficam fora da versão 1: não existe rota nem escopo para eles. Isso é decisão de produto, não uma pendência de implementação.

Limites e cotas

Consulte os limites por minuto e a cota diária nos cabeçalhos das respostas que passaram pela autenticação.

  • 120 chamadas por minuto, por endereço de origem. Esse é anterior à autenticação: ele existe para que tentativa de chave atrás de chave não vire carga no sistema. Integrações que compartilham o mesmo endereço de origem também compartilham esse limite.
  • 60 chamadas por minuto, por chave. É o teto de uma automação sozinha.
  • 600 chamadas por minuto, por escritório. Somando todas as chaves do escritório.
  • Cota diária do plano. Ela é compartilhada entre a API, os webhooks e o conector de inteligência artificial do escritório, e zera às 00h de Brasília. Plano sem teto não tem este limite.

Cota diária por plano

Cota diária de chamadas por plano
PlanoChamadas por dia
Solo e Solo Plus (com o adicional Conector de IA)300
Profissional1.000
Escritório3.000
Enterprise10.000
Banca30.000
Personalizadosem teto

A cota é do escritório, somando conector de IA, API e webhooks, e zera à meia-noite de Brasília. Quem precisa de mais compra o adicional +1.000 chamadas por dia (R$ 49,90/mês) em Meu Plano ou sobe de plano.

Cabeçalhos de resposta que informam limite e cota
CabeçalhoO que informa
X-Request-IdIdentificador daquela chamada. Guarde no seu log: é por ele que o suporte acha o que aconteceu.
X-RateLimit-LimitQuantas chamadas cabem na janela de um minuto, no limite que vale para aquela resposta.
X-RateLimit-RemainingQuantas ainda cabem na janela atual.
X-RateLimit-ResetQuando a janela reabre, em segundos desde 1970.
X-Quota-LimitTeto diário do escritório. Ausente quando o plano não tem teto.
X-Quota-UsedQuanto do dia já foi consumido.
Retry-AfterSó no 429: quantos segundos esperar antes de tentar de novo.

Os cabeçalhos vêm nas respostas que passaram da autenticação

Respostas 401 e recusas pelo limite de endereço de origem não incluem esses dados: a chamada ainda não passou pela autenticação. O par X-RateLimit-Limit e X-RateLimit-Remaining descreve sempre o limite que decidiu aquela resposta, então num 429 do escritório ele mostra 600, e não 60.

Como reagir ao 429

Espere o número de segundos do Retry-After e tente de novo, com espera crescente a cada nova recusa. Repetir na hora só consome a janela seguinte. Se você faz carga grande, prefira assinar um webhook a varrer a API em laço.

Paginação

Nas rotas paginadas, use o cursor devolvido pela resposta. Consulte na referência os limites e o formato de cada lista.

O exemplo abaixo mostra os campos de uma lista com cursor. Algumas rotas usam listas próprias, como /prazos, ou não oferecem cursor, como /agenda. Nesses casos, siga os filtros e limites da referência.

Exemplo de lista com cursor
{
  "itens": [
    {
      "id": "3f7c9a10-5a2b-4c8d-9e11-77b0c2d4e5f6",
      "numero_cnj": "0800123-45.2026.8.19.0001",
      "tipo": "Contestação",
      "data_fatal": "2026-09-18"
    }
  ],
  "total_devolvido": 1,
  "total_disponivel": 37,
  "truncado": false,
  "proximo_cursor": null
}
  • itens traz os registros, total_devolvido quantos vieram nesta resposta.
  • total_disponivel é quantos registros existem no filtro inteiro, e não só nesta página. Ele vem SÓ quando a consulta consegue contar sem custo alto: ausente não quer dizer zero, quer dizer que o total não foi apurado. Use para barra de progresso, nunca como condição de parada.
  • truncado em true avisa que o recorte pedido é maior do que uma resposta comporta.
  • proximo_cursor vem preenchido quando há mais páginas, e null quando acabou. Pare quando ele for nulo, nunca por contagem própria.
Próxima página
curl "https://api.cleanjuris.com.br/v1/intimacoes?dias=30&cursor=ZXhlbXBsby1kZS1jdXJzb3I" \
  -H "Authorization: Bearer cjk_live_SUA_CHAVE"

O cursor é opaco e vale só na mesma rota

Não tente ler, montar nem reaproveitar o cursor em outro endereço. O formato pode mudar sem aviso, porque ele nunca fez parte do contrato.

Erros

Os erros usam o formato RFC 9457 (application/problem+json). Trate cada situação pelo campo codigo da resposta.

Exemplo de erro
HTTP/1.1 403 Forbidden
Content-Type: application/problem+json

{
  "type": "https://cleanjuris.com.br/desenvolvedores#erro-escopo_insuficiente",
  "title": "Escopo insuficiente",
  "status": 403,
  "detail": "Esta chave não tem o escopo prazos:write, exigido por esta rota.",
  "instance": "/v1/prazos",
  "codigo": "escopo_insuficiente",
  "escopo_necessario": ["prazos:write"]
}

Programe contra o campo codigo, que é estável, e não contra o texto de title ou detail, que existem para pessoas e podem ser reescritos.

O campo type de cada erro aponta para a linha desta tabela: abrir a URL que veio na resposta leva direto à explicação do código.

Códigos de erro da versão 1 da API
HTTPCódigoQuando acontece
400validacaoAlgum campo do pedido é inválido. A resposta traz a lista de campos com o motivo de cada um.
400idempotencia_obrigatoriaFaltou o cabeçalho Idempotency-Key numa chamada que grava.
401nao_autorizadoA chave não veio, veio malformada ou não existe.
401chave_revogadaA chave foi revogada dentro do sistema.
401chave_expiradaA validade da chave terminou. Crie outra.
403escopo_insuficienteA chave não carrega o escopo que a rota exige. O campo escopo_necessario diz qual é.
403categoria_desligadaO escritório desligou essa categoria de dado para integrações.
403mfa_exigidaA verificação em duas etapas é exigida para esta conta ou escritório e a chave foi criada sem ela; crie uma chave nova depois de entrar com o código.
403api_nao_disponivelO plano do escritório não inclui a API.
404nao_encontradoO registro não existe, ou a pessoa dona da chave não o enxerga.
405metodo_nao_permitidoO endereço existe, mas não aceita esse método.
409idempotencia_conflitoA mesma Idempotency-Key foi reusada com um corpo diferente.
409idempotencia_em_andamentoUma chamada com essa mesma Idempotency-Key ainda está em processamento. Espere a resposta dela em vez de reenviar.
413corpo_grandeO corpo passou de 256 KB. Nenhuma rota do contrato precisa de um corpo desse tamanho.
429rate_limitChamadas demais em pouco tempo, por origem ou por chave. Espere o que o Retry-After indicar.
429quota_diariaA cota diária do escritório acabou. Ela volta na virada da meia-noite de Brasília.
500erro_internoErro interno do servidor. Tente de novo e, se insistir, fale com o suporte com o X-Request-Id em mãos.
500servidor_nao_configuradoFalta configuração do nosso lado e nenhuma chamada autenticada passa. Avise o suporte: não adianta tentar de novo.

Idempotência

Chamadas de gravação exigem Idempotency-Key. Repetir a chave com o mesmo corpo, durante sua validade, evita executar a operação novamente.

Gere um identificador único por operação (um UUID serve) e mande no cabeçalho Idempotency-Key. Se a rede cair no meio e você repetir a chamada com a mesma chave e o mesmo corpo, a resposta gravada volta com o cabeçalho Idempotent-Replayed: true, sem executar a operação novamente.

Criar prazo com idempotência
# Consulte /intimacoes e /prazos/tipos para obter os IDs.
# Use dados reais do seu escritório; os valores abaixo são placeholders.
curl -X POST https://api.cleanjuris.com.br/v1/prazos/calcular \
  -H "Authorization: Bearer cjk_live_SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"intimacao_id":"ID_DA_INTIMACAO","tipo_prazo_id":"ID_DO_TIPO"}'

# Confira o resultado e use a data retornada em data_fatal_confirmada.
curl -X POST https://api.cleanjuris.com.br/v1/prazos \
  -H "Authorization: Bearer cjk_live_SUA_CHAVE" \
  -H "Idempotency-Key: 6c1f2a48-90b1-4a77-9f2d-1b3c5d7e9f00" \
  -H "Content-Type: application/json" \
  -d '{
    "intimacao_id": "ID_DA_INTIMACAO",
    "tipo_prazo_id": "ID_DO_TIPO",
    "data_fatal_confirmada": "DATA_RETORNADA_NO_CALCULO"
  }'
  • Mesma chave e mesmo corpo: o resultado é recuperado, sem repetir a gravação. Na criação e na rotação de webhooks, o segredo não é incluído no replay.
  • Mesma chave e corpo diferente: 409 com o código idempotencia_conflito. Troque a chave quando o pedido mudar.
  • A chave vale por 24 horas. Depois disso ela é esquecida, e repetir a chamada cria um registro novo.
  • Consultas que usam POST porque recebem muitos parâmetros (calcular prazo, busca, conflito de interesses) não exigem o cabeçalho: elas não gravam nada.

Webhooks

Receba os eventos escolhidos no endereço do seu servidor, sem precisar consultar a API repetidamente para descobrir uma mudança.

Quem cria a assinatura é um administrador do escritório, em Configurações › Integrações › API e webhooks, ou uma chave com o escopo webhooks:manage pelas rotas em https://api.cleanjuris.com.br/v1/webhooks. A lista completa de eventos assináveis está em https://api.cleanjuris.com.br/v1/webhooks/eventos, com o rótulo de cada um em português.

O evento traz identificadores

O aviso carrega só o tipo do evento, quando aconteceu e o identificador do registro. O evento não inclui título, nome nem texto de intimação. Pode incluir o número CNJ, conforme o tipo de evento. Para consultar o conteúdo, chame a API com a sua chave, e aí valem os escopos e as permissões dela.

Corpo da entrega
{
  "id": "b2f4d6a8-1c3e-4b5a-9d7f-0e1a2b3c4d5e",
  "evento": "prazos.criado",
  "ocorrido_em": "2026-09-02T14:07:31Z",
  "escritorio_id": "7f2a1c30-9b41-4a2e-8f2b-1d4c5e6a7b88",
  "recurso": {
    "tipo": "prazo",
    "id": "3f7c9a10-5a2b-4c8d-9e11-77b0c2d4e5f6",
    "processo_id": "1b8e2c55-6d4f-4a90-8e21-0c9b7a6d5e43",
    "numero_cnj": "0800123-45.2026.8.19.0001"
  }
}

recurso.processo_id e recurso.numero_cnj vêm apenas quando o evento é de um processo, e nunca de processo em segredo de justiça: esse não gera evento nenhum. Para montar o mapeamento antes de existir um evento real, peça o exemplo do evento que você vai assinar.

Exemplo do corpo de um evento
curl https://api.cleanjuris.com.br/v1/webhooks/eventos/prazos.criado/exemplo \
  -H "Authorization: Bearer cjk_live_SUA_CHAVE"

Cabeçalhos de cada entrega

Cabeçalhos
X-CleanJuris-Event: prazos.criado
X-CleanJuris-Delivery: b2f4d6a8-1c3e-4b5a-9d7f-0e1a2b3c4d5e
X-CleanJuris-Signature: t=1756800000,v1=ce65d76f5c9f5eefd675e5650fe215459b0069d16c9c78d385748031c4397df8
User-Agent: CleanJuris-Webhooks/1.0
  • X-CleanJuris-Delivery é o identificador da entrega. Use para descartar repetição: uma entrega pode chegar duas vezes se a sua resposta demorar.
  • X-CleanJuris-Signature traz o instante t e a assinatura v1, que é o HMAC SHA-256 de t + "." + corpo com o segredo da assinatura.

Como conferir a assinatura

Calcule sobre o corpo CRU do pedido, antes de qualquer conversão para objeto: reserializar o JSON muda os bytes e derruba a conferência. Compare em tempo constante e recuse entrega com mais de 5 minutos de idade.

import crypto from 'node:crypto';

/** Confere a assinatura de uma entrega. `corpo` é o texto CRU, antes de virar JSON. */
export function assinaturaValida(corpo, cabecalho, segredo) {
  const partes = Object.fromEntries(
    cabecalho.split(',').map((p) => p.trim().split('=')),
  );
  const t = Number(partes.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false; // 5 minutos

  const esperada = crypto
    .createHmac('sha256', segredo)
    .update(`${partes.t}.${corpo}`)
    .digest('hex');

  const a = Buffer.from(esperada, 'hex');
  const b = Buffer.from(partes.v1 ?? '', 'hex');
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}
Vetor de teste
segredo: segredo_de_teste
t:       1756800000
corpo:   {"id":"evt_1","evento":"ping"}

v1 esperado:
ce65d76f5c9f5eefd675e5650fe215459b0069d16c9c78d385748031c4397df8

Atualize o segredo também no servidor de destino

O segredo pode ser revelado e trocado a qualquer momento pelo administrador, na tela do escritório. A partir da troca, as entregas saem assinadas com o novo, e quem ainda conferir com o antigo passa a recusar tudo. Troque nos dois lados na mesma janela.

Retentativas e pausa automática

Responda 2xx assim que receber e processe depois. Resposta fora da faixa 2xx, tempo esgotado ou conexão recusada contam como falha, e a entrega volta para a fila.

Espera entre as tentativas de entrega
TentativaQuando sai
1ªna hora
2ª1 minuto depois
3ª5 minutos depois
4ª30 minutos depois
5ª2 horas depois
6ª8 horas depois
  • Depois da última tentativa, a entrega fica marcada como falha. O administrador consulta a entrega na tela do escritório, com o erro do seu servidor, e pode reenviar quando o destino voltar.
  • Depois de 50 falhas seguidas, a assinatura é pausada para interromper tentativas repetidas contra um destino indisponível. A tela do escritório informa o motivo e permite reativar.
  • Os eventos que aconteceram durante a pausa não são reenviados sozinhos. Quando reativar, busque pela API o que mudou no período.

Versionamento e deprecação

Durante o Beta, a versão 1 pode receber mudanças incompatíveis com aviso prévio. Após o lançamento público, vale a política de compatibilidade descrita abaixo.

A versão está no caminho, em /v1. Após o lançamento público, as mudanças dentro de uma versão são aditivas: não removem campos nem alteram tipos ou significados, observadas as condições de segurança previstas nos Termos de Uso.

Prepare o seu código para receber, sem quebrar:

  • Um campo novo na resposta.
  • Um valor novo num campo de lista (situação, tipo, categoria).
  • Um parâmetro opcional novo.
  • Uma rota nova.
  • Um evento novo no catálogo de webhooks.

Na prática: ignore campo que você não conhece, não trate lista fechada de valores como se fosse fechada para sempre, e não dependa da ordem das chaves do JSON.

Após o lançamento público, uma mudança incompatível exige uma nova versão, como a /v2, e a /v1 continua no ar por pelo menos 12 meses ao lado dela. Durante esse período, toda resposta da versão antiga carrega os cabeçalhos abaixo: o primeiro diz desde quando ela está marcada para sair, o segundo diz a data em que ela sai de verdade.

Cabeçalhos de rota em depreciação
Deprecation: Wed, 01 Sep 2027 00:00:00 GMT
Sunset: Fri, 01 Sep 2028 00:00:00 GMT
Link: <https://cleanjuris.com.br/desenvolvedores>; rel="deprecation"

Durante o piloto, a v1 ainda pode mudar

A API está em Beta: ela roda hoje com um grupo fechado de escritórios, para calibrarmos limites e cotas com uso real. Nesse período, uma mudança incompatível na /v1 é possível, e avisamos por e-mail todos os administradores com chave ativa antes de aplicá-la. A garantia de 12 meses acima passa a valer a partir do lançamento público, e a data dele entra no changelog desta página.

Monitore o cabeçalho Deprecation

Um alerta no seu monitoramento quando o cabeçalho Deprecation aparecer transforma a migração num trabalho tranquilo de meses, em vez de um susto na véspera.

Changelog

Toda mudança da API entra aqui, na data em que foi ao ar.

Histórico de versões da API pública
VersãoDataO que mudou
1.0.002/09/2026Primeira versão, em Beta com um grupo fechado de escritórios. Processos, prazos, agenda e audiências, tarefas, pessoas, intimações, busca e painel. Webhooks com assinatura, retentativas, reenvio e exemplo de corpo por evento.

Segurança e LGPD

As consultas podem conter dados de clientes. O acesso respeita as permissões do usuário, os escopos da chave e as categorias habilitadas.

O que a API nunca entrega

  • Lançamentos e contas a receber do módulo financeiro do escritório.
  • Conversas de atendimento e mensagens de WhatsApp, Instagram ou Messenger.
  • Arquivos e documentos.
  • Dados bancários e documentos de identidade das pessoas cadastradas.
  • Conteúdo de processo em segredo de justiça.
  • Qualquer registro que a pessoa dona da chave já não enxergue dentro do sistema.

O que fica registrado

Toda chamada entra no registro do escritório, com data, quem pediu, qual chave, qual operação e quantos registros voltaram. O administrador vê e exporta esse registro na tela do escritório. É o mesmo lugar onde ele revoga uma chave que não deveria mais existir.

O que esperamos de você

  • Guardar a chave e o segredo do webhook em cofre de senhas, nunca em código versionado nem em log.
  • Pedir só os escopos que a automação usa, e revogar a chave quando ela sair de operação.
  • Tratar o que a API devolve como dado pessoal de cliente do escritório: guardar o mínimo, pelo tempo mínimo, e apagar quando o contrato acabar.
  • Falar com o escritório antes de mandar esse dado para um terceiro. Quem responde pelo tratamento perante o titular é o escritório.

Dúvida de segurança ou incidente

Escreva para suporte@cleanjuris.com.br com o X-Request-Id das chamadas envolvidas. Se você acha que uma chave vazou, peça ao administrador do escritório para revogar antes de qualquer outra coisa.

Referência da API

Todas as rotas, com os escopos que cada uma exige e os campos que ela aceita. Sai da mesma especificação que o servidor publica.

A especificação em OpenAPI fica em /desenvolvedores/openapi.json. Ela serve para gerar cliente na sua linguagem e para importar num cliente de HTTP. Todo caminho abaixo é relativo a https://api.cleanjuris.com.br.