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

# Update campaign

> Update a campaign's settings. Only allowed in draft, scheduled, or paused status — pause first, update, then resume.

A running campaign cannot be updated directly. Pause it first, update, then resume.

## Path parameters

<ParamField path="id" type="string" required>
  UUID of the campaign.
</ParamField>

## Request body

All fields are optional, but at least one must be provided.

<ParamField body="campaign_name" type="string" />

<ParamField body="max_retries" type="number" />

<ParamField body="retry_intervals" type="number[]" />

<ParamField body="scheduled_at" type="string | null">
  ISO 8601 UTC timestamp, or `null` to clear. If the campaign is currently `draft` and you set a future time, status moves to `scheduled`.
</ParamField>

<ParamField body="business_hours" type="object | null">
  Replace the campaign's business-hours config. Send `null` to clear (24/7 dispatch). See [Create campaign](/api-reference/campaigns/create#param-business-hours) for the shape.
</ParamField>

## Request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X PATCH "https://api.verbeo.ai/v1/campaigns/0175091d-2c3b-4aef-8c45-dbbe24f7b3ff" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "max_retries": 3,
      "retry_intervals": [5, 30, 120]
    }'
  ```

  ```javascript Node.js theme={null}
  await fetch(`https://api.verbeo.ai/v1/campaigns/${campaignId}`, {
    method: "PATCH",
    headers: {
      Authorization: `Bearer ${process.env.VERBEO_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ max_retries: 3, retry_intervals: [5, 30, 120] }),
  });
  ```

  ```python Python theme={null}
  requests.patch(
      f"https://api.verbeo.ai/v1/campaigns/{campaign_id}",
      headers={"Authorization": f"Bearer {os.environ['VERBEO_API_KEY']}"},
      json={"max_retries": 3, "retry_intervals": [5, 30, 120]},
  )
  ```
</CodeGroup>

## Response

`200 OK`. Returns the updated campaign.

```json theme={null}
{
  "success": true,
  "data": {
    "campaign_id": "0175091d-2c3b-4aef-8c45-dbbe24f7b3ff",
    "campaign_name": "Q2 Sales Outreach",
    "status": "paused",
    "max_retries": 3,
    "retry_intervals": [5, 30, 120],
    "scheduled_at": null,
    "business_hours": null,
    "updated_at": "2026-05-04T16:12:00.000Z"
  }
}
```

## Errors

| Code | Status | When it happens |
| - | - | - |
| `INVALID_STATUS` | 409 | Campaign is `running` / `dormant` / `completed` / `cancelled` — pause first. |
| `CAMPAIGN_NOT_FOUND` | 404 | The campaign doesn't exist in your workspace. |
| `VALIDATION_FAILED` | 422 | Request body failed schema validation (e.g. invalid `business_hours`, empty body). |
| `UPDATE_FAILED` | 500 | Database error during update. |

See [Errors](/api-reference/errors) for the envelope.

***


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.