# POST /v1/projects/:projectId/ads/:platform/campaigns/:campaignId/{pause,resume} (/docs/api/reference/ads/pause-campaign)



<Endpoint method="POST" path="/v1/projects/:projectId/ads/{platform}/campaigns/:campaignId/pause" scope="ads:write:lifecycle" phase="1" />

<Endpoint method="POST" path="/v1/projects/:projectId/ads/{platform}/campaigns/:campaignId/resume" scope="ads:write:lifecycle" phase="1" />

Verb-style lifecycle endpoints. Layers translates per-platform (Meta `ACTIVE/PAUSED`, TikTok `ENABLE/DISABLE`, Apple `ENABLED/PAUSED`) so partners don't reason about platform status enums.

Same shape applies to adsets and ads:

* `POST …/adsets/:adsetId/{pause,resume}`
* `POST …/ads/:adId/{pause,resume}`

## Request [#request]

```bash
curl -X POST https://api.layers.com/v1/projects/$PROJECT_ID/ads/meta/campaigns/$CAMPAIGN_ID/pause \
  -H "Authorization: Bearer $LAYERS_API_KEY"
```

## Response [#response]

`200` with `{entityId, platform, partnerStatus, platformStatus, verdictId, occurredAt}`. `platformStatus` is the platform-native value Layers translated to (`PAUSED` on Meta, `DISABLE` on TikTok, etc.). The platform write is dispatched asynchronously — settlement surfaces through the `ads.write.executed` / `ads.write.denied` webhooks.

## Errors [#errors]

| Code               | When                                                                                  |
| ------------------ | ------------------------------------------------------------------------------------- |
| `AUTHORITY_DENIED` | `structural` axis (for delete) or `tactical` axis (for pause/resume) is `off`.        |
| `NOT_FOUND`        | Campaign / adset / ad not in this org or platform.                                    |
| `INTERNAL`         | Dispatch failed — **nothing was changed**, on the platform or locally. Safe to retry. |

## See also [#see-also]

* [Ads write model — pause/resume verb abstraction (D33)](/docs/api/concepts/ads-write-model)
* [`DELETE …/campaigns/:id`](/docs/api/reference/ads/delete-campaign)
