Pipory
Node reference

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

OperationWhat it doesScope
listRecordsList records (one page)data.records:read
listAllRecordsList all records (follow pagination)data.records:read
getRecordGet recorddata.records:read

Records — write

OperationWhat it doesScope
createRecordCreate recorddata.records:write
batchCreateRecordsCreate records (up to 10)data.records:write
updateRecordUpdate record (keep other cells)data.records:write
replaceRecordReplace record (clear other cells)data.records:write
batchUpdateRecordsUpdate records (up to 10)data.records:write
batchReplaceRecordsReplace records (up to 10)data.records:write
upsertRecordUpsert record by matching fieldsdata.records:write
batchUpsertRecordsUpsert records (up to 10)data.records:write
deleteRecordDelete recorddata.records:write
batchDeleteRecordsDelete records (up to 10)data.records:write
syncCsvDataPush CSV into a sync tabledata.records:write

Attachments

OperationWhat it doesScope
uploadAttachmentUpload attachment to a celldata.records:write

Comments

OperationWhat it doesScope
listCommentsList record commentsdata.recordComments:read
createCommentAdd comment to a recorddata.recordComments:write
updateCommentEdit commentdata.recordComments:write
deleteCommentDelete commentdata.recordComments:write

Bases, tables & fields

OperationWhat it doesScope
listBasesList basesschema.bases:read
getBaseSchemaGet base schema (tables, fields, views)schema.bases:read
createBaseCreate baseschema.bases:write
createTableCreate tableschema.bases:write
updateTableUpdate table name or descriptionschema.bases:write
createFieldCreate fieldschema.bases:write
updateFieldUpdate field name or descriptionschema.bases:write
deleteViewDelete viewworkspacesAndBases:write
whoamiGet token owner and scopes(any valid token)

Webhooks

OperationWhat it doesScope
listWebhooksList webhooks on a basewebhook:manage
createWebhookCreate webhookwebhook:manage
deleteWebhookDelete webhookwebhook:manage
toggleWebhookNotificationsEnable or disable webhook pingswebhook:manage
refreshWebhookRefresh webhook expirywebhook:manage
listWebhookPayloadsList webhook payloadswebhook: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:

FieldValueNotes
baseIdappXXXXXXXXXXXXXXThe app... id from the base's URL, or from the List bases operation
tableContactsTable 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
mergeFieldsEmailUp to three comma-separated columns to match on; they must be plain, non-computed fields
typecasttrueLets 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.