How to Export Metadata from Airtable
Airtable is already a spreadsheet — exporting your metadata is as simple as downloading a CSV. Here are three ways to do it, from one-click to API-powered.
Airtable has a built-in CSV download. From any view in a table, click the three-dot menu and select "Download CSV." Since Airtable is already structured data, the export captures exactly what you see. For more complex needs (attachment metadata, linked records, computed fields), the Airtable API gives you full programmatic access.
Built-in CSV Download
The simplest method. One click from any view, and you have a CSV of all visible records and fields. Since Airtable is already tabular data, the export is clean and spreadsheet-ready.
Views + Extensions
Airtable extensions (formerly "apps") add export capabilities beyond the basic CSV download. The CSV Import/Export extension and Send.com extension provide more control over export formatting, field mapping, and scheduling.
Airtable REST API
The Airtable API returns records as JSON with full field values, including attachment metadata (file URLs, thumbnails, sizes) and linked record IDs. It handles pagination and supports filtering, sorting, and field selection.
airtable.com/create/tokens. Create a token with read access to the base whose metadata you need.import requests
import csv
API_TOKEN = "your_personal_access_token"
BASE_ID = "your_base_id"
TABLE_NAME = "your_table_name"
HEADERS = {"Authorization": f"Bearer {API_TOKEN}"}
def list_all_records():
"""List all records with pagination."""
records = []
offset = None
while True:
params = {"pageSize": 100}
if offset:
params["offset"] = offset
resp = requests.get(
f"https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}",
headers=HEADERS,
params=params,
)
data = resp.json()
records.extend(data.get("records", []))
offset = data.get("offset")
if not offset:
break
return records
records = list_all_records()
# Collect all field names across all records
all_fields = set()
for record in records:
all_fields.update(record.get("fields", {}).keys())
all_fields = sorted(all_fields)
with open("airtable_metadata.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["Record ID", "Created Time"] + all_fields)
for record in records:
fields = record.get("fields", {})
row = [record["id"], record.get("createdTime", "")]
for field_name in all_fields:
value = fields.get(field_name, "")
# Handle attachment fields (list of objects)
if isinstance(value, list) and value and isinstance(value[0], dict):
value = "; ".join(
item.get("filename", item.get("url", str(item)))
for item in value
)
row.append(value)
writer.writerow(row)
print(f"Exported {len(records)} records to airtable_metadata.csv")What metadata fields can you export?
| Field | CSV Download | Extensions | Airtable API |
|---|---|---|---|
| Record ID | ✕ | ✕ | ✓ |
| All visible fields | ✓ | ✓ | ✓ |
| Hidden fields | ✕ | Configurable | ✓ |
| Created time | If column shown | ✓ | ✓ |
| Last modified time | If column shown | ✓ | ✓ |
| Created by | If column shown | ✓ | ✓ |
| Attachment file names | Flattened | Varies | Full detail |
| Attachment URLs | ✕ | ✕ | ✓ |
| Attachment file size | ✕ | ✕ | ✓ |
| Attachment dimensions | ✕ | ✕ | ✓ |
| Linked record IDs | Display values | Varies | Record IDs |
| Lookup / rollup values | ✓ | ✓ | ✓ |
| Formula values | ✓ | ✓ | ✓ |
| Single/multi-select | ✓ | ✓ | ✓ |
- CSV download is view-dependent: The built-in CSV export only includes fields visible in the current view. Hidden fields are excluded. Create a dedicated export view to ensure consistency.
- Attachment metadata in CSV: The CSV download flattens attachment fields to file names only. URLs, sizes, and dimensions are lost. Use the API if you need full attachment metadata.
- API rate limits: The Airtable API allows 5 requests per second per base. For very large bases (50,000+ records), exports may take a few minutes due to pagination and rate limiting.
You have your metadata export.
Now score it.
Upload your CSV or Excel file to MQS and get a structural metadata health score out of 100 with dimension breakdowns and actionable diagnostics.