# GET / PATCH /v1/projects/:projectId/ads/:platform/campaigns/:campaignId/authority (/docs/api/reference/ads/patch-campaign-authority)



<Endpoint method="GET" path="/v1/projects/:projectId/ads/{platform}/campaigns/:campaignId/authority" scope="ads:read" phase="1" />

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

Inspect or modify the per-campaign authority block. The block is the source of truth for whether subsequent writes against this campaign **dispatch** (`auto`), **queue** (`draft`), or are **denied** (`off`). Customer's layer-defaults block is the fallback when per-campaign authority isn't pinned.

A PATCH from a partner key flows through the gate identically to a customer-issued PATCH — partner cannot escalate past customer policy.

## Path parameters [#path-parameters]

<Parameters
  rows="[
  { name: 'projectId', type: 'string (uuid)', required: true },
  { name: 'platform', type: 'string', required: true, enum: ['meta', 'tiktok', 'apple'] },
  { name: 'campaignId', type: 'string', required: true, description: 'Layers campaign id (`cmp_…`).' },
]"
/>

## GET response [#get-response]

```json
{
  "campaignId": "cmp_01HZX9...",
  "platform": "meta",
  "authority": {
    "creative": "auto",
    "tactical": "draft",
    "structural": "off"
  },
  "source": "per_campaign",
  "lastModifiedAt": "2026-05-08T14:32:11Z",
  "lastModifiedBy": {
    "actorType": "partner",
    "actorOrganizationId": "org_2481fa5c-a404-44ed-a561-565392499abc",
    "actorApiKeyId": "key_c2037bb9..."
  }
}
```

`source` is `per_campaign` (this row) or `layer_defaults` (inherited from the layer's defaults block).

## PATCH body [#patch-body]

<Parameters
  title="Body"
  rows="[
  { name: 'authority', type: 'object', required: true, description: '`{ creative?, tactical?, structural? }`. Each axis: `off` | `draft` | `auto`.' },
]"
/>

```bash
curl -X PATCH https://api.layers.com/v1/projects/$PROJECT_ID/ads/meta/campaigns/$CAMPAIGN_ID/authority \
  -H "Authorization: Bearer $LAYERS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "authority": { "creative": "auto", "tactical": "draft", "structural": "off" }
  }'
```

## PATCH response [#patch-response]

```json
{
  "campaignId": "cmp_01HZX9...",
  "authority": { "creative": "auto", "tactical": "draft", "structural": "off" },
  "verdictId": "ver_01HZX9..."
}
```

## Errors [#errors]

| Code               | When                                                                |
| ------------------ | ------------------------------------------------------------------- |
| `AUTHORITY_DENIED` | Customer's layer-defaults policy refuses the requested axis change. |
| `FORBIDDEN_SCOPE`  | Key lacks `ads:write:policy`.                                       |
| `NOT_FOUND`        | Campaign not in this org.                                           |

## See also [#see-also]

* [Ads write model](/docs/api/concepts/ads-write-model)
* [`PATCH …/defaults`](/docs/api/reference/ads/patch-defaults)
* [Audit log](/docs/api/reference/audit-log/list)
