· 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.

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
1. Get a link that returns the current file
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.



