Download files from a website
Reports, invoices, exports, images, the files you click to download one at a time. A bot can grab them for you, from a button on the page or straight from a URL, and loop a whole list of downloads from a sheet. The one thing to decide up front is where they land, your own machine or your Google Drive. There are three ways to start, with no code, with code, or with a Claude skill.
What I mean by downloading files from a website
Downloading files from a website means a bot does the clicking and saving you would do by hand. It opens the page, finds the file, whether that is a download button or a direct link, and saves it where you tell it. Give it one page or a list of URLs in a sheet, and it works through every one, naming each download as it goes.
Where your downloads land
The first thing to settle is not how to download, it is where the file goes. That choice decides how you run it.
If you want files on your own machine, run it in the desktop app. The local download steps, Download file, Download files, and Download file from URL, all save straight to a folder on your computer, and they only work in the desktop app.
If you want files in the cloud, save to Google Drive. The Download a file to Google Drive step puts each file in a Drive folder, which is the way to go when the bot runs in the cloud with no machine of yours involved. That same Drive step can also write to a local folder when you run it on the desktop, so one step covers both.
Decide the destination first, and the rest of the build follows.
Who this is for
This is for anyone who downloads the same files on a schedule. Pulling a daily report off a dashboard, saving invoices from a portal, collecting exports one click at a time. And for anyone sitting on a spreadsheet of links who needs every file behind them. No-coders and coders both, since you can build it without code and drop into code when you want.
How I'd approach it
Start with where the downloads go, local or Drive, because that picks your runner. Then look at the source. If you have direct file URLs, use the from-URL step, it is the simplest. If the file sits behind a button or a link on a page, go to the page first, then point the download step at that element. For a list, read the URLs from a Google Sheet and loop through them, saving each with its own name.
Destination, then source, then loop. That order keeps it simple. There is a full walkthrough in how to automate file downloads, and I would lay out the first draft with Build with description.
Download files from a description
Describe what to download and where in the Chrome extension and it builds the steps for you. Give it a few short lines, check what it made, and run it. Explore no-code. Note: Build from description is coming very soon. In the meantime you can still use the no-code builder.
To the right is an example. Describe what to download and where it should land, and the AI lays out the steps.
Chrome extensionInstructions
- Read a list of page URLs from a Google Sheet44 / 500
- Open each page in turn22 / 500
- Download the file on the page29 / 500
- Name it from the sheet22 / 500
- Save it to my folder20 / 500
Download files in code
Build with code. If you would rather script it yourself, this is the path. Explore code
Connect Playwright (or Puppeteer) to our cloud Chromium and write the same scripts you'd run locally, without managing the browser.
Code toolimport { chromium } from "playwright";
import path from "path";
const browser = await chromium.connectOverCDP(
`wss://cdp-lb.axiom.ai/?token=${process.env.AXIOM_API_KEY}`
);
try {
const context = browser.contexts()[0];
const page = context.pages()[0] ?? await context.newPage();
// Pages that each hold a file. These would come from your Google Sheet.
const pages = [
"https://example.com/reports/jan",
"https://example.com/reports/feb",
];
for (const url of pages) {
await page.goto(url);
// Wait for the download the click starts, then save it where you want
const [download] = await Promise.all([
page.waitForEvent("download"),
page.getByRole("button", { name: "Download" }).click(),
]);
const name = download.suggestedFilename();
await download.saveAs(path.join("/downloads", name));
}
} finally {
await browser.close();
}
Build with a Claude skill
Build no-code or code bots with a skill.
Add the Claude skill and describe what to download and where. It builds the bot for you, no-code or code, from a button or a URL, saving to your machine or to Google Drive.

What can you download?
Most files behind a click. A couple of cases worth knowing first.
Works well
- Reports and exports from a dashboard
- Invoices and statements from a portal
- Files behind a download button
- Direct file URLs from a list
- Images and PDFs in bulk
Harder
- Files behind a login or 2FA
- Files that open in the browser instead of saving
- Very large files on a slow connection
Don't try
- Downloading material you have no right to
- Anything against a site's terms
- Pulling files faster than a site allows
What I'd watch out for
Downloading is simple until a file opens in a tab instead of saving. Here is what I would watch for.
Local downloads need the desktop app
The local download steps only save to your computer when the bot runs in the desktop app. In the cloud, save to Google Drive instead, or use the Drive step that can do both.
Files that open instead of downloading
Some files open in the browser rather than downloading. Turn on Force download so the bot saves them instead. If it still opens, the file is being served inline and needs a different approach.
Folder permissions
If a file will not save, check the path is right and that the folder has write permission for your user. A wrong path is the usual culprit.
Reused file names
When two files would share a name, axiom adds a number so nothing is overwritten. Turn on Overwrite if you would rather replace the old file instead.