# DELETE /v1/projects/:projectId/ads/:platform/campaigns/:campaignId (/docs/api/reference/ads/delete-campaign)



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

Marks the campaign deleted on the platform (Meta `DELETED`, TikTok `DELETE`, Apple `REMOVED`). Most platforms preserve historical metrics for the deleted campaign indefinitely; Layers' `GET …/campaigns?status=deleted` continues to return it.

Same shape applies to adsets and ads:

* `DELETE …/adsets/:adsetId`
* `DELETE …/ads/:adId`

## Authority [#authority]

Delete is gated by the &#x2A;*`structural`** axis. With `structural: "off"` (the default for `manual` campaigns), every delete is denied.

## Request [#request]

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

## Response [#response]

`202 { jobId, verdictId }`. The platform-side dispatch happens via the gate.

## Errors [#errors]

| Code               | When                             |
| ------------------ | -------------------------------- |
| `AUTHORITY_DENIED` | `structural` axis is `off`.      |
| `FORBIDDEN_SCOPE`  | Key lacks `ads:write:lifecycle`. |

## See also [#see-also]

* [Ads write model](/docs/api/concepts/ads-write-model)
* [Pause / resume](/docs/api/reference/ads/pause-campaign)
