· Simple Data Foundry Team · Tutorials  · 4 min read

Import a CSV from a URL into Airtable

Point a job at a CSV link and it re-reads it on your schedule — no download, no manual import. Here is the setup, and the field-type trap to avoid first.

Import a CSV from a URL into Airtable

Short answer: Airtable’s built-in CSV import is a one-time, manual upload. To keep a table current from a file that changes, you need something that re-reads the URL on a schedule and upserts the rows — otherwise every refresh is either a manual re-import or a pile of duplicates.

Why the built-in import is not enough

Airtable will happily import a CSV. It will not go and fetch it again tomorrow.

That is fine for a migration and wrong for anything recurring — a nightly export from another system, a report a vendor publishes daily, a file a colleague regenerates each Monday. Re-importing by hand works right up until the week somebody forgets.

What the File URL source reads

Point it at an HTTPS link, or at a file in your account’s storage:

  • Delimited — CSV, TSV, or a custom delimiter
  • JSON and JSONL
  • Excel.xlsx
  • Compressed — gzip, zip, bz2 and xz, unwrapped automatically

Format detection is automatic: the file extension first, then the Content-Type header. You can override it when a URL lies about what it serves, which happens more than it should.

Also available: has_header, skip_rows for files with a preamble above the header, encoding for the ones that are not UTF-8, and max_rows to cap a run.

The setup

The requirement is a stable URL that always returns the latest version. A link that returns yesterday’s file forever will sync perfectly and tell you nothing.

If the file is not reachable over the public internet, upload it to your account’s storage and read it from there instead.

2. Add the File URL source

Paste the URL. Leave the format on automatic unless the file is unusual.

3. Choose Airtable, and set the field types

This is the step worth slowing down on. Airtable is typed, and CSV is not — every value arrives as text. A number landing in a single-line-text field will not sum; a date landing as text will not sort or filter by range.

Paste a sample of your file into the Airtable field type mapper and it will suggest a type per column and a primary field. Set the table up to match before the first run, not after.

typecast is on by default, so Airtable coerces strings into select, number and date fields rather than rejecting the write — but that works best when the field is already the right type.

4. Upsert, not append

Set the write mode to upsert and pick a key column — the CSV’s own record ID if it has one. Without this, every run appends the entire file again.

The full reasoning, including how to pick a key that does not fall apart, is in Airtable upsert: stop creating duplicate records.

5. Schedule it

Match the schedule to how often the file actually changes. A file regenerated nightly does not need an hourly job — it just burns quota re-reading identical bytes. The cron generator shows the next ten run times in your timezone.

Cleaning the file on the way through

Real exports are rarely tidy. Between read and write you can select columns, drop rows with a filter, cast types, and add computed fields.

Computed fields take a restricted expression — abs, round, min, max, len, and col() for referencing column names with spaces in them. Enough for a margin, a total or a unit conversion; deliberately not a general scripting environment.

For a quick look at what a messy file needs before you wire it up, the CSV cleaner normalises headers, trims whitespace, drops empty rows and checks whether your intended key column is actually unique. That last check is the one that saves you: a key with duplicates in it makes upsert behave in ways that look like a bug.

Limits worth knowing

  • 256 MB per file by default. It is streamed rather than loaded whole, so the cap is about the pipeline, not your memory.
  • Five redirect hops, and the destination is re-validated at every hop — a link that later redirects somewhere internal does not quietly become a request to somewhere it should not go.
  • Writes go 10 records per request at 4 requests per second, so roughly 2,400 records a minute into Airtable.

Same file, other destinations

The same source works with the other destinations, with the same column mapping:

Postgres is the better choice if you want to join the file against other data and query it with SQL; Airtable if the rows are going to be worked on by people.

Related Posts

View All Posts »
Export Stripe data to Google Sheets

Export Stripe data to Google Sheets

Stripe's dashboard exports are manual and stale the moment you download them. Here is how to keep customers, invoices and charges fresh in a sheet instead.

Mailchimp campaign reports in Airtable

Mailchimp campaign reports in Airtable

Mailchimp's reporting lives one campaign at a time. Here is how to get opens, clicks and bounces for every campaign into Airtable, updating on a schedule.