# ad.review.approved

An ad Zernio already tracked passed platform review, or a rejected ad was approved on appeal.

### When it fires

Fires within one sync cycle of the platform's decision, not instantly; on Meta the review poll usually reports sooner. Each outcome is delivered at most once per ad per 24 hours.

### When it does not fire

Ads seen for the first time by a sync never fire it, including history loaded at connect. On Meta, Google, TikTok and Reddit an ad that leaves review while paused sends no `approved`.

### Platform notes

Covers every ad network Zernio syncs, with one payload shape. On X, Pinterest and LinkedIn the review is read apart from delivery status, so an ad leaving review while paused still sends `approved`.

### Payload notes

`review.raw` is the platform's own status string. `adObject.adId` is the Zernio ad id, ready for `GET /v1/ads/{adId}`. Deduplicate on the event `id`.




**Payload for `ad.review.approved`:**

- **id** (required) `string`: Stable webhook event ID: the dedupe key, also sent as the X-Zernio-Event-Id header and identical on every retry and redelivery.
- **profiles**: `WebhookProfiles` - See schema definition
- **test** `boolean`: Always true when present: only a sample sent by POST /v1/webhooks/test with an event carries it. Real deliveries never do.
- **event** (required) `string`: No description - one of: ad.review.approved, ad.review.rejected
- **account** (required): `WebhookAdsAccount` - See schema definition
- **adObject** (required) `object`: 
  - **level** (required) `string`: Always `AD`. - one of: AD
  - **platformId** (required) `string`: Platform-native ad ID.
  - **platformAdAccountId** (required) `string`: Platform-native ad account ID.
  - **adId** (required) `string`: Zernio ad ID, usable with GET /v1/ads/{adId}.
  - **name** (required) `string`: No description
- **review** (required) `object`: 
  - **status** (required) `string`: No description - one of: approved, rejected
  - **raw** (required) `string`: Platform-native status string, forwarded verbatim (Meta `ACTIVE` / `DISAPPROVED`, TikTok `DISABLE`, ...).
  - **reasons** (required) `array[object]`: Why the platform rejected the ad, when it says. Always empty on `approved`. Pinterest, LinkedIn and Reddit send their own reasons, X sends none, and most other networks only return a generic message.
    - **message** (required) `string`: No description
- **timestamp** (required) `string` (date-time): UTC time at which Zernio generated this event.