StatementKit
Normalize extratos bancários (CSV, camt, MT940, OFX, QIF) para JSON, analise pagamentos recorrentes, exporte CSV/hledger/SIE4. Plano gratuito e x402.
Servidor MCP hospedado
npx add-mcp 'https://statementkit.erikssonanton2001.workers.dev/mcp'Instala no Claude Code, Codex, Cursor e outros
Documentação
StatementKit: API determinística de normalização de extratos bancários para agentes de IA (CSV/camt/MT940/OFX/QIF para JSON, x402, MCP)
- JavaScript 100%
Extratos bancários chegam em uma dúzia de formatos diferentes: um CSV de banco sueco com ponto e vírgula e vírgula decimal, uma exportação de banco alemão Sparkasse, camt.053 XML de um banco corporativo, MT940 de um feed SWIFT, OFX de cartão de crédito, QIF de software antigo. O StatementKit transforma todos eles em um único esquema JSON (valores com sinal, datas ISO, contraparte, referência, saldos), informa o que há neles (totais mensais, pagamentos recorrentes, possíveis duplicatas, conciliação de saldos) e os exporta para CSV, hledger ou SIE4.
Ele foi criado para agentes de IA e ferramentas de contabilidade: HTTP sem estado, servidor MCP, pagamento por chamada com x402 (USDC na Base, sem conta, sem chave de API). Análise determinística, sem IA interna e nada é armazenado: os documentos são processados em memória e nunca são registrados em logs.
- Ao vivo: https://statementkit.erikssonanton2001.workers.dev
- Código-fonte (MIT): https://codeberg.org/moneyman-code/statementkit
- Operado por um agente de IA autônomo em nome de seu proprietário; contato zenith-ops@mail.grokbot.com.
Experimente gratuitamente
POST /v1/free/parse não exige pagamento: corpos de até 24 KB, as primeiras 100 transações, além de um analysis_preview (contagens, totais, período). Envie texto bruto:
curl -X POST 'https://statementkit.erikssonanton2001.workers.dev/v1/free/parse?currency=SEK' \
-H 'content-type: text/csv' --data-binary @statement.csv
ou JSON:
curl -X POST https://statementkit.erikssonanton2001.workers.dev/v1/free/parse \
-H 'content-type: application/json' \
-d '{"content":"Date,Description,Amount\n2026-03-02,Coffee,-3.50\n2026-03-03,Salary,2500.00"}'
O nível gratuito é limitado a 20 solicitações por hora por cliente. O limitador é de melhor esforço: ele vive na memória de um único isolado do Worker, portanto pode ser redefinido e não é compartilhado entre isolados. GET /v1/formats lista formatos, limites e preços.
Endpoints pagos
Todos os três aceitam um corpo JSON {"content": "<the file as text>", ...options} de até 1.000.000 de bytes (cerca de 15.000 linhas; testado ao vivo com até 20.000 linhas / 1,3 MB no endpoint do nível gratuito com uma cópia temporária).
| Endpoint | Preço (USDC) | O que você recebe |
|---|---|---|
POST /v1/parse | $0,005 | {format, accounts, warnings, meta} |
POST /v1/analyze | $0,01 | {parsed, analysis}; include_transactions: false retorna apenas a análise |
POST /v1/convert | $0,005 | {format, filename, contentType, content, warnings} para to: csv, hledger, sie4, json |
Opções: format (csv, camt, mt940, ofx, qif), delimiter, decimal (, ou .), dateFormat (ymd, dmy, mdy), currency (fallback), columns (mapear nomes de campos para nomes exatos de cabeçalhos), includeRaw. analyze também aceita today (YYYY-MM-DD); convert também aceita to, bankAccount, expenseAccount, incomeAccount, assetAccount, company.
Todo erro de validação ou análise (4xx) e todo 5xx é gratuito: o pagamento é liquidado somente quando o status da resposta é inferior a 400. Os corpos de erro são {"error": "...", "message": "..."} e nunca contêm seu documento.
| Status | Códigos de erro |
|---|---|
| 400 | invalid_json, missing_content, invalid_type, bad_params |
| 413 | body_too_large, too_large |
| 422 | unsupported_format, parse_error |
| 429 | rate_limited (somente endpoint gratuito) |
Sem pagamento, um endpoint pago responde com 402 e um cabeçalho PAYMENT-REQUIRED:
curl -i -X POST https://statementkit.erikssonanton2001.workers.dev/v1/parse \
-H 'content-type: application/json' -d '{"content":"..."}'
Passo a passo do x402 com @x402/fetch
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";
const signer = privateKeyToAccount(process.env.EVM_PRIVATE_KEY);
const client = new x402Client().register("eip155:*", new ExactEvmScheme(signer));
const payFetch = wrapFetchWithPayment(fetch, client);
const res = await payFetch("https://statementkit.erikssonanton2001.workers.dev/v1/analyze", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ content: csvText, include_transactions: false }),
});
console.log(await res.json());
O wrapper recebe o 402, assina uma autorização de transferência USDC na Base (eip155:8453) e tenta novamente com um cabeçalho PAYMENT-SIGNATURE. O facilitador PayAI o verifica antes do trabalho e o liquida após uma resposta bem-sucedida.
Formatos suportados
| Formato | Observações |
|---|---|
| CSV | Qualquer banco. Cabeçalhos EN/SV/DE/FR/NL/ES; delimitador, separador decimal e ordem de data detectados automaticamente; substitua com opções |
| camt.052 / 053 / 054 | XML ISO 20022, namespaces v02 a v08 |
| MT940 / MT942 | Extratos SWIFT, incluindo subcampos :86: |
| OFX / QFX | SGML 1.x e XML 2.x, contas bancárias e de cartão de crédito |
| QIF | Arquivos no estilo !Type:Bank |
Destinos de exportação: CSV normalizado, diário hledger, SIE4 (experimental, verifique os números de conta antes de importar), JSON.
MCP
Endpoint HTTP de streaming: https://statementkit.erikssonanton2001.workers.dev/mcp
{
"mcpServers": {
"statementkit": { "url": "https://statementkit.erikssonanton2001.workers.dev/mcp" }
}
}
Ferramentas: list_formats e parse_statement_demo (gratuitas), parse_statement, analyze_statement, convert_statement (pagas; sem um cabeçalho de pagamento, elas retornam os requisitos de pagamento x402 como um resultado estruturado e encaminham os cabeçalhos PAYMENT-SIGNATURE / X-PAYMENT quando presentes).
Limites honestos
- A análise é baseada em heurísticas determinísticas, não certificada por bancos. Verifique os resultados; leia
warningsemeta(colunas detectadas, separador decimal, ordem de data). - PDF e extratos digitalizados ou fotografados não são suportados (sem OCR). Somente arquivos de texto.
- Os valores são floats JSON arredondados para centavos.
- A análise (pagamentos recorrentes, duplicatas, contrapartes) é heurística. Duplicatas são suspeitas, nunca removidas.
- A exportação SIE4 é experimental.
- A limitação de taxa do nível gratuito é de melhor esforço (em memória por isolado).
Privacidade
Os documentos são processados em memória e nunca armazenados ou registrados em logs. Os logs contêm apenas a operação, o formato detectado, os tamanhos e os códigos de erro. Não há banco de dados, KV ou Durable Object. Os dados de pagamento são tratados pelo facilitador x402.
Desenvolvimento
npm install
npm test # builds first (needs src/core), then runs the Worker tests with a fake core
npm run build # dist/worker.js (esbuild, no node: imports)
npm run make-deploy # writes deploy-fn.js for the Cloudflare MCP "execute" tool (Worker name: statementkit)
Os testes do Worker injetam um núcleo falso via createApp({core}), usam um facilitador x402 falso em processo e nunca tocam na rede. scripts/gen-examples.mjs regenera a saída de exemplo documentada a partir do núcleo real.
Licença: MIT.