Airtable

Records, tables and fields in the Airtable bases your client picks.

Connects by
Signing in with Airtable
Category
Spreadsheets and databases
Services
1
Tools
2
ServiceKey
Airtableairtable

Connecting

Your client presses Connect. Airtable lists the permissions and asks which bases to give access to. They pick the bases and grant access.

Check they're connected
curl https://api.operate.as/v1/me/clients \  -H "Authorization: Bearer $OPERATE_AS_API_KEY"
Response
[  {    "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 readsPermission it asks for
See records in the bases you choosedata.records:read
Add and edit records in those basesdata.records:write
See the tables and fields of those basesschema.bases:read

Tools

Install Airtable's typed package for your language:

pip install operate-as-airtable
Run airtable.create_record
curl -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": {}    }  }'
InputTypeWhat it is
base_idrequiredstringThe base's ID, starting app
tablerequiredstringThe table's name or ID
fieldsrequiredobjectThe record's fields by name
Response
{  "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.

Call any endpoint
GET /v1/clients/{clientId}/airtable/{baseId}/Leads?maxRecords=20
Authorization: Bearer oa_...

When access ends

How long access lasts60 minutes at a time. Operate As renews it before it runs out and checks every connection daily.
RenewalEach renewal key works once and lasts 60 days. Daily renewal means the 60 days don't normally run out.
What ends itYour client removes the app's access in Airtable.
When it's removedAirtable 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.

Calls answer
HTTP/1.1 409 ConflictContent-Type: application/json{  "detail": "Miller Dental's Airtable access ended. Send them their link to reconnect."}
Your webhook receives
{  "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://…"  }}