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

# Ad created event

`POST ad.created` (webhook)

An ad was created through Zernio (`source: "zernio"`) or detected by the sync (`source: "platform"`).

### When it fires

Fires once the ad's campaign and ad set are recorded. A detected ad arrives up to one sync interval late; Meta ads entering review usually arrive within minutes.

### When it does not fire

History loaded when an account connects, and ads created more than 7 days ago, are never announced.

## Payload

- WebhookPayloadAdCreated: Webhook payload for the `ad.created` event. Fires when an ad is created through Zernio (API, MCP or dashboard) or detected by the sync, once per ad, after its campaign and ad set are recorded so `GET /v1/ads/{adId}` finds them. `source` is `zernio` for ads created through Zernio and `platform` for ads our sync detected, up to one sync interval later (Meta ads entering review usually arrive within minutes). History loaded when an account connects, and ads created more than 7 days ago, are never announced. An ad is announced at most once per 24 hours.
  - `id` string, required: Stable webhook event ID: the dedupe key, also sent as the X-Zernio-Event-Id header and identical on every retry and redelivery.
  - `profiles` object[]: The profiles this event belongs to, each with the externalId you set on it (null when none is set). Use it to route the event to your tenant without storing Zernio profile ids. Present on every event tied to a profile, absent on events that belong to none. Events spanning several profiles (a post published to accounts of different profiles) list each once.
    - `id` string, required
    - `externalId` string, nullable, required
  - `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` 'ad.created', required
  - `account` WebhookAdsAccount, required: The connected ads account the event belongs to.
    - `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: Ads connection platform (`metaads`, `googleads`, `tiktokads`, `linkedinads`, `pinterestads`, `xads`, ...).
    - `username` string, required
    - `displayName` string, nullable
  - `adObject` object, required
    - `level` 'AD', required: Always `AD`.
    - `platformId` string, required: Platform-native ad ID.
    - `platformAdAccountId` string, required: Platform-native ad account ID.
    - `adId` string, required: Zernio ad ID, usable with GET /v1/ads/{adId}.
    - `name` string, required
    - `campaign` object, nullable, required: The campaign the ad belongs to, or null when the platform has none.
      - `platformCampaignId` string, required
      - `name` string, nullable, required
    - `adSet` object, nullable, required: The ad set the ad belongs to, or null when the platform has none.
      - `platformAdSetId` string, required
      - `name` string, nullable, required
  - `source` 'zernio' | 'platform', required: Where the ad was created. `zernio` for ads created through Zernio, `platform` for ads the sync detected.
  - `timestamp` string, date-time, required: UTC time at which Zernio generated this event.

## Acknowledgement `200`

Webhook received successfully

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) - [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/a79c233ebf22?raw)
