Guides / Bulk download attachments

How to bulk download all attachments from an Airtable base

Airtable will happily store thousands of files and give you no button to get them back out. Here is what actually works, what breaks at scale, and why attachment URLs keep expiring on you.

If you have ever been asked to "send over all the files in the Airtable base," you have already found the problem: there is no button for that. Airtable stores attachments well and exports them badly. This guide covers the four approaches people actually use, in order of how far they get you.

Why there is no native bulk export

Airtable's own export path is Download CSV on a view. It produces one row per record, and every attachment cell becomes a text string: the filename plus a URL. It does not produce the files.

Those URLs are the second half of the problem. Airtable serves attachments from airtableusercontent.com using signed, expiring links. Airtable's own documentation states that download URLs "stay active for at least 2 hours after receiving them." This was a deliberate security change — Airtable explicitly discourages using a base as a CDN — but it means a CSV export is only useful if you fetch every file in it within the same session.

The practical consequence: any workflow that exports a CSV on Monday and downloads the files on Tuesday is broken. The links have to be resolved and fetched in one continuous pass.

The four options, compared

ApproachWhat you getWhere it breaks
Click each attachment in the UI The file, correctly named Fine for ten files. Unusable for a thousand.
Export view to CSV A spreadsheet of expiring URLs No files. Links dead after ~2 hours. One view at a time.
Script in the Scripting extension Whatever you write Browser memory limits, ~30 s execution ceilings, and you have to write and maintain it.
Automation pushing to Drive / S3 / Dropbox Files in external storage Runs per record going forward; back-filling an existing base means burning automation runs. Needs a connected account.

Doing it with a script

If you want to stay inside Airtable, the Scripting extension can walk a table and fetch each attachment. The shape is always the same:

  1. Query the table for all records with table.selectRecordsAsync().
  2. For each record, read the attachment field — it is an array of { id, url, filename, size, type }.
  3. fetch() each url while it is still fresh.
  4. Assemble the results into a ZIP in the browser, then hand it to the user.

This works, up to a point. The point is memory: the Scripting extension builds the archive in the browser tab, so a few gigabytes of attachments will crash it. It is also serial, has no resume, and has to be rewritten whenever the base changes shape. If you want to start from a working script rather than a blank editor, the Airtable Script Editor generates and tests scripts against your real base.

Doing it in one pass, with the folder structure intact

The Bulk Attachment Downloader solves the two failure modes above: it resolves and fetches each URL inside the same run, so nothing expires, and it streams each file directly into a ZIP on your disk rather than accumulating the archive in RAM. That is what makes ten-gigabyte bases work.

  1. Sign in to TrilogicPPP with your Airtable account — the OAuth connection is read-only for this tool and you can revoke it from Airtable at any time.
  2. Open the downloader and pick a base. Every table in it is scanned; tables with no attachment fields are skipped automatically.
  3. Choose where the ZIP should be written on your disk.
  4. Start it and leave the tab open. Progress is reported per table, and individual failures are logged rather than aborting the run.

Inside the archive, each file lands at:

Table name / Field name / recXXXXXXXX_original-filename.pdf

Keeping the record ID in the filename is the part people miss when they roll their own. Two records can perfectly well both have a file called invoice.pdf; without the ID one silently overwrites the other.

Free tool

Bulk Attachment Downloader

Export every attachment in an Airtable base as one structured ZIP. Streams to disk, so base size is not the limit. Two runs a week on a free account.

Open the downloader →

Going the other way

The mirror-image problem — you have a folder of files and need them into Airtable, attached to the right records — has the same shape and the same absence of a native tool. That one is covered in how to bulk upload files to Airtable.

Frequently asked

Can Airtable export all attachments at once?
No. Airtable can export a view to CSV, but the attachment columns become text containing temporary download URLs rather than the files themselves. There is no native "download all attachments" action at base or table level.
Why do Airtable attachment URLs expire?
Since 2024 Airtable serves attachments from airtableusercontent.com through signed URLs that stay valid for roughly two hours after they are issued. Airtable does this so bases cannot be used as a public CDN. A CSV you exported last week therefore contains links that all return an error.
How large a base can be exported this way?
The TrilogicPPP downloader streams each file straight to disk instead of holding the archive in memory, so bases in the tens of gigabytes work. The practical limit is your free disk space and how long you leave the tab open.
Does the downloader keep my folder structure?
Yes. Inside the ZIP each file lands at Table name / Field name / recordId_originalfilename, so you can tell which record a file came from even after the export.
Is it free?
A free account runs two full base downloads per week. A paid account at $20 CAD per month removes the cap.

Related guides