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

# Campaigns

> Endpoints under /v1/campaigns

All endpoints require `Authorization: Bearer ck_...`.

## List campaigns

`GET /v1/campaigns`

**Scope:** `campaigns:list`

### Query parameters

| Parameter | Type    | Default | Description                                                                                                                                 |
| --------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `page`    | integer | `1`     | Page number (min 1)                                                                                                                         |
| `limit`   | integer | `10`    | One of `1`, `5`, `10`, `25`, `50`, `100`                                                                                                    |
| `active`  | boolean | —       | Filter by active status                                                                                                                     |
| `name`    | string  | —       | Max 255 chars                                                                                                                               |
| `network` | string  | —       | `facebook`, `google`, `tiktok`, `kwai`, `taboola`, `pinterest`, `yandex`, `mgid`, `outbrain`, `sms`, `revcontent`, `adskeeper`, `newsbreak` |

### Response `200`

```json theme={null}
{
  "count": 0,
  "data": []
}
```

Each item in `data` is a [CampaignShort](/reference/schemas#campaignshort). The `in_review` field mirrors `filters.deny_always`.

### Example

```bash theme={null}
curl -H "Authorization: Bearer ck_YOUR_KEY" \
  "https://api.cloakup.me/v1/campaigns?page=1&limit=10"
```

***

## Create campaign

`POST /v1/campaigns`

**Scope:** `campaigns:create`

### Request body

[CampaignBody](/reference/schemas#campaignbody). See [Campaign create](/guides/campaign-create) for defaults and minimal example.

### Response `201`

[CampaignFull](/reference/schemas#campaignfull)

***

## Get campaign

`GET /v1/campaigns/:id`

**Scope:** `campaigns:show`

### Path parameters

| Name | Type    | Description |
| ---- | ------- | ----------- |
| `id` | integer | Campaign ID |

### Response `200`

[CampaignFull](/reference/schemas#campaignfull) — includes `is_test_mode` (true if caller IP is in `filters.whitelist`).

***

## Update campaign

`PUT /v1/campaigns/:id`

**Scope:** `campaigns:update`

Full replace — same schema as create. **Not** a partial PATCH.

### Request body

[CampaignBody](/reference/schemas#campaignbody)

### Response `200`

[CampaignFull](/reference/schemas#campaignfull)

***

## Delete campaign

`DELETE /v1/campaigns/:id`

**Scope:** `campaigns:delete`

Soft-deletes the campaign.

### Response `204`

HTTP status is `204`. The handler may attach a JSON body `{ "message": "..." }` (Express quirk). Treat success as status `204`.

***

## Clone campaign

`POST /v1/campaigns/:id/clone`

**Scope:** `campaigns:clone`

No request body.

### Response `200`

[CampaignFull](/reference/schemas#campaignfull)

***

## Toggle status

`PUT /v1/campaigns/:id/toggle-status`

**Scope:** `campaigns:toggle`

Toggles the campaign `active` flag. No request body.

### Response `200`

Empty body. Re-fetch with GET show if you need the updated `active` value.
