> ## Documentation Index
> Fetch the complete documentation index at: https://docs.modulex.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Airtable Integration for AI Agents & Workflows

> Cloud-based database platform for organizing, storing, and collaborating on structured data with spreadsheet-like interface and powerful automation capabilities.

{/* Self-hosted logo — build-time vendored from modulex.json / Iconify (see scripts/lib/logo.js). */}

<img src="https://mintcdn.com/modulexaillc/zKB2qsP6Q61VNLfB/logos/airtable.svg?fit=max&auto=format&n=zKB2qsP6Q61VNLfB&q=85&s=f3aba6c88223389e3ac9aeb90a1b4846" alt="Airtable logo" width="72" height="72" data-path="logos/airtable.svg" />

## Overview

Add **Airtable** to any ModuleX agent or workflow. CRUD against the Airtable REST API (`api.airtable.com/v0`): base + table discovery via `/meta/`, record list/get/create/update/delete via `/<base>/<table>`.

<Info>
  **Categories**: Project & Task Management · Project Management · Workflow · Automation · **Auth**: Personal Access Token · **Actions**: 7
</Info>

## Authentication

### Personal Access Token

Authenticate using your Airtable Personal Access Token. Create one at airtable.com/create/tokens

#### Required Credentials

| Field                          | Description                                                | Required | Format                                                                         |
| ------------------------------ | ---------------------------------------------------------- | -------- | ------------------------------------------------------------------------------ |
| Airtable Personal Access Token | Your Airtable Personal Access Token for API authentication | Yes      | `patXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX` |

## Available Actions

<AccordionGroup>
  <Accordion title="list_bases — List all Airtable bases accessible with your API token">
    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "bases": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "title": "Bases",
          "type": "array"
        },
        "count": {
          "default": 0,
          "title": "Count",
          "type": "integer"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListBasesOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="list_tables — List all tables in a specific Airtable base with their fields and views">
    ### Parameters

    <ResponseField name="base_id" type="string" required>
      The ID of the Airtable base (starts with 'app')
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "tables": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "title": "Tables",
          "type": "array"
        },
        "count": {
          "default": 0,
          "title": "Count",
          "type": "integer"
        },
        "base_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Base Id"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListTablesOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="list_records — List records from an Airtable table with optional filtering and sorting">
    ### Parameters

    <ResponseField name="base_id" type="string" required>
      The ID of the Airtable base
    </ResponseField>

    <ResponseField name="table_name" type="string" required>
      Name or ID of the table
    </ResponseField>

    <ResponseField name="max_records" type="integer">
      Maximum number of records to return (1-100) (Default: `100`)
    </ResponseField>

    <ResponseField name="filter_formula" type="string">
      Airtable formula to filter records
    </ResponseField>

    <ResponseField name="sort_field" type="string">
      Field name to sort by
    </ResponseField>

    <ResponseField name="sort_direction" type="string">
      Sort direction ('asc' or 'desc') (Default: `asc`)
    </ResponseField>

    <ResponseField name="view" type="string">
      Name or ID of a view to use for filtering/sorting
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "AirtableRecord": {
          "additionalProperties": false,
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "fields": {
              "additionalProperties": true,
              "title": "Fields",
              "type": "object"
            },
            "createdTime": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Createdtime"
            }
          },
          "title": "AirtableRecord",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "records": {
          "items": {
            "$ref": "#/$defs/AirtableRecord"
          },
          "title": "Records",
          "type": "array"
        },
        "count": {
          "default": 0,
          "title": "Count",
          "type": "integer"
        },
        "table": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Table"
        },
        "base_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Base Id"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListRecordsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_record — Get a specific record from an Airtable table by its ID">
    ### Parameters

    <ResponseField name="base_id" type="string" required>
      The ID of the Airtable base
    </ResponseField>

    <ResponseField name="table_name" type="string" required>
      Name or ID of the table
    </ResponseField>

    <ResponseField name="record_id" type="string" required>
      The ID of the record (starts with 'rec')
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "AirtableRecord": {
          "additionalProperties": false,
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "fields": {
              "additionalProperties": true,
              "title": "Fields",
              "type": "object"
            },
            "createdTime": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Createdtime"
            }
          },
          "title": "AirtableRecord",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "record": {
          "anyOf": [
            {
              "$ref": "#/$defs/AirtableRecord"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "GetRecordOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="create_records — Create one or more records in an Airtable table. Batched up to 10 per request.">
    ### Parameters

    <ResponseField name="base_id" type="string" required>
      The ID of the Airtable base
    </ResponseField>

    <ResponseField name="table_name" type="string" required>
      Name or ID of the table
    </ResponseField>

    <ResponseField name="records" type="array" required>
      List of \{field: value} record objects
    </ResponseField>

    <ResponseField name="typecast" type="boolean">
      If true, Airtable converts string values to the appropriate cell types (Default: `false`)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "AirtableRecord": {
          "additionalProperties": false,
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "fields": {
              "additionalProperties": true,
              "title": "Fields",
              "type": "object"
            },
            "createdTime": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Createdtime"
            }
          },
          "title": "AirtableRecord",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "records": {
          "items": {
            "$ref": "#/$defs/AirtableRecord"
          },
          "title": "Records",
          "type": "array"
        },
        "count": {
          "default": 0,
          "title": "Count",
          "type": "integer"
        },
        "table": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Table"
        },
        "base_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Base Id"
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateRecordsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="update_records — Update one or more records in an Airtable table. Each record must include `id`; remaining fields can be nested under `fields` or at the top level.">
    ### Parameters

    <ResponseField name="base_id" type="string" required>
      The ID of the Airtable base
    </ResponseField>

    <ResponseField name="table_name" type="string" required>
      Name or ID of the table
    </ResponseField>

    <ResponseField name="records" type="array" required>
      Records to update; each is \{'id': 'rec…', 'fields': \{…}} or \{'id': 'rec…', 'field\_a': value, …}
    </ResponseField>

    <ResponseField name="typecast" type="boolean">
      If true, Airtable converts string values to the appropriate cell types (Default: `false`)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "AirtableRecord": {
          "additionalProperties": false,
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "fields": {
              "additionalProperties": true,
              "title": "Fields",
              "type": "object"
            },
            "createdTime": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Createdtime"
            }
          },
          "title": "AirtableRecord",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "records": {
          "items": {
            "$ref": "#/$defs/AirtableRecord"
          },
          "title": "Records",
          "type": "array"
        },
        "count": {
          "default": 0,
          "title": "Count",
          "type": "integer"
        },
        "table": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Table"
        },
        "base_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Base Id"
        },
        "updated_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Updated Count"
        }
      },
      "required": [
        "success"
      ],
      "title": "UpdateRecordsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="delete_records — Delete one or more records from an Airtable table. Batched up to 10 per request.">
    ### Parameters

    <ResponseField name="base_id" type="string" required>
      The ID of the Airtable base
    </ResponseField>

    <ResponseField name="table_name" type="string" required>
      Name or ID of the table
    </ResponseField>

    <ResponseField name="record_ids" type="array" required>
      List of record IDs to delete (each starts with 'rec')
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "deleted_ids": {
          "items": {
            "type": "string"
          },
          "title": "Deleted Ids",
          "type": "array"
        },
        "count": {
          "default": 0,
          "title": "Count",
          "type": "integer"
        },
        "table": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Table"
        },
        "base_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Base Id"
        },
        "deleted_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Deleted Count"
        }
      },
      "required": [
        "success"
      ],
      "title": "DeleteRecordsOutput",
      "type": "object"
    }
    ```
  </Accordion>
</AccordionGroup>

## Limits & Quotas

* Airtable caps batch record operations at **10 records per request**;
  `create/update/delete_records` split larger inputs automatically.
* `update_records` accepts both shapes per record:
  `{"id": "rec…", "fields": {"X": 1}}` (canonical) and
  `{"id": "rec…", "X": 1, "Y": 2}` (flat top-level fields). Both
  normalize to the canonical wire shape internally.
* `delete_records` uses `?records[]=rec1&records[]=rec2` query
  parameters (Airtable's documented batch-delete contract).
* Partial-batch failures surface as `success=False` + the count of
  records that completed before the error (via `updated_count` /
  `deleted_count`).

## Related integrations

<CardGroup cols={3}>
  <Card title="AgentMail" href="/integrations/tools/agentmail" />

  <Card title="Apify" href="/integrations/tools/apify" />

  <Card title="Browserbase" href="/integrations/tools/browserbase" />
</CardGroup>

## Links

* [Airtable](https://airtable.com)
