Erros
A API pública usa status HTTP + envelope:
Um contrato previsível de erros permite que sua integração resolva falhas recuperáveis automaticamente, encaminhe exceções com contexto e evite que a equipe precise investigar cada ocorrência manualmente.
Ganho operacional
- diferencie entrada inválida, credencial, saldo, limite e indisponibilidade;
- aplique retry apenas quando a falha for recuperável;
- use
requestIdpara reduzir o tempo de diagnóstico e suporte; - transforme erros esperados em mensagens e ações claras no seu produto.
{
"error": {
"code": "CODIGO",
"message": "Descrição legível"
}
}
Alguns erros incluem campos extras (por exemplo, availableCredits e requiredCredits).
Tabela principal
| HTTP | Código | Significado | Como resolver |
|---|---|---|---|
| 202 | — | Consulta ainda em processamento | Não trate como erro; siga Location/data.statusUrl e respeite Retry-After |
| 401 | API_KEY_REQUIRED | Chave ausente | Envie x-api-key ou Authorization: Bearer |
| 401 | INVALID_API_KEY | Chave inválida/revogada | Gere ou copie a chave em API Keys |
| 401 | INVALID_DOWNLOAD_TOKEN | Link assinado inválido ou alterado | Use exatamente o downloadUrl retornado pela listagem autenticada |
| 401 | DOWNLOAD_TOKEN_EXPIRED | Link de documento expirado | Consulte documentos-publicos novamente para gerar outro link |
| 403 | ACCOUNT_INACTIVE | Conta inativa | Contate o suporte |
| 403 | EMAIL_VERIFICATION_REQUIRED | E-mail não confirmado | Conclua a verificação de cadastro |
| 403 | INSUFFICIENT_CREDITS | Saldo insuficiente | Recarregue em Recarga |
| 400 | MISSING_DOCUMENT | Documento não informado | Envie cpf_cnpj ou document |
| 400 | MISSING_SEARCH_TERM | Termo ausente | Informe o parâmetro de busca exigido |
| 400 | INVALID_JSON | Body JSON inválido | Valide o payload |
| 422 | INVALID_DOCUMENT | CPF/CNPJ inválido | Normalize e valide dígitos |
| 422 | INVALID_LIMIT | Limit inválido | Em /v1/processos, use 50 ou 100 |
| 422 | INVALID_CNJ | CNJ inválido | Normalize o número CNJ |
| 422 | INVALID_OAB / INVALID_OABS | OAB inválida | Use UF e número corretos |
| 422 | INVALID_WEBHOOK_URL | Webhook inválido | Use HTTPS válido |
| 404 | INVALID_API_HOST | Host incorreto | Use api.buscaprocessos.app.br |
| 404 | MONITORING_NOT_FOUND | Monitoramento inexistente | Confira o ID da conta |
| 404 | — | Recurso/lista vazia | Trate conforme o endpoint (ex.: processos não encontrados) |
| 409 | DOWNLOAD_ALREADY_IN_PROGRESS | O mesmo link já iniciou um download | Aguarde a conclusão antes de tentar novamente |
| 410 | DOWNLOAD_TOKEN_ALREADY_FAILED | A tentativa vinculada ao link falhou e foi estornada | Consulte documentos-publicos novamente para gerar outro link |
| 429 | — | Rate limit | Respeite Retry-After, X-RateLimit-* |
| 502 | UPSTREAM_UNAVAILABLE | Fonte indisponível | Retente com backoff |
| 422 | INVALID_CPF / MISSING_QUERY | CPF inválido ou consulta de mandados sem CPF/peça | Envie um CPF válido ou numero_peca |
| 502 | BNMP_UNAVAILABLE / BNMP_BLOCKED | Fonte de mandados temporariamente indisponível | Retente com backoff |
| 429 | BNMP_RATE_LIMITED | A fonte de mandados limitou temporariamente as consultas | Respeite Retry-After |
| 500 | INTERNAL_ERROR | Erro interno | Persist requestId e contate suporte |
📘 Saldo insuficiente
Trate saldo insuficiente como HTTP 403 com códigoINSUFFICIENT_CREDITS.
HTTP 202 não é erro
A API possui uma janela total de resposta de até 30 segundos. Se uma consulta elegível não puder terminar com segurança nessa janela, o servidor continua o mesmo trabalho em segundo plano e responde 202 Accepted antes do timeout.
- persista
data.requestId; - siga o header
Locationoudata.statusUrlcom a mesma API key; - aguarde
Retry-After,data.pollAfterSecondsoudata.pollAfterMs;data.nextPollAtinforma o horário recomendado da próxima tentativa; - mantenha polling finito enquanto o status for
202; - trate o primeiro status diferente de
202como a resposta final; - não repita a chamada de negócio nem crie outro job.
O estado pendente informa meta.creditsCharged: 0. A operação é cobrada uma única vez quando executada; consultar a statusUrl não executa nem cobra a operação novamente. A URL de acompanhamento é temporária e pode retornar 404 ASYNC_REQUEST_NOT_FOUND depois de expirar.
Downloads feitos por downloadUrl assinado permanecem na mesma conexão do navegador e não retornam 202. Se o link expirar ou a tentativa anterior falhar, gere outro pela listagem autenticada de documentos públicos.
Rate limit (429)
Em rotas que usam o perfil de consulta paga a fontes judiciais:
- limite padrão: 2 requisições por segundo por API Key, com rajada de até 10 requisições
- resposta pode incluir
retryAfter - headers:
Retry-After,X-RateLimit-Limit,X-RateLimit-Burst,X-RateLimit-Remaining,X-RateLimit-Reset
Como tratar no cliente
async function callApi(path: string) {
let url = `https://api.buscaprocessos.app.br${path}`;
for (let attempt = 0; attempt < 60; attempt += 1) {
const res = await fetch(url, {
headers: { "x-api-key": process.env.BUSCAPROCESSOS_API_KEY! },
});
const body = await res.json().catch(() => ({}));
if (res.status === 202) {
const retryAfterMs =
Number(res.headers.get("Retry-After") || 0) * 1000 ||
body?.data?.pollAfterMs ||
5000;
url = res.headers.get("Location") || body?.data?.statusUrl;
if (!url) throw new Error("202 sem statusUrl");
await new Promise((resolve) => setTimeout(resolve, retryAfterMs));
continue;
}
if (res.status === 429) {
const retryAfter = Number(res.headers.get("Retry-After") || 1);
throw Object.assign(new Error("rate_limited"), { retryAfter });
}
if (!res.ok) {
throw Object.assign(new Error(body?.error?.message || "api_error"), {
status: res.status,
code: body?.error?.code,
body,
});
}
return body;
}
throw new Error("Limite de polling excedido");
}
Correlação e suporte
Sempre registre, quando disponíveis:
meta.requestId- header
X-BuscaProcessos-Request-Id meta.searchLogId- status HTTP e
error.code
Isso acelera o atendimento em WhatsApp de suporte.