Airtable
Airtable node reference - all 34 operations, the credential it needs, and a worked example.
Calls the Airtable Web API with a personal access token across 34 operations, grouped by resource: records (list one page, list all by following pagination, get, create, create up to ten, update keeping other cells, replace clearing them, update or replace up to ten, upsert by matching up to three fields, delete, delete up to ten, push CSV into a sync table), attachment upload straight into a cell, record comments (list, add, edit, delete), bases and schema (list bases, read a base's tables/fields/views, create a base, create and update tables, create and update fields, delete a view, read the token's own id and scopes), and webhook management (list, create, delete, refresh the seven-day expiry, toggle pings, read payloads). Batch operations are capped at Airtable's ten-record limit before the request rather than after a 422, and every operation names the token scope it needs so a 403 says which one to tick.
Credential: Airtable personal access token - see Credentials.
Scopes
Each operation below lists the scope it needs. Scopes are ticked when you create the Airtable personal access token. If a run fails with a permission error, the node names the missing scope in the error - grant it and re-run; you do not need to rebuild the workflow.
Operations (34)
Records — read
| Operation | What it does | Scope |
|---|---|---|
listRecords | List records (one page) | data.records:read |
listAllRecords | List all records (follow pagination) | data.records:read |
getRecord | Get record | data.records:read |
Records — write
| Operation | What it does | Scope |
|---|---|---|
createRecord | Create record | data.records:write |
batchCreateRecords | Create records (up to 10) | data.records:write |
updateRecord | Update record (keep other cells) | data.records:write |
replaceRecord | Replace record (clear other cells) | data.records:write |
batchUpdateRecords | Update records (up to 10) | data.records:write |
batchReplaceRecords | Replace records (up to 10) | data.records:write |
upsertRecord | Upsert record by matching fields | data.records:write |
batchUpsertRecords | Upsert records (up to 10) | data.records:write |
deleteRecord | Delete record | data.records:write |
batchDeleteRecords | Delete records (up to 10) | data.records:write |
syncCsvData | Push CSV into a sync table | data.records:write |
Attachments
| Operation | What it does | Scope |
|---|---|---|
uploadAttachment | Upload attachment to a cell | data.records:write |
Comments
| Operation | What it does | Scope |
|---|---|---|
listComments | List record comments | data.recordComments:read |
createComment | Add comment to a record | data.recordComments:write |
updateComment | Edit comment | data.recordComments:write |
deleteComment | Delete comment | data.recordComments:write |
Bases, tables & fields
| Operation | What it does | Scope |
|---|---|---|
listBases | List bases | schema.bases:read |
getBaseSchema | Get base schema (tables, fields, views) | schema.bases:read |
createBase | Create base | schema.bases:write |
createTable | Create table | schema.bases:write |
updateTable | Update table name or description | schema.bases:write |
createField | Create field | schema.bases:write |
updateField | Update field name or description | schema.bases:write |
deleteView | Delete view | workspacesAndBases:write |
whoami | Get token owner and scopes | (any valid token) |
Webhooks
| Operation | What it does | Scope |
|---|---|---|
listWebhooks | List webhooks on a base | webhook:manage |
createWebhook | Create webhook | webhook:manage |
deleteWebhook | Delete webhook | webhook:manage |
toggleWebhookNotifications | Enable or disable webhook pings | webhook:manage |
refreshWebhook | Refresh webhook expiry | webhook:manage |
listWebhookPayloads | List webhook payloads | webhook:manage |
Example
Keep a contacts table in sync without creating duplicates
A form submission arrives with an email address that may or may not already be in the base. Upsert matches on the Email column: an existing row is updated, a brand-new person is inserted - one node instead of a search-then-branch pair.
Set Operation to upsertRecord, then fill in:
| Field | Value | Notes |
|---|---|---|
baseId | appXXXXXXXXXXXXXX | The app... id from the base's URL, or from the List bases operation |
table | Contacts | Table name or tbl... id - an id survives a rename, a name does not |
fields | {"Email": "{{form.email}}", "Name": "{{form.name}}"} | Cell values keyed by field name |
mergeFields | Email | Up to three comma-separated columns to match on; they must be plain, non-computed fields |
typecast | true | Lets Airtable coerce strings into the cell's type, e.g. creating a select option that does not exist yet |
Sets {{crm.id}} (the matched-or-created rec... id) and {{crm.fields}} (the row after the write). Airtable also reports which side of the upsert happened: {{crm.createdRecords}} is non-empty only on insert, {{crm.updatedRecords}} only on match.