Envíe su clave API como token Bearer en el encabezado Authorization. Usamos claves API; no hay OAuth en v1.
API de extracción de extractos bancarios
API REST para convertir extractos bancarios en PDF a JSON estructurado. 99,9 % o más de transacciones correctamente identificadas, reembolso automático en caso de falla.
$ curl https://api.bankstatementlab.com/v1/extractions \
-H "Authorization: Bearer bsl_live_..." \
-F "file=@statement.pdf" Extracción de extractos bancarios
Extraiga transacciones, saldos y metadatos de cualquier PDF.
Salida JSON estructurada
Esquema predecible en 10 idiomas admitidos.
99,9 % o más de transacciones correctamente identificadas
Reembolso automático en caso de falla. Sin cargo por extracciones fallidas.
Modos síncrono y asíncrono
Modo síncrono para PDF pequeños; modo asíncrono con polling para lotes grandes.
Ejemplos de código
Integre en cualquier idioma. Ejemplos a continuación.
$ curl https://api.bankstatementlab.com/v1/extractions \
-H "Authorization: Bearer bsl_live_..." \
-F "file=@statement.pdf" const form = new FormData();
form.append("file", fs.createReadStream("statement.pdf"));
const res = await fetch("https://api.bankstatementlab.com/v1/extractions", {
method: "POST",
headers: { Authorization: `Bearer $${process.env.BSL_KEY}` },
body: form,
});
const data = await res.json(); import requests
with open("statement.pdf", "rb") as f:
r = requests.post(
"https://api.bankstatementlab.com/v1/extractions",
headers={"Authorization": f"Bearer {BSL_KEY}"},
files={"file": f},
)
data = r.json() $ch = curl_init("https://api.bankstatementlab.com/v1/extractions");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer " . getenv("BSL_KEY")]);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
"file" => new CURLFile("statement.pdf"),
]);
$data = json_decode(curl_exec($ch), true); Formato de las respuestas
Los campos data, column_names y transaction_count solo están presentes cuando status vale "completed". En los demás casos se omiten del JSON (están ausentes, no son null).
GET /v1/extractions/:id
200 OK — Extracción completada
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "ext_3f8a9b2c1d4e5f6a7b8c9d0e",
"status": "completed",
"file_name": "statement-march-2026.pdf",
"created_at": "2026-03-15T10:23:00.000Z",
"completed_at": "2026-03-15T10:23:18.000Z",
"page_count": 3,
"credits_charged": 3,
"api_key_id": "ak_abc123",
"column_names": ["Date", "Description", "Amount"],
"transaction_count": 42,
"data": {
"columns": ["Date", "Description", "Amount"],
"transactions": [
["2026-03-01", "VIREMENT SEPA", "1500.00"],
["2026-03-02", "CB CARREFOUR", "-45.20"]
]
}
} 200 OK — Extracción en curso
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "ext_3f8a9b2c1d4e5f6a7b8c9d0e",
"status": "processing",
"file_name": "statement-march-2026.pdf",
"created_at": "2026-03-15T10:23:00.000Z",
"page_count": 3,
"credits_charged": 3,
"api_key_id": "ak_abc123"
} 200 OK — Extracción fallida
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "ext_3f8a9b2c1d4e5f6a7b8c9d0e",
"status": "failed",
"file_name": "statement-march-2026.pdf",
"created_at": "2026-03-15T10:23:00.000Z",
"completed_at": "2026-03-15T10:23:32.000Z",
"page_count": 3,
"credits_charged": 3,
"api_key_id": "ak_abc123",
"error": {
"type": "extraction_failed",
"message": "Extraction failed due to an internal error. Contact support if the issue persists."
}
} Patrón de polling
Cuando una extracción se ejecuta en modo async, la respuesta contiene status: "processing" hasta que el worker termina. Compruebe siempre que status vale "completed" ANTES de leer los campos data, transaction_count y column_names: estos se omiten del JSON hasta que la extracción finaliza.
Frecuencia de polling recomendada en el cliente: de 5 a 10 segundos. El worker del servidor se ejecuta cada 10 segundos; consultar con mayor frecuencia no acelera el resultado.
GET /v1/extractions
200 OK — Página mixta (un elemento por estado)
HTTP/1.1 200 OK
Content-Type: application/json
{
"data": [
{
"id": "ext_001",
"status": "completed",
"file_name": "march.pdf",
"created_at": "2026-03-15T10:00:00.000Z",
"completed_at": "2026-03-15T10:00:18.000Z",
"page_count": 3,
"credits_charged": 3,
"api_key_id": "ak_abc123",
"column_names": ["Date", "Description", "Amount"],
"transaction_count": 42
},
{
"id": "ext_002",
"status": "processing",
"file_name": "april.pdf",
"created_at": "2026-04-15T10:00:00.000Z",
"page_count": 5,
"credits_charged": 5,
"api_key_id": "ak_abc123"
},
{
"id": "ext_003",
"status": "failed",
"file_name": "may.pdf",
"created_at": "2026-05-15T10:00:00.000Z",
"completed_at": "2026-05-15T10:00:42.000Z",
"page_count": 2,
"credits_charged": 2,
"api_key_id": "ak_abc123",
"error": {
"type": "extraction_failed",
"message": "Extraction failed due to an internal error. Contact support if the issue persists."
}
}
],
"has_more": false
} Patrón de polling
Cuando una extracción se ejecuta en modo async, la respuesta contiene status: "processing" hasta que el worker termina. Compruebe siempre que status vale "completed" ANTES de leer los campos data, transaction_count y column_names: estos se omiten del JSON hasta que la extracción finaliza.
Frecuencia de polling recomendada en el cliente: de 5 a 10 segundos. El worker del servidor se ejecuta cada 10 segundos; consultar con mayor frecuencia no acelera el resultado.
Construido para
Automatización contable
Importe extractos de clientes directamente a su proceso de contabilidad.
Debida diligencia crediticia
Verifique los ingresos y el flujo de caja de los extractos bancarios del solicitante.
Aplicaciones de finanzas personales
Permita que los usuarios conecten sus extractos sin ingresar datos manualmente.
Mismos créditos, web + API
1 crédito = 1 página. Los créditos se comparten con su plan Pro o Business; la API no tiene un mínimo independiente.
Ver precios →Preguntas frecuentes
10 solicitudes por segundo y 1.000 solicitudes por hora para cada clave API. ¿Necesita límites superiores? Póngase en contacto con nosotros.
Nuestro objetivo es una disponibilidad del 99 % según nuestro mejor esfuerzo. La v1 no incluye un SLA contractual; póngase en contacto con nosotros para acordar compromisos empresariales.
Las extracciones fallidas se reembolsan automáticamente a su saldo de créditos. Solo paga por las páginas procesadas correctamente.
PDF sólo en v1. Máximo 20 MB por archivo. La compatibilidad con imágenes y CSV llegará más adelante.
Inglés, francés, español, alemán, italiano, portugués, japonés, holandés, coreano, hindi.
Comience a construir hoy
El nivel gratuito incluye 5 créditos. No se requiere tarjeta de crédito.
Obtenga su clave API