Airtable Component
Manage records, tables and bases in Airtable
Component key: airtable
Description
Airtable is a spreadsheet-database hybrid, with the features of a database but applied to a spreadsheet. This component allows you to list, create, delete, and update records in an Airtable Base.
API Documentation
This component was built using the Airtable Web API.
Airtable developer documentation can be found here.
Connections
API Key and Base ID (Deprecated)
Deprecation Notice
Airtable API keys have been deprecated as of February 1, 2024.
Use OAuth 2.0 or personal access tokens instead for all new integrations.
| Input | Notes | Example |
|---|---|---|
| API Key | You can generate an API key from https://airtable.com/account. | keyvTlNCTqEXAMPLE |
| Airtable Base ID | Visit https://airtable.com/api and select your workspace. The ID of your base will be printed for you in green. | appLkNDICXNqxSDhG |
OAuth 2.0
To create an Airtable OAuth 2.0 connection, an OAuth integration must be registered in Airtable.
Prerequisites
- An Airtable account with permissions to create OAuth integrations
Setup Steps
- Log in to Airtable and navigate to airtable.com/create/oauth.
- Click Register new OAuth integration.
- Fill in the required fields:
- App name: A descriptive name for the integration
- App description: Brief description of the integration's purpose
- Redirect URLs: Enter
https://oauth2.prismatic.io/callbackas the OAuth redirect URL
- Under Scopes, select the scopes required for the integration. Refer to Airtable's OAuth scopes documentation for details on available scopes.
- Common scopes include:
data.records:read- Read records from basesdata.records:write- Create, edit, and delete recordsschema.bases:read- Read base schema informationschema.bases:write- Create and modify base schemawebhook:manage- Create and manage webhooks
- Common scopes include:
- Click Save to create the integration.
- Copy the Client ID and Client secret values displayed on the integration details page.
Configure the Connection
- Enter the Client ID and Client Secret from the OAuth integration.
- For Scopes, enter the selected scopes as a space-separated list. For example:
data.records:read data.records:write schema.bases:read webhook:manage - The default scopes include common permissions for reading, writing, and managing webhooks. Adjust the scopes based on the specific requirements of the integration.
The connection is now ready to authenticate with Airtable.
| Input | Notes | Example |
|---|---|---|
| Authorize URL | The OAuth 2.0 Authorization URL for Airtable | https://airtable.com/oauth2/v1/authorize |
| Client ID | Provide the Client ID you received from https://airtable.com/create/oauth. | cli1234567890abcd |
| Client Secret | Provide the Client Secret you received from https://airtable.com/create/oauth. | |
| Scopes | A space-delimited set of one or more scopes to get the user's permission to access. | data.records:read data.records:write data.recordComments:read data.recordComments:write schema.bases:read schema.bases:write webhook:manage |
| Token URL | The OAuth 2.0 Token URL for Airtable | https://airtable.com/oauth2/v1/token |
Personal Access Token
A personal access token provides user-specific access to Airtable bases and can be used for testing integrations or for user-scoped operations.
Personal access tokens are user-scoped and suitable for testing or personal automations. For production integrations where users need to authenticate with their own credentials, OAuth 2.0 is recommended.
Prerequisites
- An Airtable account with access to the bases that will be accessed
Setup Steps
To generate a personal access token:
- Log in to Airtable and navigate to airtable.com/create/tokens.
- Click Create new token.
- Enter a descriptive Token name to identify the token's purpose.
- Under Scopes, select the permissions required for the integration. Refer to Airtable's scopes documentation for details on available scopes.
- Common scopes include:
data.records:read- Read records from basesdata.records:write- Create, edit, and delete recordsschema.bases:read- Read base schema informationschema.bases:write- Create and modify base schema
- Common scopes include:
- Under Access, select the specific bases the token should have access to, or select All current and future bases in all current and future workspaces for broader access.
- Click Create token.
- Copy the token value immediately. The token will not be shown again after leaving the page.
The token format will look similar to: patAbCdEfGh1234567.1234567890abcdefghijklmnopqr
Configure the Connection
- Enter the personal access token into the API Key field of the connection configuration.
Store the token securely. Personal access tokens do not expire but can be revoked at any time from the token management page.
| Input | Notes | Example |
|---|---|---|
| API Key | You can generate an API key from https://airtable.com/create/tokens | patAbCdEfGh1234567.1234567890abcdefghijklmnopqr |
Triggers
Base Change Notifications
Receive base change notifications from Airtable. Automatically creates and manages a webhook subscription when the instance is deployed, and removes the subscription when the instance is deleted. | key: baseChanges
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. | appLkNDICXNqxSDhG |
| Data Types | Types of changes to monitor. | tableData |
| Record Change Scope | Optional table ID or view ID to limit webhook to specific table/view. Leave empty to monitor all tables in base. | tblMwMnUJpKoJUDzo |
The Base Change Notifications trigger automatically creates and manages an Airtable webhook subscription that monitors changes to a base. When the instance is deployed, the trigger creates the webhook; when the instance is deleted, the webhook is automatically removed. The trigger uses cursor-based payload retrieval and includes automatic webhook refresh functionality to prevent expiration.
For more information about Airtable's webhook system, see the Airtable Webhooks API documentation.
Lifecycle Behavior
Instance Deploy
When an instance with this trigger is deployed, the trigger:
- Checks for existing webhook: If a webhook was previously created and exists in the instance state, the trigger validates whether it still exists in Airtable
- Handles configuration changes: If the configuration (base ID, data types, or record change scope) has changed, the trigger deletes the old webhook before creating a new one
- Creates webhook: Calls the Airtable API to create a new webhook subscription with the specified configuration
- Stores state: Saves the webhook ID, MAC secret, expiration time, cursor, and configuration details in cross-flow state
Instance Update
When an instance is redeployed with configuration changes:
- If the base ID, data types, or record change scope has changed, the trigger deletes the old webhook and creates a new one with the updated configuration
- If the configuration remains the same, the existing webhook is retained
Instance Delete
When an instance is deleted or disabled:
- The trigger automatically deletes the webhook from Airtable using the webhook ID stored in state
- The cross-flow state is cleared
- If the webhook was already deleted in Airtable (404 response), the deletion is handled gracefully
Webhook Events
This trigger uses two branches to handle different types of events:
Notification Branch
The Notification branch processes webhook notifications from Airtable when changes occur in the monitored base. When invoked:
- Validates signature: Uses the stored MAC secret to verify the webhook payload is authentic
- Retrieves payloads: Fetches all change payloads using cursor-based pagination from the Airtable Webhooks API
- Auto-refreshes webhook: Automatically extends the webhook expiration if needed
- Updates state: Stores the latest cursor and new expiration time
- Returns data: Provides the notification ping, all retrieved payloads, payload count, and cursor
Refresh Branch
The Refresh branch handles scheduled invocations to prevent webhook expiration. Airtable webhooks expire after 7 days without a refresh. Configure a schedule (recommended: daily or every few days) to keep the webhook active. When invoked by schedule:
- Extends expiration: Calls the Airtable API to refresh the webhook
- Updates state: Stores the new expiration time
- Returns confirmation: Provides the new expiration time and success message
Configuration
The trigger requires the following inputs:
- Connection: An Airtable OAuth or API key connection
- Base ID: The ID of the Airtable base to monitor (e.g.,
appLkNDICXNqxSDhG) - Data Types: Types of changes to monitor (default:
tableDatafor record changes)tableData- Monitor record changes (create, update, delete)tableFields- Monitor schema changes (field additions, modifications)tableMetadata- Monitor table metadata changes
- Record Change Scope (optional): A specific table ID or view ID to limit monitoring (e.g.,
tblMwMnUJpKoJUDzo). Leave empty to monitor all tables in the base
Schedule Configuration
To prevent webhook expiration, configure a schedule for the trigger:
- In the integration designer, select the trigger
- Enable Schedule in the trigger configuration
- Set the schedule to run every 1-3 days (recommended: daily)
- When the schedule runs, the Refresh branch will execute and extend the webhook expiration
Returned Data
Notification Branch
When a change notification is received, the trigger returns:
Notification branch response payload
{
"notification": {
"base": {
"id": "appLkNDICXNqxSDhG"
},
"webhook": {
"id": "ach00000000000001"
},
"timestamp": "2023-09-15T18:30:00.000Z"
},
"payloads": [
{
"timestamp": "2023-09-15T18:30:00.000Z",
"actionMetadata": {
"source": "publicApi",
"sourceMetadata": {}
},
"changedTablesById": {
"tblMwMnUJpKoJUDzo": {
"createdRecordsById": {
"rec123abc": {
"createdTime": "2023-09-15T18:30:00.000Z",
"cellValuesByFieldId": {
"fldXYZ789": "New Value"
}
}
},
"changedRecordsById": {
"rec456def": {
"current": {
"cellValuesByFieldId": {
"fldABC123": "Updated Value"
}
},
"previous": {
"cellValuesByFieldId": {
"fldABC123": "Old Value"
}
},
"unchanged": {
"cellValuesByFieldId": {
"fldDEF456": "Unchanged"
}
}
}
},
"destroyedRecordIds": ["rec789ghi"]
}
}
}
],
"payloadCount": 1,
"cursor": 5
}
Refresh Branch
When the webhook is refreshed by schedule, the trigger returns:
Refresh branch response payload
{
"expirationTime": "2023-09-22T18:30:00.000Z",
"message": "Webhook refreshed"
}
Branch Logic
Use branch routing in the integration flow to handle different event types:
- Route the Notification branch to process base changes (record updates, schema changes, etc.)
- Route the Refresh branch to log successful refresh events or send notifications
Example flow structure
[Base Change Notifications Trigger]
|
├─ Notification → [Process Changes] → [Update Records]
|
└─ Refresh → [Log Refresh] → [Send Status Email]
Important Notes
- Webhook Expiration: Airtable webhooks expire after 7 days without activity. The trigger includes automatic refresh functionality, but a schedule must be configured for this to work
- MAC Signature Verification: All webhook payloads are validated using HMAC-SHA256 signature verification to ensure authenticity
- Cursor Management: The trigger uses cursors to track processed payloads and avoid duplicate processing
- State Management: Webhook metadata is stored in cross-flow state and persists across executions
- Configuration Changes: Changing the base ID, data types, or record change scope will delete and recreate the webhook
Comparison with Manual Webhook Trigger
The Airtable component includes two webhook triggers:
- Base Change Notifications (this trigger): Automatically creates and manages webhook subscriptions with lifecycle handlers, cursor-based retrieval, and auto-refresh
- Webhook: A simple webhook receiver for manually configured Airtable webhooks (configured outside the integration)
Use the Base Change Notifications trigger for automated webhook management with built-in expiration prevention. Use the Webhook trigger if webhooks are managed externally or if simple webhook reception is needed without lifecycle management.
{
"payload": {
"headers": {
"Accept": "*/*",
"Content-Type": "application/json",
"Host": "hooks.example.com",
"User-Agent": "Airtable Webhooks",
"X-Airtable-Content-MAC": "hmacSHA256=abc123def456..."
},
"queryParameters": {},
"rawBody": {
"data": "<data (1024 bytes)>"
},
"body": {
"data": {
"expirationTime": "2023-02-15T10:30:00.000Z",
"message": "Webhook notification received"
}
},
"pathFragment": "",
"webhookUrls": {
"Base Changes Flow": "https://hooks.example.com/trigger/BASE_CHANGES_TRIGGER"
},
"webhookApiKeys": {
"Base Changes Flow": [
"api-key-base-changes"
]
},
"invokeUrl": "https://hooks.example.com/trigger/BASE_CHANGES_TRIGGER",
"executionId": "ExecutionResult:base-changes-execution-456",
"customer": {
"id": "Q3VzdG9tZXI6ZXhhbXBsZS1jdXN0b21lci1pZA==",
"name": "Example Customer",
"externalId": "customer-12345"
},
"instance": {
"id": "SW5zdGFuY2U6ZXhhbXBsZS1pbnN0YW5jZS1pZA==",
"name": "Airtable Base Monitor Instance"
},
"user": {
"id": "VXNlcjpleGFtcGxlLXVzZXItaWQ=",
"email": "user@example.com",
"name": "Jane Doe",
"externalId": "user-67890"
},
"integration": {
"name": "Airtable Base Changes",
"id": "SW50ZWdyYXRpb246YWlydGFibGUtYmFzZS1jaGFuZ2Vz",
"versionSequenceId": "1",
"externalVersion": "1.0.0"
},
"flow": {
"name": "Monitor Base Changes",
"id": "RmxvdzpiYXNlLWNoYW5nZXM="
},
"startedAt": "2023-01-15T10:30:00.000Z",
"globalDebug": false
},
"branch": "Notification"
}
Webhook
Receive and validate webhook requests from Airtable for manually configured webhook subscriptions. | key: webhook
The Webhook trigger receives webhook requests from manually configured Airtable webhooks. This trigger is designed for scenarios where webhooks are created and managed outside the integration using Airtable's API or automation interface.
For information about creating Airtable webhooks manually, see the Airtable Webhooks API documentation.
When to Use This Trigger
Use this trigger when:
- Webhooks are created and managed using Airtable's API or Automations interface directly
- Multiple integrations need to receive the same webhook events
- Webhook lifecycle needs to be controlled independently from instance deployment
- Simple webhook reception is needed without automatic lifecycle management
For automatic webhook creation and management with built-in expiration prevention and cursor-based retrieval, use the Base Change Notifications trigger instead.
Configuration
This trigger requires no configuration inputs. It simply receives and returns webhook payloads as-is.
Setting Up the Webhook URL
- Deploy the instance containing this trigger
- Copy the webhook URL from the trigger's configuration in the instance
- Create an Airtable webhook manually using one of these methods:
- Airtable API: Call the Create webhook endpoint with the trigger URL as the
notificationUrl - Airtable Automations: Use the Webhook Received trigger in an Airtable automation to forward events
- Airtable API: Call the Create webhook endpoint with the trigger URL as the
- Configure the webhook specification to define which events to monitor
Webhook Payload Structure
The trigger receives the raw webhook payload from Airtable and returns it unchanged. A typical Airtable webhook notification includes:
Webhook notification payload
{
"base": {
"id": "appLkNDICXNqxSDhG"
},
"webhook": {
"id": "ach00000000000001"
},
"timestamp": "2023-09-15T18:30:00.000Z"
}
After receiving the notification ping, use the List webhook payloads endpoint to retrieve the actual change data using the webhook ID and cursor values.
Example Webhook Payloads
Record Created Event
{
"base": {
"id": "appLkNDICXNqxSDhG"
},
"webhook": {
"id": "ach00000000000001"
},
"timestamp": "2023-09-15T18:30:00.000Z"
}
Table Schema Changed Event
{
"base": {
"id": "appLkNDICXNqxSDhG"
},
"webhook": {
"id": "ach00000000000001"
},
"timestamp": "2023-09-15T19:45:00.000Z"
}
Multiple Changes Event
{
"base": {
"id": "appLkNDICXNqxSDhG"
},
"webhook": {
"id": "ach00000000000002"
},
"timestamp": "2023-09-15T20:15:00.000Z"
}
Returned Data
The trigger returns the complete webhook payload structure:
Complete webhook payload structure
{
"headers": {
"Accept": "*/*",
"Content-Type": "application/json",
"Host": "hooks.example.com",
"User-Agent": "Airtable (https://airtable.com)"
},
"queryParameters": {},
"rawBody": {
"data": "<data (547 bytes)>"
},
"body": {
"data": [
{
"id": "recExample123",
"fields": {
"Field 1": "Example Value 1",
"Field 2": "Example Value 2"
},
"createdTime": "2023-01-01T00:00:00.000Z"
}
],
"contentType": "application/json"
},
"pathFragment": "",
"webhookUrls": {
"Flow 1": "https://hooks.example.com/trigger/EXAMPLE_ID"
},
"webhookApiKeys": {
"Flow 1": ["example-api-key"]
},
"invokeUrl": "https://hooks.example.com/trigger/EXAMPLE_ID",
"executionId": "ExecutionResult:example-execution-id",
"customer": {
"id": "customerId",
"name": "Customer Name",
"externalId": "externalId"
},
"instance": {
"id": "instanceId",
"name": "Instance Name"
},
"user": {
"id": "userId",
"email": "user@example.com",
"name": "User Name",
"externalId": "userExternalId"
},
"integration": {
"name": "Integration Name",
"id": "integrationId",
"versionSequenceId": "1",
"externalVersion": "1"
},
"flow": {
"name": "Flow Name",
"id": "flowId"
},
"startedAt": "2023-01-01T00:00:00.000Z",
"globalDebug": false
}
Processing Webhook Data
After receiving the notification ping, the integration flow should:
- Extract webhook metadata: Get the
webhook.idandbase.idfrom the payload - Retrieve change details: Call the List webhook payloads endpoint to get actual change data
- Process changes: Parse the change payloads and take appropriate actions
- Track cursor: Store the cursor value to avoid reprocessing payloads
Example flow
[Webhook Trigger]
→ [Extract Webhook ID]
→ [List Webhook Payloads Action]
→ [Process Changes Loop]
→ [Update Records]
Important Notes
- No Automatic Lifecycle Management: This trigger does not create, refresh, or delete webhooks. Webhook management must be handled separately
- No Signature Verification: This trigger does not verify webhook signatures. Implement verification in the flow if needed using the MAC secret from webhook creation
- No Cursor Management: The trigger does not track cursors or retrieve payloads automatically. The flow must implement cursor tracking
- Webhook Expiration: Airtable webhooks expire after 7 days without a refresh. Implement refresh logic separately using the Refresh webhook endpoint
- Raw Payload: The trigger returns the webhook notification as-is without transformation
Comparison with Base Change Notifications Trigger
The Airtable component includes two webhook triggers:
- Webhook (this trigger): Receives manually configured Airtable webhooks without lifecycle management
- Base Change Notifications: Automatically creates and manages webhook subscriptions with lifecycle handlers, cursor-based retrieval, and auto-refresh
Use this Webhook trigger for simple webhook reception when webhooks are managed externally. Use the Base Change Notifications trigger for automated webhook management with built-in expiration prevention and payload retrieval.
Additional Resources
- Airtable Webhooks API Overview
- Create a webhook
- List webhook payloads
- Refresh a webhook
- Webhooks specification model
Data Sources
Select Base
Select an Airtable base | key: selectBase | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Include ID in dropdown menu? | When true, the base or table ID will be included next to the dropdown menu options. | false |
Select Record
Select a record from a table | key: selectRecord | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Include ID in dropdown menu? | When true, the base or table ID will be included next to the dropdown menu options. | false |
| Table Name | Provide the name of the table you would like to access. | Marketing Campaigns |
Select Table
Select a table from a base | key: selectTable | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Include ID in dropdown menu? | When true, the base or table ID will be included next to the dropdown menu options. | false |
Select Webhook
Select a webhook from a base | key: selectWebhook | type: picklist
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Include ID in dropdown menu? | When true, the base or table ID will be included next to the dropdown menu options. | false |
Actions
Create Record
Create a new record in the given table | key: createRecord
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Dynamic Fields | A field for dynamic inputs that can be configured at deploy time with the use of a key value config variable. Please note that if this input is used, then the default 'Record Fields' inputwill be ignored. | |
| Record Fields | A record is the base equivalent of a row in a spreadsheet. | |
| Table Name | Provide the name of the table you would like to access. | Marketing Campaigns |
{
"data": {
"id": "recZ6qSLw0OCA6Xul",
"createdTime": "2022-06-01T17:50:40.000Z",
"fields": {
"Notes": "We finished this and we're ready to move on to our backlog",
"Status": "Complete",
"Start date": "2022-05-31",
"Projects": "Updated sales process",
"Priority": "High",
"Assigned to": "Jane Doe",
"Count": 42
}
}
}
Create Webhook
Create a new webhook for a base | key: createWebhook
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Notification URL | An optional URL that can receive notification pings. | https://your-webhook-endpoint.com/airtable/notifications |
| Specification | A JSON object that describe the types of changes the webhook is interested in. |
{
"data": {
"id": "ach00000000000001",
"macSecretBase64": "c3VwZXIgZHVwZXIgc2VjcmV0IGtleSBmb3Igd2ViaG9vaw==",
"expirationTime": "2023-01-20T00:00:00.000Z"
}
}
Delete Record
Delete a record inside of the given table | key: deleteRecord
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Record ID | Within Airtable, each record has a unique identifier known as a Record ID. If you are familiar with Entity-Relationship Diagrams or ERDs, then the record id would be the primary key. | rec6r4kNmGDk5D52F |
| Table Name | Provide the name of the table you would like to access. | Marketing Campaigns |
{
"data": {
"deleted": true,
"id": "recZ6qSLw0OCA6Xul"
}
}
Delete Webhook
Delete a webhook | key: deleteWebhook
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Webhook ID | The ID of the webhook to be deleted. | ach00000000000001 |
{
"data": {}
}
Get Base Schema
Get all tables schema within a base | key: getBaseSchema
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
{
"data": {
"tables": [
{
"description": "Apartments to track.",
"fields": [
{
"description": "Name of the apartment",
"id": "fld1VnoyuotSTyxW1",
"name": "Name",
"type": "singleLineText"
},
{
"id": "fldoaIqdn5szURHpw",
"name": "Pictures",
"type": "multipleAttachments"
},
{
"id": "fldumZe00w09RYTW6",
"name": "District",
"options": {
"inverseLinkFieldId": "fldWnCJlo2z6ttT8Y",
"isReversed": false,
"linkedTableId": "tblK6MZHez0ZvBChZ",
"prefersSingleRecordLink": true
},
"type": "multipleRecordLinks"
},
{
"id": "fldPrQNxGqKXLbR4w",
"name": "Price",
"type": "currency",
"options": {
"precision": 2,
"symbol": "$"
}
}
],
"id": "tbltp8DGLhqbUmjK1",
"name": "Apartments",
"primaryFieldId": "fld1VnoyuotSTyxW1",
"views": [
{
"id": "viwQpsuEDqHFqegkp",
"name": "Grid view",
"type": "grid"
},
{
"id": "viwKLb2UxT9mQpP4d",
"name": "Gallery view",
"type": "gallery"
}
]
},
{
"fields": [
{
"id": "fldEVzvQOoULO38yl",
"name": "Name",
"type": "singleLineText"
},
{
"description": "Apartments that belong to this district",
"id": "fldWnCJlo2z6ttT8Y",
"name": "Apartments",
"options": {
"inverseLinkFieldId": "fldumZe00w09RYTW6",
"isReversed": false,
"linkedTableId": "tbltp8DGLhqbUmjK1",
"prefersSingleRecordLink": false
},
"type": "multipleRecordLinks"
}
],
"id": "tblK6MZHez0ZvBChZ",
"name": "Districts",
"primaryFieldId": "fldEVzvQOoULO38yl",
"views": [
{
"id": "viwi3KXvrKug2mIBS",
"name": "Grid view",
"type": "grid"
}
]
}
]
}
}
Get Current User
Get user ID and OAuth scopes for the current user | key: getCurrentUser
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. |
{
"data": {
"id": "usrL2PNC5o3H4lBEi",
"email": "jane.doe@example.com",
"scopes": [
"data.records:read",
"data.records:write",
"data.recordComments:read",
"data.recordComments:write",
"schema.bases:read",
"schema.bases:write",
"webhook:manage"
]
}
}
Get Record
Retrieve a record by ID from the given table | key: getRecord
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Record ID | Within Airtable, each record has a unique identifier known as a Record ID. If you are familiar with Entity-Relationship Diagrams or ERDs, then the record id would be the primary key. | rec6r4kNmGDk5D52F |
| Table Name | Provide the name of the table you would like to access. | Marketing Campaigns |
{
"data": {
"id": "recZ6qSLw0OCA6Xul",
"createdTime": "2022-06-01T17:50:40.000Z",
"fields": {
"Notes": "We finished this and we're ready to move on to our backlog",
"Status": "Complete",
"Start date": "2022-05-31",
"Projects": "Updated sales process",
"Priority": "High",
"Assigned to": "Jane Doe",
"Count": 42
}
}
}
List Bases
List all bases within the Airtable account | key: listBases
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. |
{
"data": [
{
"id": "appLkNDICXNqxSDhG",
"name": "Apartment Hunting",
"permissionLevel": "create"
},
{
"id": "appSW9R5uCNmRmfl6",
"name": "Project Tracker",
"permissionLevel": "edit"
},
{
"id": "appVZ3mDrP8fK4xyL",
"name": "Marketing Campaigns",
"permissionLevel": "read"
}
]
}
List Records
List all records inside of the given table | key: listRecords
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Fields | Enter the names (or IDs) of the fields you would like returned. If you omit this list, all fields will be returned. | Name, Email, Status |
| Filter By Formula | Filter results to only records that meet some particular criteria. | AND({Quantity} * {Price} > 100, NOT({Shipped?})) |
| Table Name | Provide the name of the table you would like to access. | Marketing Campaigns |
| View | The name or ID of a view in your table. If set, only records in that view will be returned, sorted in the way that the view is sorted. | Grid view |
Filtering Records
You can filter for specific records using the Filter By Formula input.
For example, if you want only records where the product of the Quantity and Price fields is greater than 100, and the record's Shipped? field is not checked, you can use a formula like this:
AND({Quantity} * {Price} > 100, NOT({Shipped?}))
Full documentation on Airtable formula is available on their support site.
{
"data": [
{
"id": "recZ6qSLw0OCA6Xul",
"createdTime": "2022-06-01T17:50:40.000Z",
"fields": {
"Notes": "We finished this and we're ready to move on to our backlog",
"Status": "Complete",
"Start date": "2022-05-31",
"Projects": "Updated sales process",
"Priority": "High",
"Assigned to": "Jane Doe",
"Count": 42
}
},
{
"id": "rec3EKPqD9kLdNPx2",
"createdTime": "2022-05-15T14:23:10.000Z",
"fields": {
"Notes": "Initial setup and configuration",
"Status": "In Progress",
"Start date": "2022-05-15",
"Projects": "New feature development",
"Priority": "Medium",
"Assigned to": "John Smith",
"Count": 15
}
}
]
}
List Webhooks
List all webhooks registered for a base | key: listWebhooks
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
{
"data": [
{
"id": "ach00000000000001",
"specification": {
"options": {
"filters": {
"dataTypes": [
"tableData"
],
"recordChangeScope": "tbltp8DGLhqbUmjK1"
}
}
},
"notificationUrl": "https://example.com/receive-webhook",
"cursorForNextPayload": 5,
"areNotificationsEnabled": true,
"lastNotificationResult": {
"success": true,
"completionTimestamp": "2022-02-01T21:25:05.663Z",
"durationMs": 2.603,
"retryNumber": 0
},
"lastSuccessfulNotificationTime": "2022-02-01T21:25:05.663Z",
"isHookEnabled": true,
"expirationTime": "2023-01-20T00:00:00.000Z"
},
{
"id": "ach00000000000002",
"specification": {
"options": {
"filters": {
"dataTypes": [
"tableData",
"tableMetadata"
]
}
}
},
"notificationUrl": "https://hooks.example.io/airtable",
"cursorForNextPayload": 12,
"areNotificationsEnabled": true,
"lastNotificationResult": {
"success": true,
"completionTimestamp": "2022-02-15T14:30:22.145Z",
"durationMs": 1.854,
"retryNumber": 0
},
"lastSuccessfulNotificationTime": "2022-02-15T14:30:22.145Z",
"isHookEnabled": true,
"expirationTime": "2023-02-10T00:00:00.000Z"
}
]
}
Raw Request
Send raw HTTP request to Airtable | key: rawRequest
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Data | The HTTP body payload to send to the URL. | {"exampleKey": "Example Data"} |
| File Data | File Data to be sent as a multipart form upload. | [{key: "example.txt", value: "My File Contents"}] |
| File Data File Names | File names to apply to the file data inputs. Keys must match the file data keys above. | |
| Form Data | The Form Data to be sent as a multipart form upload. | [{"key": "Example Key", "value": new Buffer("Hello World")}] |
| Header | A list of headers to send with the request. | User-Agent: curl/7.64.1 |
| Max Retry Count | The maximum number of retries to attempt. Specify 0 for no retries. | 0 |
| Method | The HTTP method to use. | |
| Query Parameter | A list of query parameters to send with the request. This is the portion at the end of the URL similar to ?key1=value1&key2=value2. | |
| Response Type | The type of data you expect in the response. You can request json, text, or binary data. | json |
| Retry On All Errors | If true, retries on all erroneous responses regardless of type. This is helpful when retrying after HTTP 429 or other 3xx or 4xx errors. Otherwise, only retries on HTTP 5xx and network errors. | false |
| Retry Delay (ms) | The delay in milliseconds between retries. This is used when 'Use Exponential Backoff' is disabled. | 0 |
| Timeout | The maximum time that a client will await a response to its request | 2000 |
| URL | Input the path only (/v0/meta/bases/{BASE_ID}/tables), The base URL is already included (https://api.airtable.com). For example, to connect to https://api.airtable.com/v0/meta/bases/{BASE_ID}/tables, only /v0/meta/bases/{BASE_ID}/tables is entered in this field. | /v0/meta/bases/{BASE_ID}/tables |
| Use Exponential Backoff | Specifies whether to use a pre-defined exponential backoff strategy for retries. When enabled, 'Retry Delay (ms)' is ignored. | false |
{
"data": {
"data": {
"tables": [
{
"id": "tbltp8DGLhqbUmjK1",
"name": "Apartments",
"primaryFieldId": "fld1VnoyuotSTyxW1",
"fields": [
{
"id": "fld1VnoyuotSTyxW1",
"name": "Name",
"type": "singleLineText"
}
],
"views": [
{
"id": "viwQpsuEDqHFqegkp",
"name": "Grid view",
"type": "grid"
}
]
}
]
},
"headers": {}
}
}
Refresh Webhook
Extend the life of a webhook | key: refreshWebhook
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Webhook ID | The ID of the webhook to be deleted. | ach00000000000001 |
{
"data": {
"expirationTime": "2023-01-30T00:00:00.000Z"
}
}
Update Record
Update a record's content inside a given table | key: updateRecord
| Input | Notes | Example |
|---|---|---|
| Connection | The Airtable connection to use. | |
| Base ID | The ID of the base to interact with. Required if you use an OAuth connection, and optional if you specify base ID with a legacy API Key connection. | appLkNDICXNqxSDhG |
| Dynamic Fields | A field for dynamic inputs that can be configured at deploy time with the use of a key value config variable. Please note that if this input is used, then the default 'Record Fields' inputwill be ignored. | |
| Record ID | Within Airtable, each record has a unique identifier known as a Record ID. If you are familiar with Entity-Relationship Diagrams or ERDs, then the record id would be the primary key. | rec6r4kNmGDk5D52F |
| Record Fields | A record is the base equivalent of a row in a spreadsheet. | |
| Table Name | Provide the name of the table you would like to access. | Marketing Campaigns |
{
"data": {
"id": "recZ6qSLw0OCA6Xul",
"createdTime": "2022-06-01T17:50:40.000Z",
"fields": {
"Notes": "We finished this and we're ready to move on to our backlog",
"Status": "Complete",
"Start date": "2022-05-31",
"Projects": "Updated sales process",
"Priority": "High",
"Assigned to": "Jane Doe",
"Count": 42
}
}
}
Changelog
2025-12-17
- Base Change Notifications trigger with automatic webhook creation, cursor-based payload retrieval, and scheduled auto-refresh to prevent webhook expiration
- Webhook trigger for receiving manually configured Airtable webhooks