Skip to main content
Neste guia você envia um borderô CNAB 400, acompanha o processamento até a conclusão e busca o resultado hierárquico da análise — cedente, sacados, títulos e as violações de regra (issues) de cada nó. É a mesma esteira de análise da interface web do Sherlocker, agora acessível por API.
Não confunda com o Motor de Análise (documentado aqui), que avalia o risco de um CNPJ ou CPF individual. O Motor de Borderô analisa o borderô inteiro — e usa o Motor de Análise por baixo para cada entidade.

Pré-requisitos

  • Acesso ao beta: a feature analysis_engine precisa estar habilitada no seu workspace. Solicite em Solicitar acesso.
  • Chave de API: criada no app Sherlocker em Settings → API Keys. As chaves têm prefixo slhk_ e são exibidas uma única vez — guarde em local seguro.
  • Saldo de tokens: a operação consome tokens do mesmo pool do workspace usado no app — um débito por entidade única do borderô (veja Cobrança).
  • Arquivo CNAB 400 remessa (.rem) — Banco Paulista 611, 444 colunas, Windows-1252 — com no máximo 16 MB.
  • CNPJ do cedente da operação (14 dígitos, com ou sem formatação).
A base URL de todos os exemplos é https://221b-api.sherlocker.com.br/api/v1.
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=.
1

Crie a operação

Envie um POST /operations como multipart/form-data — o arquivo vai direto no form, sem base64:
Resposta (202 Accepted):
Guarde o operation_id: é com ele que você consulta o status e o resultado. A cobrança (uma por entidade única do borderô — cedente + sacados únicos) acontece normalmente na criação, mas não aparece no payload: acompanhe débitos e estornos no extrato de tokens do workspace, no app Sherlocker.
O header Idempotency-Key é opcional. Se você enviá-lo, reenviar o mesmo payload com a mesma key devolve 200 com o body original (sem nova operação nem nova cobrança); a mesma key com payload diferente devolve 409 idempotency_conflict. Sem o header, cada POST cria uma operação nova. Veja Idempotência.
2

Acompanhe até a conclusão

Consulte GET /operations/{id} até o status ficar terminal (completed ou failed). O vocabulário de status é queuedprocessingcompleted | failed. Não há header Retry-After nem campo de intervalo no body — consulte a cada ~2 segundos (consultar mais rápido não acelera o resultado, e o limite global é de 100 requisições por minuto por IP):
Resposta (200) — o envelope de status traz sempre todos os campos:
  • titulo_count, approved_count, blocked_count e alert_count são null até completed. A soma approved_count + blocked_count + alert_count sempre fecha com titulo_countalert_count inclui os títulos com análise incompleta (fonte de dados indisponível).
  • completed_at só aparece preenchido em completed; error (string) só em failed.
  • Operações que terminam em failed são estornadas automaticamente. Por ora a API é polling-only (sem webhooks).
3

Busque o resultado hierárquico

Com a operação completed, chame o GET /operations/{id}/result. Por padrão (?filter=issues) a resposta poda os títulos aprovados e os sacados sem problemas — você recebe só o que precisa de atenção:
cURL
Resposta (200):
Variações do endpoint:
  • ?filter=all — devolve a árvore completa, incluindo títulos aprovados e sacados sem problemas. Qualquer outro valor retorna 400 com a mensagem Invalid filter value. Use "issues" or "all"..
  • ?include=execution_plan — lista separada por vírgulas de blocos extras; adiciona o campo execution_plan à resposta (hoje sempre []).
  • Chamar o /result antes de a operação chegar a completed retorna 409 conflict com detail no formato Operation has not completed yet. Current status: processing.
O summary sempre reflete o dataset completo — ele não muda com ?filter.
4

Interprete o resultado

O resultado é uma árvore: cedente → sacados → títulos, cada nó com um status e uma lista de issues (violações de regra).
Fonte de dados indisponível não vira issue — vira degraded_rules (e aparece em coverage). No summary, os títulos afetados contam como alerted. Se a sua esteira exige cobertura total, trate degraded_rules não-vazio na sua regra de aprovação.
Um filtro típico — listar as issues bloqueantes da operação:
Python

Tratamento de erros

Todos os erros seguem RFC 7807 (Content-Type: application/problem+json). Use o campo code para decidir o que fazer — o campo type é apenas um identificador. Os erros de validação do multipart chegam field-level em errors[], com os campos file, xmls e cedente_cnpj: Resposta (400):
Outras mensagens comuns: Invalid CNPJ format (dígito verificador do cedente_cnpj), falha de parse do CNAB e arquivos acima do teto (16 MB para file, 32 MB para xmls). Como nada foi parseado, nada é cobrado. Os demais códigos: 401 unauthorized, 402 insufficient_tokens, 403 feature_not_enabled, 409 idempotency_conflict e 422 no_engine — registro completo em Erros.

O que você construiu

  • Um fluxo completo de análise de borderô: POST /operations multipart (202) → polling em GET /operations/{id} (queued/processingcompleted) → resultado hierárquico em GET /operations/{id}/result.
  • Um consumo enxuto do resultado: ?filter=issues (padrão) entrega só os nós com problemas; ?filter=all entrega a árvore completa.
  • Interpretação de issues, summary, coverage e degraded_rules — incluindo a validação de NFe via issues do título e nfe_chave.

Próximos passos

Ciclo de vida

Estados da operação, envelope de status e o endpoint /result

Idempotência

Idempotency-Key opcional no borderô — replay e conflitos

Cobrança

Modelo por entidade única, com exemplo numérico e estorno

Títulos e NFe

O shape do título na árvore do resultado e a validação de NFe