A source is data, never code — this is the whole of it.
openbank-es.json
{
"id": "openbank-es",
"name": "Openbank España",
"service": "openbank",
"trust": "first-party",
"credit": {
"author": {
"name": "David Marín",
"url": "https://davefx.com"
},
"capture": {
"name": "David Marín",
"url": "https://davefx.com"
}
},
"domain": "openbank.es",
"country": "ES",
"version": "2026-08-26.1",
"minVersion": "0.3.0.24",
"categories": [
"banking"
],
"gaps": [
"tarjetas"
],
"throttle": {
"minMs": 400,
"jitterMs": 600
},
"keepAlive": {
"path": "/token/keepalive",
"method": "POST",
"contentType": "application/json",
"everyMs": 120000,
"tokenField": "tokenCredential"
},
"match": [
"https://clientes.openbank.es/*"
],
"openUrl": "https://clientes.openbank.es/",
"auth": {
"mode": "bearer",
"tokenHeader": "openbankauthtoken",
"tokenMatch": "^eyJ",
"replayHeaders": [
"openbankauthtoken"
],
"cookies": false
},
"api": {
"host": "https://api.openbank.es"
},
"streams": [
{
"id": "extracto-integrado",
"name": "Extracto integrado",
"schema": "invoice@1",
"keepRaw": true,
"api": {
"list": {
"path": "/extractos/comunicaciones-cursadas",
"paging": "cursor",
"cursorParam": "memento",
"nextPath": "memento",
"morePath": "hasMore",
"moreValue": "S",
"itemsPath": "datos.datos",
"params": {
"codCategoria": "0001",
"codGrupoComunicacion": "0006"
},
"cursorParams": {
"hasMorePagination": "S"
}
},
"pdf": {
"path": "/extractos/documentos?gestorDocumental={gestorDocumental}&codigoSubaplicacion={codSubaplicacion}&codComunicacion={internalId}",
"method": "GET",
"ext": "pdf"
}
},
"fields": {
"internalId": "codComunicacion",
"date": "fechaAlta",
"number": "codComunicacion",
"description": "Extracto integrado {fechaAlta}"
}
},
{
"id": "movimientos",
"name": "Movimientos",
"schema": "transaction@1",
"keepRaw": true,
"normalize": {
"counterparty": {
"from": "conceptoTabla",
"re": [
"A FAVOR DE\\s+([^,]+)",
"\\bDE\\s+([^,]+)",
"\\bEN\\s+([^,]+)"
]
}
},
"api": {
"groups": {
"path": "/posicion-global-total",
"params": {
"listaSolicitada": "TODOS",
"indicadorSaldoPreTarj": "false",
"invocationMode": "GLOBAL_API"
},
"itemsPath": "datosSalidaCuentas.cuentas",
"fields": {
"id": "id",
"name": "descripcion",
"titular": "nombretitular",
"bban": "codiban.codbban"
},
"derive": {
"titular": {
"from": "titular",
"trim": true
},
"digitoControl": {
"from": "bban",
"trim": true,
"slice": [
8,
10
]
},
"numeroCuenta": {
"from": "bban",
"trim": true,
"slice": [
10,
20
]
},
"producto": {
"from": "bban",
"trim": true,
"slice": [
10,
13
]
},
"contrato": {
"from": "bban",
"trim": true,
"slice": [
13,
20
]
}
}
},
"list": {
"path": "/my-money/cuentas/movimientos",
"params": {
"producto": "{group.producto}",
"numeroContrato": "{group.contrato}"
},
"range": {
"from": "fechaDesde",
"format": "date"
},
"window": "90d",
"paging": "cursor",
"nextPath": "_links.nextPage.href",
"nextIsUrl": true,
"morePath": "masMovimientos",
"moreValue": true,
"stopPath": "scaRequired",
"stopValue": true,
"itemsPath": [
"movimientos",
"methodResult.movimientos"
]
}
},
"fields": {
"internalId": "{group.contrato}-{fechaOperacion}-{diaMvto}-{nummov}",
"date": "fechaOperacion",
"amount": "importe.importe",
"currency": "importe.divisa",
"description": "conceptoTabla",
"account": "{group.numeroCuenta}",
"balanceAfter": "saldo.importe"
}
},
{
"id": "movimientos-doc",
"name": "Extracto de movimientos por cuenta",
"schema": "invoice@1",
"keepRaw": true,
"api": {
"groups": {
"path": "/posicion-global-total",
"params": {
"listaSolicitada": "TODOS",
"indicadorSaldoPreTarj": "false",
"invocationMode": "GLOBAL_API"
},
"itemsPath": "datosSalidaCuentas.cuentas",
"fields": {
"id": "id",
"name": "descripcion",
"titular": "nombretitular",
"bban": "codiban.codbban"
},
"derive": {
"titular": {
"from": "titular",
"trim": true
},
"digitoControl": {
"from": "bban",
"trim": true,
"slice": [
8,
10
]
},
"numeroCuenta": {
"from": "bban",
"trim": true,
"slice": [
10,
20
]
},
"producto": {
"from": "bban",
"trim": true,
"slice": [
10,
13
]
},
"contrato": {
"from": "bban",
"trim": true,
"slice": [
13,
20
]
}
}
},
"list": {
"paging": "synthetic",
"synthetic": {
"each": "group-months"
},
"maxAgeDays": 90
}
},
"fields": {
"internalId": "{group.numeroCuenta}-{period}",
"date": "{date}",
"number": "{period}",
"account": "{group.numeroCuenta}",
"description": "Movimientos {group.name} {period}"
},
"formats": [
{
"id": "pdf",
"name": "PDF",
"api": {
"pdf": {
"path": "/cuentas/movimientos/descarga?digitoControl={group.digitoControl}&producto={group.producto}&contrato={group.contrato}&numeroCuenta={group.numeroCuenta}&tipoMovimiento=+&tipoArchivo=p&concepto=000&titular={group.titular}&fechaDesde={fromDate}&fechaHasta={date}",
"method": "GET",
"ext": "pdf",
"mime": "application/pdf",
"headers": {
"accept": "application/json, application/json"
}
}
}
},
{
"id": "excel",
"name": "Excel",
"api": {
"pdf": {
"path": "/cuentas/movimientos/descarga?digitoControl={group.digitoControl}&producto={group.producto}&contrato={group.contrato}&numeroCuenta={group.numeroCuenta}&tipoMovimiento=+&tipoArchivo=t&concepto=000&titular={group.titular}&fechaDesde={fromDate}&fechaHasta={date}",
"method": "GET",
"ext": "xls",
"mime": "application/vnd.ms-excel",
"headers": {
"accept": "application/json, application/json"
}
}
}
}
]
}
],
"changelog": [
{
"version": "2026-08-26.1",
"changes": {
"en": "Trust level raised to first-party: written and verified against the real service by the project, not contributed unreviewed. The label describes provenance, not permission — the same-domain guard, the consent screen and every other rule apply identically whatever it says.",
"es": "Confianza elevada a first-party: escrita y verificada contra el servicio real por el proyecto, no una aportación sin revisar. La etiqueta describe procedencia, no permisos — la guardia de mismo dominio, la pantalla de consentimiento y las demás reglas se aplican igual diga lo que diga."
}
},
{
"version": "2026-08-26",
"changes": {
"en": "Records authorship: the session was recorded and the definition written by the maintainer. No change to extraction.",
"es": "Registra la autoría: la sesión la grabó y la definición la escribió el mantenedor. No cambia la extracción."
}
},
{
"version": "2026-08-08",
"changes": {
"en": "No change to what this source extracts. This version gave it its guide page on habeas.dev.",
"es": "Sin cambios en lo que extrae esta fuente. Esta versión le dio su página de guía en habeas.dev."
}
},
{
"version": "2026-07-16",
"changes": {
"en": "Map the movement's running balance (saldo.importe) to record.balanceAfter (promoted to a canonical field for the Cuéntamo contract). Requires extension >= 0.3.0.24.",
"es": "Mapea el saldo tras el movimiento (saldo.importe) a record.balanceAfter (promovido a campo canónico para el contrato del consumidor). Requiere extensión >= 0.3.0.24."
}
},
{
"version": "2026-07-15.1",
"changes": {
"en": "Fixes the first page of movements coming back empty.",
"es": "Corrige la primera página de movimientos, que llegaba vacía."
}
},
{
"version": "2026-07-15",
"changes": {
"en": "Adds account movements (last 90 days) and monthly statements in PDF and Excel, one per account. Stops before any step that would ask you for a one-time code.",
"es": "Añade los movimientos por cuenta (últimos 90 días) y los extractos mensuales en PDF y Excel, uno por cuenta. Se detiene antes de cualquier paso que te pediría un código de un solo uso."
}
},
{
"version": "2026-07-14",
"changes": {
"en": "Initial: integrated monthly statements (PDF) across all accounts. Movements/cards/investments are declared gaps for community contribution.",
"es": "Inicial: extractos mensuales integrados (PDF) de todas las cuentas. Movimientos, tarjetas e inversiones quedan como carencias declaradas, abiertas a la comunidad."
}
}
],
"content": {
"en": {
"slug": "openbank-transactions",
"docs": "transactions and statements",
"h1": "Download all your Openbank transactions and statements at once",
"intro": "Openbank shows your transactions on its website and lets you download individual documents, but not gather them into a single file you can work with.",
"title": "How to download your Openbank transactions and statements"
},
"es": {
"slug": "movimientos-openbank",
"docs": "movimientos y extractos",
"h1": "Descarga todos tus movimientos y extractos de Openbank de una vez",
"intro": "Openbank muestra tus movimientos en su web y permite descargar documentos sueltos, pero no reunirlos en un único archivo con el que puedas trabajar.",
"title": "Cómo descargar tus movimientos y extractos de Openbank"
}
},
"brand": "Openbank"
}