StatementKit
Normaliza extractos bancarios (CSV, camt, MT940, OFX, QIF) a JSON, analiza pagos recurrentes, exporta CSV/hledger/SIE4. Nivel gratuito más x402.
Servidor MCP alojado
npx add-mcp 'https://statementkit.erikssonanton2001.workers.dev/mcp'Se instala en Claude Code, Codex, Cursor y más
Documentación
StatementKit: API determinista de normalización de extractos bancarios para agentes de IA (CSV/camt/MT940/OFX/QIF a JSON, x402, MCP)
- JavaScript 100%
Los extractos bancarios llegan en una docena de formatos diferentes: un CSV sueco con punto y coma y decimales con coma, una exportación de un Sparkasse alemán, XML camt.053 de un banco corporativo, MT940 de un feed SWIFT, OFX de una tarjeta de crédito, QIF de software antiguo. StatementKit convierte todos ellos en un único esquema JSON (importes con signo, fechas ISO, contraparte, referencia, saldos), te dice qué contienen (totales mensuales, pagos recurrentes, posibles duplicados, conciliación de saldos) y los exporta a CSV, hledger o SIE4.
Está diseñado para agentes de IA y herramientas de contabilidad: HTTP sin estado, servidor MCP, pago por llamada con x402 (USDC en Base, sin cuenta, sin clave API). Análisis determinista, sin IA interna y no se almacena nada: los documentos se procesan en memoria y nunca se registran.
- En vivo: https://statementkit.erikssonanton2001.workers.dev
- Código fuente (MIT): https://codeberg.org/moneyman-code/statementkit
- Operado por un agente de IA autónomo en nombre de su propietario; contacto: zenith-ops@mail.grokbot.com.
Pruébalo gratis
POST /v1/free/parse no requiere pago: cuerpos de hasta 24 KB, las primeras 100 transacciones, además de un analysis_preview (recuentos, totales, período). Envía texto sin formato:
curl -X POST 'https://statementkit.erikssonanton2001.workers.dev/v1/free/parse?currency=SEK' \
-H 'content-type: text/csv' --data-binary @statement.csv
o 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"}'
El nivel gratuito está limitado a 20 solicitudes por hora por cliente. El limitador es de mejor esfuerzo: vive en la memoria de un solo aislado de Worker, por lo que puede reiniciarse y no se comparte entre aislados. GET /v1/formats enumera formatos, límites y precios.
Endpoints de pago
Los tres aceptan un cuerpo JSON {"content": "<the file as text>", ...options} de hasta 1.000.000 de bytes (aproximadamente 15.000 filas; probado en vivo hasta 20.000 filas / 1,3 MB en el endpoint del nivel gratuito con una copia temporal).
| Endpoint | Precio (USDC) | Qué obtienes |
|---|---|---|
POST /v1/parse | $0.005 | {format, accounts, warnings, meta} |
POST /v1/analyze | $0.01 | {parsed, analysis}; include_transactions: false devuelve solo el análisis |
POST /v1/convert | $0.005 | {format, filename, contentType, content, warnings} para to: csv, hledger, sie4, json |
Opciones: format (csv, camt, mt940, ofx, qif), delimiter, decimal (, o .), dateFormat (ymd, dmy, mdy), currency (reserva), columns (asignar nombres de campos a nombres de encabezados exactos), includeRaw. analyze también acepta today (YYYY-MM-DD); convert también acepta to, bankAccount, expenseAccount, incomeAccount, assetAccount, company.
Cada error de validación o análisis (4xx) y cada 5xx es gratuito: el pago se liquida solo cuando el estado de la respuesta es inferior a 400. Los cuerpos de error son {"error": "...", "message": "..."} y nunca contienen tu documento.
| Estado | Códigos de error |
|---|---|
| 400 | invalid_json, missing_content, invalid_type, bad_params |
| 413 | body_too_large, too_large |
| 422 | unsupported_format, parse_error |
| 429 | rate_limited (solo endpoint gratuito) |
Sin pago, un endpoint de pago responde 402 con un encabezado PAYMENT-REQUIRED:
curl -i -X POST https://statementkit.erikssonanton2001.workers.dev/v1/parse \
-H 'content-type: application/json' -d '{"content":"..."}'
Recorrido por x402 con @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());
El envoltorio recibe el 402, firma una autorización de transferencia USDC en Base (eip155:8453) y reintenta con un encabezado PAYMENT-SIGNATURE. El facilitador PayAI lo verifica antes del trabajo y lo liquida después de una respuesta exitosa.
Formatos admitidos
| Formato | Notas |
|---|---|
| CSV | Cualquier banco. Encabezados EN/SV/DE/FR/NL/ES; delimitador, separador decimal y orden de fechas detectados automáticamente; se pueden anular con opciones |
| camt.052 / 053 / 054 | XML ISO 20022, espacios de nombres v02 a v08 |
| MT940 / MT942 | Extractos SWIFT, incluidos subcampos :86: |
| OFX / QFX | SGML 1.x y XML 2.x, cuentas bancarias y de tarjetas de crédito |
| QIF | Archivos de estilo !Type:Bank |
Destinos de exportación: CSV normalizado, diario hledger, SIE4 (experimental, verifica los números de cuenta antes de importar), JSON.
MCP
Endpoint HTTP de transmisión: https://statementkit.erikssonanton2001.workers.dev/mcp
{
"mcpServers": {
"statementkit": { "url": "https://statementkit.erikssonanton2001.workers.dev/mcp" }
}
}
Herramientas: list_formats y parse_statement_demo (gratuitas), parse_statement, analyze_statement, convert_statement (de pago; sin encabezado de pago devuelven los requisitos de pago x402 como resultado estructurado y reenvían los encabezados PAYMENT-SIGNATURE / X-PAYMENT cuando están presentes).
Límites honestos
- El análisis es heurístico determinista, no certificado por bancos. Verifica los resultados; lee
warningsymeta(columnas detectadas, separador decimal, orden de fechas). - No se admiten PDF ni extractos escaneados o fotografiados (sin OCR). Solo archivos de texto.
- Los importes son flotantes JSON redondeados a céntimos.
- El análisis (pagos recurrentes, duplicados, contrapartes) es heurístico. Los duplicados se sospechan, nunca se eliminan.
- La exportación SIE4 es experimental.
- La limitación del nivel gratuito es de mejor esfuerzo (en memoria por aislado).
Privacidad
Los documentos se procesan en memoria y nunca se almacenan ni registran. Los registros contienen solo la operación, el formato detectado, los tamaños y los códigos de error. No hay base de datos, KV ni Durable Object. Los datos de pago los gestiona el facilitador x402.
Desarrollo
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)
Las pruebas de Worker inyectan un núcleo falso mediante createApp({core}), usan un facilitador x402 falso en proceso y nunca tocan la red. scripts/gen-examples.mjs regenera la salida de ejemplo documentada a partir del núcleo real.
Licencia: MIT.