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 128 MiB. - CNPJ do cedente da operação (14 dígitos, com ou sem formatação).
https://221b-api.sherlocker.com.br/api/v1. A autenticação é feita pelo header Authorization: Bearer slhk_sua_chave_aqui; os Motores não aceitam ?token= na URL.
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.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 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.
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.
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):
Invalid CNPJ format (dígito verificador do cedente_cnpj), falha de parse do CNAB e arquivos acima do teto (128 MiB para file, 512 MiB para xmls). O gateway limita o multipart completo a 768 MiB, incluindo campos e framing. 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