Airtable Export to Excel: Keep Your Linked Records Intact
Airtable markets itself as "spreadsheet meets database." But when you actually try to get your data INTO a spreadsheet, you hit walls.
Their CSV export breaks linked records. Their API is well-documented but returns deeply nested JSON. And the Excel-formatted export they added last year? Still strips out crucial data.
Here's how to get everything out—including the stuff Airtable doesn't want you to export easily.
The Export Options (Compared)
Airtable gives you three ways out:
| Method | Linked Records | Attachments | Formulas | Lookups |
|---|---|---|---|---|
| CSV Download | ❌ IDs only | ❌ URLs in text | ❌ Formula text | ❌ Formula text |
| Grid View Copy | ✅ Text values | ❌ Just names | ✅ Results | ✅ Results |
| API Export | ✅ Full data | ✅ Full URLs | ✅ Results | ✅ Results |
Bottom line: If you have linked records or lookups, the API is your only real option.
Method 1: CSV Export (Fast but Limited)
In Airtable:
- Open your base
- Click the table name dropdown → Download CSV
- Open in Excel
What works:
- Text, numbers, dates
- Single select fields
- Long text (preserves line breaks)
- Checkboxes (TRUE/FALSE)
What breaks:
- Linked records: Show as internal IDs like
recXYZ123abc - Lookups: Show the formula, not the value
- Formulas: Same—formula text instead of result
- Attachments: Raw URLs, one per line in the same cell
- Multi-select: Comma-separated in one cell
For a quick dump of simple data, this works. For relational data, useless.
Method 2: Copy-Paste from Grid View
This trick works better than CSV for small datasets:
- Open your table in Grid view
- Click the first row number to select row
- Shift+Click the last row
- Ctrl+C (or Cmd+C)
- Paste into Excel
Why this is better:
- Linked records paste as their primary field value (not IDs)
- Formulas paste as the result (not the formula)
- Lookups paste as the looked-up value
Why this sucks:
- Maximum ~10,000 rows before browser chokes
- Attachments paste as filenames only
- Long text might get truncated
- No automation—manual every time
Good for one-time exports under 1,000 rows.
Method 3: API Export (The Real Solution)
Airtable's API returns complete data including linked record details.
Step 1: Get your API key
- Go to airtable.com/create/tokens
- Create a personal access token
- Scope it to your base
- Copy the token
Step 2: Find your base and table IDs
Open your base. The URL looks like:
https://airtable.com/appXXXXXX/tblYYYYYY/...
appXXXXXX= Base IDtblYYYYYY= Table ID
Step 3: Make the API call
Using curl:
curl "https://api.airtable.com/v0/appXXXXXX/tblYYYYYY" \
-H "Authorization: Bearer YOUR_TOKEN"
Or in Postman:
- GET
https://api.airtable.com/v0/{baseId}/{tableId} - Header:
Authorization: Bearer YOUR_TOKEN
Step 4: Handle pagination
Airtable returns max 100 records per request. If you have more:
{
"records": [...],
"offset": "rec123abc..."
}
Use the offset in your next request:
?offset=rec123abc...
Repeat until no offset is returned.
Step 5: Convert JSON to Excel
The API returns nested JSON:
{
"records": [{
"id": "rec123",
"fields": {
"Name": "Project Alpha",
"Client": ["rec456"],
"Status": "Active",
"Budget": 50000,
"Team": ["recABC", "recDEF"],
"Due Date": "2026-03-15"
}
}]
}
Notice: Client and Team are still record IDs, not names.
To get names, you need to:
- Fetch the linked table (Clients)
- Build a lookup:
rec456→ "Acme Corp" - Replace IDs with names
Or paste the JSON into JsonExport, which:
- Flattens the nested structure
- Creates separate columns for array items (
Team[0],Team[1]) - Exports clean Excel
You'll still have IDs for linked records, but the structure is usable.
Expanding Linked Records
To get linked record names directly from the API, use the returnFieldsByFieldId parameter... just kidding, Airtable doesn't have a native "expand" parameter.
Workaround: Multiple API calls
- Fetch main table
- Collect all linked record IDs
- Fetch linked table with those IDs
- Join in your script/Excel
Python example:
import requests
headers = {"Authorization": "Bearer YOUR_TOKEN"}
# Fetch projects
projects = requests.get(
"https://api.airtable.com/v0/appXXX/Projects",
headers=headers
).json()
# Collect client IDs
client_ids = set()
for record in projects["records"]:
client_ids.update(record["fields"].get("Client", []))
# Fetch clients by ID
clients = {}
for cid in client_ids:
resp = requests.get(
f"https://api.airtable.com/v0/appXXX/Clients/{cid}",
headers=headers
).json()
clients[cid] = resp["fields"]["Name"]
# Replace IDs with names
for record in projects["records"]:
client_ids = record["fields"].get("Client", [])
record["fields"]["Client_Names"] = [clients[cid] for cid in client_ids]
Then export to JSON and convert to Excel.
Attachments
Airtable attachments are complex objects:
"Attachments": [
{
"id": "attXXX",
"url": "https://dl.airtable.com/.attachments/...",
"filename": "contract.pdf",
"type": "application/pdf",
"size": 245123
}
]
In CSV export: You get just the URLs, mashed into one cell.
In API export: You get structured data. Choose what you need:
filenamefor a clean listurlfor download links- Both, in separate columns
When converting JSON to Excel, JsonExport creates:
Attachments[0].filenameAttachments[0].urlAttachments[1].filename- etc.
Formulas and Rollups
Unlike linked records, formulas and rollups export correctly via API:
{
"fields": {
"Name": "Q1 2026",
"Total Revenue": 150000, // Rollup: SUM(Deals.Amount)
"Deal Count": 23, // Rollup: COUNT(Deals)
"Win Rate": 0.67 // Formula: Won/Total
}
}
These are the computed values, ready to use.
Synced Tables
If you're using Airtable's synced tables (data from another base), you can export them just like regular tables. The sync happens on Airtable's side—your export includes current values.
Gotcha: Synced fields are read-only. If you re-import modified data, you can't update synced fields.
Views vs Tables
Exporting a view (filtered/sorted) vs the full table:
CSV export: Exports only visible rows in current view. Respects your filters.
API export: By default, returns ALL records. To filter:
?filterByFormula=AND({Status}="Active", {Budget}>10000)
Or use view parameter:
?view=Active%20Projects
Automation Ideas
If you export weekly:
Option 1: Airtable Automations → Webhooks
- Create an automation: Run weekly
- Action: Find records (with filter)
- Action: Run script (format as JSON)
- Action: Send webhook to your server
Option 2: Third-party tools
- Make (Integromat): Airtable module → Google Sheets → download as XLSX
- Zapier: Similar, but more limited on data volume
- n8n (self-hosted): Full control, free
Option 3: Scheduled script
Run a Python/Node script on cron that:
- Calls Airtable API
- Converts to Excel using a library
- Emails you the file or saves to Dropbox
Common Export Problems
"Some records missing"
You have over 100 records but only got 100.
Cause: Airtable paginates. You need to follow the offset until there's none.
"Linked records show as IDs"
Expected behavior for CSV and basic API exports.
Fix: Use the multi-table join approach described above.
"Formula columns are blank"
Formula might reference an error or return empty for some rows.
Check: Open Airtable, look for ERROR or empty formula results.
"Attachments won't open"
Airtable attachment URLs expire after a few hours.
If you need permanent links:
- Download attachments via URL
- Re-host them (S3, Drive, etc.)
- Replace URLs in your export
Or just use the URLs for immediate download, not long-term storage.
Excel Import Back to Airtable
Exporting is one thing. Getting data back in:
CSV import:
- Table → Import CSV
- Map columns to fields
- Choose: append or replace
API import:
POST /v0/{base}/{table}
{
"records": [
{"fields": {"Name": "New Project", "Budget": 25000}}
]
}
Gotcha: You can't import back into lookup/formula fields—they're computed.
The Airtable → Excel Template Workflow
For recurring reports:
First time:
- Export via API (all records)
- Convert JSON to Excel via JsonExport
- Build your analysis (pivot tables, charts, formulas)
- Save as template
Each export after:
- Re-run API export
- Convert to Excel
- Paste into template's "Data" sheet
- Everything auto-updates
Takes 5 minutes once set up.
Privacy
Airtable bases often contain customer data, PII, or business-sensitive info.
When using API exports:
- Token is between you and Airtable (encrypted)
- JSON conversion in JsonExport happens in your browser
- No data uploaded to any server
When using third-party automation tools:
- Read their privacy policy
- Data passes through their servers
- May not be GDPR-compliant
For sensitive data, stick to local solutions: API → your machine → JsonExport (browser) → Excel.
Summary
Simple tables: CSV export works fine.
Relational data: API + JSON conversion required.
Recurring exports: Build a template, refresh data weekly.
Airtable is powerful for organising work. Just expect some friction when it's time to get data out.
Convert Your Airtable JSON Export - Flatten nested records and attachments automatically.
Related Guides: