Appearance
Airtable integration
Airtable combines the simplicity of a spreadsheet with the power of a database. This integration lets your WeWeb backend list, read, create, update, and delete records in Airtable, as well as upload attachments.
Use cases
- Use Airtable as a data source for tables — Add a table in Data & API linked to an Airtable base and table; configure views (fields, filters, sort, pagination) and bind them to Data Grids or fetch them with Fetch table view.
- Sync records from Airtable to power frontend lists and detail pages
- Create and update records from forms and workflows
- Bulk upsert records from external sources
- Upload attachments to existing Airtable records
Setup
- Create a Personal Access Token in Airtable with access to the target bases and the
data.records:read,data.records:write, andschema.bases:readscopes as needed. - In WeWeb, add your Airtable token to the
EditorandProductionmodes. - Use the built-in pickers to select a Base and Table; run "List records" to validate access.
- If the test fails, verify base/table permissions, required scopes, and that the base and table IDs are correct.
Using Airtable as a data source for tables
Besides calling Airtable actions from workflows, you can use Airtable as a data source for tables in WeWeb. A table linked to Airtable loads records from a base and table you choose, and you configure a view (fields, filters, sort, pagination). That view can be bound to table components (e.g. Data Grid) or fetched from the interface with the Fetch table view action.
Add an Airtable table
- In WeWeb, open Data & API and go to the area where you manage Tables (or Add table).
- Add a new table and choose Airtable as the source.
- Select your Airtable connection.
- Use the pickers to select Base and Table. WeWeb loads your bases and tables from the Airtable API; columns for the WeWeb table are derived from the Airtable table’s fields (names and types).
- Save. The table is now available in your project.
Configure a view
Views define which slice of data the table exposes (which fields, filters, sort, and pagination). On the Airtable table you added:
- Create or edit a view for that table.
- Configure:
- Fields to return — Select which Airtable fields to include (or leave empty for all). Uses Airtable field IDs (
fld...); the picker shows field names. - View — Optional. An Airtable view ID (
viw...) to use for record order/filtering in Airtable. Leave empty for the default. - Filter by Formula — Optional. An Airtable formula (e.g.
{Status} = "Active"). Use{FieldName}for field references. - Sort — Optional. One or more sort rules: Airtable field ID and direction (
ascordesc). - Page size — Records per page (1–100). Used for pagination.
- Offset — Optional. Pagination cursor from the previous response (the
recordID Airtable returns asoffset).
- Fields to return — Select which Airtable fields to include (or leave empty for all). Uses Airtable field IDs (
When the view is loaded (e.g. by a table component or by Fetch table view), the backend calls the Airtable List records API with these options and returns the records. Each row in the WeWeb table is the record’s fields object (field names or IDs, depending on your Airtable settings).
Use the table in the interface
- Bind to a component — In the binding menu, under Table Views, select the view you configured. Bind it to a Data Grid, repeating group, or list so the component displays the Airtable records. Data loads when the view is fetched (e.g. on page load or when you call Fetch table view).
- Fetch table view — In an interface workflow, add the Fetch table view action, choose your Airtable table view, and optionally pass parameters (if the view supports them). Use the result to update a variable or refresh the bound data.
- Pagination — The view returns an
offsetin its metadata when more records exist. Use that offset in a subsequent request to load the next page (e.g. by passing it as a parameter or storing it in a variable and refetching).
Auto-generated workflows for the table
When you add an Airtable table, WeWeb can create backend workflows for that table so you can get, create, update, and delete records via APIs:
- Get Record — GET with a Record ID parameter; returns one Airtable record.
- Create Record — POST with a body containing the new record’s fields.
- Update Record — PUT with Record ID and body with fields to update.
- Delete Record — DELETE with a Record ID parameter.
These workflows call the same Airtable actions (Get record, Create records, Update records, Delete records) with the table’s base and table IDs. Use them from the interface (e.g. form submit → call Create Record API) or from other backend workflows. Security and access are controlled by the API’s access rules and your Airtable token.
For the general pattern of tables, views, and fetching data, see Working with data and Fetch table view.
Common pitfalls (setup & usage)
Missing scopes or base access
If the token lacks required scopes or access to the base, requests will fail (often 403). Ensure the token includes needed scopes and the base is shared with the token.
Field ID vs field name mismatch
When returning fields by ID, your responses will contain field IDs, not names. Disable “Return fields by field ID” if you prefer names.
Formula and sorting issues
filterByFormula must follow Airtable’s formula syntax. For sorting, use valid field IDs and a supported direction (asc, desc).
All Actions
This integration provides six actions mapped to Airtable’s REST API.
| Action | Description |
|---|---|
| List records | Retrieve records from a table with optional fields, filters, sorting, and pagination |
| Get record | Retrieve a single record by ID |
| Create records | Create one or multiple records |
| Update records | Update a single record or multiple records (with optional upsert) |
| Delete records | Delete a single record or multiple records by IDs |
| Upload attachment | Upload a file to an attachment field on an existing record |
Action details
List records
Retrieve records from a table with optional fields, filters, sorting, and pagination.
Inputs
| Display Key | Example Input | Description | Restrictions |
|---|---|---|---|
Base | "appXXXXXXXXXXXXXX" | Airtable Base ID | Required |
Table | "tblXXXXXXXXXXXXXX" | Airtable Table ID | Required |
Fields to returnOptional | ["fldABC123","fldDEF456"] | Only return these fields | Array of field IDs |
ViewOptional | "viwXXXXXXXXXXXXXX" | View to source records | Valid view ID |
Filter by FormulaOptional | {Status} = "Active" | Airtable formula filter | Valid Airtable formula |
SortOptional | [{"field":"fldABC","direction":"asc"}] | Sort criteria | direction: asc, desc |
Page sizeOptional | 100 | Records per page | 1–100 |
OffsetOptional | "recXXXXXXXX" | Pagination cursor from previous page | String |
Return fields by field IDOptional | true | Return field keys as IDs | Boolean |
Cell formatOptional | "json" | Value format | Valid: json, string |
Time zoneOptional | "America/New_York" | Time zone for dates | IANA tz |
User localeOptional | "en-US" | Locale for formatting | BCP47 |
Example output
json
{
"records": [
{ "id": "recXXXXX", "fields": { "Name": "Acme" } }
],
"offset": "recYYYYY"
}Documentation of API endpoint that powers action: Airtable API – List records (GET /v0/{baseId}/{tableId})
Get record
Retrieve a single record by ID.
Inputs
| Display Key | Example Input | Description | Restrictions |
|---|---|---|---|
Base | "appXXXXXXXXXXXXXX" | Airtable Base ID | Required |
Table | "tblXXXXXXXXXXXXXX" | Airtable Table ID | Required |
Record ID | "recXXXXXXXXXXXXXX" | Record ID | Required |
Fields to returnOptional | ["fldABC123","fldDEF456"] | Only return these fields | Array of field IDs |
Return fields by field IDOptional | true | Return field keys as IDs | Boolean |
Cell formatOptional | "json" | Value format | Valid: json, string |
Time zoneOptional | "America/New_York" | Time zone for dates | IANA tz |
User localeOptional | "en-US" | Locale for formatting | BCP47 |
Example output
json
{ "id": "recXXXXXXXXXXXXXX", "fields": { "Name": "Acme" } }Documentation of API endpoint that powers action: Airtable API – Retrieve a record (GET /v0/{baseId}/{tableId}/{recordId})
Create records
Create one or multiple records.
Inputs
| Display Key | Example Input | Description | Restrictions |
|---|---|---|---|
Base | "appXXXXXXXXXXXXXX" | Airtable Base ID | Required |
Table | "tblXXXXXXXXXXXXXX" | Airtable Table ID | Required |
Mode | "single" | Create a single record or multiple | Valid: single, multiple |
Record / Records | See below | Fields for the new record(s) | Object or array of objects |
Return fields by field IDOptional | true | Return field keys as IDs | Boolean |
TypecastOptional | true | Coerce values to field types | Boolean |
Example output
json
{
"records": [
{ "id": "recXXXX", "fields": { "Name": "Acme" } }
]
}Documentation of API endpoint that powers action: Airtable API – Create records (POST /v0/{baseId}/{tableId})
Update records
Update a single record or multiple records.
Inputs
| Display Key | Example Input | Description | Restrictions |
|---|---|---|---|
Base | "appXXXXXXXXXXXXXX" | Airtable Base ID | Required |
Table | "tblXXXXXXXXXXXXXX" | Airtable Table ID | Required |
Mode | "single" | Update a single record or multiple | Valid: single, multiple |
Select fields to includeOptional | ["fldABC123","fldDEF456"] | Fields to show and update | Array of field IDs |
Record IDOptional | "recXXXX" | Required in single mode | String |
Record / Records | See below | Fields to update | Object or array with {id, fields} |
TypecastOptional | true | Coerce values to field types | Boolean |
Perform upsertOptional | true | Upsert on multiple mode | Boolean |
Example output
json
{
"records": [
{ "id": "recXXXX", "fields": { "Status": "Active" } }
]
}Documentation of API endpoint that powers action: Airtable API – Update records (PATCH /v0/{baseId}/{tableId})
Delete records
Delete a single record by ID or multiple records by IDs.
Inputs
| Display Key | Example Input | Description | Restrictions |
|---|---|---|---|
Base | "appXXXXXXXXXXXXXX" | Airtable Base ID | Required |
Table | "tblXXXXXXXXXXXXXX" | Airtable Table ID | Required |
Mode | "single" | Delete single or multiple | Valid: single, multiple |
Record IDOptional | "recXXXX" | Required in single mode | String |
Record IDsOptional | ["rec1","rec2"] | Required in multiple mode | Array of strings |
Example output
json
{
"records": [
{ "id": "rec1", "deleted": true },
{ "id": "rec2", "deleted": true }
]
}Documentation of API endpoint that powers action: Airtable API – Delete records (DELETE /v0/{baseId}/{tableId})
Upload attachment
Upload a file to an attachment field on an existing record.
Inputs
| Display Key | Example Input | Description | Restrictions |
|---|---|---|---|
Base | "appXXXXXXXXXXXXXX" | Airtable Base ID | Required |
Table | "tblXXXXXXXXXXXXXX" | Airtable Table ID | Required |
Record ID | "recXXXXXXXXXXXXXX" | Record to attach to | Required |
Attachment Field | "fldXXXXXXXXXXXXXX" | Target attachment field | Required |
File | "data:image/png;base64,..." | Base64-encoded file content | Required |
Filename | "invoice.pdf" | Client filename | Required |
Content Type | "application/pdf" | MIME type | Required |
Example output
json
{
"attachment": {
"id": "attXXXX",
"url": "https://v5.airtableusercontent.com/..."
}
}Documentation of API endpoint that powers action: Airtable API – Upload attachment (POST content.airtable.com/v0/{baseId}/{recordId}/{fieldId}/uploadAttachment)
Error handling
| Error code and type | Reason |
|---|---|
| 401 Unauthorized | Invalid or missing token. |
| 403 Forbidden | Token lacks required scopes or base/table access. |
| 404 Not Found | Base, table, record, or route not found. |
| 413 Payload Too Large | Request body too large (e.g., large attachments). |
| 422 Unprocessable Entity | Invalid field values or schema mismatch. |
| 429 Too Many Requests | Rate limited; retry with backoff. |
| 500 Internal Server Error | Provider-side error; retry with backoff. |
FAQs
How do I get Base, Table, Field, and View IDs?
Use the built-in pickers in WeWeb, which fetch bases, tables, fields, and views. IDs are also visible in Airtable’s API/metadata responses.
What does “Return fields by field ID” do?
When enabled, keys in fields are IDs (e.g., fld*) instead of user-facing names. Disable if you want field names.
How should I format filterByFormula?
Use Airtable formula syntax (e.g., {Status} = "Active"). See Airtable’s formula reference.

