---
title: "Campaign created event"
method: POST
path: "campaign.created"
tags: ["Webhook Events"]
---

# Campaign created event

`POST campaign.created` (webhook)

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

### When it fires

Fires once the campaign row is recorded. A detected campaign arrives up to one sync interval late.

### When it does not fire

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

## Payload

- WebhookPayloadCampaignCreated: Webhook payload for the `campaign.created` event. Fires when a campaign is created through Zernio (API, MCP or dashboard) or detected by the sync, once per campaign, after its row is recorded so `GET /v1/ads/campaigns/{campaignId}` finds it. `source` is `zernio` for campaigns created through Zernio and `platform` for campaigns our sync detected, up to one sync interval later. History loaded when an account connects, and campaigns created more than 7 days ago, are never announced. A campaign 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` 'campaign.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` 'CAMPAIGN', required: Always `CAMPAIGN`.
    - `platformId` string, required: Platform-native campaign ID, usable as campaignId with /v1/ads/campaigns/{campaignId}.
    - `platformAdAccountId` string, required: Platform-native ad account ID.
    - `name` string, nullable, required
  - `source` 'zernio' | 'platform', required: Where the campaign was created. `zernio` for campaigns created through Zernio, `platform` for campaigns 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)
