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%

moneyman-code 92cac3aa6e StatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)

2026-10-17 02:33:47 +02:00
registryStatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)2026-10-17 02:33:47 +02:00
scriptsStatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)2026-10-17 02:33:47 +02:00
shimsStatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)2026-10-17 02:33:47 +02:00
srcStatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)2026-10-17 02:33:47 +02:00
testStatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)2026-10-17 02:33:47 +02:00
testlibStatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)2026-10-17 02:33:47 +02:00
.gitignoreStatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)2026-10-17 02:33:47 +02:00
LICENSEStatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)2026-10-17 02:33:47 +02:00
package.jsonStatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)2026-10-17 02:33:47 +02:00
README.mdStatementKit: API determinista de normalización de extractos bancarios para agentes de IA (x402, MCP)2026-10-17 02:33:47 +02:00

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.

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

EndpointPrecio (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.

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

FormatoNotas
CSVCualquier 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 / 054XML ISO 20022, espacios de nombres v02 a v08
MT940 / MT942Extractos SWIFT, incluidos subcampos :86:
OFX / QFXSGML 1.x y XML 2.x, cuentas bancarias y de tarjetas de crédito
QIFArchivos 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 warnings y meta (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.