# Swap tables (/ai/reference/channels/feed-lookups)

Toolset `feed_lookups`, 6 tools.

## Records [#records]

### `feed_lookup` [#feed_lookup]

A table that swaps a store value for the value a site wants (e.g. category names, colour names), used by feed rules. List shows each table with its source, row count, last refresh, last error and the rules that read it; get adds its rows and updated_at for a change.

- Permission: `feeds.read`
- Tools: `feed_lookup_list`, `feed_lookup_get`

## Actions [#actions]

### `feed_lookup_create` [#feed_lookup_create]

Create a swap table from rows the merchant gave or a shared Google Sheet link.

Checked as the table editor checks it (up to 20000 rows). Needs swap tables in the plan.

- Action key: `feed_lookup.create`
- Permission: `feeds.write`
- Approval: Always waits for a person to approve it.
- Effect: Changes the live store.
- Retries: runs at most once; a repeat with the same idempotency key returns the first result.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes | 1 to 120 characters |
| `content` | object, one shape of: | yes | Where the rows come from: typed in, a CSV text, or a shared Google Sheet link |
| `content[source=inline].source` | string | yes | always "inline" |
| `content[source=inline].rows` | list of object | yes | at most 20000 items |
| `content[source=inline].rows[].key` | string | yes | The store value. at most 500 characters |
| `content[source=inline].rows[].value` | string | yes | The site's value. at most 2000 characters |
| `content[source=csv].source` | string | yes | always "csv" |
| `content[source=csv].csv` | string | yes | at most 2097152 characters |
| `content[source=sheet].source` | string | yes | always "sheet" |
| `content[source=sheet].url` | string | yes | A shared Google Sheet link the merchant gave. 1 to 2000 characters |

Example inputs:

```json
{
  "name": "Colours",
  "content": {
    "source": "inline",
    "rows": [
      {
        "key": "Piros",
        "value": "Red"
      }
    ]
  }
}
```

```json
{
  "name": "Sizes",
  "content": {
    "source": "sheet",
    "url": "https://docs.google.com/spreadsheets/d/abc/edit"
  }
}
```

### `feed_lookup_delete` [#feed_lookup_delete]

Delete a swap table; refused while a rule still reads it.

- Action key: `feed_lookup.delete`
- Permission: `feeds.write`
- Approval: Always waits for a person to approve it.
- Effect: Changes the live store.
- Destructive: in compact mode it runs with `run_destructive_action`.
- Retries: safe to repeat with the same input.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `lookup_id` | string | yes | Swap table ID. 1 to 64 characters |

Example input:

```json
{
  "lookup_id": "019bb2a5-91bc-7241-8a8d-06e8c0daaa94"
}
```

### `feed_lookup_refresh` [#feed_lookup_refresh]

Read a sheet-backed swap table from its Google Sheet again.

- Action key: `feed_lookup.refresh`
- Permission: `feeds.write`
- Approval: Runs without approval.
- Effect: Changes the live store.
- Retries: safe to repeat with the same input.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `lookup_id` | string | yes | Swap table ID. 1 to 64 characters |

Example input:

```json
{
  "lookup_id": "019bb2a5-91bc-7241-8a8d-06e8c0daaa94"
}
```

### `feed_lookup_update` [#feed_lookup_update]

Rename a swap table, replace its rows, or both.

Send the updated_at read with feed_lookup_get as expected_updated_at: a table changed meanwhile refuses the change. A rename is written into every rule that reads the table. Needs swap tables in the plan.

- Action key: `feed_lookup.update`
- Permission: `feeds.write`
- Approval: Always waits for a person to approve it.
- Effect: Changes the live store.
- Retries: safe to repeat with the same input.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `lookup_id` | string | yes | Swap table ID. 1 to 64 characters |
| `expected_updated_at` | string | yes | updated_at as read. format date-time |
| `name` | string |  | 1 to 120 characters |
| `content` | object, one shape of: |  | Where the rows come from: typed in, a CSV text, or a shared Google Sheet link |
| `content[source=inline].source` | string | yes | always "inline" |
| `content[source=inline].rows` | list of object | yes | at most 20000 items |
| `content[source=inline].rows[].key` | string | yes | The store value. at most 500 characters |
| `content[source=inline].rows[].value` | string | yes | The site's value. at most 2000 characters |
| `content[source=csv].source` | string | yes | always "csv" |
| `content[source=csv].csv` | string | yes | at most 2097152 characters |
| `content[source=sheet].source` | string | yes | always "sheet" |
| `content[source=sheet].url` | string | yes | A shared Google Sheet link the merchant gave. 1 to 2000 characters |
| `language` | string |  | Language of the note on the rules a rename rewrites; en by default. one of "en", "hu" |

Example input:

```json
{
  "lookup_id": "019bb2a5-91bc-7241-8a8d-06e8c0daaa94",
  "expected_updated_at": "2026-10-01T10:00:00Z",
  "name": "Colour names"
}
```
