A source is data, never code — this is the whole of it.
wizink-es.json
{
"id": "wizink-es",
"name": "WiZink España",
"service": "wizink",
"trust": "first-party",
"credit": {
"author": {
"name": "David Marín",
"url": "https://davefx.com"
},
"capture": {
"name": "David Marín",
"url": "https://davefx.com"
}
},
"domain": "wizink.es",
"country": "ES",
"version": "2026-09-15",
"currency": "EUR",
"categories": [
"card",
"banking"
],
"match": [
"https://www.wizink.es/*"
],
"auth": {
"mode": "cookie",
"replayHeaders": [],
"resetCookies": true,
"resetCookiesOnLoginStatus": 400,
"loginUrl": "https://www.wizink.es/login",
"readyUrl": "https://www.wizink.es/clientes/posicion-global"
},
"api": {
"host": "https://www.wizink.es",
"csrf": {
"path": "/clientes/posicion-global",
"match": "securityToken['\"]?\\s*(?:value=|:)\\s*['\"]([A-Za-z0-9]{12,})"
},
"groups": {
"from": "html",
"path": "/cs/Satellite",
"method": "POST",
"params": {
"pagename": "ECOM_SiteEntry/WZPRI/NewGlobalPosition"
},
"body": "ECOM_Page_Category=New Global Position&ECOM_Page_Sub_Category=New Global Position&securityToken={csrf}",
"rows": {
"each": "goToCardDetail\\('([^']+)',\\s*'([^']+)'[\\s\\S]{0,180}?c-card__summary[\\s\\S]{0,150}?card-product-name[^>]*>(?:<span[^>]*>[^<]*</span>)?\\s*([^<]+?)\\s*</span>[\\s\\S]{0,200}?card-security-code[^>]*>(?:<span[^>]*>[^<]*</span>)?\\s*([^<]*\\d{4})",
"fields": {
"accountNumber": {
"group": 1
},
"cardNumber": {
"group": 2
},
"name": {
"group": 3
},
"mask": {
"group": 4
}
}
},
"fields": {
"id": "accountNumber",
"accountNumber": "accountNumber",
"cardNumber": "cardNumber",
"name": "name",
"mask": "mask"
}
}
},
"streams": [
{
"id": "movimientos",
"name": "Movimientos de tarjeta",
"schema": "transaction@1",
"categories": [
"card"
],
"api": {
"list": {
"from": "html",
"path": "/cs/Satellite",
"method": "POST",
"maxPeriods": 24,
"periods": {
"current": {
"params": {
"pagename": "ECOM_SiteEntry/WZPRI/CardDetail/NewToday"
},
"body": "accountNumber={group.accountNumber}&cardNumber={group.cardNumber}&option=today&securityToken={csrf}",
"after": "Movimientos a d"
},
"dates": {
"params": {
"pagename": "ECOM_SiteEntry/WZPRI/CardDetail/Today/ListExtracts"
},
"body": "cardNumber={group.cardNumber}&accountNumber={group.accountNumber}&securityToken={csrf}",
"rows": {
"each": "callOperations\\('([0-9-]+)'\\)",
"fields": {
"statementDate": {
"group": 1
}
}
}
},
"past": {
"params": {
"pagename": "ECOM_SiteEntry/WZPRI/CardDetail/ExtractOnScreenDetail"
},
"body": "securityToken={csrf}&ic2Error=false&accountNumber={group.accountNumber}&cardNumber={group.cardNumber}&cardLogo=505&cahsback=null&statementDate={period}&calculatePaymentInfo=false&fromPrincipalAccount=true&inStatementRepository=true&verMas=false&flagStatementsHistory=null"
}
},
"rows": {
"each": "movItem(?:_\\d+_[A-Z]+|R_\\d+)\"[\\s\\S]{0,1500}?class=\"movement-amount[^\"]*\"[^>]*>[^<]*<",
"fields": {
"type": {
"re": "movement-item ([a-zA-Z]+)"
},
"description": {
"tag": "h4"
},
"card": {
"sel": "card-number-masked"
},
"date": {
"sel": "movement-date"
},
"location": {
"sel": "movement-location"
},
"amount": {
"sel": "movement-amount"
}
}
},
"maxAgeDays": 90,
"idOverride": {
"template": "{group.accountNumber}|{date}|{amount}|{description}",
"when": {
"field": "amount",
"present": true
}
}
}
},
"fields": {
"internalId": "{group.accountNumber}|{date}|{amount}|{description}",
"date": "date",
"amount": "amount",
"description": "description",
"type": "type",
"location": "location",
"card": "card",
"account": "{group.accountNumber}"
}
},
{
"id": "extractos",
"name": "Extractos",
"schema": "invoice@1",
"categories": [
"banking"
],
"api": {
"list": {
"from": "html",
"path": "/cs/Satellite",
"method": "POST",
"paging": "none",
"params": {
"pagename": "ECOM_SiteEntry/WZPRI/CardDetail/ExtractOnScreen"
},
"body": "cardNumber={group.cardNumber}&accountNumber={group.accountNumber}&securityToken={csrf}",
"rows": {
"each": "<option[^>]*data-statementDate=\"([^\"]+)\"[^>]*data-inRepository=\"true\"[^>]*data-docId=\"([^\"]+)\"[^>]*data-fileName=\"([^\"]+)\"",
"fields": {
"statementDate": {
"group": 1
},
"docId": {
"group": 2
},
"fileName": {
"group": 3
}
}
},
"maxAgeDays": 90
}
},
"fields": {
"internalId": "{group.accountNumber}|{statementDate}",
"date": "statementDate",
"account": "{group.accountNumber}",
"type": "Extracto",
"description": "Extracto {statementDate}"
},
"formats": [
{
"id": "pdf",
"name": "PDF",
"api": {
"pdf": {
"path": "/cs/Satellite/{fileName}?pagename=ECOM_SiteEntry/WZPRI/DownloadIC2File&d=Touch&documentId={docId}&fileName={fileName}&statementDate={statementDate}&accountNumber={group.accountNumber}&customerNumber=null&securityToken={csrf}",
"method": "GET",
"ext": "pdf"
}
}
},
{
"id": "excel",
"name": "Excel",
"api": {
"pdf": {
"path": "/cs/Satellite/movimientosExtracto.xls?pagename=ECOM_SiteEntry/WZPRI/General/DownloadXLSFileExtract&d=Touch&fileName=movimientosExtracto.xls&accountNumber={group.accountNumber}&date={statementDate}&isPrincipalAccount=true&securityToken={csrf}",
"method": "GET",
"ext": "xls"
}
}
}
]
}
],
"changelog": [
{
"version": "2026-09-15",
"changes": {
"en": "This month's card movements are collected again. They had stopped appearing: the change that removed provisional pending charges also dropped the whole current, not-yet-billed period, so a purchase only showed up once its monthly statement closed. Now the current period is read again — its settled movements only, never the ones still 'pending confirmation', which remain provisional until they settle. A movement still counts once: when this month's charge later lands in its statement, its stable identity makes the two one. Needs Habeas 0.10.7.3 or newer.",
"es": "Vuelven a recogerse los movimientos de tarjeta de este mes. Habían dejado de aparecer: el cambio que quitó los cargos pendientes provisionales se llevó por delante todo el periodo actual sin facturar, así que una compra no aparecía hasta que cerraba su extracto mensual. Ahora el periodo actual se lee de nuevo — solo sus movimientos ya confirmados, nunca los que están «pendientes de confirmar», que siguen siendo provisionales hasta que se liquidan. Un movimiento sigue contando una sola vez: cuando el cargo de este mes aparezca luego en su extracto, su identidad estable hace que los dos sean uno. Requiere Habeas 0.10.7.3 o posterior."
}
},
{
"version": "2026-08-28",
"changes": {
"en": "Pending charges are no longer collected, and each movement now keeps the same identity between syncs. A pending charge is provisional — its amount, date and wording can all still change — and WiZink lists it a second time inside the statement that bills it, so the same purchase was being saved twice. From now on a movement is collected once, from its statement, with its final values. Its identity is also built from what the values mean rather than from how the page painted them, so a change of styling on the website can no longer turn one movement into two. One consequence, once: on the first sync after this update your card movements are treated as new, because their identity has changed.",
"es": "Ya no se recogen los cargos pendientes, y cada movimiento conserva la misma identidad entre sincronizaciones. Un cargo pendiente es provisional — su importe, su fecha y su texto todavía pueden cambiar — y WiZink lo lista una segunda vez dentro del extracto que lo liquida, así que la misma compra se guardaba dos veces. A partir de ahora un movimiento se recoge una sola vez, desde su extracto y con sus valores definitivos. Su identidad, además, se construye con lo que significan los valores y no con cómo los pintaba la web, así que un cambio de estilo en la página ya no puede convertir un movimiento en dos. Una consecuencia, una sola vez: en la primera sincronización tras esta actualización tus movimientos de tarjeta se tratan como nuevos, porque su identidad ha cambiado."
}
},
{
"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-10",
"changes": {
"en": "Statements now show a readable label (\"Statement <date>\") instead of the internal identifier, and carry the type \"Statement\".",
"es": "Los extractos ahora muestran una etiqueta legible («Extracto <fecha>») en lugar del identificador interno, y llevan el tipo «Extracto»."
}
},
{
"version": "2026-07-09",
"changes": {
"en": "One WiZink source instead of three. You now choose what you want from it: your card movements, or your statements as PDF or as Excel. Needs Habeas 0.1.52 or newer.",
"es": "Una sola fuente de WiZink en lugar de tres. Ahora eliges qué quieres de ella: los movimientos de tu tarjeta, o tus extractos en PDF o en Excel. Requiere Habeas 0.1.52 o posterior."
}
}
],
"minVersion": "0.10.7.3",
"content": {
"en": {
"slug": "wizink-statements",
"docs": "card transactions and statements",
"h1": "Download all your WiZink transactions and statements at once",
"intro": "WiZink publishes one statement per period plus a transaction list. Getting the full history means downloading each statement separately.",
"title": "How to download your WiZink transactions and statements"
},
"es": {
"slug": "extractos-wizink",
"docs": "movimientos y extractos de tarjeta",
"h1": "Descarga todos tus movimientos y extractos de WiZink de una vez",
"intro": "WiZink publica un extracto por periodo y un listado de movimientos. Para tener el histórico completo hay que ir descargando cada extracto por separado.",
"title": "Cómo descargar tus movimientos y extractos de WiZink"
}
},
"brand": "WiZink"
}