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_engineprecisa 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).
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 Resposta (202 Accepted):Guarde o
POST /operations como multipart/form-data — o arquivo vai direto no form, sem base64: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.2
Acompanhe até a conclusão
Consulte Resposta (200) — o envelope de status traz sempre todos os campos:
GET /operations/{id} até o status ficar terminal (completed ou failed). O vocabulário de status é queued → processing → completed | 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):titulo_count,approved_count,blocked_countealert_countsãonullatécompleted. A somaapproved_count + blocked_count + alert_countsempre fecha comtitulo_count—alert_countinclui os títulos com análise incompleta (fonte de dados indisponível).completed_atsó aparece preenchido emcompleted;error(string) só emfailed.- Operações que terminam em
failedsão estornadas automaticamente. Por ora a API é polling-only (sem webhooks).
3
Busque o resultado hierárquico
Com a operação Resposta (200):Variações do endpoint:
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
?filter=all— devolve a árvore completa, incluindo títulos aprovados e sacados sem problemas. Qualquer outro valor retorna400com a mensagemInvalid filter value. Use "issues" or "all"..?include=execution_plan— lista separada por vírgulas de blocos extras; adiciona o campoexecution_planà resposta (hoje sempre[]).- Chamar o
/resultantes de a operação chegar acompletedretorna409 conflictcom detail no formatoOperation 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).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):
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 /operationsmultipart (202) → polling emGET /operations/{id}(queued/processing→completed) → resultado hierárquico emGET /operations/{id}/result. - Um consumo enxuto do resultado:
?filter=issues(padrão) entrega só os nós com problemas;?filter=allentrega a árvore completa. - Interpretação de
issues,summary,coverageedegraded_rules— incluindo a validação de NFe via issues do título enfe_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