# Edit an Engage feed

> Change a saved feed. Send the whole feed (name, type, query...); placement can't change. Call it only when the user asked for this in the conversation; never on your own initiative.

`engage.update_feed` · write

- **MCP tool:** `engage_update_feed`. Catalog: reach it with `find_actions` and `run_write_action`, or turn on the full toolset.
- **REST:** `POST /v1/engage/update-feed`
- **CLI:** `xholic engage update-feed`
- **Scope:** `write`
- **Plan:** Every plan, including the trial
- **Cost:** Free.
- **Rate limit bucket:** `write`

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string (uuid) | Yes | Feed id from engage.list_feeds. |
| `name` | string ≤ 80 chars | Yes |  |
| `type` | "TOPIC" \\| "FOLLOWING" \\| "CONTACT_LIST" \\| "X_LIST" \\| "USER" | Yes | TOPIC (query holds 1-5 keywords), CONTACT_LIST (contactListId), X_LIST (xListId), USER (query holds a handle; TIMELINE placement only). |
| `placement` | "FEEDS" \\| "TIMELINE" | No | FEEDS (default) or TIMELINE. It can't change later. |
| `query` | string ≤ 500 chars or null | No |  |
| `contactListId` | string (uuid) or null | No |  |
| `xListId` | string or null | No |  |
| `excludedHandles` | array of string ≤ 16 chars (max 50) | No |  |
| `excludedTerms` | array of string ≤ 80 chars (max 50) | No |  |
| `account` | string ≤ 64 chars | No | X account to act on, as @handle. Leave it out to use the connection's default account. |
| `dryRun` | boolean | No | Return exactly what would happen without doing it. |
| `idempotencyKey` | string ≤ 200 chars | No | A unique key for this write. Repeating a call with the same key returns the first result instead of acting twice. |
