---
title: "Ad status changed event"
method: POST
path: "ad.status_changed"
tags: ["Webhook Events"]
---

# Ad status changed event

`POST ad.status_changed` (webhook)

Fired when a campaign, ad set, or ad on a connected ad platform changes status.
Currently emitted only for Meta (`metaads`).

Subscribed to two Meta `ad_account` webhook fields:
  - `in_process_ad_objects` - the ad object finished processing and exited
    the `IN_PROCESS` state. `status.raw` carries Meta's `status_name`
    (e.g. `ACTIVE`, `PAUSED`, `ARCHIVED`, `DELETED`).
  - `with_issues_ad_objects` - the ad object entered the `WITH_ISSUES`
    state. `status.raw` is set to `WITH_ISSUES` and the `error` block is
    populated from Meta's `error_code` / `error_summary` / `error_message`.

`adObject.level` mirrors Meta's `level` and is one of `CAMPAIGN`,
`AD_SET`, or `AD`. Creative-level events are not forwarded.

Branch on `status.raw` to handle each transition; use `error.code` (when
present) as the stable discriminator — `error.summary` and `error.message`
are localized to the ad-account owner's Meta locale.

The `error` block is optional. It's present on most `WITH_ISSUES`
events but can be absent (Meta does not always include diagnostics),
and is never present on any other status. Always null-check `error`
before reading `error.code`.

**Fan-out:** matching is keyed on `adObject.platformAdAccountId`. When
multiple connected Zernio `metaads` accounts are linked to the same Meta
ad account, each receives its own delivery.

## Payload

- WebhookPayloadAdStatusChanged — Webhook payload for the `ad.status_changed` event. Currently emitted only for Meta (`metaads`). Sourced from two Meta `ad_account` webhook fields: - `in_process_ad_objects` - the ad object finished processing and exited `IN_PROCESS`. `status.raw` carries Meta's `status_name`. - `with_issues_ad_objects` - the ad object entered `WITH_ISSUES`. `status.raw` is `WITH_ISSUES` and the `error` block is populated from Meta's `error_code` / `error_summary` / `error_message`.
  - `id` string, required — Stable webhook event ID
  - `event` 'ad.status_changed', required
  - `account` object, required — The connected ad-platform account that owns the ad object.
    - `accountId` string, required — Internal Zernio account ID (same as used in /v1/accounts/{accountId}).
    - `profileId` string, required — Internal Zernio profile ID this account belongs to.
    - `platform` string, required — Ad platform identifier. Currently always `metaads`.
    - `username` string, required — Display username of the connected ad-platform account.
    - `displayName` string — Human-readable display name of the account, when available.
  - `adObject` object, required — The ad-platform object the status change applies to.
    - `level` 'CAMPAIGN' | 'AD_SET' | 'AD', required — Hierarchy level the status applies to. Mirrors Meta's `level`. Creative-level events are not forwarded.
    - `platformId` string, required — Platform-native ID of the campaign / ad set / ad. For Meta this is the bare numeric ID (e.g. `120244894077860689`).
    - `platformAdAccountId` string, required — Platform-native ad-account ID. For Meta this uses the `act_<id>` shape.
  - `status` object, required — Status info. Branch on `status.raw` to handle each transition.
    - `raw` string, required — Platform-native status string, forwarded verbatim. For Meta this is `status_name` from `in_process_ad_objects` (e.g. `ACTIVE`, `PAUSED`, `PENDING_REVIEW`, `ARCHIVED`, `DELETED`, `DISAPPROVED`), or `WITH_ISSUES` when sourced from `with_issues_ad_objects`. Not constrained by an `enum` — Meta may add new values.
  - `error` object — Optional. Present on most `WITH_ISSUES` events, carrying the platform's error diagnostics. May be absent on some `WITH_ISSUES` events (Meta does not always include diagnostics). Always absent for any other `status.raw` value. Always null-check before reading.
    - `code` string, required — Platform-native error code, forwarded verbatim. For Meta this is `error_code` as a string. Use as the stable discriminator — `summary` and `message` are localized.
    - `summary` string — Short human-readable summary (Meta `error_summary`). Localized to the ad-account owner's Meta locale — display only, do not match on it.
    - `message` string — Full human-readable error message (Meta `error_message`). Localized — display only.
  - `timestamp` string, date-time, required — ISO-8601 timestamp the webhook was produced.

## Acknowledgement `200`

Webhook received successfully

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/revisions/f81ca70ea6b9/schema)
