Airtable (airtable.com). Use this skill for ANY Airtable request — reading, creating, updating, and deleting data. Whenever a task involves Airtable, use this skill instead of calling the API directly.
Data & analysis
airtable
Try itConnect to Airtable via a managed OAuth gateway for full CRUD on bases, tables, and records.
What it does
Provides HTTP access to the Airtable REST API through an OAuth-managed proxy. Authenticate with a single bearer API key, then list bases, fetch table schemas, and run create, read, update, and delete operations on records. Supports Airtable query parameters including views, filterByFormula, field selection, sorting, and offset-based pagination. Includes connection endpoints for listing, creating, retrieving, and deleting OAuth connections, plus a header for routing requests when multiple accounts are linked. Code samples are shown for Python and JavaScript.
When to use it
- Querying Airtable records with filterByFormula
- Creating or updating records in bulk through the Airtable REST API
- Managing OAuth connections across multiple Airtable accounts
- Inspecting base schemas before integrating with downstream systems
The skill document
Airtable
Access the Airtable API with managed OAuth authentication. Manage bases, tables, and records with full CRUD operations.
Quick Start
# List records from a table
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/airtable/v0/{baseId}/{tableIdOrName}?maxRecords=100')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Base URL
https://api.maton.ai/airtable/{native-api-path}
Maton proxies requests to api.airtable.com and automatically injects your OAuth token.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
Connection Management
Manage your Airtable OAuth connections at https://api.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=airtable&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create Connection
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'airtable'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Get Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "airtable",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Specifying Connection
If you have multiple Airtable connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/airtable/v0/appXXXXX/TableName')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
Security & Permissions
- Access is scoped to bases, tables, and records within the connected Airtable account.
- All write operations require explicit user approval. Before executing any create, update, or delete call, confirm the target resource and intended effect with the user.
API Reference
List Bases
GET /airtable/v0/meta/bases
Get Base Schema
GET /airtable/v0/meta/bases/{baseId}/tables
List Records
GET /airtable/v0/{baseId}/{tableIdOrName}?maxRecords=100
With view:
GET /airtable/v0/{baseId}/{tableIdOrName}?view=Grid%20view&maxRecords=100
With filter formula:
GET /airtable/v0/{baseId}/{tableIdOrName}?filterByFormula={Status}='Active'
With field selection:
GET /airtable/v0/{baseId}/{tableIdOrName}?fields[]=Name&fields[]=Status&fields[]=Email
With sorting:
GET /airtable/v0/{baseId}/{tableIdOrName}?sort[0][field]=Created&sort[0][direction]=desc
Get Record
GET /airtable/v0/{baseId}/{tableIdOrName}/{recordId}
Create Records
POST /airtable/v0/{baseId}/{tableIdOrName}
Content-Type: application/json
{
"records": [
{
"fields": {
"Name": "New Record",
"Status": "Active",
"Email": "test@example.com"
}
}
]
}
Update Records (PATCH - partial update)
PATCH /airtable/v0/{baseId}/{tableIdOrName}
Content-Type: application/json
{
"records": [
{
"id": "recXXXXXXXXXXXXXX",
"fields": {
"Status": "Completed"
}
}
]
}
Update Records (PUT - full replace)
PUT /airtable/v0/{baseId}/{tableIdOrName}
Content-Type: application/json
{
"records": [
{
"id": "recXXXXXXXXXXXXXX",
"fields": {
"Name": "Updated Name",
"Status": "Active"
}
}
]
}
Delete Records
DELETE /airtable/v0/{baseId}/{tableIdOrName}?records[]=recXXXXX&records[]=recYYYYY
Pagination
Use pageSize and offset for pagination:
GET /airtable/v0/{baseId}/{tableIdOrName}?pageSize=50&offset=itrXXXXXXXXXXX
Response includes offset when more records exist:
{
"records": [...],
"offset": "itrXXXXXXXXXXX"
}
Code Examples
JavaScript
const response = await fetch(
'https://api.maton.ai/airtable/v0/appXXXXX/TableName?maxRecords=10',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
Python
import os
import requests
response = requests.get(
'https://api.maton.ai/airtable/v0/appXXXXX/TableName',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'maxRecords': 10}
)
Notes
- Base IDs start with
app - Table IDs start with
tbl(can also use table name) - Record IDs start with
rec - Maximum 100 records per request for create/update
- Maximum 10 records per delete request
- Filter formulas use Airtable formula syntax
- IMPORTANT: When using curl commands, use
curl -gwhen URLs contain brackets (fields[],sort[],records[]) to disable glob parsing - IMPORTANT: When piping curl output to
jqor other commands, environment variables like$MATON_API_KEYmay not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.
Error Handling
| Status | Meaning |
|---|---|
| 400 | Missing Airtable connection |
| 401 | Invalid or missing Maton API key |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from Airtable API |
Troubleshooting: API Key Issues
- Check that the
MATON_API_KEYenvironment variable is set:
echo $MATON_API_KEY
- Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Troubleshooting: Invalid App Name
- Ensure your URL path starts with
airtable. For example:
- Correct:
https://api.maton.ai/airtable/v0/{baseId}/{tableIdOrName} - Incorrect:
https://api.maton.ai/v0/{baseId}/{tableIdOrName}
Resources
Questions people ask
- How does authentication work?
- Requests are sent to the gateway with a Bearer API key stored in the MATON_API_KEY environment variable. The gateway injects the OAuth token before forwarding calls to api.airtable.com, so no token handling is required in client code.
- How are multiple Airtable accounts handled?
- List existing OAuth connections at /connections, then include the Maton-Connection header with the desired connection_id on Airtable requests to ensure calls route to the intended account.
- What limits apply to write operations?
- Create and update requests accept up to 100 records per call, and delete requests accept up to 10. The documented guidance is to confirm the target resource and intended effect with the user before running any write call.
Related skills
Read and modify Baserow databases through a managed API key proxy with CRUD, filtering, and batch support.
Manage ClickUp workspaces, spaces, folders, lists, and tasks via the ClickUp API with managed OAuth.
Access the HubSpot CRM API via managed OAuth to manage contacts, companies, deals, and associations.
Access Notion workspaces via a managed OAuth proxy for search, database queries, and reads, with explicit approval for writes.
Connect to Google Tasks with managed OAuth to read and manage task lists and tasks via a unified API.