Airtable
Records, tables and fields in the Airtable bases your client picks.
- Website
- airtable.com
- Connects by
- Signing in with Airtable
- Category
- Spreadsheets and databases
- Services
- 1
- Tools
- 2
| Service | Key | Base URL |
|---|---|---|
| Airtable | airtable | https://api.airtable.com/v0 |
Connecting
Your client presses Connect. Airtable lists the permissions and asks which bases to give access to. They pick the bases and grant access.
curl https://api.operate.as/v1/me/clients \ -H "Authorization: Bearer $OPERATE_AS_API_KEY"[ { "id": "6f1c2a7e-...", "name": "Miller Dental", "services": [ "airtable" ] }]Good to know
Only the bases your client picks
Calls to any other base fail. Your client can add or remove bases later in Airtable, or connect again from their link and pick again. Base IDs start with app.
PKCE is handled for you
Airtable's sign-in uses PKCE, an extra check that the sign-in which started on your client's page is the same one that finishes. Operate As handles it. There's nothing for you or your client to do.
Permissions
| What the client reads | Permission it asks for |
|---|---|
| See records in the bases you choose | data.records:read |
| Add and edit records in those bases | data.records:write |
| See the tables and fields of those bases | schema.bases:read |
Tools
Install Airtable's typed package for your language:
pip install operate-as-airtableairtable.create_recordcurl -X POST https://api.operate.as/v1/actions/airtable.create_record \ -H "Authorization: Bearer $OPERATE_AS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "clientId": "6f1c2a7e-...", "input": { "base_id": "<base_id>", "table": "<table>", "fields": {} } }'| Input | Type | What it is |
|---|---|---|
base_idrequired | string | The base's ID, starting app |
tablerequired | string | The table's name or ID |
fieldsrequired | object | The record's fields by name |
{ "status": 200, "data": { "…": "the service's own response" }, "encoding": "json"}Pass-through
Paths continue from https://api.airtable.com/v0.
See Pass-through requests for the full request and response format.
GET /v1/clients/{clientId}/airtable/{baseId}/Leads?maxRecords=20
Authorization: Bearer oa_...When access ends
| How long access lasts | 60 minutes at a time. Operate As renews it before it runs out and checks every connection daily. |
| Renewal | Each renewal key works once and lasts 60 days. Daily renewal means the 60 days don't normally run out. |
| What ends it | Your client removes the app's access in Airtable. |
| When it's removed | Airtable has no way for an app to cancel its own access, so we delete our copy and nothing renews it. Your client removes the app in Airtable. |
See Keeping access alive and Removing access.
HTTP/1.1 409 ConflictContent-Type: application/json{ "detail": "Miller Dental's Airtable access ended. Send them their link to reconnect."}{ "id": "evt_3f9a1c…", "type": "connection.expired", "createdAt": "2026-10-16T08:00:00+00:00", "data": { "clientId": "6f1c2a7e-...", "clientName": "Miller Dental", "provider": "airtable", "services": [ "airtable" ], "reconnectUrl": "https://…" }}