---
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 — UTC time at which Zernio generated this event (set once when the event payload is built, before delivery is queued). Retries and redeliveries keep the original value, so it reflects the event, not the delivery attempt.

## 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/3c7cf84cec44/schema)
