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%

moneyman-code 92cac3aa6e StatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)

2026-10-17 02:33:47 +02:00
registryStatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)2026-10-17 02:33:47 +02:00
scriptsStatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)2026-10-17 02:33:47 +02:00
shimsStatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)2026-10-17 02:33:47 +02:00
srcStatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)2026-10-17 02:33:47 +02:00
testStatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)2026-10-17 02:33:47 +02:00
testlibStatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)2026-10-17 02:33:47 +02:00
.gitignoreStatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)2026-10-17 02:33:47 +02:00
LICENSEStatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)2026-10-17 02:33:47 +02:00
package.jsonStatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)2026-10-17 02:33:47 +02:00
README.mdStatementKit: deterministic bank statement normalizer API for AI agents (x402, MCP)2026-10-17 02:33:47 +02:00

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.

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).

EndpointPreç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.

StatusCódigos de erro
400invalid_json, missing_content, invalid_type, bad_params
413body_too_large, too_large
422unsupported_format, parse_error
429rate_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

FormatoObservações
CSVQualquer 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 / 054XML ISO 20022, namespaces v02 a v08
MT940 / MT942Extratos SWIFT, incluindo subcampos :86:
OFX / QFXSGML 1.x e XML 2.x, contas bancárias e de cartão de crédito
QIFArquivos 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 warnings e meta (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.