Skip to content

Instantly share code, notes, and snippets.

@BoxedBrain
Created October 6, 2025 13:09
Show Gist options
  • Select an option

  • Save BoxedBrain/d0a135a3d2d40eaf5cbd887febdc1e78 to your computer and use it in GitHub Desktop.

Select an option

Save BoxedBrain/d0a135a3d2d40eaf5cbd887febdc1e78 to your computer and use it in GitHub Desktop.
N26 Bank - Download ALL Monthly Statements
/*
==========================================
N26 Monthly Statements Auto Downloader (Browser Console)
==========================================
Description:
Automatically downloads all N26 account statements (PDFs)
starting from a specified month up to the current month.
How it works:
- Fetches URLs in the format:
https://app.n26.com/download-statement/statement-YYYY-MM
- Detects valid PDFs and downloads them automatically.
- Waits between downloads to avoid rate limits.
- If a 429 (Too Many Requests) occurs, waits 1.5 minutes and retries.
Configurable variables:
startYear → first year to download from (e.g.: 2018)
startMonth → first month (e.g.: 8 = August)
delay → pause (ms) between successful downloads (default: 5000 = 5 sec)
retryWait → wait time (ms) after HTTP 429 before retry (default: 90000 = 1.5 min)
Usage:
1. Log in to your N26 account in the same browser tab.
2. Open the browser console (F12 → Console).
3. Paste the full code below and press Enter.
4. PDFs will be automatically downloaded month by month.
Note:
If fetch fails (e.g., due to CORS), the script will open the statement URL in a new tab and you need to save the PDFs manually.
*/
(async()=>{
const startYear=2018, startMonth=8, delay=5000, retryWait=90000;
const now=new Date(), endYear=now.getFullYear(), endMonth=now.getMonth()+1;
const sleep=ms=>new Promise(r=>setTimeout(r,ms));
const pad=n=>String(n).padStart(2,'0');
const download=(blob,name)=>{
const a=document.createElement('a');
a.href=URL.createObjectURL(blob);
a.download=name;
a.click();
URL.revokeObjectURL(a.href);
};
for(let y=startYear;y<=endYear;y++){
const mStart=y===startYear?startMonth:1, mEnd=y===endYear?endMonth:12;
for(let m=mStart;m<=mEnd;m++){
const url=`https://app.n26.com/download-statement/statement-${y}-${pad(m)}`;
const filename=`statement-${y}-${pad(m)}.pdf`;
console.log(`→ Trying: ${url}`);
let done=false, retries=0;
while(!done){
try{
const r=await fetch(url,{credentials:'include'});
if(r.status===429){
retries++;
console.warn(`⚠️ 429 Too Many Requests — waiting ${retryWait/1000}s before retry #${retries}`);
await sleep(retryWait);
continue;
}
if(r.ok){
const t=r.headers.get('content-type')||'';
if(t.includes('pdf')){
const b=await r.blob();
download(b,filename);
console.log(`✓ Downloaded: ${filename}`);
}else{
console.warn(`✗ Not a PDF (content-type: ${t})`);
}
}else{
console.warn(`✗ HTTP ${r.status} for ${url}`);
}
done=true;
}catch(e){
console.warn(`⚠️ Error fetching ${url}`,e);
window.open(url,'_blank');
done=true;
}
}
await sleep(delay);
}
}
console.log('All done.');
})();
@rorar

rorar commented Jul 31, 2026

Copy link
Copy Markdown

Hi @BoxedBrain, I've used your Script as base to create a UserScript with a nice KISS user interface and some useful settings :)
CSVs can also be downloaded now.
It needs Tampermonkey and for subfolder downloads the download Method set to "Browser API" inside the advanced tampermonkey settings.
If you like, please check it out:
https://github.com/rorar/n26-statement-downloader

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment