# Preview campaign messages

> Render a campaign step's message for a few recipients exactly as it will be sent. With generateAiLine true, Xholic's AI writes the missing [ai_line] first lines and charges per line: quote first, show it to the user, and pass confirmCredits after they agree. Without it, previews are free.

`dm.preview_campaign` · write

- **MCP tool:** `dm_preview_campaign`. Catalog: reach it with `find_actions` and `run_write_action`, or turn on the full toolset.
- **REST:** `POST /v1/dm/preview-campaign`
- **CLI:** `xholic dm preview-campaign`
- **Scope:** `write`
- **Plan:** Pro plan or higher
- **Cost:** Xholic AI: up to about 10 credits (Xholic AI first lines ([ai_line]) for up to 5 previewed recipients). Returns a quote first; pass `confirmCredits` after the user agrees.
- **Rate limit bucket:** `write`

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string (uuid) | Yes | DM campaign id. |
| `offset` | integer 0–9007199254740991 | No |  |
| `limit` | integer 1–5 | No |  |
| `stepPosition` | integer 1–3 | No |  |
| `variantLabel` | "A" \\| "B" \\| "C" or null | No |  |
| `generateAiLine` | boolean | No | Write missing [ai_line] first lines with Xholic's AI (spends credits). |
| `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. |
| `confirmCredits` | number 0–100000 | No | Xholic AI credits the user agreed to spend. Call first without it to get the quote, show the quote to the user, and pass the amount only after they say yes. |
| `quoteId` | string ≤ 100 chars | No | The quoteId from the quote the user agreed to. Send it with confirmCredits. |
