Skip to main content
Tudo que os motores criam — uma análise (POST /analyses) ou uma operação de borderô (POST /operations) — é processado de forma assíncrona e passa pela mesma forma de máquina de estados: aguardando → executando → terminal. O que muda é o vocabulário público de cada motor. Esta página explica os estados, o polling e, por motor, o que cada campo do resultado significa.
Os Motores usam a mesma base da API 221b (https://221b-api.sherlocker.com.br/api/v1), mas autenticam via Authorization: Bearer slhk_…não via ?token=.

Máquina de estados

O campo status passa por dois estados não-terminais e um terminal, com nomes diferentes em cada motor: Trate failed como possível a partir de qualquer estado não-terminal: um run que expira ainda aguardando (sem chegar a executar) também termina em failed. Respostas terminais (completed/failed) são estáveis — o resultado não muda depois de pronto. O estorno em failed é automático nos dois motores (veja Cobrança).

Polling

Consulte o resultado com GET /analyses/{id} ou GET /operations/{id}. A indicação de intervalo difere por motor:
  • CPF/CNPJ: enquanto o run não é terminal, a resposta traz o campo poll_after_seconds: 2 no body e o header Retry-After: 2. Quando o status é terminal, campo e header deixam de aparecer.
  • Borderô: não há campo de intervalo nem header Retry-After — consulte a cada ~2 segundos até completed ou failed.
Consultar mais rápido que o intervalo indicado não acelera o resultado. No CPF/CNPJ, honre Retry-After/poll_after_seconds; no borderô, mantenha o intervalo de ~2 segundos.

Boas práticas

  • Respeite o rate limit: 100 requisições por minuto por IP. Exceder retorna 429.
  • Use o intervalo indicado (2 segundos) entre consultas, em vez de um valor fixo próprio.
  • Pare no estado terminal: completed e failed são finais; não há transição depois deles.
  • Consultar um id inexistente ou de outro workspace retorna 404 not_found — veja Erros.

O resultado de cada motor

Verdicts

O verdict resume o resultado da análise. Ele só existe quando a análise termina em completed; em pending, running e failed ele é null.
incompleto não é uma reprovação. Significa que parte das fontes de dados não respondeu e o motor não teve como avaliar todos os blocos. Confira o campo coverage para ver qual fonte ficou indisponível antes de decidir o que fazer com a análise.

Status de bloco

Cada item de blocks[] traz o resultado de uma verificação individual (ex.: SITUACAO_CADASTRAL_CNPJ, SANCAO_NACIONAL). O catálogo completo está em Blocos.Cada bloco pode trazer evidence[] com itens no formato {field, value, expected, result} (ex.: result igual a divergent ou match).

Coverage

O campo coverage[] mostra, por fonte de dados consultada, se a busca funcionou:

Quando os campos deixam de ser null

Enquanto a análise está em pending ou running, verdict, blocks, coverage e finished_at são null. Os campos de resultado são preenchidos de uma vez quando a análise chega a completed — não há resultado parcial. Em failed, verdict, blocks e coverage permanecem null (apenas finished_at é preenchido) e os tokens são reembolsados.

Exemplo: em andamento

GET /analyses/{id} com a análise ainda em running retorna 200 com header Retry-After: 2:

Exemplo: concluída

Os campos tokens_charged e balance aparecem na resposta quando disponíveis.

Próximos passos

Cobrança

Débito na criação e estorno automático em failed

Idempotência

Retries seguros e resolução de conflitos 409

Blocos (CPF/CNPJ)

Catálogo dos blocos de verificação e seus grupos

Títulos e NFe (Borderô)

O shape do título na árvore do resultado e o campo nfe_chave