# Create a DM campaign

> Create a draft DM campaign for a contact list. Then write its steps with dm.update_campaign, check it with dm.review_campaign and launch it with launch_dm_campaign. Write the messages and any per-person first lines with your own model: import the lines as a CSV column (dm.import_csv, e.g. first_line) and use [first_line]. The [ai_line] variable makes Xholic's AI write a line per recipient at launch and spends AI credits; use it only when the user asks for Xholic to write them. Call it only when the user asked for this in the conversation; never on your own initiative.

`dm.create_campaign` · write

- **MCP tool:** `create_dm_campaign`. Loaded by default in MCP clients.
- **REST:** `POST /v1/dm/create-campaign`
- **CLI:** `xholic dm create-campaign`
- **Scope:** `write`
- **Plan:** Pro plan or higher
- **Cost:** Free.
- **Rate limit bucket:** `write`

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string ≤ 80 chars | No |  |
| `contactListId` | string (uuid) or null | No | Contact list to message. |
| `deliveryMode` | "AUTOMATIC" \\| "ASSISTED" | No | AUTOMATIC sends from the X account; ASSISTED queues them for the user to send by hand. |
| `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. |
