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

# Airtable

> Flexible database-spreadsheet hybrid API for reading, writing, and managing structured records across bases and tables.

Flexible database-spreadsheet hybrid API for reading, writing, and managing structured records across bases and tables. Best for workflows that need to persist, query, or sync structured data without running a dedicated database. Unlike Google Sheets, Airtable exposes typed fields, linked records, and webhooks as first-class primitives.

11 example endpoints available through Lava's AI Gateway. See the [Airtable API docs](https://airtable.com/developers/web/api/introduction) for full documentation.

<Warning>This provider requires your own credentials — connect your API key or OAuth account before use.</Warning>

<Info>This is a **catch-all provider** — any valid URL under `https://api.airtable.com` is supported. Any Airtable Web API endpoint. Data plane: [https://api.airtable.com/v0/\&#123;baseId\&#125;/\&#123;tableIdOrName\&#125](https://api.airtable.com/v0/\&#123;baseId\&#125;/\&#123;tableIdOrName\&#125);. Meta API: [https://api.airtable.com/v0/meta/bases](https://api.airtable.com/v0/meta/bases). Webhooks: [https://api.airtable.com/v0/bases/\&#123;baseId\&#125;/webhooks](https://api.airtable.com/v0/bases/\&#123;baseId\&#125;/webhooks). See [https://airtable.com/developers/web/api/introduction](https://airtable.com/developers/web/api/introduction) for full reference. The endpoints below are curated examples.</Info>

## Endpoints

### List records in a table. Supports filterByFormula, sort, view, and pagination.

**GET** `https://api.airtable.com/v0/{base_id}/{table_id_or_name}?maxRecords=100` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/{base_id}/{table_id_or_name}?maxRecords=100', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2F%7Bbase_id%7D%2F%7Btable_id_or_name%7D%3FmaxRecords%3D100" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Retrieve a single record by ID.

**GET** `https://api.airtable.com/v0/{base_id}/{table_id_or_name}/{record_id}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/{base_id}/{table_id_or_name}/{record_id}', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2F%7Bbase_id%7D%2F%7Btable_id_or_name%7D%2F%7Brecord_id%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Create one or more records in a table (up to 10 per call).

**POST** `https://api.airtable.com/v0/{base_id}/{table_id_or_name}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/{base_id}/{table_id_or_name}', {
      body: {
    "records": [
      {
        "fields": {
          "Name": "Example",
          "Status": "Active"
        }
      }
    ]
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2F%7Bbase_id%7D%2F%7Btable_id_or_name%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"records":[{"fields":{"Name":"Example","Status":"Active"}}]}'
    ```
  </Tab>
</Tabs>

### Update one or more records, preserving fields not included in the request.

**PATCH** `https://api.airtable.com/v0/{base_id}/{table_id_or_name}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/{base_id}/{table_id_or_name}', { method: 'PATCH', body: {"records":[{"id":"rec123","fields":{"Status":"Done"}}]} });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X PATCH "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2F%7Bbase_id%7D%2F%7Btable_id_or_name%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"records":[{"id":"rec123","fields":{"Status":"Done"}}]}'
    ```
  </Tab>
</Tabs>

### Upsert records. Use performUpsert with fieldsToMergeOn to match on existing values.

**PUT** `https://api.airtable.com/v0/{base_id}/{table_id_or_name}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/{base_id}/{table_id_or_name}', {
      method: 'PUT',
      body: {
    "performUpsert": {
      "fieldsToMergeOn": [
        "Email"
      ]
    },
    "records": [
      {
        "fields": {
          "Email": "a@b.com",
          "Name": "Ada"
        }
      }
    ]
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X PUT "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2F%7Bbase_id%7D%2F%7Btable_id_or_name%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"performUpsert":{"fieldsToMergeOn":["Email"]},"records":[{"fields":{"Email":"a@b.com","Name":"Ada"}}]}'
    ```
  </Tab>
</Tabs>

### Delete one or more records by ID (pass records\[] query param).

**DELETE** `https://api.airtable.com/v0/{base_id}/{table_id_or_name}?records[]={record_id}` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/{base_id}/{table_id_or_name}?records[]={record_id}', { method: 'DELETE' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X DELETE "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2F%7Bbase_id%7D%2F%7Btable_id_or_name%7D%3Frecords%5B%5D%3D%7Brecord_id%7D" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json"
    ```
  </Tab>
</Tabs>

### List all bases the authorized user has access to.

**GET** `https://api.airtable.com/v0/meta/bases` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/meta/bases', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2Fmeta%2Fbases" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Get the schema (tables, fields, views) for a base.

**GET** `https://api.airtable.com/v0/meta/bases/{base_id}/tables` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/meta/bases/{base_id}/tables', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2Fmeta%2Fbases%2F%7Bbase_id%7D%2Ftables" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### List webhooks registered on a base.

**GET** `https://api.airtable.com/v0/bases/{base_id}/webhooks` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/bases/{base_id}/webhooks', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2Fbases%2F%7Bbase_id%7D%2Fwebhooks" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

### Register a new webhook for changes in a base.

**POST** `https://api.airtable.com/v0/bases/{base_id}/webhooks` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/bases/{base_id}/webhooks', {
      body: {
    "notificationUrl": "https://example.com/airtable-webhook",
    "specification": {
      "options": {
        "filters": {
          "dataTypes": [
            "tableData"
          ]
        }
      }
    }
    },
    });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl -X POST "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2Fbases%2F%7Bbase_id%7D%2Fwebhooks" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{"notificationUrl":"https://example.com/airtable-webhook","specification":{"options":{"filters":{"dataTypes":["tableData"]}}}}'
    ```
  </Tab>
</Tabs>

### Return information about the currently authorized user.

**GET** `https://api.airtable.com/v0/meta/whoami` — Free

<Tabs>
  <Tab title="SDK">
    ```typescript theme={null}
    const data = await lava.gateway('https://api.airtable.com/v0/meta/whoami', { method: 'GET' });
    ```
  </Tab>

  <Tab title="cURL">
    ```bash theme={null}
    curl "https://api.lava.so/v1/forward?u=https%3A%2F%2Fapi.airtable.com%2Fv0%2Fmeta%2Fwhoami" \
      -H "Authorization: Bearer $LAVA_SECRET_KEY"
    ```
  </Tab>
</Tabs>

## Next Steps

<CardGroup cols={2}>
  <Card title="All Providers" icon="grid" href="/gateway/supported-providers">
    Browse all supported AI providers
  </Card>

  <Card title="Forward Proxy" icon="route" href="/gateway/forward-proxy">
    Learn how to construct proxy URLs and authenticate requests
  </Card>
</CardGroup>
