> ## Documentation Index
> Fetch the complete documentation index at: https://aisa.one/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> - Base URLs: models `https://api.aisa.one/v1` (Gemini GenerateContent: `https://api.aisa.one/v1beta`); data APIs `https://api.aisa.one/apis/v1`. The `servers` of each operation in https://aisa.one/openapi.yaml is authoritative.
> - Auth: `Authorization: Bearer $AISA_API_KEY`. Never print, log, or commit the key.
> - MCP (preferred for agents): `https://mcp.aisa.one/mcp`, signed in with OAuth, so there is no key to paste.
> - Agent Skill: `npx skills add AIsa-team/agent-skills --skill aisa`. Fallback with the AIsa CLI: `aisa skills install aisa`.
> - Spending: docs, https://aisa.one/models, https://aisa.one/api, `/v1/models`, and MCP `search`, `list_categories`, `get_details`, `batch_quote`, and the `account` operation are free. Quote the exact calls before running them (MCP `batch_quote`, CLI `aisa quote --json`). If the quote reports `auto_execute_eligible: true`, run it unless the user set a tighter limit or asked only for a quote. Otherwise, tell the user in one message the planned calls, the quoted price, and a total USD budget for the task, then wait for approval. Direct HTTP calls follow the stricter rule at https://aisa.one/docs/get-started/cli.md#direct-http-fallback. Do not make paid calls to test availability. Full rule: https://aisa.one/llms.txt

# Create standalone ad

> Ad Campaigns. Can spend money or change spend: needs the ads:spend scope and X-Aisa-Confirm: spend; without the header the request is refused with confirmation_required and nothing is sent. Creates a campaign, ad set and ad in one call; it spends its budget once the platform approves it. validateOnly=true checks the request without acting and needs no confirmation. Creates a paid ad with your own creative, building the campaign and ad set it needs or adding it to existing ones. Works across Meta, Google Ads, Pinterest, TikTok, X, LinkedIn, OpenAI Ads (ChatGPT Ads) and Reddit Ads. Per-platform required fields, budget minimums, and video-ad rules are documented on each property below. ### Request shapes The body selects one of these mutually exclusive shapes:

<!-- aisa-pricing:start -->
A request reference price is not currently available; use a request quote where supported. Account-specific pricing and final settlement may differ.
<!-- aisa-pricing:end -->

## Request contract

* **Method and path:** POST /apis/v1/ads/create
* **Availability:** enabled
* **Request URL template:** `https://api.aisa.one/apis/v1/ads/create`
* **connectionId:** query; required
* **X-Aisa-Confirm:** header; optional
* **Idempotency-Key:** header; optional
* **Runtime facts:** fe60122939c67dc98a3a6ac6b97bd5c326b526105150c8959304dd2160d4dd09

[Complete OpenAPI definition](https://aisa.one/docs/reference-contracts/aisa-ads.json)

Effective request and pricing declaration (including authentication and referenced schemas):

```json theme={null}
{
  "operationId": "post_aisa_ads_apis_v1_ads_create",
  "method": "POST",
  "path": "/apis/v1/ads/create",
  "servers": [
    {
      "url": "https://api.aisa.one"
    }
  ],
  "parameters": [
    {
      "description": "The ads connection (adc_...) the request runs on: one of yours, from GET /apis/v1/ads/connections. On a request with a JSON body it may be sent as a top-level body member instead.",
      "in": "query",
      "name": "connectionId",
      "required": true,
      "schema": {
        "pattern": "^adc_[0-9A-Za-z]+$",
        "type": "string"
      }
    },
    {
      "description": "Required with the value \"spend\" when the request can spend money or change spend. Without it the request is refused with 409 confirmation_required, which describes what would happen; nothing is sent to the ad platform.",
      "in": "header",
      "name": "X-Aisa-Confirm",
      "required": false,
      "schema": {
        "enum": [
          "spend"
        ],
        "type": "string"
      }
    },
    {
      "description": "Passed to the ad platform integration: a retry with the same key returns the first result instead of acting twice. AIsa never retries a write for you.",
      "in": "header",
      "name": "Idempotency-Key",
      "required": false,
      "schema": {
        "maxLength": 191,
        "minLength": 1,
        "type": "string"
      }
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "requestBody": {
    "content": {
      "application/json": {
        "example": {
          "adAccountId": "9122445560",
          "body": "Same-day repairs across Lyon.",
          "budgetAmount": 5,
          "budgetType": "daily",
          "campaignType": "search",
          "cities": [
            "1006410"
          ],
          "connectionId": "adc_7f3k2m9q",
          "goal": "traffic",
          "headline": "Plumber in Lyon",
          "keywords": [
            "plombier lyon"
          ],
          "linkUrl": "https://example.com",
          "locationTargetingType": "presence",
          "name": "Lyon plumbing",
          "status": "PAUSED"
        },
        "schema": {
          "additionalProperties": true,
          "properties": {
            "adAccountId": {
              "type": "string"
            },
            "adName": {
              "description": "Meta only. Exact ad name (the single-creative ad object's name). Overrides the default, which is `name`. (For per-ad names on the multi-creative shape, set `name` on each `creatives[]` entry instead.)",
              "maxLength": 255,
              "type": "string"
            },
            "adSetId": {
              "description": "When present, switches to the attach shape: adds one new ad to this existing ad set without creating a new campaign. Mutually exclusive with `creatives[]`. Must be yours: it is checked through the connection before the request is sent, and an id that is not yours answers not_found.",
              "type": "string"
            },
            "adSetName": {
              "description": "Exact ad set name. Meta, Reddit and Google (the ad group). Overrides the default ` - Ad Set` (Google Search and Display: ` - Ad Group`). Ignored when the request joins an existing ad set (`adSetId`).",
              "maxLength": 255,
              "type": "string"
            },
            "adSetStatus": {
              "description": "Every platform. Sets the switch of the new ad set alone and overrides `status` for it. When omitted, it follows `status`.",
              "enum": [
                "ACTIVE",
                "PAUSED"
              ],
              "type": "string"
            },
            "adStatus": {
              "description": "Request-side publish switch for `adStatus` on ad creation endpoints only (`status`, `campaignStatus` and `adSetStatus` carry their own inline ACTIVE/PAUSED enum there; the status-update endpoints are a separate lowercase `active`/`paused`…",
              "enum": [
                "ACTIVE",
                "PAUSED"
              ],
              "type": "string"
            },
            "additionalDescriptions": {
              "description": "Google Search RSA only. Extra text assets, as strings or objects with text and optional pinnedField. Existing string input remains supported.",
              "items": {
                "oneOf": [
                  {
                    "maxLength": 90,
                    "minLength": 1,
                    "type": "string"
                  },
                  {
                    "properties": {
                      "pinnedField": {
                        "description": "Optional fixed description position. Omit to leave the asset unpinned.",
                        "enum": [
                          "DESCRIPTION_1",
                          "DESCRIPTION_2"
                        ],
                        "type": "string"
                      },
                      "text": {
                        "maxLength": 90,
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "text"
                    ],
                    "type": "object"
                  }
                ]
              },
              "type": "array"
            },
            "additionalHeadlines": {
              "description": "Google Search RSA only. Extra text assets, as strings or objects with text and optional pinnedField. String input remains supported.",
              "items": {
                "oneOf": [
                  {
                    "maxLength": 30,
                    "minLength": 1,
                    "type": "string"
                  },
                  {
                    "properties": {
                      "pinnedField": {
                        "description": "Optional fixed headline position. Omit to leave the asset unpinned.",
                        "enum": [
                          "HEADLINE_1",
                          "HEADLINE_2",
                          "HEADLINE_3"
                        ],
                        "type": "string"
                      },
                      "text": {
                        "maxLength": 30,
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "text"
                    ],
                    "type": "object"
                  }
                ]
              },
              "type": "array"
            },
            "advantageAudience": {
              "description": "Meta only. Controls the Advantage audience feature (targeting_automation). 0 = disabled (default), 1 = enabled. Meta Marketing API requires this field on all ad set creation requests.",
              "enum": [
                0,
                1
              ],
              "type": "integer"
            },
            "ageMax": {
              "maximum": 65,
              "minimum": 13,
              "type": "integer"
            },
            "ageMin": {
              "maximum": 65,
              "minimum": 13,
              "type": "integer"
            },
            "aiDisclosure": {
              "description": "Meta only. Meta's \"Ad includes media created or edited with AI\" disclosure (the Ads Manager checkbox), stored on the creative as `generative_asset_spec.transparency_metadata.self_disclosure`. OPT_IN: checks it.",
              "enum": [
                "OPT_IN",
                "OPT_OUT"
              ],
              "type": "string"
            },
            "assetGroup": {
              "additionalProperties": false,
              "description": "Google Performance Max creative assets. At least one description must be 60 characters or fewer. Texts within each list must be distinct.",
              "properties": {
                "businessName": {
                  "maxLength": 25,
                  "minLength": 1,
                  "type": "string"
                },
                "descriptions": {
                  "description": "At least one description must be 60 characters or fewer.",
                  "items": {
                    "maxLength": 90,
                    "minLength": 1,
                    "type": "string"
                  },
                  "maxItems": 5,
                  "minItems": 2,
                  "type": "array",
                  "uniqueItems": true
                },
                "finalUrl": {
                  "description": "Required destination URL.",
                  "format": "uri",
                  "pattern": "^https?://",
                  "type": "string"
                },
                "headlines": {
                  "items": {
                    "maxLength": 30,
                    "minLength": 1,
                    "type": "string"
                  },
                  "maxItems": 15,
                  "minItems": 3,
                  "type": "array",
                  "uniqueItems": true
                },
                "images": {
                  "additionalProperties": false,
                  "description": "Public HTTP(S) image URLs. GIF, JPEG or PNG, at most 5120 KB per image. Google validates dimensions and aspect ratios.",
                  "properties": {
                    "landscape": {
                      "description": "Landscape marketing images. Aspect ratio 1.91:1, minimum 600 x 314 pixels.",
                      "items": {
                        "format": "uri",
                        "pattern": "^https?://",
                        "type": "string"
                      },
                      "maxItems": 20,
                      "minItems": 1,
                      "type": "array"
                    },
                    "logo": {
                      "description": "Required square logos. Aspect ratio 1:1, minimum 128 x 128 pixels.",
                      "items": {
                        "format": "uri",
                        "pattern": "^https?://",
                        "type": "string"
                      },
                      "maxItems": 5,
                      "minItems": 1,
                      "type": "array"
                    },
                    "square": {
                      "description": "Square marketing images. Aspect ratio 1:1, minimum 300 x 300 pixels.",
                      "items": {
                        "format": "uri",
                        "pattern": "^https?://",
                        "type": "string"
                      },
                      "maxItems": 20,
                      "minItems": 1,
                      "type": "array"
                    }
                  },
                  "required": [
                    "landscape",
                    "logo",
                    "square"
                  ],
                  "type": "object"
                },
                "longHeadline": {
                  "maxLength": 90,
                  "minLength": 1,
                  "type": "string"
                },
                "name": {
                  "description": "Defaults to the request name.",
                  "maxLength": 128,
                  "minLength": 1,
                  "type": "string"
                },
                "youtubeVideoId": {
                  "description": "Optional existing YouTube video id. Google can generate video when omitted. Video uploads and arbitrary video URLs are not supported.",
                  "pattern": "^[A-Za-z0-9_-]{11}$",
                  "type": "string"
                }
              },
              "required": [
                "businessName",
                "descriptions",
                "finalUrl",
                "headlines",
                "images",
                "longHeadline"
              ],
              "type": "object"
            },
            "attributionSpec": {
              "description": "Meta only. Conversion attribution window for the ad set, mapping 1:1 to Meta's ad-set `attribution_spec`. Only honored for conversion goals (`conversions`, `lead_generation`, `app_promotion`); ignored for awareness/traffic/engagement.",
              "items": {
                "properties": {
                  "eventType": {
                    "enum": [
                      "CLICK_THROUGH",
                      "VIEW_THROUGH",
                      "ENGAGED_VIDEO_VIEW"
                    ],
                    "type": "string"
                  },
                  "windowDays": {
                    "enum": [
                      1,
                      7,
                      28
                    ],
                    "type": "integer"
                  }
                },
                "required": [
                  "eventType",
                  "windowDays"
                ],
                "type": "object"
              },
              "maxItems": 3,
              "minItems": 1,
              "type": "array"
            },
            "audienceId": {
              "description": "Custom audience ID for targeting Must be yours: it is checked through the connection before the request is sent, and an id that is not yours answers not_found.",
              "type": "string"
            },
            "behaviors": {
              "description": "Behaviour entities from /apis/v1/ads/targeting/search?dimension=behavior (Meta, TikTok and LinkedIn). Each must include id. On TikTok:",
              "items": {
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "bidAmount": {
              "description": "Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window; sending both shapes returns a 400.",
              "type": "number"
            },
            "bidStrategy": {
              "description": "Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window. Sending both shapes returns a 400.",
              "enum": [
                "LOWEST_COST_WITHOUT_CAP",
                "LOWEST_COST_WITH_BID_CAP",
                "COST_CAP",
                "LOWEST_COST_WITH_MIN_ROAS"
              ],
              "type": "string"
            },
            "billingEvent": {
              "description": "Meta only. Explicit ad-set `billing_event`. Defaults to `IMPRESSIONS`. Forwarded verbatim to Meta, which validates compatibility with the optimization goal.",
              "type": "string"
            },
            "boardId": {
              "description": "Pinterest only. Board ID (auto-creates if not provided).",
              "type": "string"
            },
            "bodies": {
              "description": "Meta only. Multiple Text Options (Advantage+ Flexible Format): 1-5 primary-text variations that Meta optimises delivery across, WITHOUT enabling full Dynamic Creative (`dynamicCreative`).",
              "items": {
                "type": "string"
              },
              "maxItems": 5,
              "minItems": 1,
              "type": "array"
            },
            "body": {
              "description": "Required on legacy + attach shapes. X: the tweet text (max 280 chars including a ~24-char URL when `linkUrl` is set). LinkedIn: the post commentary (the intro text shown above the ad). OpenAI Ads: the chat card's body text.",
              "type": "string"
            },
            "brandIdentity": {
              "description": "TikTok only; non-TikTok platforms ignore this field. Synthetic Brand Identity used when the ad attributes to a CUSTOMIZED_USER (instead of a real TT_USER @username).",
              "properties": {
                "displayName": {
                  "description": "Brand name shown above the ad on TikTok.",
                  "maxLength": 40,
                  "minLength": 1,
                  "type": "string"
                },
                "imageUrl": {
                  "description": "Public URL of a square brand image (≥98×98 px, JPG/PNG). Used as the brand avatar on the ad.",
                  "format": "uri",
                  "type": "string"
                }
              },
              "required": [
                "displayName",
                "imageUrl"
              ],
              "type": "object"
            },
            "budgetAmount": {
              "description": "Budget in WHOLE currency units (USD: 50 = $50.00), NOT cents. Meta's own Marketing API takes this number in minor units, an easy and expensive mix-up. Required on legacy, multi-creative and Performance Max shapes. Inherited on attach.",
              "type": "number"
            },
            "budgetLevel": {
              "default": "adset",
              "description": "Meta only. Where the budget lives, which selects the Meta budget model: `adset` (default): ABO (Ad-set Budget Optimization). The budget is set on the ad set. Back-compatible; omit this field to keep it.",
              "enum": [
                "adset",
                "campaign"
              ],
              "type": "string"
            },
            "budgetType": {
              "description": "Defaults to daily when `budgetAmount` is sent without it (reported in `appliedDefaults.budgetType`). Inherited on attach. OpenAI Ads: accepts both as the campaign's single spend cap.",
              "enum": [
                "daily",
                "lifetime"
              ],
              "type": "string"
            },
            "businessName": {
              "description": "Google Display only",
              "maxLength": 25,
              "type": "string"
            },
            "buyingType": {
              "default": "AUCTION",
              "description": "Meta only. Buying type. Defaults to AUCTION and is explicitly sent on new campaigns, including validateOnly. Reusing existingCampaignId does not change the campaign. RESERVED = Reach & Frequency:",
              "enum": [
                "AUCTION",
                "RESERVED"
              ],
              "type": "string"
            },
            "callToAction": {
              "description": "The ad's call-to-action button. Meta: required on legacy + attach shapes. Accepts every call to action type Meta itself accepts (the enum lists them), including values such as SEE_DETAILS that ads synced from Meta carry.",
              "enum": [
                "BOOK_TRAVEL",
                "CONTACT_US",
                "DONATE",
                "DONATE_NOW",
                "DOWNLOAD",
                "GET_DIRECTIONS",
                "GO_LIVE",
                "INTERESTED",
                "LEARN_MORE",
                "SEE_DETAILS",
                "LIKE_PAGE",
                "MESSAGE_PAGE",
                "RAISE_MONEY",
                "SAVE",
                "SEND_TIP",
                "SHOP_NOW",
                "SIGN_UP",
                "VIEW_INSTAGRAM_PROFILE",
                "INSTAGRAM_MESSAGE",
                "LOYALTY_LEARN_MORE",
                "PURCHASE_GIFT_CARDS",
                "PAY_TO_ACCESS",
                "SEE_MORE",
                "TRY_IN_CAMERA",
                "WHATSAPP_LINK",
                "GET_IN_TOUCH",
                "TRY_NOW",
                "ASK_A_QUESTION",
                "START_A_CHAT",
                "CHAT_NOW",
                "ASK_US",
                "CHAT_WITH_US",
                "SHOP_ON_RETAILER",
                "BOOK_NOW",
                "CHECK_AVAILABILITY",
                "ORDER_NOW",
                "WHATSAPP_MESSAGE",
                "GET_MOBILE_APP",
                "INSTALL_MOBILE_APP",
                "USE_MOBILE_APP",
                "INSTALL_APP",
                "USE_APP",
                "PLAY_GAME",
                "TRY_DEMO",
                "WATCH_VIDEO",
                "WATCH_MORE",
                "OPEN_LINK",
                "NO_BUTTON",
                "LISTEN_MUSIC",
                "MOBILE_DOWNLOAD",
                "GET_OFFER",
                "GET_OFFER_VIEW",
                "BUY_NOW",
                "BUY_TICKETS",
                "UPDATE_APP",
                "BET_NOW",
                "ADD_TO_CART",
                "SELL_NOW",
                "GET_SHOWTIMES",
                "LISTEN_NOW",
                "GET_EVENT_TICKETS",
                "REMIND_ME",
                "SEARCH_MORE",
                "PRE_REGISTER",
                "SWIPE_UP_PRODUCT",
                "SWIPE_UP_SHOP",
                "PLAY_GAME_ON_FACEBOOK",
                "VISIT_WORLD",
                "OPEN_INSTANT_APP",
                "JOIN_GROUP",
                "GET_PROMOTIONS",
                "SEND_UPDATES",
                "INQUIRE_NOW",
                "VISIT_PROFILE",
                "CHAT_ON_WHATSAPP",
                "EXPLORE_MORE",
                "CONFIRM",
                "JOIN_CHANNEL",
                "MAKE_AN_APPOINTMENT",
                "ASK_ABOUT_SERVICES",
                "BOOK_A_CONSULTATION",
                "GET_A_QUOTE",
                "BUY_VIA_MESSAGE",
                "ASK_FOR_MORE_INFO",
                "VIEW_PRODUCT",
                "VIEW_CHANNEL",
                "WATCH_LIVE_VIDEO",
                "JOIN_LIVE_VIDEO",
                "IMAGINE",
                "WATCH_NOW",
                "STREAM_NOW",
                "BUY_ACTIVITY_TICKETS",
                "CALL",
                "MISSED_CALL",
                "CALL_NOW",
                "CALL_ME",
                "APPLY_NOW",
                "BUY",
                "GET_QUOTE",
                "SUBSCRIBE",
                "RECORD_NOW",
                "VOTE_NOW",
                "GIVE_FREE_RIDES",
                "REGISTER_NOW",
                "OPEN_MESSENGER_EXT",
                "EVENT_RSVP",
                "CIVIC_ACTION",
                "SEND_INVITES",
                "REFER_FRIENDS",
                "REQUEST_TIME",
                "SEE_MENU",
                "SEARCH",
                "TRY_IT",
                "TRY_ON",
                "LINK_CARD",
                "DIAL_CODE",
                "FIND_YOUR_GROUPS",
                "START_ORDER",
                "REGISTER",
                "JOIN",
                "ATTEND",
                "REQUEST_DEMO",
                "VIEW_QUOTE",
                "APPLY"
              ],
              "type": "string"
            },
            "callouts": {
              "description": "Google Search only. Short callout texts (max 25 chars each) that appear as non-clickable annotations under the ad, e.g. \"Free shipping\", \"24/7 support\".",
              "items": {
                "maxLength": 25,
                "minLength": 1,
                "type": "string"
              },
              "maxItems": 20,
              "minItems": 1,
              "type": "array"
            },
            "campaignAttribution": {
              "description": "Meta ad-set attribution. Required as SKADNETWORK for iOS 14+ app promotion or a SKAdNetwork campaign. Requires AUCTION buying. Standalone Meta ad-set creation is not supported; use this field on /apis/v1/ads/create.",
              "enum": [
                "AEM",
                "SKADNETWORK"
              ],
              "type": "string"
            },
            "campaignName": {
              "description": "Meta, Reddit and Google. Exact campaign name; overrides the default ` - Campaign`. Ignored when the request joins an existing campaign or ad set. Google: no line breaks and at most 255 characters, checked before calling Google.",
              "maxLength": 255,
              "type": "string"
            },
            "campaignNegativeKeywords": {
              "description": "Google Search only; other platforms return 400. Campaign-level negative keywords (campaign_criterion.negative), created alongside the ad group. Editable later via PUT /apis/v1/ads/campaigns/{campaignId}/negative-keywords.",
              "items": {
                "description": "A Google Search keyword: a bare string (BROAD match), or an object naming the match type.",
                "oneOf": [
                  {
                    "description": "Keyword text; defaults to BROAD match",
                    "maxLength": 80,
                    "minLength": 1,
                    "type": "string"
                  },
                  {
                    "properties": {
                      "matchType": {
                        "description": "Defaults to broad. Accepted in any case (EXACT, Exact) and stored lowercase.",
                        "enum": [
                          "exact",
                          "phrase",
                          "broad"
                        ],
                        "type": "string"
                      },
                      "text": {
                        "maxLength": 80,
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "text"
                    ],
                    "type": "object"
                  }
                ]
              },
              "maxItems": 1000,
              "type": "array"
            },
            "campaignStatus": {
              "description": "Every platform. Sets the switch of the new campaign alone (LinkedIn: the campaign group) and overrides `status` for it. Omitted, it follows `status`. Ignored when the request creates no campaign (`existingCampaignId` or `adSetId`).",
              "enum": [
                "ACTIVE",
                "PAUSED"
              ],
              "type": "string"
            },
            "campaignType": {
              "default": "display",
              "description": "Google only. Performance Max requires assetGroup and Demand Gen requires demandGen; both are always created PAUSED. With `adSetId` it defaults to the ad group's own campaign type instead of display.",
              "enum": [
                "display",
                "search",
                "pmax",
                "demand_gen"
              ],
              "type": "string"
            },
            "carouselCards": {
              "description": "Carousel cards. Behavior per platform: Reddit: builds a carousel ad.",
              "items": {
                "properties": {
                  "callToAction": {
                    "description": "Card CTA override. Defaults to the top-level callToAction; same enum.",
                    "type": "string"
                  },
                  "description": {
                    "description": "Card description, shown under the headline.",
                    "maxLength": 255,
                    "type": "string"
                  },
                  "headline": {
                    "description": "Card headline, shown below the card image.",
                    "maxLength": 255,
                    "type": "string"
                  },
                  "imageUrl": {
                    "description": "Card image; uploaded to the ad account and referenced by hash.",
                    "format": "uri",
                    "type": "string"
                  },
                  "linkUrl": {
                    "description": "Card destination URL. Defaults to the top-level linkUrl, or Meta's lead-form link when leadGenFormId is set and neither is provided.",
                    "format": "uri",
                    "type": "string"
                  }
                },
                "required": [
                  "imageUrl"
                ],
                "type": "object"
              },
              "maxItems": 10,
              "minItems": 2,
              "type": "array"
            },
            "catalogFormat": {
              "description": "Meta catalog template creatives only (goal `catalog_sales`, goal `traffic` with `promotedObject.productSetId`, or `adSetId` with `promotedObject.productSetId`); a 400 otherwise. Omit it to let Meta pick the format.",
              "enum": [
                "single_image",
                "carousel_images_multi_items",
                "carousel_images_single_item",
                "carousel_slideshows"
              ],
              "type": "string"
            },
            "cities": {
              "description": "City-level geo targeting (Meta, Google and TikTok). An entry is `{ key }` or the key alone as a plain string (`[\"1006410\"]`).",
              "items": {
                "oneOf": [
                  {
                    "description": "The city id alone, e.g. \"1006410\" (same as { key: \"1006410\" }).",
                    "type": "string"
                  },
                  {
                    "properties": {
                      "distance_unit": {
                        "description": "Unit for radius. Required if radius is set.",
                        "enum": [
                          "mile",
                          "kilometer"
                        ],
                        "type": "string"
                      },
                      "key": {
                        "description": "City id from /apis/v1/ads/targeting/search results (Meta city key, Google geo target constant id, TikTok location id).",
                        "type": "string"
                      },
                      "radius": {
                        "description": "Optional radius around the city. Must be set together with distance_unit. Meta enforces a minimum city radius (~17 km / 10 mi); smaller values resolve to a 0-size audience and the ad fails at launch.",
                        "type": "number"
                      }
                    },
                    "required": [
                      "key"
                    ],
                    "type": "object"
                  }
                ]
              },
              "type": "array"
            },
            "connectionId": {
              "description": "The ads connection (adc_...), when not sent as the connectionId query parameter.",
              "pattern": "^adc_[0-9A-Za-z]+$",
              "type": "string"
            },
            "countries": {
              "description": "ISO 3166-1 alpha-2 country codes (e.g. ['NL']). Defaults to ['US'] when no other geo targeting (flat or nested `targeting`) is provided.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "countryGroups": {
              "description": "Meta only. Continents and trade blocs (`geo_locations.country_groups`), for targeting a whole region without listing its countries. Combines with `countries` rather than replacing it.",
              "items": {
                "enum": [
                  "africa",
                  "asia",
                  "europe",
                  "north_america",
                  "south_america",
                  "oceania",
                  "central_america",
                  "caribbean",
                  "eea",
                  "euro_area",
                  "nafta",
                  "mercosur",
                  "afta",
                  "apec",
                  "gcc",
                  "cisfta",
                  "emerging_markets",
                  "itunes_app_store",
                  "android_free_store",
                  "android_paid_store"
                ],
                "type": "string"
              },
              "type": "array"
            },
            "creativeFeatures": {
              "additionalProperties": {
                "enum": [
                  "OPT_IN",
                  "OPT_OUT"
                ],
                "type": "string"
              },
              "description": "Meta Advantage+ creative enhancements. Map snake_case feature names to OPT_IN or OPT_OUT; Meta validates supported keys and unspecified features default to OPT_OUT.",
              "type": "object"
            },
            "creatives": {
              "description": "Meta-only. When present, switches to the multi-creative shape: creates 1 campaign + 1 ad set + N ads (one per entry here). Top-level `headline` / `body` / `imageUrl` / `linkUrl` / `callToAction` are ignored in this mode.",
              "items": {
                "description": "Each creative must supply EXACTLY ONE of `imageUrl` (image creative) or `video` (video creative).",
                "properties": {
                  "body": {
                    "type": "string"
                  },
                  "callToAction": {
                    "enum": [
                      "BOOK_TRAVEL",
                      "CONTACT_US",
                      "DONATE",
                      "DONATE_NOW",
                      "DOWNLOAD",
                      "GET_DIRECTIONS",
                      "GO_LIVE",
                      "INTERESTED",
                      "LEARN_MORE",
                      "SEE_DETAILS",
                      "LIKE_PAGE",
                      "MESSAGE_PAGE",
                      "RAISE_MONEY",
                      "SAVE",
                      "SEND_TIP",
                      "SHOP_NOW",
                      "SIGN_UP",
                      "VIEW_INSTAGRAM_PROFILE",
                      "INSTAGRAM_MESSAGE",
                      "LOYALTY_LEARN_MORE",
                      "PURCHASE_GIFT_CARDS",
                      "PAY_TO_ACCESS",
                      "SEE_MORE",
                      "TRY_IN_CAMERA",
                      "WHATSAPP_LINK",
                      "GET_IN_TOUCH",
                      "TRY_NOW",
                      "ASK_A_QUESTION",
                      "START_A_CHAT",
                      "CHAT_NOW",
                      "ASK_US",
                      "CHAT_WITH_US",
                      "SHOP_ON_RETAILER",
                      "BOOK_NOW",
                      "CHECK_AVAILABILITY",
                      "ORDER_NOW",
                      "WHATSAPP_MESSAGE",
                      "GET_MOBILE_APP",
                      "INSTALL_MOBILE_APP",
                      "USE_MOBILE_APP",
                      "INSTALL_APP",
                      "USE_APP",
                      "PLAY_GAME",
                      "TRY_DEMO",
                      "WATCH_VIDEO",
                      "WATCH_MORE",
                      "OPEN_LINK",
                      "NO_BUTTON",
                      "LISTEN_MUSIC",
                      "MOBILE_DOWNLOAD",
                      "GET_OFFER",
                      "GET_OFFER_VIEW",
                      "BUY_NOW",
                      "BUY_TICKETS",
                      "UPDATE_APP",
                      "BET_NOW",
                      "ADD_TO_CART",
                      "SELL_NOW",
                      "GET_SHOWTIMES",
                      "LISTEN_NOW",
                      "GET_EVENT_TICKETS",
                      "REMIND_ME",
                      "SEARCH_MORE",
                      "PRE_REGISTER",
                      "SWIPE_UP_PRODUCT",
                      "SWIPE_UP_SHOP",
                      "PLAY_GAME_ON_FACEBOOK",
                      "VISIT_WORLD",
                      "OPEN_INSTANT_APP",
                      "JOIN_GROUP",
                      "GET_PROMOTIONS",
                      "SEND_UPDATES",
                      "INQUIRE_NOW",
                      "VISIT_PROFILE",
                      "CHAT_ON_WHATSAPP",
                      "EXPLORE_MORE",
                      "CONFIRM",
                      "JOIN_CHANNEL",
                      "MAKE_AN_APPOINTMENT",
                      "ASK_ABOUT_SERVICES",
                      "BOOK_A_CONSULTATION",
                      "GET_A_QUOTE",
                      "BUY_VIA_MESSAGE",
                      "ASK_FOR_MORE_INFO",
                      "VIEW_PRODUCT",
                      "VIEW_CHANNEL",
                      "WATCH_LIVE_VIDEO",
                      "JOIN_LIVE_VIDEO",
                      "IMAGINE",
                      "WATCH_NOW",
                      "STREAM_NOW",
                      "BUY_ACTIVITY_TICKETS",
                      "CALL",
                      "MISSED_CALL",
                      "CALL_NOW",
                      "CALL_ME",
                      "APPLY_NOW",
                      "BUY",
                      "GET_QUOTE",
                      "SUBSCRIBE",
                      "RECORD_NOW",
                      "VOTE_NOW",
                      "GIVE_FREE_RIDES",
                      "REGISTER_NOW",
                      "OPEN_MESSENGER_EXT",
                      "EVENT_RSVP",
                      "CIVIC_ACTION",
                      "SEND_INVITES",
                      "REFER_FRIENDS",
                      "REQUEST_TIME",
                      "SEE_MENU",
                      "SEARCH",
                      "TRY_IT",
                      "TRY_ON",
                      "LINK_CARD",
                      "DIAL_CODE",
                      "FIND_YOUR_GROUPS",
                      "START_ORDER"
                    ],
                    "type": "string"
                  },
                  "creativeFeatures": {
                    "additionalProperties": {
                      "enum": [
                        "OPT_IN",
                        "OPT_OUT"
                      ],
                      "type": "string"
                    },
                    "description": "Meta Advantage+ creative enhancements. Map snake_case feature names to OPT_IN or OPT_OUT; Meta validates supported keys and unspecified features default to OPT_OUT.",
                    "type": "object"
                  },
                  "description": {
                    "description": "Link description for this ad (link_data.description; video creatives: video_data.link_description). Falls back to the top-level `description`; when both are omitted Meta scrapes the destination URL's OG description.",
                    "maxLength": 255,
                    "type": "string"
                  },
                  "headline": {
                    "maxLength": 255,
                    "type": "string"
                  },
                  "imageUrl": {
                    "description": "Image creative. Mutually exclusive with `video`.",
                    "format": "uri",
                    "type": "string"
                  },
                  "linkUrl": {
                    "format": "uri",
                    "type": "string"
                  },
                  "name": {
                    "description": "Exact name for this ad. Falls back to ` #N` (N = 1-based position).",
                    "maxLength": 255,
                    "type": "string"
                  },
                  "video": {
                    "description": "Video creative for this entry. Mutually exclusive with `imageUrl`.",
                    "properties": {
                      "thumbnailUrl": {
                        "format": "uri",
                        "type": "string"
                      },
                      "url": {
                        "format": "uri",
                        "type": "string"
                      }
                    },
                    "required": [
                      "url"
                    ],
                    "type": "object"
                  }
                },
                "required": [
                  "body",
                  "callToAction",
                  "headline",
                  "linkUrl"
                ],
                "type": "object"
              },
              "minItems": 1,
              "type": "array"
            },
            "currency": {
              "description": "ISO 4217 currency code matching the ad account's currency (e.g. `USD`). Meta only.",
              "maxLength": 3,
              "minLength": 3,
              "type": "string"
            },
            "customLocations": {
              "description": "Point-radius (lat/lng) geo targeting. Meta only (custom_locations). Rejected on platforms without radius support.",
              "items": {
                "properties": {
                  "address": {
                    "type": "string"
                  },
                  "distanceUnit": {
                    "enum": [
                      "mile",
                      "kilometer"
                    ],
                    "type": "string"
                  },
                  "latitude": {
                    "maximum": 90,
                    "minimum": -90,
                    "type": "number"
                  },
                  "longitude": {
                    "maximum": 180,
                    "minimum": -180,
                    "type": "number"
                  },
                  "name": {
                    "type": "string"
                  },
                  "radius": {
                    "type": "number"
                  }
                },
                "required": [
                  "distanceUnit",
                  "latitude",
                  "longitude",
                  "radius"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "defaultLocale": {
              "description": "Meta only. Language the top-level copy is written in (e.g. `en`, `pt_BR`), used by the `translations` default rule. Defaults to `en`. Meta rejects a language asset feed whose default rule carries no locales of its own.",
              "type": "string"
            },
            "demandGen": {
              "additionalProperties": false,
              "description": "Creative, channel and audience settings for a Google Demand Gen campaign (campaignType demand_gen).",
              "properties": {
                "adGroupName": {
                  "description": "Defaults to the ad name.",
                  "maxLength": 255,
                  "type": "string"
                },
                "audience": {
                  "additionalProperties": false,
                  "description": "Created as a Google Audience and attached to the ad group. Send at least one dimension. Ids are numeric Google ids (user lists, interest categories, custom audiences) from the same customer.",
                  "properties": {
                    "ageRanges": {
                      "items": {
                        "properties": {
                          "max": {
                            "description": "Omit for no upper bound.",
                            "enum": [
                              24,
                              34,
                              44,
                              54,
                              64
                            ],
                            "type": "integer"
                          },
                          "min": {
                            "enum": [
                              18,
                              25,
                              35,
                              45,
                              55,
                              65
                            ],
                            "type": "integer"
                          }
                        },
                        "required": [
                          "min"
                        ],
                        "type": "object"
                      },
                      "maxItems": 6,
                      "minItems": 1,
                      "type": "array"
                    },
                    "customAudiences": {
                      "items": {
                        "type": "string"
                      },
                      "maxItems": 20,
                      "minItems": 1,
                      "type": "array"
                    },
                    "genders": {
                      "items": {
                        "enum": [
                          "male",
                          "female",
                          "undetermined"
                        ],
                        "type": "string"
                      },
                      "maxItems": 3,
                      "minItems": 1,
                      "type": "array"
                    },
                    "userInterests": {
                      "items": {
                        "type": "string"
                      },
                      "maxItems": 20,
                      "minItems": 1,
                      "type": "array"
                    },
                    "userLists": {
                      "items": {
                        "type": "string"
                      },
                      "maxItems": 20,
                      "minItems": 1,
                      "type": "array"
                    }
                  },
                  "type": "object"
                },
                "audienceId": {
                  "description": "Attach an existing Google Audience by numeric id instead of audience. Must be yours: it is checked through the connection before the request is sent, and an id that is not yours answers not_found.",
                  "type": "string"
                },
                "businessName": {
                  "maxLength": 25,
                  "type": "string"
                },
                "callToAction": {
                  "description": "Image and carousel ads only. Call to action text such as 'Learn more'; Google picks one when omitted.",
                  "maxLength": 25,
                  "type": "string"
                },
                "carouselCards": {
                  "description": "Makes the ad a carousel ad. Each card needs its own image (no two cards may share one); use the same image shape on every card. Card images are uploaded to the account's asset library before the campaign is created, validateOnly included.",
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "callToAction": {
                        "maxLength": 25,
                        "type": "string"
                      },
                      "finalUrl": {
                        "description": "Defaults to demandGen.finalUrl.",
                        "format": "uri",
                        "type": "string"
                      },
                      "headline": {
                        "maxLength": 40,
                        "type": "string"
                      },
                      "images": {
                        "additionalProperties": false,
                        "properties": {
                          "landscape": {
                            "description": "1.91:1.",
                            "format": "uri",
                            "type": "string"
                          },
                          "portrait": {
                            "description": "4:5.",
                            "format": "uri",
                            "type": "string"
                          },
                          "square": {
                            "description": "1:1.",
                            "format": "uri",
                            "type": "string"
                          }
                        },
                        "type": "object"
                      }
                    },
                    "required": [
                      "headline",
                      "images"
                    ],
                    "type": "object"
                  },
                  "maxItems": 10,
                  "minItems": 2,
                  "type": "array"
                },
                "channels": {
                  "description": "Channel controls on the new ad group. Only the listed channels serve; Google Maps, which this list cannot select, is turned off.",
                  "items": {
                    "enum": [
                      "youtube_in_stream",
                      "youtube_in_feed",
                      "youtube_shorts",
                      "discover",
                      "gmail",
                      "display"
                    ],
                    "type": "string"
                  },
                  "minItems": 1,
                  "type": "array"
                },
                "descriptions": {
                  "description": "A carousel ad takes exactly one.",
                  "items": {
                    "maxLength": 90,
                    "type": "string"
                  },
                  "maxItems": 5,
                  "minItems": 1,
                  "type": "array"
                },
                "finalUrl": {
                  "format": "uri",
                  "type": "string"
                },
                "headlines": {
                  "description": "Distinct texts. A carousel ad takes exactly one.",
                  "items": {
                    "maxLength": 40,
                    "type": "string"
                  },
                  "maxItems": 5,
                  "minItems": 1,
                  "type": "array"
                },
                "images": {
                  "additionalProperties": false,
                  "description": "Public image URLs. An image ad needs landscape or square; video and carousel ads take only one logo (carousel images go on each card).",
                  "properties": {
                    "landscape": {
                      "description": "1.91:1, at least 600x314.",
                      "items": {
                        "format": "uri",
                        "type": "string"
                      },
                      "maxItems": 20,
                      "minItems": 1,
                      "type": "array"
                    },
                    "logo": {
                      "description": "1:1, at least 128x128.",
                      "items": {
                        "format": "uri",
                        "type": "string"
                      },
                      "maxItems": 5,
                      "minItems": 1,
                      "type": "array"
                    },
                    "portrait": {
                      "description": "4:5, at least 480x600.",
                      "items": {
                        "format": "uri",
                        "type": "string"
                      },
                      "maxItems": 20,
                      "minItems": 1,
                      "type": "array"
                    },
                    "square": {
                      "description": "1:1, at least 300x300.",
                      "items": {
                        "format": "uri",
                        "type": "string"
                      },
                      "maxItems": 20,
                      "minItems": 1,
                      "type": "array"
                    }
                  },
                  "required": [
                    "logo"
                  ],
                  "type": "object"
                },
                "longHeadlines": {
                  "description": "Video ads only, and required there.",
                  "items": {
                    "maxLength": 90,
                    "type": "string"
                  },
                  "maxItems": 5,
                  "minItems": 1,
                  "type": "array"
                },
                "youtubeVideoIds": {
                  "description": "Makes the ad a video responsive ad.",
                  "items": {
                    "pattern": "^[A-Za-z0-9_-]{11}$",
                    "type": "string"
                  },
                  "maxItems": 5,
                  "minItems": 1,
                  "type": "array"
                }
              },
              "required": [
                "businessName",
                "descriptions",
                "finalUrl",
                "headlines",
                "images"
              ],
              "type": "object"
            },
            "description": {
              "description": "Meta only (facebook/instagram). Link description: the secondary text shown below the headline (Meta's link_data.description; on video creatives mapped to video_data.link_description).",
              "maxLength": 255,
              "type": "string"
            },
            "descriptions": {
              "description": "Meta only. Optional description variations for Multiple Text Options. Sent alongside `bodies` and `headlines`.",
              "items": {
                "maxLength": 255,
                "type": "string"
              },
              "maxItems": 5,
              "minItems": 1,
              "type": "array"
            },
            "dsaBeneficiary": {
              "description": "Legal entity that benefits from the ad. Required when targeting EU users (EU DSA, Article 26).",
              "maxLength": 100,
              "type": "string"
            },
            "dsaPayor": {
              "description": "Legal entity that pays for the ad. Can differ from `dsaBeneficiary` (for example, an agency paying for a client's ads). Same rules as `dsaBeneficiary`: required for EU targeting unless the ad account has a default payor.",
              "maxLength": 100,
              "type": "string"
            },
            "dynamicCreative": {
              "description": "Meta only. Dynamic Creative: supply a POOL of assets and Meta auto-combines and optimises them into the best-performing variations within a single ad (mapped to the creative's `asset_feed_spec`).",
              "properties": {
                "adFormat": {
                  "description": "Asset-feed ad format. Must match the pool: SINGLE_IMAGE / CAROUSEL_IMAGE require `imageUrls`, SINGLE_VIDEO requires `videoUrls` (400 otherwise). Defaults to SINGLE_IMAGE with `imageUrls`, SINGLE_VIDEO with `videoUrls`.",
                  "enum": [
                    "SINGLE_IMAGE",
                    "CAROUSEL_IMAGE",
                    "SINGLE_VIDEO"
                  ],
                  "type": "string"
                },
                "bodies": {
                  "description": "Primary-text variations (the body copy).",
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 5,
                  "type": "array"
                },
                "callToActionTypes": {
                  "description": "CTA-button variations. Required.",
                  "items": {
                    "enum": [
                      "BOOK_TRAVEL",
                      "CONTACT_US",
                      "DONATE",
                      "DONATE_NOW",
                      "DOWNLOAD",
                      "GET_DIRECTIONS",
                      "GO_LIVE",
                      "INTERESTED",
                      "LEARN_MORE",
                      "SEE_DETAILS",
                      "LIKE_PAGE",
                      "MESSAGE_PAGE",
                      "RAISE_MONEY",
                      "SAVE",
                      "SEND_TIP",
                      "SHOP_NOW",
                      "SIGN_UP",
                      "VIEW_INSTAGRAM_PROFILE",
                      "INSTAGRAM_MESSAGE",
                      "LOYALTY_LEARN_MORE",
                      "PURCHASE_GIFT_CARDS",
                      "PAY_TO_ACCESS",
                      "SEE_MORE",
                      "TRY_IN_CAMERA",
                      "WHATSAPP_LINK",
                      "GET_IN_TOUCH",
                      "TRY_NOW",
                      "ASK_A_QUESTION",
                      "START_A_CHAT",
                      "CHAT_NOW",
                      "ASK_US",
                      "CHAT_WITH_US",
                      "SHOP_ON_RETAILER",
                      "BOOK_NOW",
                      "CHECK_AVAILABILITY",
                      "ORDER_NOW",
                      "WHATSAPP_MESSAGE",
                      "GET_MOBILE_APP",
                      "INSTALL_MOBILE_APP",
                      "USE_MOBILE_APP",
                      "INSTALL_APP",
                      "USE_APP",
                      "PLAY_GAME",
                      "TRY_DEMO",
                      "WATCH_VIDEO",
                      "WATCH_MORE",
                      "OPEN_LINK",
                      "NO_BUTTON",
                      "LISTEN_MUSIC",
                      "MOBILE_DOWNLOAD",
                      "GET_OFFER",
                      "GET_OFFER_VIEW",
                      "BUY_NOW",
                      "BUY_TICKETS",
                      "UPDATE_APP",
                      "BET_NOW",
                      "ADD_TO_CART",
                      "SELL_NOW",
                      "GET_SHOWTIMES",
                      "LISTEN_NOW",
                      "GET_EVENT_TICKETS",
                      "REMIND_ME",
                      "SEARCH_MORE",
                      "PRE_REGISTER",
                      "SWIPE_UP_PRODUCT",
                      "SWIPE_UP_SHOP",
                      "PLAY_GAME_ON_FACEBOOK",
                      "VISIT_WORLD",
                      "OPEN_INSTANT_APP",
                      "JOIN_GROUP",
                      "GET_PROMOTIONS",
                      "SEND_UPDATES",
                      "INQUIRE_NOW",
                      "VISIT_PROFILE",
                      "CHAT_ON_WHATSAPP",
                      "EXPLORE_MORE",
                      "CONFIRM",
                      "JOIN_CHANNEL",
                      "MAKE_AN_APPOINTMENT",
                      "ASK_ABOUT_SERVICES",
                      "BOOK_A_CONSULTATION",
                      "GET_A_QUOTE",
                      "BUY_VIA_MESSAGE",
                      "ASK_FOR_MORE_INFO",
                      "VIEW_PRODUCT",
                      "VIEW_CHANNEL",
                      "WATCH_LIVE_VIDEO",
                      "JOIN_LIVE_VIDEO",
                      "IMAGINE",
                      "WATCH_NOW",
                      "STREAM_NOW",
                      "BUY_ACTIVITY_TICKETS",
                      "CALL",
                      "MISSED_CALL",
                      "CALL_NOW",
                      "CALL_ME",
                      "APPLY_NOW",
                      "BUY",
                      "GET_QUOTE",
                      "SUBSCRIBE",
                      "RECORD_NOW",
                      "VOTE_NOW",
                      "GIVE_FREE_RIDES",
                      "REGISTER_NOW",
                      "OPEN_MESSENGER_EXT",
                      "EVENT_RSVP",
                      "CIVIC_ACTION",
                      "SEND_INVITES",
                      "REFER_FRIENDS",
                      "REQUEST_TIME",
                      "SEE_MENU",
                      "SEARCH",
                      "TRY_IT",
                      "TRY_ON",
                      "LINK_CARD",
                      "DIAL_CODE",
                      "FIND_YOUR_GROUPS",
                      "START_ORDER"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "descriptions": {
                  "description": "Description (link caption) variations.",
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 5,
                  "type": "array"
                },
                "imageUrls": {
                  "description": "Pool of image URLs (1-10). Uploaded to the ad account and referenced by hash in the asset feed. Mutually exclusive with `videoUrls`.",
                  "items": {
                    "format": "uri",
                    "type": "string"
                  },
                  "maxItems": 10,
                  "minItems": 1,
                  "type": "array"
                },
                "linkUrls": {
                  "description": "Destination URL variations. At least one is required unless `goal` is `lead_generation`.",
                  "items": {
                    "format": "uri",
                    "type": "string"
                  },
                  "type": "array"
                },
                "titles": {
                  "description": "Headline variations.",
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 5,
                  "type": "array"
                },
                "videoUrls": {
                  "description": "Pool of video URLs (1-10). Uploaded to the ad account and referenced by video id in the asset feed. No thumbnails are needed: Meta auto-generates a poster per video. Mutually exclusive with `imageUrls`; `adFormat` defaults to SINGLE_VIDEO.",
                  "items": {
                    "format": "uri",
                    "type": "string"
                  },
                  "maxItems": 10,
                  "minItems": 1,
                  "type": "array"
                }
              },
              "type": "object"
            },
            "endDate": {
              "description": "When the ad ends. If omitted: on a lifetime budget, the ad ends 7 days after it starts (reported in `appliedDefaults.endDate`); a daily budget runs until paused.",
              "format": "date-time",
              "type": "string"
            },
            "existingCampaignId": {
              "description": "Create the new objects under this EXISTING campaign instead of creating a new one. Supported on Meta, Google Ads, LinkedIn, TikTok and Reddit Ads. Mutually exclusive with `adSetId` and `creatives[]`. Must be yours: it is checked through the connection before the request is sent, and an id that is not yours answers not_found.",
              "type": "string"
            },
            "existingCreativeId": {
              "description": "Meta only. Reuse an EXISTING ad creative by id instead of building a new one from the copy/media fields (which are then ignored). Combine with `existingCampaignId` to build a multi-ad-set campaign that shares one creative.",
              "type": "string"
            },
            "gender": {
              "default": "all",
              "description": "Restrict the audience by gender. 'male' targets men only, 'female' targets women only, 'all' (default) targets everyone. Applied on Meta, TikTok, Pinterest and Reddit. Ignored on Google, LinkedIn and X.",
              "enum": [
                "all",
                "male",
                "female"
              ],
              "type": "string"
            },
            "goal": {
              "description": "The ad's goal. Available goals vary by platform. When omitted, it is inferred from the ad (see `appliedDefaults.goal` in the response); the attach shape inherits it from the ad set. Meta `conversions`: OUTCOME_SALES.",
              "enum": [
                "engagement",
                "traffic",
                "awareness",
                "video_views",
                "lead_generation",
                "lead_conversion",
                "conversions",
                "app_promotion",
                "catalog_sales",
                "page_likes",
                "page_visits",
                "job_applicants"
              ],
              "type": "string"
            },
            "headline": {
              "description": "Ad headline. Required for Meta, Google, Pinterest, LinkedIn, OpenAI Ads and Reddit Ads on legacy + attach shapes (for multi-creative, skip it and use `creatives[].headline`). Ignored for TikTok.",
              "type": "string"
            },
            "headlines": {
              "description": "Meta only. Headline variations for Multiple Text Options. Must be sent alongside `bodies`. The top-level `headline` field is used as the `object_story_spec.link_data.name` (`video_data.title` on a video creative).",
              "items": {
                "maxLength": 255,
                "type": "string"
              },
              "maxItems": 5,
              "minItems": 1,
              "type": "array"
            },
            "identityId": {
              "description": "TikTok: the identity the ad runs as, from GET /apis/v1/ads/tiktok-identities. Overrides the connected account's own identity; must be authorized on the advertiser.",
              "type": "string"
            },
            "identityType": {
              "description": "TikTok only. Forces the identity attribution on the ad: `TT_USER`: the posting account's open_id (real @username branding). Requires a connected TikTok posting account on the same profile.",
              "enum": [
                "TT_USER",
                "CUSTOMIZED_USER",
                "BC_AUTH_TT"
              ],
              "type": "string"
            },
            "imageUrl": {
              "description": "Image creative for Meta/Google/Pinterest/LinkedIn on legacy + attach shapes. Mutually exclusive with `video`. LinkedIn: required unless `video` is set.",
              "format": "uri",
              "type": "string"
            },
            "images": {
              "description": "Google Display (Responsive Display Ads) only. Google RDA requires both a landscape (1.91:1) and a square (1:1) marketing image; sending only one is rejected upstream as 'Too few.' (NOT_ENOUGH_*_MARKETING_IMAGE_ASSET). Supply both URLs here.",
              "properties": {
                "landscape": {
                  "description": "Landscape 1.91:1 marketing image URL (e.g. 1200x628). Also accepted via the top-level `imageUrl` for backward compatibility.",
                  "format": "uri",
                  "type": "string"
                },
                "square": {
                  "description": "Square 1:1 marketing image URL (e.g. 1080x1080). Required for Google Display.",
                  "format": "uri",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "incomeTier": {
              "description": "Normalized household-income tier. Meta and TikTok express all four; Google maps only `top_10`; rejected on LinkedIn, X, and Pinterest. On Meta, income targeting is incompatible with housing/employment/credit `specialAdCategories`.",
              "enum": [
                "top_5",
                "top_10",
                "top_10_25",
                "top_25_50"
              ],
              "type": "string"
            },
            "instagramAccountId": {
              "description": "Meta only. Overrides the Instagram account the ad is delivered as. Pass an Instagram Business Account ID (e.g. 17841...), mapped to the creative's `instagram_user_id`; it is sent as-is and never replaced.",
              "type": "string"
            },
            "interests": {
              "description": "Interest objects from /apis/v1/ads/targeting/search?dimension=interest (or dimension=interestKeyword on TikTok). Each must include id and name. TikTok: Bare numeric ids are interest categories (`interest_category_ids`).",
              "items": {
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "name"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "isSkadnetworkAttribution": {
              "description": "Meta app promotion only. Immutable campaign flag. Set true for iOS 14+ SKAdNetwork campaigns and supply promotedObject.applicationId plus promotedObject.objectStoreUrl. The campaign receives promotedObject only when this flag is true.",
              "type": "boolean"
            },
            "keywords": {
              "description": "Google Search only. Keywords on the new ad group; entries are strings (BROAD) or { text, matchType }. Editable later via PUT /apis/v1/ads/{adId} targeting.keywords.",
              "items": {
                "description": "A Google Search keyword: a bare string (BROAD match), or an object naming the match type.",
                "oneOf": [
                  {
                    "description": "Keyword text; defaults to BROAD match",
                    "maxLength": 80,
                    "minLength": 1,
                    "type": "string"
                  },
                  {
                    "properties": {
                      "matchType": {
                        "description": "Defaults to broad. Accepted in any case (EXACT, Exact) and stored lowercase.",
                        "enum": [
                          "exact",
                          "phrase",
                          "broad"
                        ],
                        "type": "string"
                      },
                      "text": {
                        "maxLength": 80,
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "text"
                    ],
                    "type": "object"
                  }
                ]
              },
              "maxItems": 1000,
              "type": "array"
            },
            "languages": {
              "description": "Language codes, e.g. [\"en\",\"es\"]. Google: campaign language targeting (language_constant) using Google's language codes (ISO 639-1, plus variants such as `zh_CN`). Unknown codes return 400.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "leadGenFormId": {
              "description": "Lead Gen form ID to attach to the ad's creative. REQUIRED when `goal` is `lead_generation`. Create one via POST /apis/v1/ads/lead-forms. Meta (facebook/instagram): the leadgen_forms ID.",
              "type": "string"
            },
            "linkUrl": {
              "description": "The ad's destination URL. Required on legacy + attach shapes (skip for multi-creative). NOT required when `goal` is `lead_generation` (the ad opens a Lead Gen form instead).",
              "format": "uri",
              "type": "string"
            },
            "locationTargetingType": {
              "description": "Google only (400 elsewhere). Set on the new campaign; a request that joins an existing campaign (`existingCampaignId` or `adSetId`) returns 400, change that campaign with PUT /apis/v1/ads/campaigns/{campaignId}/targeting instead.",
              "enum": [
                "presence",
                "presence_or_interest"
              ],
              "type": "string"
            },
            "longHeadline": {
              "description": "Google Display only. Defaults to `headline` if omitted. On LinkedIn, reused as the optional secondary description text on traffic (link) ads; omitted if not provided.",
              "maxLength": 90,
              "type": "string"
            },
            "manualCpc": {
              "additionalProperties": false,
              "description": "Google Search and Display only. Manual CPC bidding. Enhanced CPC is not offered: Google no longer lets Search and Display campaigns enable it. Exclusive with every other strategy field.",
              "properties": {
                "maxCpc": {
                  "description": "Max CPC of the ad groups, in the account's currency units: set on the ad group created with the campaign, and on every ad group of the campaign when an update switches it to Manual CPC. Google gives an ad group without one a 0.01 bid.",
                  "exclusiveMinimum": 0,
                  "type": "number"
                }
              },
              "required": [
                "maxCpc"
              ],
              "type": "object"
            },
            "metros": {
              "description": "DMA / metro-area geo targeting (Meta and TikTok). `key` is the platform's metro ID from /apis/v1/ads/targeting/search?dimension=geo&geoType=metro (TikTok metros appear as type `metro`, e.g. the New York DMA).",
              "items": {
                "oneOf": [
                  {
                    "type": "string"
                  },
                  {
                    "properties": {
                      "key": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "key"
                    ],
                    "type": "object"
                  }
                ]
              },
              "type": "array"
            },
            "multiAdvertiser": {
              "description": "Meta only. Multi-advertiser ads: whether Meta may show this ad alongside other advertisers' in one unit. Meta auto-enrols since Aug 2024, so send OPT_OUT to leave.",
              "enum": [
                "OPT_IN",
                "OPT_OUT"
              ],
              "type": "string"
            },
            "name": {
              "description": "Omitted, the ad is named `Ad ` (UTC) and the response reports it in `appliedDefaults.name`.",
              "maxLength": 255,
              "type": "string"
            },
            "negativeKeywords": {
              "description": "Google Search only; other platforms return 400. Ad-group-level negative keywords on the new ad group. Editable later via PUT /apis/v1/ads/{adId} targeting.negativeKeywords.",
              "items": {
                "description": "A Google Search keyword: a bare string (BROAD match), or an object naming the match type.",
                "oneOf": [
                  {
                    "description": "Keyword text; defaults to BROAD match",
                    "maxLength": 80,
                    "minLength": 1,
                    "type": "string"
                  },
                  {
                    "properties": {
                      "matchType": {
                        "description": "Defaults to broad. Accepted in any case (EXACT, Exact) and stored lowercase.",
                        "enum": [
                          "exact",
                          "phrase",
                          "broad"
                        ],
                        "type": "string"
                      },
                      "text": {
                        "maxLength": 80,
                        "minLength": 1,
                        "type": "string"
                      }
                    },
                    "required": [
                      "text"
                    ],
                    "type": "object"
                  }
                ]
              },
              "maxItems": 1000,
              "type": "array"
            },
            "networkSettings": {
              "additionalProperties": false,
              "description": "Google Search only, when the call creates the campaign (400 with existingCampaignId or adSetId).",
              "properties": {
                "displayNetwork": {
                  "description": "campaign.network_settings.target_content_network (Search with Display expansion)",
                  "type": "boolean"
                },
                "searchPartners": {
                  "description": "campaign.network_settings.target_search_network",
                  "type": "boolean"
                }
              },
              "type": "object"
            },
            "optimizationGoal": {
              "description": "Explicit optimization goal. Supported on: TikTok with goal video_views: ENGAGED_VIEW (the 6-second default) or ENGAGED_VIEW_FIFTEEN; both bill per view.",
              "type": "string"
            },
            "optimizeCardOrder": {
              "description": "Meta only (a 400 on any other platform), and only with `carouselCards` (a 400 without them). Sets the creative's `link_data.multi_share_optimized`. `false`: keeps the cards in the order given.",
              "type": "boolean"
            },
            "organizationId": {
              "description": "LinkedIn only (ignored by every other platform). The Company Page that authors the Direct Sponsored Content (\"dark\") post backing the ad. Accepts a numeric organization ID or a full `urn:li:organization:N` URN. Required unless it defaults:",
              "type": "string"
            },
            "pageId": {
              "description": "Meta only. The Facebook Page the ad runs as (`object_story_spec.page_id`). Defaults to the Page bound to the connection. Pass another Page ID to run the ad as that Page.",
              "type": "string"
            },
            "phoneNumber": {
              "description": "Meta attach shape only (`adSetId`). The phone number (E.164, e.g. `+4712345678`) for an ad added to a \"website and phone call\" ad set (destination_type `WEBSITE_AND_PHONE_CALL`), sent as the creative's call configuration.",
              "pattern": "^\\+[1-9]\\d{6,14}$",
              "type": "string"
            },
            "placementAssets": {
              "description": "Meta only. Pins a SPECIFIC asset (image OR video) to each placement group on a SINGLE ad (e.g. a 9:16 on Stories/Reels and a 4:5 on Feed).",
              "properties": {
                "defaultImageUrl": {
                  "description": "Image mode. Catch-all image for any placement no rule matches. Required in image mode (Meta mandates a default rule).",
                  "format": "uri",
                  "type": "string"
                },
                "defaultThumbnailUrl": {
                  "description": "Video mode (optional). Poster image for the default video; Meta auto-generates one when omitted.",
                  "format": "uri",
                  "type": "string"
                },
                "defaultVideoUrl": {
                  "description": "Video mode. Catch-all video for any placement no rule matches. Required in video mode.",
                  "format": "uri",
                  "type": "string"
                },
                "rules": {
                  "description": "One entry per placement group you want to pin a specific asset to.",
                  "items": {
                    "properties": {
                      "body": {
                        "description": "One primary text pinned to this rule. Omit to inherit the top-level body.",
                        "minLength": 1,
                        "type": "string"
                      },
                      "description": {
                        "description": "One link description pinned to this rule. Omit to inherit the top-level description.",
                        "maxLength": 255,
                        "minLength": 1,
                        "type": "string"
                      },
                      "headline": {
                        "description": "One headline pinned to this rule. Omit to inherit the top-level headline.",
                        "maxLength": 255,
                        "minLength": 1,
                        "type": "string"
                      },
                      "imageUrl": {
                        "description": "Image mode. The image to deliver for this rule's placements.",
                        "format": "uri",
                        "type": "string"
                      },
                      "placements": {
                        "description": "Placements this asset is pinned to. At least one field must be set (an empty rule is invalid; that role is served by the default asset). Same enums as the top-level `placements` object.",
                        "properties": {
                          "audienceNetworkPositions": {
                            "items": {
                              "enum": [
                                "classic",
                                "rewarded_video"
                              ],
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "devicePlatforms": {
                            "items": {
                              "enum": [
                                "mobile",
                                "desktop"
                              ],
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "facebookPositions": {
                            "items": {
                              "enum": [
                                "feed",
                                "right_hand_column",
                                "marketplace",
                                "story",
                                "search",
                                "instream_video",
                                "facebook_reels",
                                "facebook_reels_overlay",
                                "profile_feed",
                                "notification"
                              ],
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "instagramPositions": {
                            "items": {
                              "enum": [
                                "stream",
                                "story",
                                "explore",
                                "explore_home",
                                "reels",
                                "profile_feed",
                                "ig_search",
                                "profile_reels"
                              ],
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "messengerPositions": {
                            "items": {
                              "enum": [
                                "messenger_home",
                                "sponsored_messages",
                                "story"
                              ],
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "publisherPlatforms": {
                            "items": {
                              "enum": [
                                "facebook",
                                "instagram",
                                "threads",
                                "messenger",
                                "audience_network",
                                "whatsapp",
                                "meta"
                              ],
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "threadsPositions": {
                            "items": {
                              "enum": [
                                "threads_stream"
                              ],
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "whatsappPositions": {
                            "items": {
                              "enum": [
                                "status"
                              ],
                              "type": "string"
                            },
                            "type": "array"
                          }
                        },
                        "type": "object"
                      },
                      "thumbnailUrl": {
                        "description": "Video mode (optional). Poster image for this rule's video; auto-generated when omitted.",
                        "format": "uri",
                        "type": "string"
                      },
                      "videoUrl": {
                        "description": "Video mode. The video to deliver for this rule's placements.",
                        "format": "uri",
                        "type": "string"
                      }
                    },
                    "required": [
                      "placements"
                    ],
                    "type": "object"
                  },
                  "maxItems": 10,
                  "minItems": 1,
                  "type": "array"
                }
              },
              "required": [
                "rules"
              ],
              "type": "object"
            },
            "placements": {
              "description": "Meta only; non-Meta platforms reject this field. Manual ad placements. Omit for automatic placements (Meta's default, recommended for most cases, since Meta optimises delivery across all eligible surfaces).",
              "properties": {
                "audienceNetworkPositions": {
                  "items": {
                    "enum": [
                      "classic",
                      "rewarded_video"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "devicePlatforms": {
                  "description": "Restrict by device. Omit to deliver on both mobile and desktop.",
                  "items": {
                    "enum": [
                      "mobile",
                      "desktop"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "facebookPositions": {
                  "items": {
                    "enum": [
                      "feed",
                      "right_hand_column",
                      "marketplace",
                      "story",
                      "search",
                      "instream_video",
                      "facebook_reels",
                      "facebook_reels_overlay",
                      "profile_feed",
                      "notification"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "instagramPositions": {
                  "items": {
                    "enum": [
                      "stream",
                      "story",
                      "explore",
                      "explore_home",
                      "reels",
                      "profile_feed",
                      "ig_search",
                      "profile_reels"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "messengerPositions": {
                  "items": {
                    "enum": [
                      "messenger_home",
                      "sponsored_messages",
                      "story"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "publisherPlatforms": {
                  "description": "Top-level platforms to deliver on. A position field below is only honoured when its parent platform is included here.",
                  "items": {
                    "enum": [
                      "facebook",
                      "instagram",
                      "threads",
                      "messenger",
                      "audience_network",
                      "whatsapp",
                      "meta"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "threadsPositions": {
                  "items": {
                    "enum": [
                      "threads_stream"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "whatsappPositions": {
                  "items": {
                    "enum": [
                      "status"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                }
              },
              "type": "object"
            },
            "platformSpecificData": {
              "description": "Platform-specific options. The platform is derived from `connectionId`; options for a different platform return a 400. LinkedIn (campaign bidding and delivery controls) and Meta (the bid trio) have options today. Meta",
              "oneOf": [
                {
                  "additionalProperties": false,
                  "description": "LinkedIn-specific options for POST /apis/v1/ads/boost and POST /apis/v1/ads/create: campaign bidding and delivery controls, plus the LinkedIn-only creative formats on /apis/v1/ads/create. Unknown keys are rejected.",
                  "properties": {
                    "audienceExpansionEnabled": {
                      "description": "Enable LinkedIn audience expansion. Defaults to false.",
                      "type": "boolean"
                    },
                    "carousel": {
                      "additionalProperties": false,
                      "description": "POST /apis/v1/ads/create only. Carousel ad with 2-10 image cards. Mutually exclusive with the other creative sources.",
                      "properties": {
                        "cards": {
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "headline": {
                                "description": "Card title. Falls back to the ad-level headline.",
                                "type": "string"
                              },
                              "imageUrl": {
                                "format": "uri",
                                "type": "string"
                              },
                              "landingUrl": {
                                "description": "Per-card click destination. LinkedIn requires one on every card; the ad-level `linkUrl` backfills cards that omit it.",
                                "format": "uri",
                                "type": "string"
                              }
                            },
                            "required": [
                              "imageUrl"
                            ],
                            "type": "object"
                          },
                          "maxItems": 10,
                          "minItems": 2,
                          "type": "array"
                        }
                      },
                      "required": [
                        "cards"
                      ],
                      "type": "object"
                    },
                    "connectedTelevisionOnly": {
                      "description": "Restrict delivery to Connected TV inventory.",
                      "type": "boolean"
                    },
                    "conversation": {
                      "additionalProperties": false,
                      "description": "POST /apis/v1/ads/create only. Conversation Ad: a choose-your-path message tree delivered to the member's LinkedIn inbox. Messages are flat nodes wired by local ids. Each button either opens a url or leads to nextMessageId.",
                      "properties": {
                        "body": {
                          "description": "Optional intro body (HTML allowed).",
                          "type": "string"
                        },
                        "firstMessageId": {
                          "type": "string"
                        },
                        "footer": {
                          "description": "Terms shown at the bottom of the message.",
                          "type": "string"
                        },
                        "headline": {
                          "description": "Conversation headline. Defaults to the first message's first line.",
                          "type": "string"
                        },
                        "messages": {
                          "items": {
                            "additionalProperties": false,
                            "properties": {
                              "buttons": {
                                "items": {
                                  "additionalProperties": true,
                                  "type": "object"
                                },
                                "maxItems": 5,
                                "minItems": 1,
                                "type": "array"
                              },
                              "id": {
                                "type": "string"
                              },
                              "text": {
                                "maxLength": 500,
                                "type": "string"
                              }
                            },
                            "required": [
                              "id",
                              "text"
                            ],
                            "type": "object"
                          },
                          "maxItems": 25,
                          "minItems": 1,
                          "type": "array"
                        },
                        "sender": {
                          "description": "Person or organization URN. Defaults to the authoring Company Page. The sender must be approved for the ad account first (Campaign Manager > Manage message ad senders) or LinkedIn rejects the create with SINMAIL_SENDER_NOT_APPROVED.",
                          "type": "string"
                        },
                        "subject": {
                          "description": "InMail subject shown in the inbox.",
                          "type": "string"
                        }
                      },
                      "required": [
                        "firstMessageId",
                        "messages",
                        "subject"
                      ],
                      "type": "object"
                    },
                    "costType": {
                      "description": "Campaign cost model (billing event). Defaults to `CPM`. Required when `unitCost` is set so the manual bid applies to an explicit cost model.",
                      "enum": [
                        "CPM",
                        "CPC",
                        "CPV"
                      ],
                      "type": "string"
                    },
                    "creativeSelection": {
                      "description": "How LinkedIn rotates creatives within the campaign. Defaults to `OPTIMIZED`.",
                      "enum": [
                        "OPTIMIZED",
                        "ROUND_ROBIN"
                      ],
                      "type": "string"
                    },
                    "document": {
                      "additionalProperties": false,
                      "description": "POST /apis/v1/ads/create only. Document ad rendered as an in-feed viewer. PDF, PPT or DOC up to 100MB. Mutually exclusive with the other creative sources.",
                      "properties": {
                        "title": {
                          "description": "Document title.",
                          "type": "string"
                        },
                        "url": {
                          "format": "uri",
                          "type": "string"
                        }
                      },
                      "required": [
                        "title",
                        "url"
                      ],
                      "type": "object"
                    },
                    "event": {
                      "additionalProperties": false,
                      "description": "POST /apis/v1/ads/create only. Promotes an existing LinkedIn Event; no headline needed. Mutually exclusive with the other creative sources.",
                      "properties": {
                        "urn": {
                          "description": "LinkedIn Event URN, urn:li:event:N.",
                          "pattern": "^urn:li:event:\\d+$",
                          "type": "string"
                        }
                      },
                      "required": [
                        "urn"
                      ],
                      "type": "object"
                    },
                    "follower": {
                      "additionalProperties": false,
                      "description": "POST /apis/v1/ads/create only. Dynamic Follower Ad promoting the Company Page. Supported goals: engagement, awareness. headline and description take exactly one of preApproved or custom. Mutually exclusive with the other creative sources.",
                      "properties": {
                        "callToAction": {
                          "enum": [
                            "VISIT_ORGANIZATION_COMPANY_PAGE",
                            "VISIT_ORGANIZATION_LIFE_PAGE",
                            "VISIT_ORGANIZATION_JOBS_PAGE",
                            "VISIT_ORGANIZATION_CAREERS_PAGE"
                          ],
                          "type": "string"
                        },
                        "description": {
                          "additionalProperties": false,
                          "properties": {
                            "custom": {
                              "description": "Free text, reviewed by LinkedIn.",
                              "type": "string"
                            },
                            "preApproved": {
                              "description": "LinkedIn preset id, not reviewed. Example GET_LATEST_JOBS_AND_INDUSTRY_NEWS.",
                              "type": "string"
                            }
                          },
                          "type": "object"
                        },
                        "headline": {
                          "additionalProperties": false,
                          "properties": {
                            "custom": {
                              "description": "Free text, reviewed by LinkedIn.",
                              "type": "string"
                            },
                            "preApproved": {
                              "description": "LinkedIn preset id, not reviewed. Example GROW_YOUR_BUSINESS_INSIGHTS.",
                              "type": "string"
                            }
                          },
                          "type": "object"
                        },
                        "logoUrl": {
                          "format": "uri",
                          "type": "string"
                        },
                        "organizationName": {
                          "type": "string"
                        },
                        "showMemberProfilePhoto": {
                          "description": "Defaults to true.",
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "callToAction",
                        "description",
                        "headline"
                      ],
                      "type": "object"
                    },
                    "jobs": {
                      "additionalProperties": false,
                      "description": "POST /apis/v1/ads/create only. Dynamic Jobs Ad promoting your open roles, personalized with the viewer's profile photo. Mutually exclusive with the other creative sources.",
                      "properties": {
                        "buttonLabel": {
                          "additionalProperties": false,
                          "properties": {
                            "custom": {
                              "description": "Free text, reviewed by LinkedIn.",
                              "type": "string"
                            },
                            "preApproved": {
                              "description": "LinkedIn preset id, not reviewed. One of SEE_MORE_JOBS, VIEW_MORE, CAREERS_AT_COMPANY.",
                              "type": "string"
                            }
                          },
                          "type": "object"
                        },
                        "headline": {
                          "additionalProperties": false,
                          "properties": {
                            "custom": {
                              "description": "Free text, reviewed by LinkedIn.",
                              "type": "string"
                            },
                            "preApproved": {
                              "description": "LinkedIn preset id, not reviewed. Example MEMBER_READY_FOR_YOUR_DREAM_JOB.",
                              "type": "string"
                            }
                          },
                          "type": "object"
                        },
                        "logoUrl": {
                          "format": "uri",
                          "type": "string"
                        },
                        "organizationName": {
                          "type": "string"
                        },
                        "showMemberProfilePhoto": {
                          "description": "Defaults to true.",
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "buttonLabel",
                        "headline"
                      ],
                      "type": "object"
                    },
                    "offsiteDeliveryEnabled": {
                      "description": "Deliver on the LinkedIn Audience Network. Defaults to false.",
                      "type": "boolean"
                    },
                    "optimizationTargetType": {
                      "description": "Campaign `optimizationTargetType` (e.g. `MAX_CLICK`, `TARGET_COST_PER_CLICK`, `MAX_IMPRESSION`). Forwarded verbatim; LinkedIn validates compatibility with the objective and `costType`. Default when omitted, derived from the objective:",
                      "type": "string"
                    },
                    "spotlight": {
                      "additionalProperties": false,
                      "description": "POST /apis/v1/ads/create only. Dynamic Spotlight Ad personalized with the viewer's profile photo. Supported goals: traffic, awareness.",
                      "properties": {
                        "backgroundImageUrl": {
                          "description": "Custom background. Replaces the description and the profile photo.",
                          "format": "uri",
                          "type": "string"
                        },
                        "callToAction": {
                          "description": "Button label text.",
                          "type": "string"
                        },
                        "description": {
                          "description": "Mutually exclusive with backgroundImageUrl.",
                          "type": "string"
                        },
                        "headline": {
                          "type": "string"
                        },
                        "landingUrl": {
                          "format": "uri",
                          "type": "string"
                        },
                        "logoUrl": {
                          "format": "uri",
                          "type": "string"
                        },
                        "organizationName": {
                          "type": "string"
                        },
                        "showMemberProfilePhoto": {
                          "description": "Defaults to true.",
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "callToAction",
                        "headline",
                        "landingUrl"
                      ],
                      "type": "object"
                    },
                    "textAd": {
                      "additionalProperties": false,
                      "description": "POST /apis/v1/ads/create only. Classic right-rail Text Ad. The copy lives here; ad-level body and headline are not used. Mutually exclusive with the other creative sources.",
                      "properties": {
                        "description": {
                          "maxLength": 75,
                          "type": "string"
                        },
                        "headline": {
                          "maxLength": 25,
                          "type": "string"
                        },
                        "imageUrl": {
                          "description": "Optional 100x100 image.",
                          "format": "uri",
                          "type": "string"
                        },
                        "landingUrl": {
                          "format": "uri",
                          "type": "string"
                        }
                      },
                      "required": [
                        "description",
                        "headline",
                        "landingUrl"
                      ],
                      "type": "object"
                    },
                    "thoughtLeader": {
                      "additionalProperties": false,
                      "description": "POST /apis/v1/ads/create only. Sponsors an existing LinkedIn post (a share or ugcPost authored by your organization's Company Page) as the creative, keeping its commentary, author and engagement.",
                      "properties": {
                        "postUrn": {
                          "description": "LinkedIn share or ugcPost URN: urn:li:share:N or urn:li:ugcPost:N. Get it via \"Copy link to post\" on the target LinkedIn post. The URL contains -share- (share) or -ugcPost- (ugcPost), then the numeric id.",
                          "pattern": "^urn:li:(share|ugcPost):\\d+$",
                          "type": "string"
                        }
                      },
                      "required": [
                        "postUrn"
                      ],
                      "type": "object"
                    },
                    "unitCost": {
                      "description": "Manual bid in WHOLE account-currency units (e.g. 2.5 = $2.50). Requires `costType`. Omit for LinkedIn's automated (max delivery) bidding. LinkedIn enforces its own per-audience min/max bid bounds.",
                      "type": "number"
                    }
                  },
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "description": "Meta (facebook/instagram) options for platformSpecificData on POST /apis/v1/ads/boost and /apis/v1/ads/create. Unknown keys are rejected, not dropped.",
                  "properties": {
                    "adSchedule": {
                      "description": "Dayparting on the ad set being created (Meta `adset_schedule` with `pacing_type: [\"day_parting\"]`). Change it later with `PUT /apis/v1/ads/ad-sets/{adSetId}`. A 400 with `param: platformSpecificData.adSchedule` when:",
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "dayOfWeek": {
                            "enum": [
                              "MONDAY",
                              "TUESDAY",
                              "WEDNESDAY",
                              "THURSDAY",
                              "FRIDAY",
                              "SATURDAY",
                              "SUNDAY"
                            ],
                            "type": "string"
                          },
                          "endHour": {
                            "description": "Must be after startHour. 24 is midnight at the end of the day.",
                            "maximum": 24,
                            "minimum": 1,
                            "type": "integer"
                          },
                          "startHour": {
                            "maximum": 23,
                            "minimum": 0,
                            "type": "integer"
                          },
                          "timezoneType": {
                            "default": "USER",
                            "description": "Meta `timezone_type`: USER runs the hours in each viewer's time zone, ADVERTISER in the ad account time zone.",
                            "enum": [
                              "USER",
                              "ADVERTISER"
                            ],
                            "type": "string"
                          }
                        },
                        "required": [
                          "dayOfWeek",
                          "endHour",
                          "startHour"
                        ],
                        "type": "object"
                      },
                      "maxItems": 168,
                      "minItems": 1,
                      "type": "array"
                    },
                    "bidAmount": {
                      "description": "Whole currency units (USD: 5 = $5.00). Required when bidStrategy is LOWEST_COST_WITH_BID_CAP or COST_CAP.",
                      "type": "number"
                    },
                    "bidStrategy": {
                      "description": "Meta bid strategy. Same enum applies at campaign and ad-set level; ad-set value (when set) overrides campaign-level. Cross-field rules: `LOWEST_COST_WITHOUT_CAP` (default): auto-bid, forbids `bidAmount` and `roasAverageFloor`.",
                      "enum": [
                        "LOWEST_COST_WITHOUT_CAP",
                        "LOWEST_COST_WITH_BID_CAP",
                        "COST_CAP",
                        "LOWEST_COST_WITH_MIN_ROAS"
                      ],
                      "type": "string"
                    },
                    "customerLifecycle": {
                      "additionalProperties": false,
                      "description": "Meta's Customer Lifecycle Strategy on a Sales ad set (Meta `ad_set_goal`). Rejected with 400 in adSetId attach mode: use PUT /apis/v1/ads/ad-sets/{adSetId} for an ad set that already exists.",
                      "properties": {
                        "engagedAudienceIds": {
                          "description": "Custom audience ids of people who engaged but have not bought. Required with new_customers_excluding_engaged, not allowed with the other strategies. Must be yours: it is checked through the connection before the request is sent, and an id that is not yours answers not_found.",
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        "existingCustomerAudienceIds": {
                          "description": "Custom audience ids that define your existing customers. Required with both new_customers strategies (Meta answers 400 subcode 1870251 without them); not allowed with all_customers. Must be yours: it is checked through the connection before the request is sent, and an id that is not yours answers not_found.",
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        "strategy": {
                          "description": "`all_customers` is \"Maximize conversions from all customers\". `new_customers` is \"Acquire new customers\" (excludes existing customers). `new_customers_excluding_engaged` also excludes people who engaged with you but have not bought yet.",
                          "enum": [
                            "all_customers",
                            "new_customers",
                            "new_customers_excluding_engaged"
                          ],
                          "type": "string"
                        }
                      },
                      "required": [
                        "strategy"
                      ],
                      "type": "object"
                    },
                    "dailyMinSpendTarget": {
                      "description": "Meta daily_min_spend_target on the ad set being created: the least it should spend per day, in whole currency units. A target, not a guarantee.",
                      "type": "number"
                    },
                    "lifetimeMinSpendTarget": {
                      "description": "Meta lifetime_min_spend_target: the lifetime-budget flavour of dailyMinSpendTarget, in whole currency units. Same rules and same rejections.",
                      "type": "number"
                    },
                    "roasAverageFloor": {
                      "description": "Decimal ROAS multiplier (2.0 = 2.0x). Required when bidStrategy is LOWEST_COST_WITH_MIN_ROAS; sending it without bidStrategy is a 400.",
                      "type": "number"
                    }
                  },
                  "type": "object"
                }
              ]
            },
            "portfolioBidStrategyId": {
              "description": "Google Search and Display only. Performance Max rejects portfolio bidding. Attach an existing portfolio bid strategy (numeric id from GET /apis/v1/ads/bid-strategies) to the new campaign instead of a standard one.",
              "pattern": "^\\d+$",
              "type": "string"
            },
            "promotedObject": {
              "additionalProperties": false,
              "description": "What the ad optimises against. Behaviour depends on the platform. Platforms other than Meta, TikTok, OpenAI and Reddit ignore `promotedObject` entirely. Meta: forwarded to the ad set's `promoted_object` (snake-cased).",
              "properties": {
                "applicationId": {
                  "description": "App ID. Required for `goal: app_promotion`.",
                  "type": "string"
                },
                "customConversionId": {
                  "description": "Custom Conversion ID, when optimising against one instead of a standard event. Accepted alone by this API, without `pixelId` or `customEventType`.",
                  "type": "string"
                },
                "customEventStr": {
                  "description": "Meta only. Pixel custom-event name to optimise against (Meta's `custom_event_str`), exactly as it appears in Events Manager and your CAPI payloads (case-sensitive, not uppercased).",
                  "type": "string"
                },
                "customEventType": {
                  "description": "The event the campaign/ad group optimises against. Meta: a standard event like `PURCHASE`, `LEAD`, `COMPLETE_REGISTRATION`, `ADD_TO_CART`. Uppercased internally, so any case works. Required for `goal: conversions`.",
                  "type": "string"
                },
                "objectStoreUrl": {
                  "description": "App Store / Play Store listing URL. Required for `goal: app_promotion`.",
                  "format": "uri",
                  "type": "string"
                },
                "offlineConversionDataSetId": {
                  "description": "Meta only. Offline event set (dataset) to optimise toward. Post-merger these are datasets: the id is the dataset id (for pixel-backed datasets, the pixel id).",
                  "type": "string"
                },
                "pageId": {
                  "description": "Facebook Page ID. Used by `goal: lead_generation`. Auto-filled from the connected Page when omitted.",
                  "type": "string"
                },
                "pixelId": {
                  "description": "Pixel ID. Meta: Facebook Pixel ID, required for `goal: conversions`.",
                  "type": "string"
                },
                "productCatalogId": {
                  "description": "Optional catalog ID. A catalog ID cannot replace productSetId.",
                  "type": "string"
                },
                "productSetId": {
                  "description": "Meta product SET ID, for example from GET /apis/v1/ads/catalogs/{catalogId}/product-sets. Creating catalog ads needs only ads_management on the Meta login, not catalog_management. Where it goes.",
                  "type": "string"
                },
                "whatsappPhoneNumber": {
                  "description": "Meta only. WhatsApp number on messaging-destination ad sets.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "promotion": {
              "description": "Not supported. Send null or omit the field, and set the Promotion on the ad in Ads Manager. Any object is rejected with 400 invalid_field_value.",
              "type": [
                "object",
                "null"
              ]
            },
            "rawTargeting": {
              "additionalProperties": true,
              "description": "Meta only.",
              "type": "object"
            },
            "regionalRegulatedCategories": {
              "description": "Meta only. Regional regulation categories required when the ad set targets certain countries.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "regionalRegulationIdentities": {
              "additionalProperties": {
                "type": [
                  "string",
                  "integer"
                ]
              },
              "description": "Meta only. Verified identity IDs of the beneficiary and payer for each declared regionalRegulatedCategories value. Ignored when adSetId adds the ad to an existing ad set.",
              "type": "object"
            },
            "regions": {
              "description": "Region-level (state/province) geo targeting (Meta, Google and TikTok). Each region is targeted by the platform's opaque `key` (the region ID) which can be looked up via `GET /apis/v1/ads/targeting/search?dimension=geo&q=&countryCode=`.",
              "items": {
                "oneOf": [
                  {
                    "type": "string"
                  },
                  {
                    "properties": {
                      "key": {
                        "description": "Platform region ID, from /apis/v1/ads/targeting/search results.",
                        "type": "string"
                      }
                    },
                    "required": [
                      "key"
                    ],
                    "type": "object"
                  }
                ]
              },
              "type": "array"
            },
            "rfPredictionId": {
              "description": "Meta only. The RESERVED prediction id the R&F ad set runs on (reserving mints a new id, so pass that one). Requires buyingType RESERVED.",
              "type": "string"
            },
            "roasAverageFloor": {
              "description": "Deprecated: send it inside `platformSpecificData` instead (Meta today; TikTok's nested shape is planned). The flat field keeps working during the deprecation window. Sending both shapes returns a 400.",
              "type": "number"
            },
            "savedTargetingId": {
              "description": "ID of a `saved_targeting` audience (created via POST /apis/v1/ads/audiences). When set, its stored TargetingSpec is expanded as the base targeting; inline fields on this body merge on top. Must be yours: it is checked through the connection before the request is sent, and an id that is not yours answers not_found.",
              "type": "string"
            },
            "sitelinks": {
              "description": "Google Search only. Sitelink assets to create and attach at the campaign level. Each entry becomes an Asset (with sitelink_asset + Asset.final_urls) plus a CampaignAsset link (field_type SITELINK).",
              "items": {
                "properties": {
                  "description1": {
                    "description": "First description line under the link text (optional). 35-char cap.",
                    "maxLength": 35,
                    "minLength": 1,
                    "type": "string"
                  },
                  "description2": {
                    "description": "Second description line (optional; usually paired with description1).",
                    "maxLength": 35,
                    "minLength": 1,
                    "type": "string"
                  },
                  "linkUrl": {
                    "description": "Final URL the sitelink navigates to.",
                    "format": "uri",
                    "type": "string"
                  },
                  "text": {
                    "description": "The clickable link text shown under the ad. 25-char cap comes from Google.",
                    "maxLength": 25,
                    "minLength": 1,
                    "type": "string"
                  }
                },
                "required": [
                  "linkUrl",
                  "text"
                ],
                "type": "object"
              },
              "maxItems": 20,
              "minItems": 2,
              "type": "array"
            },
            "smartPlus": {
              "description": "TikTok only. Creates the ad as a TikTok Upgraded Smart+ campaign: TikTok automates targeting, bidding and delivery. Supported goals: `conversions`: Smart+ Web Conversions.",
              "type": "boolean"
            },
            "smartTargeting": {
              "description": "TikTok only (a 400 elsewhere). TikTok Smart Targeting on the ad group. When on, TikTok may deliver beyond the selected audiences or interests. `audience`: TikTok's `smart_audience_enabled`.",
              "properties": {
                "audience": {
                  "description": "TikTok smart_audience_enabled.",
                  "type": "boolean"
                },
                "interestsBehaviors": {
                  "description": "TikTok smart_interest_behavior_enabled.",
                  "type": "boolean"
                }
              },
              "type": "object"
            },
            "specialAdCategories": {
              "description": "Meta only. Declares the ad's special category, required for housing, employment, credit, or political/social-issue ads (Meta enforces restricted targeting for these). Note: setting a special category disables income/zip targeting on Meta.",
              "items": {
                "enum": [
                  "HOUSING",
                  "EMPLOYMENT",
                  "CREDIT",
                  "FINANCIAL_PRODUCTS_SERVICES",
                  "ISSUES_ELECTIONS_POLITICS",
                  "ONLINE_GAMBLING_AND_GAMING"
                ],
                "type": "string"
              },
              "type": "array"
            },
            "specialAdCategoryCountry": {
              "description": "Meta (metaads) only. 2-letter ISO country codes the special ad category applies to. Requires specialAdCategories to be set (400 otherwise).",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "startDate": {
              "description": "Ad-set start time (ISO 8601, e.g. \"2026-06-10T09:00:00Z\"). When omitted the ad starts delivering immediately. Same field as on `POST /apis/v1/ads/boost`.",
              "format": "date-time",
              "type": "string"
            },
            "status": {
              "description": "Publish state of the created entities, on every platform. Omitted or ACTIVE publishes live (default, back-compat).",
              "enum": [
                "ACTIVE",
                "PAUSED"
              ],
              "type": "string"
            },
            "structuredSnippets": {
              "description": "Google Search only. Structured snippets: one header from Google's predefined list plus 3-10 values (max 25 chars each). Each becomes one Asset (`structured_snippet_asset`) plus a CampaignAsset link with field_type STRUCTURED_SNIPPET.",
              "items": {
                "properties": {
                  "header": {
                    "description": "One of Google's 13 predefined snippet headers.",
                    "enum": [
                      "Amenities",
                      "Brands",
                      "Courses",
                      "Degree programs",
                      "Destinations",
                      "Featured hotels",
                      "Insurance coverage",
                      "Models",
                      "Neighborhoods",
                      "Service catalog",
                      "Shows",
                      "Styles",
                      "Types"
                    ],
                    "type": "string"
                  },
                  "values": {
                    "items": {
                      "maxLength": 25,
                      "minLength": 1,
                      "type": "string"
                    },
                    "maxItems": 10,
                    "minItems": 3,
                    "type": "array"
                  }
                },
                "required": [
                  "header",
                  "values"
                ],
                "type": "object"
              },
              "maxItems": 20,
              "minItems": 1,
              "type": "array"
            },
            "targetImpressionShare": {
              "additionalProperties": false,
              "description": "Google Search only. Target impression share bidding. Exclusive with bidStrategy, portfolioBidStrategyId and manualCpc; bidAmount is refused alongside it (the ceiling is maxCpc).",
              "properties": {
                "location": {
                  "enum": [
                    "ANYWHERE_ON_PAGE",
                    "TOP_OF_PAGE",
                    "ABSOLUTE_TOP_OF_PAGE"
                  ],
                  "type": "string"
                },
                "maxCpc": {
                  "description": "Max CPC bid limit, in the account's currency units. Google requires it.",
                  "exclusiveMinimum": 0,
                  "type": "number"
                },
                "percent": {
                  "description": "Target share of impressions, in percent (65 = 65%). Sent to Google as location_fraction_micros (1% = 10,000).",
                  "exclusiveMinimum": 0,
                  "maximum": 100,
                  "type": "number"
                }
              },
              "required": [
                "location",
                "maxCpc",
                "percent"
              ],
              "type": "object"
            },
            "targeting": {
              "description": "Nested targeting object: the same TargetingSpec shape as `POST /apis/v1/ads/boost`, `POST /apis/v1/ads/targeting/reach-estimate`, and `saved_targeting` audiences.",
              "properties": {
                "ageMax": {
                  "description": "Maximum age. Same per-platform application and clamping as ageMin.",
                  "maximum": 100,
                  "minimum": 13,
                  "type": "integer"
                },
                "ageMin": {
                  "description": "Minimum age. Applied on Meta, TikTok, Pinterest, LinkedIn, X and Google Search/Display (Google excludes the age ranges outside the request). Rejected with 400 on OpenAI, Reddit and Google Performance Max / Demand Gen.",
                  "maximum": 100,
                  "minimum": 13,
                  "type": "integer"
                },
                "audienceExclude": {
                  "description": "Platform audience IDs to exclude; same ID formats as audienceInclude. Not supported on OpenAI (400). Must be yours: it is checked through the connection before the request is sent, and an id that is not yours answers not_found.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "audienceInclude": {
                  "description": "Platform audience IDs to include, as returned by GET /apis/v1/ads/audiences: Meta: custom audience ids. TikTok: audience ids. Pinterest: customer list ids. LinkedIn: segment ids (the platformAudienceId from GET /apis/v1/ads/audiences). Must be yours: it is checked through the connection before the request is sent, and an id that is not yours answers not_found.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "behaviors": {
                  "description": "Behaviour entities from /apis/v1/ads/targeting/search?dimension=behavior (Meta, TikTok and LinkedIn). On TikTok they target people who, in the picked categories:",
                  "items": {
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "id"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "cities": {
                  "description": "City targeting. Optional `radius` + `distanceUnit` extend beyond the city limits; both must be set together or both omitted. `radius` is only honoured on platforms whose capability map allows city radius (Meta).",
                  "items": {
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "properties": {
                          "distanceUnit": {
                            "description": "Required if radius is set.",
                            "enum": [
                              "mile",
                              "kilometer"
                            ],
                            "type": "string"
                          },
                          "key": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          },
                          "radius": {
                            "description": "Radius around the city. Requires distanceUnit. Meta enforces a minimum city radius (~17 km / 10 mi); smaller values resolve to a 0-size audience and the ad fails at launch.",
                            "type": "number"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object"
                      }
                    ]
                  },
                  "type": "array"
                },
                "communities": {
                  "description": "Reddit only (400 elsewhere). Subreddits to target, by name, with or without the `r/` prefix (e.g. `['marketing', 'r/startups']`), as returned by /apis/v1/ads/targeting/search?dimension=community.",
                  "items": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": "array"
                },
                "companySizes": {
                  "description": "LinkedIn B2B only. Single-letter size codes (A to I), or the full urn:li:staffCountRange:* URN from /apis/v1/ads/targeting/search?dimension=companySize.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "conversationKeywords": {
                  "description": "Reddit only (400 elsewhere). Keywords that place the ad in Reddit conversations about them, as returned by /apis/v1/ads/targeting/search?dimension=conversationKeyword.",
                  "items": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": "array"
                },
                "countries": {
                  "description": "ISO 3166-1 alpha-2 country codes (e.g. ['US']).",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "countryGroups": {
                  "description": "Meta only. Continents and trade blocs (`geo_locations.country_groups`), for targeting a whole region without listing its countries. Combines with `countries` rather than replacing it, and is also accepted under `excludedLocations`.",
                  "items": {
                    "enum": [
                      "africa",
                      "asia",
                      "europe",
                      "north_america",
                      "south_america",
                      "oceania",
                      "central_america",
                      "caribbean",
                      "eea",
                      "euro_area",
                      "nafta",
                      "mercosur",
                      "afta",
                      "apec",
                      "gcc",
                      "cisfta",
                      "emerging_markets",
                      "itunes_app_store",
                      "android_free_store",
                      "android_paid_store"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "customLocations": {
                  "description": "Point-radius (lat/lng) targeting (Meta custom_locations / Google proximity). Honoured on Meta and Google; ignored on platforms without radius support.",
                  "items": {
                    "properties": {
                      "address": {
                        "description": "Optional label, sent to Meta as `address_string`. latitude/longitude take precedence for the pin location.",
                        "type": "string"
                      },
                      "distanceUnit": {
                        "enum": [
                          "mile",
                          "kilometer"
                        ],
                        "type": "string"
                      },
                      "latitude": {
                        "maximum": 90,
                        "minimum": -90,
                        "type": "number"
                      },
                      "longitude": {
                        "maximum": 180,
                        "minimum": -180,
                        "type": "number"
                      },
                      "name": {
                        "type": "string"
                      },
                      "radius": {
                        "description": "Positive radius around the point.",
                        "type": "number"
                      }
                    },
                    "required": [
                      "distanceUnit",
                      "latitude",
                      "longitude",
                      "radius"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "excludedCommunities": {
                  "description": "Reddit only (400 elsewhere). Subreddits to exclude, named like `communities`.",
                  "items": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": "array"
                },
                "excludedConversationKeywords": {
                  "description": "Reddit only (400 elsewhere). Conversation keywords to keep the ad away from.",
                  "items": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "type": "array"
                },
                "excludedLocations": {
                  "description": "Geo to exclude from the audience. Mirrors the inclusion geo shape. Meta (excluded_geo_locations): excluded cities can carry a radius catchment, and excluded custom (lat/lng) pins are supported.",
                  "properties": {
                    "cities": {
                      "description": "Cities to exclude. Optional `radius` + `distanceUnit` exclude a catchment around the city (both must be set together or both omitted); Meta honours the radius on excluded cities.",
                      "items": {
                        "properties": {
                          "distanceUnit": {
                            "description": "Required if radius is set.",
                            "enum": [
                              "mile",
                              "kilometer"
                            ],
                            "type": "string"
                          },
                          "key": {
                            "type": "string"
                          },
                          "radius": {
                            "description": "Radius around the excluded city. Requires distanceUnit.",
                            "type": "number"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "countries": {
                      "items": {
                        "type": "string"
                      },
                      "type": "array"
                    },
                    "countryGroups": {
                      "description": "Meta only. Continents and trade blocs to exclude (`excluded_geo_locations.country_groups`).",
                      "items": {
                        "enum": [
                          "africa",
                          "asia",
                          "europe",
                          "north_america",
                          "south_america",
                          "oceania",
                          "central_america",
                          "caribbean",
                          "eea",
                          "euro_area",
                          "nafta",
                          "mercosur",
                          "afta",
                          "apec",
                          "gcc",
                          "cisfta",
                          "emerging_markets",
                          "itunes_app_store",
                          "android_free_store",
                          "android_paid_store"
                        ],
                        "type": "string"
                      },
                      "type": "array"
                    },
                    "customLocations": {
                      "description": "Point-radius (lat/lng) pins to exclude (Meta excluded_geo_locations.custom_locations). Mirrors the inclusion customLocations shape.",
                      "items": {
                        "properties": {
                          "address": {
                            "description": "Optional label, sent to Meta as `address_string`. latitude/longitude take precedence for the pin location.",
                            "type": "string"
                          },
                          "distanceUnit": {
                            "enum": [
                              "mile",
                              "kilometer"
                            ],
                            "type": "string"
                          },
                          "latitude": {
                            "maximum": 90,
                            "minimum": -90,
                            "type": "number"
                          },
                          "longitude": {
                            "maximum": 180,
                            "minimum": -180,
                            "type": "number"
                          },
                          "name": {
                            "type": "string"
                          },
                          "radius": {
                            "description": "Positive radius around the point.",
                            "type": "number"
                          }
                        },
                        "required": [
                          "distanceUnit",
                          "latitude",
                          "longitude",
                          "radius"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "neighborhoods": {
                      "description": "Named neighbourhood areas to exclude. `key` from /apis/v1/ads/targeting/search.",
                      "items": {
                        "properties": {
                          "key": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "places": {
                      "description": "Named points of interest to exclude. `key` from /apis/v1/ads/targeting/search.",
                      "items": {
                        "properties": {
                          "key": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "regions": {
                      "items": {
                        "properties": {
                          "key": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "zips": {
                      "items": {
                        "properties": {
                          "key": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    }
                  },
                  "type": "object"
                },
                "gender": {
                  "description": "Restrict by gender. 'all' (default) targets everyone.",
                  "enum": [
                    "all",
                    "male",
                    "female"
                  ],
                  "type": "string"
                },
                "incomeTier": {
                  "description": "Normalized household-income tier (ZIP/percentile based). Meta and TikTok express all four. Google maps only `top_10` (its INCOME_RANGE_90_UP); other tiers on Google, and any income tier on LinkedIn / X / Pinterest, are rejected.",
                  "enum": [
                    "top_5",
                    "top_10",
                    "top_10_25",
                    "top_25_50"
                  ],
                  "type": "string"
                },
                "industries": {
                  "description": "LinkedIn B2B only. Industry URN id fragments, or the full urn:li:industry:* URN from /apis/v1/ads/targeting/search?dimension=industry.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "interests": {
                  "description": "Interest entities from /apis/v1/ads/targeting/search?dimension=interest. Each carries the platform's opaque id.",
                  "items": {
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "id"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "jobFunctions": {
                  "description": "LinkedIn B2B only. Function URN id fragments, or the full urn:li:function:* URN from /apis/v1/ads/targeting/search?dimension=jobFunction.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "languages": {
                  "description": "Language codes restricting the audience by language. Applied on Meta, Google, TikTok, LinkedIn, X, Pinterest and Reddit; rejected with 400 on OpenAI. A code the platform cannot target returns 400 listing the ones it can.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "metros": {
                  "description": "DMA / metro-area targeting. `key` is the platform's metro ID (e.g. Meta `DMA:807`).",
                  "items": {
                    "properties": {
                      "key": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "key"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "regions": {
                  "description": "Region/state targeting. `key` is the platform location ID from /apis/v1/ads/targeting/search?dimension=geo&geoType=region. An entry may also be that id as a plain string (`\"20321\"` is `{ key: \"20321\" }`).",
                  "items": {
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "properties": {
                          "key": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "key"
                        ],
                        "type": "object"
                      }
                    ]
                  },
                  "type": "array"
                },
                "seniorities": {
                  "description": "LinkedIn B2B only. Seniority URN id fragments, or the full urn:li:seniority:* URN from /apis/v1/ads/targeting/search?dimension=seniority.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "skills": {
                  "description": "LinkedIn B2B only. Member skills (e.g. Python, Recruiting): skill URN id fragments, or the full urn:li:skill:* URN from /apis/v1/ads/targeting/search?dimension=skill. Values are ORed; the facet is ANDed with the other facets.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "userDevice": {
                  "description": "Meta only. Device models such as iPhone. Emitted as user_device. May also be supplied inside targeting.",
                  "items": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "minItems": 1,
                  "type": "array"
                },
                "userOs": {
                  "description": "Meta only. Operating systems and version ranges, such as iOS_ver_14.0_and_above or Android. Emitted as user_os. May also be supplied inside targeting.",
                  "items": {
                    "minLength": 1,
                    "type": "string"
                  },
                  "minItems": 1,
                  "type": "array"
                },
                "workEmployers": {
                  "description": "Meta only. Employer entities from /apis/v1/ads/targeting/search?dimension=workEmployer.",
                  "items": {
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "id"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "workIndustries": {
                  "description": "Meta only. Work-industry entities from /apis/v1/ads/targeting/search?dimension=workIndustry. Not interchangeable with the LinkedIn `industries` URN fragments.",
                  "items": {
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "id"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "workPositions": {
                  "description": "Meta only. Job title entities from /apis/v1/ads/targeting/search?dimension=workPosition. Not interchangeable with the LinkedIn `jobTitles` URN fragments.",
                  "items": {
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "id"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "zips": {
                  "description": "Postal/ZIP targeting. `key` is the platform's postal location ID (e.g. Meta `US:94304`). Supported on Meta, Google, TikTok, Pinterest, X.",
                  "items": {
                    "properties": {
                      "key": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "key"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                }
              },
              "type": "object"
            },
            "tracking": {
              "description": "Ad tracking. Meta, plus `urlTags` on ChatGPT (OpenAI) and `pixelId` on Reddit. Meta: attaches pixel measurement to the ad regardless of the optimization goal (the \"Website events\" tracking row in Ads Manager).",
              "properties": {
                "pixelId": {
                  "description": "Meta Pixel ID to attach for offsite-conversion measurement, or the Reddit pixel of the new ad group.",
                  "type": "string"
                },
                "urlTags": {
                  "description": "Click-URL params. Meta: stored on the creative as `url_tags` and returned by GET /apis/v1/ads/{adId}/tracking-tags.",
                  "items": {
                    "properties": {
                      "key": {
                        "type": "string"
                      },
                      "value": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "key",
                      "value"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                }
              },
              "type": "object"
            },
            "translations": {
              "description": "Meta only. Multi-language ads (Dynamic Language Optimization, the \"Languages\" toggle in Ads Manager): ONE ad with per-locale copy and, optionally, per-locale media.",
              "items": {
                "properties": {
                  "body": {
                    "description": "Primary text for this language. REQUIRED, and must differ from every other locale and from the ad's top-level body.",
                    "type": "string"
                  },
                  "description": {
                    "description": "Link description for this language. REQUIRED, and must differ from every other locale and from the ad's top-level description.",
                    "maxLength": 255,
                    "type": "string"
                  },
                  "headline": {
                    "description": "Headline for this language. REQUIRED, and must differ from every other locale and from the ad's top-level headline.",
                    "maxLength": 255,
                    "type": "string"
                  },
                  "imageUrl": {
                    "description": "Image for this language. Inherits the ad's `imageUrl` when omitted. The feed is all-image OR all-video.",
                    "format": "uri",
                    "type": "string"
                  },
                  "linkUrl": {
                    "description": "Destination URL for this language. Inherits the ad's top-level `linkUrl` when omitted, and requires it to be present (400 otherwise): the top-level URL is the destination for every locale you did not override.",
                    "format": "uri",
                    "type": "string"
                  },
                  "locale": {
                    "description": "Language code, resolved to Meta's numeric locale id. Bare codes target the '(All)' umbrella (`es` = every Spanish variant); region-qualified codes target the variant (`pt_BR`, `en_GB`).",
                    "type": "string"
                  },
                  "thumbnailUrl": {
                    "description": "Poster frame for this language's video.",
                    "format": "uri",
                    "type": "string"
                  },
                  "videoUrl": {
                    "description": "Video for this language. Inherits the ad's `video.url` when omitted. The feed is all-image OR all-video.",
                    "format": "uri",
                    "type": "string"
                  }
                },
                "required": [
                  "body",
                  "description",
                  "headline",
                  "locale"
                ],
                "type": "object"
              },
              "maxItems": 10,
              "minItems": 1,
              "type": "array"
            },
            "userDevice": {
              "description": "Meta only. Device models such as iPhone. Emitted as user_device. May also be supplied inside targeting.",
              "items": {
                "minLength": 1,
                "type": "string"
              },
              "minItems": 1,
              "type": "array"
            },
            "userOs": {
              "description": "Meta only. Operating systems and version ranges, such as iOS_ver_14.0_and_above or Android. Emitted as user_os. May also be supplied inside targeting.",
              "items": {
                "minLength": 1,
                "type": "string"
              },
              "minItems": 1,
              "type": "array"
            },
            "validateOnly": {
              "description": "Validate the request without creating anything. Any other platform, or a Google campaignType other than pmax or demand_gen, returns 501 `feature_not_available`.",
              "type": "boolean"
            },
            "valueRuleSetId": {
              "description": "Meta only (facebook, instagram; other platforms return 400). Value rule set to attach to the new ad set, from `/apis/v1/ads/value-rule-sets`. Attachment is driven by this id, so `valueRulesApplied` is optional alongside it.",
              "pattern": "^\\d+$",
              "type": "string"
            },
            "valueRulesApplied": {
              "description": "Meta only (facebook, instagram; other platforms return 400). Optional when attaching, and requires `valueRuleSetId`.",
              "type": "boolean"
            },
            "video": {
              "description": "Creates a single VIDEO ad. Meta (facebook, instagram), LinkedIn and Reddit. Mutually exclusive with `imageUrl`. Supply `url` to upload a file, or `id` to reuse a video already on the ad account (list them with GET /apis/v1/ads/videos).",
              "properties": {
                "id": {
                  "description": "Meta only. Reuse a video ALREADY uploaded to this ad account instead of re-uploading the file: pass the `videoId` returned by a previous create.",
                  "type": "string"
                },
                "thumbnailUrl": {
                  "description": "Public URL of a still-image thumbnail for the video. OPTIONAL. Meta, omitted: the poster is auto-generated from Meta's own preferred video thumbnail (the candidates Ads Manager shows), so video ads usually publish without one.",
                  "format": "uri",
                  "type": "string"
                },
                "url": {
                  "description": "Public URL of the video. Meta: uploaded via chunked transfer on /act_X/advideos, then the request blocks on Meta's transcoding until status.video_status === 'ready'.",
                  "format": "uri",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "workEmployers": {
              "description": "Meta only. Employer entities from /apis/v1/ads/targeting/search?dimension=workEmployer. Each must include id.",
              "items": {
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "workIndustries": {
              "description": "Meta only. Work-industry entities from /apis/v1/ads/targeting/search?dimension=workIndustry. Each must include id. Rejected on other platforms (use LinkedIn's `industries` there).",
              "items": {
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "workPositions": {
              "description": "Meta only. Job title entities from /apis/v1/ads/targeting/search?dimension=workPosition. Each must include id. Rejected on other platforms (use LinkedIn's `jobTitles` there).",
              "items": {
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "zips": {
              "description": "Postal/ZIP geo targeting. `key` is the platform's postal location ID from /apis/v1/ads/targeting/search?dimension=geo&geoType=zip. Supported on Meta, Google, TikTok, Pinterest, X.",
              "items": {
                "oneOf": [
                  {
                    "type": "string"
                  },
                  {
                    "properties": {
                      "key": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "key"
                    ],
                    "type": "object"
                  }
                ]
              },
              "type": "array"
            }
          },
          "required": [
            "adAccountId"
          ],
          "type": "object"
        }
      }
    },
    "required": true
  },
  "x-aisa-status": "enabled",
  "x-aisa-pricing": {
    "description": "Ads operations are free. Ad spend is billed by the ad platform to the connected ad account, never by AIsa.",
    "kind": "no_customer_charge"
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "scheme": "bearer",
        "type": "http"
      }
    }
  }
}
```

## Cost and request rules

A request reference price is not currently available; use a request quote where supported. Account-specific pricing and final settlement may differ.

Published reference values are not an account-specific quote or a settled charge. For endpoints supporting X-AISA-Cost-Mode: quote, obtain a free quote for your exact request before execution; reconcile the settled cost with response metadata and Usage Logs. USD amounts use 1,000,000 integer micro-USD per dollar.


## OpenAPI

````yaml reference-contracts/aisa-ads.json POST /apis/v1/ads/create
openapi: 3.1.0
info:
  description: ''
  title: AIsa Ads
  version: '1'
  x-aisa-capabilities:
    idempotency: Idempotency-Key
    max_price: X-AISA-Max-Price-USD
    quote:
      header: X-AISA-Cost-Mode
      value: quote
  x-aisa-configured-paths: []
  x-aisa-document:
    facts_hash: fe60122939c67dc98a3a6ac6b97bd5c326b526105150c8959304dd2160d4dd09
    generator_version: '3'
    protocol_version: '1'
    schema_version: '1'
    composer_version: '27'
    response_pending: []
    document_hash: sha256:ba353f59e89e1ebabe0e301d8ef57d3cbfa6bb406a8c591ee9c3833d64b60520
  x-aisa-plans:
    builder: 1
    display_plan: payg
    payg: 1
    similarweb_payg: 1
    team: 1
    version: e70a0959cd1b93b84ae16dffd7a538273ddb9c1d46277b82823c37ff1b6bc0fb
  x-aisa-provider: aisa-ads
  x-aisa-catalogs:
    aisa-ads:
      title: AIsa Ads
      description: ''
      x-aisa-document:
        facts_hash: fe60122939c67dc98a3a6ac6b97bd5c326b526105150c8959304dd2160d4dd09
        generator_version: '3'
        protocol_version: '1'
        schema_version: '1'
      x-aisa-plans:
        builder: 1
        display_plan: payg
        payg: 1
        similarweb_payg: 1
        team: 1
        version: e70a0959cd1b93b84ae16dffd7a538273ddb9c1d46277b82823c37ff1b6bc0fb
      x-aisa-capabilities:
        idempotency: Idempotency-Key
        max_price: X-AISA-Max-Price-USD
        quote:
          header: X-AISA-Cost-Mode
          value: quote
servers:
  - url: https://api.aisa.one
security:
  - bearerAuth: []
paths:
  /apis/v1/ads/create:
    post:
      summary: Create standalone ad
      description: >-
        Ad Campaigns. Can spend money or change spend: needs the ads:spend scope
        and X-Aisa-Confirm: spend; without the header the request is refused
        with confirmation_required and nothing is sent. Creates a campaign, ad
        set and ad in one call; it spends its budget once the platform approves
        it. validateOnly=true checks the request without acting and needs no
        confirmation. Creates a paid ad with your own creative, building the
        campaign and ad set it needs or adding it to existing ones. Works across
        Meta, Google Ads, Pinterest, TikTok, X, LinkedIn, OpenAI Ads (ChatGPT
        Ads) and Reddit Ads. Per-platform required fields, budget minimums, and
        video-ad rules are documented on each property below. ### Request shapes
        The body selects one of these mutually exclusive shapes:


        <!-- aisa-pricing:start -->

        A request reference price is not currently available; use a request
        quote where supported. Account-specific pricing and final settlement may
        differ.

        <!-- aisa-pricing:end -->
      operationId: post_aisa_ads_apis_v1_ads_create
      parameters:
        - description: >-
            The ads connection (adc_...) the request runs on: one of yours, from
            GET /apis/v1/ads/connections. On a request with a JSON body it may
            be sent as a top-level body member instead.
          in: query
          name: connectionId
          required: true
          schema:
            pattern: ^adc_[0-9A-Za-z]+$
            type: string
        - description: >-
            Required with the value "spend" when the request can spend money or
            change spend. Without it the request is refused with 409
            confirmation_required, which describes what would happen; nothing is
            sent to the ad platform.
          in: header
          name: X-Aisa-Confirm
          required: false
          schema:
            enum:
              - spend
            type: string
        - description: >-
            Passed to the ad platform integration: a retry with the same key
            returns the first result instead of acting twice. AIsa never retries
            a write for you.
          in: header
          name: Idempotency-Key
          required: false
          schema:
            maxLength: 191
            minLength: 1
            type: string
      requestBody:
        content:
          application/json:
            example:
              adAccountId: '9122445560'
              body: Same-day repairs across Lyon.
              budgetAmount: 5
              budgetType: daily
              campaignType: search
              cities:
                - '1006410'
              connectionId: adc_7f3k2m9q
              goal: traffic
              headline: Plumber in Lyon
              keywords:
                - plombier lyon
              linkUrl: https://example.com
              locationTargetingType: presence
              name: Lyon plumbing
              status: PAUSED
            schema:
              additionalProperties: true
              properties:
                adAccountId:
                  type: string
                adName:
                  description: >-
                    Meta only. Exact ad name (the single-creative ad object's
                    name). Overrides the default, which is `name`. (For per-ad
                    names on the multi-creative shape, set `name` on each
                    `creatives[]` entry instead.)
                  maxLength: 255
                  type: string
                adSetId:
                  description: >-
                    When present, switches to the attach shape: adds one new ad
                    to this existing ad set without creating a new campaign.
                    Mutually exclusive with `creatives[]`. Must be yours: it is
                    checked through the connection before the request is sent,
                    and an id that is not yours answers not_found.
                  type: string
                adSetName:
                  description: >-
                    Exact ad set name. Meta, Reddit and Google (the ad group).
                    Overrides the default ` - Ad Set` (Google Search and
                    Display: ` - Ad Group`). Ignored when the request joins an
                    existing ad set (`adSetId`).
                  maxLength: 255
                  type: string
                adSetStatus:
                  description: >-
                    Every platform. Sets the switch of the new ad set alone and
                    overrides `status` for it. When omitted, it follows
                    `status`.
                  enum:
                    - ACTIVE
                    - PAUSED
                  type: string
                adStatus:
                  description: >-
                    Request-side publish switch for `adStatus` on ad creation
                    endpoints only (`status`, `campaignStatus` and `adSetStatus`
                    carry their own inline ACTIVE/PAUSED enum there; the
                    status-update endpoints are a separate lowercase
                    `active`/`paused`…
                  enum:
                    - ACTIVE
                    - PAUSED
                  type: string
                additionalDescriptions:
                  description: >-
                    Google Search RSA only. Extra text assets, as strings or
                    objects with text and optional pinnedField. Existing string
                    input remains supported.
                  items:
                    oneOf:
                      - maxLength: 90
                        minLength: 1
                        type: string
                      - properties:
                          pinnedField:
                            description: >-
                              Optional fixed description position. Omit to leave
                              the asset unpinned.
                            enum:
                              - DESCRIPTION_1
                              - DESCRIPTION_2
                            type: string
                          text:
                            maxLength: 90
                            minLength: 1
                            type: string
                        required:
                          - text
                        type: object
                  type: array
                additionalHeadlines:
                  description: >-
                    Google Search RSA only. Extra text assets, as strings or
                    objects with text and optional pinnedField. String input
                    remains supported.
                  items:
                    oneOf:
                      - maxLength: 30
                        minLength: 1
                        type: string
                      - properties:
                          pinnedField:
                            description: >-
                              Optional fixed headline position. Omit to leave
                              the asset unpinned.
                            enum:
                              - HEADLINE_1
                              - HEADLINE_2
                              - HEADLINE_3
                            type: string
                          text:
                            maxLength: 30
                            minLength: 1
                            type: string
                        required:
                          - text
                        type: object
                  type: array
                advantageAudience:
                  description: >-
                    Meta only. Controls the Advantage audience feature
                    (targeting_automation). 0 = disabled (default), 1 = enabled.
                    Meta Marketing API requires this field on all ad set
                    creation requests.
                  enum:
                    - 0
                    - 1
                  type: integer
                ageMax:
                  maximum: 65
                  minimum: 13
                  type: integer
                ageMin:
                  maximum: 65
                  minimum: 13
                  type: integer
                aiDisclosure:
                  description: >-
                    Meta only. Meta's "Ad includes media created or edited with
                    AI" disclosure (the Ads Manager checkbox), stored on the
                    creative as
                    `generative_asset_spec.transparency_metadata.self_disclosure`.
                    OPT_IN: checks it.
                  enum:
                    - OPT_IN
                    - OPT_OUT
                  type: string
                assetGroup:
                  additionalProperties: false
                  description: >-
                    Google Performance Max creative assets. At least one
                    description must be 60 characters or fewer. Texts within
                    each list must be distinct.
                  properties:
                    businessName:
                      maxLength: 25
                      minLength: 1
                      type: string
                    descriptions:
                      description: At least one description must be 60 characters or fewer.
                      items:
                        maxLength: 90
                        minLength: 1
                        type: string
                      maxItems: 5
                      minItems: 2
                      type: array
                      uniqueItems: true
                    finalUrl:
                      description: Required destination URL.
                      format: uri
                      pattern: ^https?://
                      type: string
                    headlines:
                      items:
                        maxLength: 30
                        minLength: 1
                        type: string
                      maxItems: 15
                      minItems: 3
                      type: array
                      uniqueItems: true
                    images:
                      additionalProperties: false
                      description: >-
                        Public HTTP(S) image URLs. GIF, JPEG or PNG, at most
                        5120 KB per image. Google validates dimensions and
                        aspect ratios.
                      properties:
                        landscape:
                          description: >-
                            Landscape marketing images. Aspect ratio 1.91:1,
                            minimum 600 x 314 pixels.
                          items:
                            format: uri
                            pattern: ^https?://
                            type: string
                          maxItems: 20
                          minItems: 1
                          type: array
                        logo:
                          description: >-
                            Required square logos. Aspect ratio 1:1, minimum 128
                            x 128 pixels.
                          items:
                            format: uri
                            pattern: ^https?://
                            type: string
                          maxItems: 5
                          minItems: 1
                          type: array
                        square:
                          description: >-
                            Square marketing images. Aspect ratio 1:1, minimum
                            300 x 300 pixels.
                          items:
                            format: uri
                            pattern: ^https?://
                            type: string
                          maxItems: 20
                          minItems: 1
                          type: array
                      required:
                        - landscape
                        - logo
                        - square
                      type: object
                    longHeadline:
                      maxLength: 90
                      minLength: 1
                      type: string
                    name:
                      description: Defaults to the request name.
                      maxLength: 128
                      minLength: 1
                      type: string
                    youtubeVideoId:
                      description: >-
                        Optional existing YouTube video id. Google can generate
                        video when omitted. Video uploads and arbitrary video
                        URLs are not supported.
                      pattern: ^[A-Za-z0-9_-]{11}$
                      type: string
                  required:
                    - businessName
                    - descriptions
                    - finalUrl
                    - headlines
                    - images
                    - longHeadline
                  type: object
                attributionSpec:
                  description: >-
                    Meta only. Conversion attribution window for the ad set,
                    mapping 1:1 to Meta's ad-set `attribution_spec`. Only
                    honored for conversion goals (`conversions`,
                    `lead_generation`, `app_promotion`); ignored for
                    awareness/traffic/engagement.
                  items:
                    properties:
                      eventType:
                        enum:
                          - CLICK_THROUGH
                          - VIEW_THROUGH
                          - ENGAGED_VIDEO_VIEW
                        type: string
                      windowDays:
                        enum:
                          - 1
                          - 7
                          - 28
                        type: integer
                    required:
                      - eventType
                      - windowDays
                    type: object
                  maxItems: 3
                  minItems: 1
                  type: array
                audienceId:
                  description: >-
                    Custom audience ID for targeting Must be yours: it is
                    checked through the connection before the request is sent,
                    and an id that is not yours answers not_found.
                  type: string
                behaviors:
                  description: >-
                    Behaviour entities from
                    /apis/v1/ads/targeting/search?dimension=behavior (Meta,
                    TikTok and LinkedIn). Each must include id. On TikTok:
                  items:
                    properties:
                      id:
                        type: string
                      name:
                        type: string
                    required:
                      - id
                    type: object
                  type: array
                bidAmount:
                  description: >-
                    Deprecated: send it inside `platformSpecificData` instead
                    (Meta today; TikTok's nested shape is planned). The flat
                    field keeps working during the deprecation window; sending
                    both shapes returns a 400.
                  type: number
                bidStrategy:
                  description: >-
                    Deprecated: send it inside `platformSpecificData` instead
                    (Meta today; TikTok's nested shape is planned). The flat
                    field keeps working during the deprecation window. Sending
                    both shapes returns a 400.
                  enum:
                    - LOWEST_COST_WITHOUT_CAP
                    - LOWEST_COST_WITH_BID_CAP
                    - COST_CAP
                    - LOWEST_COST_WITH_MIN_ROAS
                  type: string
                billingEvent:
                  description: >-
                    Meta only. Explicit ad-set `billing_event`. Defaults to
                    `IMPRESSIONS`. Forwarded verbatim to Meta, which validates
                    compatibility with the optimization goal.
                  type: string
                boardId:
                  description: Pinterest only. Board ID (auto-creates if not provided).
                  type: string
                bodies:
                  description: >-
                    Meta only. Multiple Text Options (Advantage+ Flexible
                    Format): 1-5 primary-text variations that Meta optimises
                    delivery across, WITHOUT enabling full Dynamic Creative
                    (`dynamicCreative`).
                  items:
                    type: string
                  maxItems: 5
                  minItems: 1
                  type: array
                body:
                  description: >-
                    Required on legacy + attach shapes. X: the tweet text (max
                    280 chars including a ~24-char URL when `linkUrl` is set).
                    LinkedIn: the post commentary (the intro text shown above
                    the ad). OpenAI Ads: the chat card's body text.
                  type: string
                brandIdentity:
                  description: >-
                    TikTok only; non-TikTok platforms ignore this field.
                    Synthetic Brand Identity used when the ad attributes to a
                    CUSTOMIZED_USER (instead of a real TT_USER @username).
                  properties:
                    displayName:
                      description: Brand name shown above the ad on TikTok.
                      maxLength: 40
                      minLength: 1
                      type: string
                    imageUrl:
                      description: >-
                        Public URL of a square brand image (≥98×98 px, JPG/PNG).
                        Used as the brand avatar on the ad.
                      format: uri
                      type: string
                  required:
                    - displayName
                    - imageUrl
                  type: object
                budgetAmount:
                  description: >-
                    Budget in WHOLE currency units (USD: 50 = $50.00), NOT
                    cents. Meta's own Marketing API takes this number in minor
                    units, an easy and expensive mix-up. Required on legacy,
                    multi-creative and Performance Max shapes. Inherited on
                    attach.
                  type: number
                budgetLevel:
                  default: adset
                  description: >-
                    Meta only. Where the budget lives, which selects the Meta
                    budget model: `adset` (default): ABO (Ad-set Budget
                    Optimization). The budget is set on the ad set.
                    Back-compatible; omit this field to keep it.
                  enum:
                    - adset
                    - campaign
                  type: string
                budgetType:
                  description: >-
                    Defaults to daily when `budgetAmount` is sent without it
                    (reported in `appliedDefaults.budgetType`). Inherited on
                    attach. OpenAI Ads: accepts both as the campaign's single
                    spend cap.
                  enum:
                    - daily
                    - lifetime
                  type: string
                businessName:
                  description: Google Display only
                  maxLength: 25
                  type: string
                buyingType:
                  default: AUCTION
                  description: >-
                    Meta only. Buying type. Defaults to AUCTION and is
                    explicitly sent on new campaigns, including validateOnly.
                    Reusing existingCampaignId does not change the campaign.
                    RESERVED = Reach & Frequency:
                  enum:
                    - AUCTION
                    - RESERVED
                  type: string
                callToAction:
                  description: >-
                    The ad's call-to-action button. Meta: required on legacy +
                    attach shapes. Accepts every call to action type Meta itself
                    accepts (the enum lists them), including values such as
                    SEE_DETAILS that ads synced from Meta carry.
                  enum:
                    - BOOK_TRAVEL
                    - CONTACT_US
                    - DONATE
                    - DONATE_NOW
                    - DOWNLOAD
                    - GET_DIRECTIONS
                    - GO_LIVE
                    - INTERESTED
                    - LEARN_MORE
                    - SEE_DETAILS
                    - LIKE_PAGE
                    - MESSAGE_PAGE
                    - RAISE_MONEY
                    - SAVE
                    - SEND_TIP
                    - SHOP_NOW
                    - SIGN_UP
                    - VIEW_INSTAGRAM_PROFILE
                    - INSTAGRAM_MESSAGE
                    - LOYALTY_LEARN_MORE
                    - PURCHASE_GIFT_CARDS
                    - PAY_TO_ACCESS
                    - SEE_MORE
                    - TRY_IN_CAMERA
                    - WHATSAPP_LINK
                    - GET_IN_TOUCH
                    - TRY_NOW
                    - ASK_A_QUESTION
                    - START_A_CHAT
                    - CHAT_NOW
                    - ASK_US
                    - CHAT_WITH_US
                    - SHOP_ON_RETAILER
                    - BOOK_NOW
                    - CHECK_AVAILABILITY
                    - ORDER_NOW
                    - WHATSAPP_MESSAGE
                    - GET_MOBILE_APP
                    - INSTALL_MOBILE_APP
                    - USE_MOBILE_APP
                    - INSTALL_APP
                    - USE_APP
                    - PLAY_GAME
                    - TRY_DEMO
                    - WATCH_VIDEO
                    - WATCH_MORE
                    - OPEN_LINK
                    - NO_BUTTON
                    - LISTEN_MUSIC
                    - MOBILE_DOWNLOAD
                    - GET_OFFER
                    - GET_OFFER_VIEW
                    - BUY_NOW
                    - BUY_TICKETS
                    - UPDATE_APP
                    - BET_NOW
                    - ADD_TO_CART
                    - SELL_NOW
                    - GET_SHOWTIMES
                    - LISTEN_NOW
                    - GET_EVENT_TICKETS
                    - REMIND_ME
                    - SEARCH_MORE
                    - PRE_REGISTER
                    - SWIPE_UP_PRODUCT
                    - SWIPE_UP_SHOP
                    - PLAY_GAME_ON_FACEBOOK
                    - VISIT_WORLD
                    - OPEN_INSTANT_APP
                    - JOIN_GROUP
                    - GET_PROMOTIONS
                    - SEND_UPDATES
                    - INQUIRE_NOW
                    - VISIT_PROFILE
                    - CHAT_ON_WHATSAPP
                    - EXPLORE_MORE
                    - CONFIRM
                    - JOIN_CHANNEL
                    - MAKE_AN_APPOINTMENT
                    - ASK_ABOUT_SERVICES
                    - BOOK_A_CONSULTATION
                    - GET_A_QUOTE
                    - BUY_VIA_MESSAGE
                    - ASK_FOR_MORE_INFO
                    - VIEW_PRODUCT
                    - VIEW_CHANNEL
                    - WATCH_LIVE_VIDEO
                    - JOIN_LIVE_VIDEO
                    - IMAGINE
                    - WATCH_NOW
                    - STREAM_NOW
                    - BUY_ACTIVITY_TICKETS
                    - CALL
                    - MISSED_CALL
                    - CALL_NOW
                    - CALL_ME
                    - APPLY_NOW
                    - BUY
                    - GET_QUOTE
                    - SUBSCRIBE
                    - RECORD_NOW
                    - VOTE_NOW
                    - GIVE_FREE_RIDES
                    - REGISTER_NOW
                    - OPEN_MESSENGER_EXT
                    - EVENT_RSVP
                    - CIVIC_ACTION
                    - SEND_INVITES
                    - REFER_FRIENDS
                    - REQUEST_TIME
                    - SEE_MENU
                    - SEARCH
                    - TRY_IT
                    - TRY_ON
                    - LINK_CARD
                    - DIAL_CODE
                    - FIND_YOUR_GROUPS
                    - START_ORDER
                    - REGISTER
                    - JOIN
                    - ATTEND
                    - REQUEST_DEMO
                    - VIEW_QUOTE
                    - APPLY
                  type: string
                callouts:
                  description: >-
                    Google Search only. Short callout texts (max 25 chars each)
                    that appear as non-clickable annotations under the ad, e.g.
                    "Free shipping", "24/7 support".
                  items:
                    maxLength: 25
                    minLength: 1
                    type: string
                  maxItems: 20
                  minItems: 1
                  type: array
                campaignAttribution:
                  description: >-
                    Meta ad-set attribution. Required as SKADNETWORK for iOS 14+
                    app promotion or a SKAdNetwork campaign. Requires AUCTION
                    buying. Standalone Meta ad-set creation is not supported;
                    use this field on /apis/v1/ads/create.
                  enum:
                    - AEM
                    - SKADNETWORK
                  type: string
                campaignName:
                  description: >-
                    Meta, Reddit and Google. Exact campaign name; overrides the
                    default ` - Campaign`. Ignored when the request joins an
                    existing campaign or ad set. Google: no line breaks and at
                    most 255 characters, checked before calling Google.
                  maxLength: 255
                  type: string
                campaignNegativeKeywords:
                  description: >-
                    Google Search only; other platforms return 400.
                    Campaign-level negative keywords
                    (campaign_criterion.negative), created alongside the ad
                    group. Editable later via PUT
                    /apis/v1/ads/campaigns/{campaignId}/negative-keywords.
                  items:
                    description: >-
                      A Google Search keyword: a bare string (BROAD match), or
                      an object naming the match type.
                    oneOf:
                      - description: Keyword text; defaults to BROAD match
                        maxLength: 80
                        minLength: 1
                        type: string
                      - properties:
                          matchType:
                            description: >-
                              Defaults to broad. Accepted in any case (EXACT,
                              Exact) and stored lowercase.
                            enum:
                              - exact
                              - phrase
                              - broad
                            type: string
                          text:
                            maxLength: 80
                            minLength: 1
                            type: string
                        required:
                          - text
                        type: object
                  maxItems: 1000
                  type: array
                campaignStatus:
                  description: >-
                    Every platform. Sets the switch of the new campaign alone
                    (LinkedIn: the campaign group) and overrides `status` for
                    it. Omitted, it follows `status`. Ignored when the request
                    creates no campaign (`existingCampaignId` or `adSetId`).
                  enum:
                    - ACTIVE
                    - PAUSED
                  type: string
                campaignType:
                  default: display
                  description: >-
                    Google only. Performance Max requires assetGroup and Demand
                    Gen requires demandGen; both are always created PAUSED. With
                    `adSetId` it defaults to the ad group's own campaign type
                    instead of display.
                  enum:
                    - display
                    - search
                    - pmax
                    - demand_gen
                  type: string
                carouselCards:
                  description: >-
                    Carousel cards. Behavior per platform: Reddit: builds a
                    carousel ad.
                  items:
                    properties:
                      callToAction:
                        description: >-
                          Card CTA override. Defaults to the top-level
                          callToAction; same enum.
                        type: string
                      description:
                        description: Card description, shown under the headline.
                        maxLength: 255
                        type: string
                      headline:
                        description: Card headline, shown below the card image.
                        maxLength: 255
                        type: string
                      imageUrl:
                        description: >-
                          Card image; uploaded to the ad account and referenced
                          by hash.
                        format: uri
                        type: string
                      linkUrl:
                        description: >-
                          Card destination URL. Defaults to the top-level
                          linkUrl, or Meta's lead-form link when leadGenFormId
                          is set and neither is provided.
                        format: uri
                        type: string
                    required:
                      - imageUrl
                    type: object
                  maxItems: 10
                  minItems: 2
                  type: array
                catalogFormat:
                  description: >-
                    Meta catalog template creatives only (goal `catalog_sales`,
                    goal `traffic` with `promotedObject.productSetId`, or
                    `adSetId` with `promotedObject.productSetId`); a 400
                    otherwise. Omit it to let Meta pick the format.
                  enum:
                    - single_image
                    - carousel_images_multi_items
                    - carousel_images_single_item
                    - carousel_slideshows
                  type: string
                cities:
                  description: >-
                    City-level geo targeting (Meta, Google and TikTok). An entry
                    is `{ key }` or the key alone as a plain string
                    (`["1006410"]`).
                  items:
                    oneOf:
                      - description: >-
                          The city id alone, e.g. "1006410" (same as { key:
                          "1006410" }).
                        type: string
                      - properties:
                          distance_unit:
                            description: Unit for radius. Required if radius is set.
                            enum:
                              - mile
                              - kilometer
                            type: string
                          key:
                            description: >-
                              City id from /apis/v1/ads/targeting/search results
                              (Meta city key, Google geo target constant id,
                              TikTok location id).
                            type: string
                          radius:
                            description: >-
                              Optional radius around the city. Must be set
                              together with distance_unit. Meta enforces a
                              minimum city radius (~17 km / 10 mi); smaller
                              values resolve to a 0-size audience and the ad
                              fails at launch.
                            type: number
                        required:
                          - key
                        type: object
                  type: array
                connectionId:
                  description: >-
                    The ads connection (adc_...), when not sent as the
                    connectionId query parameter.
                  pattern: ^adc_[0-9A-Za-z]+$
                  type: string
                countries:
                  description: >-
                    ISO 3166-1 alpha-2 country codes (e.g. ['NL']). Defaults to
                    ['US'] when no other geo targeting (flat or nested
                    `targeting`) is provided.
                  items:
                    type: string
                  type: array
                countryGroups:
                  description: >-
                    Meta only. Continents and trade blocs
                    (`geo_locations.country_groups`), for targeting a whole
                    region without listing its countries. Combines with
                    `countries` rather than replacing it.
                  items:
                    enum:
                      - africa
                      - asia
                      - europe
                      - north_america
                      - south_america
                      - oceania
                      - central_america
                      - caribbean
                      - eea
                      - euro_area
                      - nafta
                      - mercosur
                      - afta
                      - apec
                      - gcc
                      - cisfta
                      - emerging_markets
                      - itunes_app_store
                      - android_free_store
                      - android_paid_store
                    type: string
                  type: array
                creativeFeatures:
                  additionalProperties:
                    enum:
                      - OPT_IN
                      - OPT_OUT
                    type: string
                  description: >-
                    Meta Advantage+ creative enhancements. Map snake_case
                    feature names to OPT_IN or OPT_OUT; Meta validates supported
                    keys and unspecified features default to OPT_OUT.
                  type: object
                creatives:
                  description: >-
                    Meta-only. When present, switches to the multi-creative
                    shape: creates 1 campaign + 1 ad set + N ads (one per entry
                    here). Top-level `headline` / `body` / `imageUrl` /
                    `linkUrl` / `callToAction` are ignored in this mode.
                  items:
                    description: >-
                      Each creative must supply EXACTLY ONE of `imageUrl` (image
                      creative) or `video` (video creative).
                    properties:
                      body:
                        type: string
                      callToAction:
                        enum:
                          - BOOK_TRAVEL
                          - CONTACT_US
                          - DONATE
                          - DONATE_NOW
                          - DOWNLOAD
                          - GET_DIRECTIONS
                          - GO_LIVE
                          - INTERESTED
                          - LEARN_MORE
                          - SEE_DETAILS
                          - LIKE_PAGE
                          - MESSAGE_PAGE
                          - RAISE_MONEY
                          - SAVE
                          - SEND_TIP
                          - SHOP_NOW
                          - SIGN_UP
                          - VIEW_INSTAGRAM_PROFILE
                          - INSTAGRAM_MESSAGE
                          - LOYALTY_LEARN_MORE
                          - PURCHASE_GIFT_CARDS
                          - PAY_TO_ACCESS
                          - SEE_MORE
                          - TRY_IN_CAMERA
                          - WHATSAPP_LINK
                          - GET_IN_TOUCH
                          - TRY_NOW
                          - ASK_A_QUESTION
                          - START_A_CHAT
                          - CHAT_NOW
                          - ASK_US
                          - CHAT_WITH_US
                          - SHOP_ON_RETAILER
                          - BOOK_NOW
                          - CHECK_AVAILABILITY
                          - ORDER_NOW
                          - WHATSAPP_MESSAGE
                          - GET_MOBILE_APP
                          - INSTALL_MOBILE_APP
                          - USE_MOBILE_APP
                          - INSTALL_APP
                          - USE_APP
                          - PLAY_GAME
                          - TRY_DEMO
                          - WATCH_VIDEO
                          - WATCH_MORE
                          - OPEN_LINK
                          - NO_BUTTON
                          - LISTEN_MUSIC
                          - MOBILE_DOWNLOAD
                          - GET_OFFER
                          - GET_OFFER_VIEW
                          - BUY_NOW
                          - BUY_TICKETS
                          - UPDATE_APP
                          - BET_NOW
                          - ADD_TO_CART
                          - SELL_NOW
                          - GET_SHOWTIMES
                          - LISTEN_NOW
                          - GET_EVENT_TICKETS
                          - REMIND_ME
                          - SEARCH_MORE
                          - PRE_REGISTER
                          - SWIPE_UP_PRODUCT
                          - SWIPE_UP_SHOP
                          - PLAY_GAME_ON_FACEBOOK
                          - VISIT_WORLD
                          - OPEN_INSTANT_APP
                          - JOIN_GROUP
                          - GET_PROMOTIONS
                          - SEND_UPDATES
                          - INQUIRE_NOW
                          - VISIT_PROFILE
                          - CHAT_ON_WHATSAPP
                          - EXPLORE_MORE
                          - CONFIRM
                          - JOIN_CHANNEL
                          - MAKE_AN_APPOINTMENT
                          - ASK_ABOUT_SERVICES
                          - BOOK_A_CONSULTATION
                          - GET_A_QUOTE
                          - BUY_VIA_MESSAGE
                          - ASK_FOR_MORE_INFO
                          - VIEW_PRODUCT
                          - VIEW_CHANNEL
                          - WATCH_LIVE_VIDEO
                          - JOIN_LIVE_VIDEO
                          - IMAGINE
                          - WATCH_NOW
                          - STREAM_NOW
                          - BUY_ACTIVITY_TICKETS
                          - CALL
                          - MISSED_CALL
                          - CALL_NOW
                          - CALL_ME
                          - APPLY_NOW
                          - BUY
                          - GET_QUOTE
                          - SUBSCRIBE
                          - RECORD_NOW
                          - VOTE_NOW
                          - GIVE_FREE_RIDES
                          - REGISTER_NOW
                          - OPEN_MESSENGER_EXT
                          - EVENT_RSVP
                          - CIVIC_ACTION
                          - SEND_INVITES
                          - REFER_FRIENDS
                          - REQUEST_TIME
                          - SEE_MENU
                          - SEARCH
                          - TRY_IT
                          - TRY_ON
                          - LINK_CARD
                          - DIAL_CODE
                          - FIND_YOUR_GROUPS
                          - START_ORDER
                        type: string
                      creativeFeatures:
                        additionalProperties:
                          enum:
                            - OPT_IN
                            - OPT_OUT
                          type: string
                        description: >-
                          Meta Advantage+ creative enhancements. Map snake_case
                          feature names to OPT_IN or OPT_OUT; Meta validates
                          supported keys and unspecified features default to
                          OPT_OUT.
                        type: object
                      description:
                        description: >-
                          Link description for this ad (link_data.description;
                          video creatives: video_data.link_description). Falls
                          back to the top-level `description`; when both are
                          omitted Meta scrapes the destination URL's OG
                          description.
                        maxLength: 255
                        type: string
                      headline:
                        maxLength: 255
                        type: string
                      imageUrl:
                        description: Image creative. Mutually exclusive with `video`.
                        format: uri
                        type: string
                      linkUrl:
                        format: uri
                        type: string
                      name:
                        description: >-
                          Exact name for this ad. Falls back to ` #N` (N =
                          1-based position).
                        maxLength: 255
                        type: string
                      video:
                        description: >-
                          Video creative for this entry. Mutually exclusive with
                          `imageUrl`.
                        properties:
                          thumbnailUrl:
                            format: uri
                            type: string
                          url:
                            format: uri
                            type: string
                        required:
                          - url
                        type: object
                    required:
                      - body
                      - callToAction
                      - headline
                      - linkUrl
                    type: object
                  minItems: 1
                  type: array
                currency:
                  description: >-
                    ISO 4217 currency code matching the ad account's currency
                    (e.g. `USD`). Meta only.
                  maxLength: 3
                  minLength: 3
                  type: string
                customLocations:
                  description: >-
                    Point-radius (lat/lng) geo targeting. Meta only
                    (custom_locations). Rejected on platforms without radius
                    support.
                  items:
                    properties:
                      address:
                        type: string
                      distanceUnit:
                        enum:
                          - mile
                          - kilometer
                        type: string
                      latitude:
                        maximum: 90
                        minimum: -90
                        type: number
                      longitude:
                        maximum: 180
                        minimum: -180
                        type: number
                      name:
                        type: string
                      radius:
                        type: number
                    required:
                      - distanceUnit
                      - latitude
                      - longitude
                      - radius
                    type: object
                  type: array
                defaultLocale:
                  description: >-
                    Meta only. Language the top-level copy is written in (e.g.
                    `en`, `pt_BR`), used by the `translations` default rule.
                    Defaults to `en`. Meta rejects a language asset feed whose
                    default rule carries no locales of its own.
                  type: string
                demandGen:
                  additionalProperties: false
                  description: >-
                    Creative, channel and audience settings for a Google Demand
                    Gen campaign (campaignType demand_gen).
                  properties:
                    adGroupName:
                      description: Defaults to the ad name.
                      maxLength: 255
                      type: string
                    audience:
                      additionalProperties: false
                      description: >-
                        Created as a Google Audience and attached to the ad
                        group. Send at least one dimension. Ids are numeric
                        Google ids (user lists, interest categories, custom
                        audiences) from the same customer.
                      properties:
                        ageRanges:
                          items:
                            properties:
                              max:
                                description: Omit for no upper bound.
                                enum:
                                  - 24
                                  - 34
                                  - 44
                                  - 54
                                  - 64
                                type: integer
                              min:
                                enum:
                                  - 18
                                  - 25
                                  - 35
                                  - 45
                                  - 55
                                  - 65
                                type: integer
                            required:
                              - min
                            type: object
                          maxItems: 6
                          minItems: 1
                          type: array
                        customAudiences:
                          items:
                            type: string
                          maxItems: 20
                          minItems: 1
                          type: array
                        genders:
                          items:
                            enum:
                              - male
                              - female
                              - undetermined
                            type: string
                          maxItems: 3
                          minItems: 1
                          type: array
                        userInterests:
                          items:
                            type: string
                          maxItems: 20
                          minItems: 1
                          type: array
                        userLists:
                          items:
                            type: string
                          maxItems: 20
                          minItems: 1
                          type: array
                      type: object
                    audienceId:
                      description: >-
                        Attach an existing Google Audience by numeric id instead
                        of audience. Must be yours: it is checked through the
                        connection before the request is sent, and an id that is
                        not yours answers not_found.
                      type: string
                    businessName:
                      maxLength: 25
                      type: string
                    callToAction:
                      description: >-
                        Image and carousel ads only. Call to action text such as
                        'Learn more'; Google picks one when omitted.
                      maxLength: 25
                      type: string
                    carouselCards:
                      description: >-
                        Makes the ad a carousel ad. Each card needs its own
                        image (no two cards may share one); use the same image
                        shape on every card. Card images are uploaded to the
                        account's asset library before the campaign is created,
                        validateOnly included.
                      items:
                        additionalProperties: false
                        properties:
                          callToAction:
                            maxLength: 25
                            type: string
                          finalUrl:
                            description: Defaults to demandGen.finalUrl.
                            format: uri
                            type: string
                          headline:
                            maxLength: 40
                            type: string
                          images:
                            additionalProperties: false
                            properties:
                              landscape:
                                description: 1.91:1.
                                format: uri
                                type: string
                              portrait:
                                description: '4:5.'
                                format: uri
                                type: string
                              square:
                                description: '1:1.'
                                format: uri
                                type: string
                            type: object
                        required:
                          - headline
                          - images
                        type: object
                      maxItems: 10
                      minItems: 2
                      type: array
                    channels:
                      description: >-
                        Channel controls on the new ad group. Only the listed
                        channels serve; Google Maps, which this list cannot
                        select, is turned off.
                      items:
                        enum:
                          - youtube_in_stream
                          - youtube_in_feed
                          - youtube_shorts
                          - discover
                          - gmail
                          - display
                        type: string
                      minItems: 1
                      type: array
                    descriptions:
                      description: A carousel ad takes exactly one.
                      items:
                        maxLength: 90
                        type: string
                      maxItems: 5
                      minItems: 1
                      type: array
                    finalUrl:
                      format: uri
                      type: string
                    headlines:
                      description: Distinct texts. A carousel ad takes exactly one.
                      items:
                        maxLength: 40
                        type: string
                      maxItems: 5
                      minItems: 1
                      type: array
                    images:
                      additionalProperties: false
                      description: >-
                        Public image URLs. An image ad needs landscape or
                        square; video and carousel ads take only one logo
                        (carousel images go on each card).
                      properties:
                        landscape:
                          description: 1.91:1, at least 600x314.
                          items:
                            format: uri
                            type: string
                          maxItems: 20
                          minItems: 1
                          type: array
                        logo:
                          description: 1:1, at least 128x128.
                          items:
                            format: uri
                            type: string
                          maxItems: 5
                          minItems: 1
                          type: array
                        portrait:
                          description: 4:5, at least 480x600.
                          items:
                            format: uri
                            type: string
                          maxItems: 20
                          minItems: 1
                          type: array
                        square:
                          description: 1:1, at least 300x300.
                          items:
                            format: uri
                            type: string
                          maxItems: 20
                          minItems: 1
                          type: array
                      required:
                        - logo
                      type: object
                    longHeadlines:
                      description: Video ads only, and required there.
                      items:
                        maxLength: 90
                        type: string
                      maxItems: 5
                      minItems: 1
                      type: array
                    youtubeVideoIds:
                      description: Makes the ad a video responsive ad.
                      items:
                        pattern: ^[A-Za-z0-9_-]{11}$
                        type: string
                      maxItems: 5
                      minItems: 1
                      type: array
                  required:
                    - businessName
                    - descriptions
                    - finalUrl
                    - headlines
                    - images
                  type: object
                description:
                  description: >-
                    Meta only (facebook/instagram). Link description: the
                    secondary text shown below the headline (Meta's
                    link_data.description; on video creatives mapped to
                    video_data.link_description).
                  maxLength: 255
                  type: string
                descriptions:
                  description: >-
                    Meta only. Optional description variations for Multiple Text
                    Options. Sent alongside `bodies` and `headlines`.
                  items:
                    maxLength: 255
                    type: string
                  maxItems: 5
                  minItems: 1
                  type: array
                dsaBeneficiary:
                  description: >-
                    Legal entity that benefits from the ad. Required when
                    targeting EU users (EU DSA, Article 26).
                  maxLength: 100
                  type: string
                dsaPayor:
                  description: >-
                    Legal entity that pays for the ad. Can differ from
                    `dsaBeneficiary` (for example, an agency paying for a
                    client's ads). Same rules as `dsaBeneficiary`: required for
                    EU targeting unless the ad account has a default payor.
                  maxLength: 100
                  type: string
                dynamicCreative:
                  description: >-
                    Meta only. Dynamic Creative: supply a POOL of assets and
                    Meta auto-combines and optimises them into the
                    best-performing variations within a single ad (mapped to the
                    creative's `asset_feed_spec`).
                  properties:
                    adFormat:
                      description: >-
                        Asset-feed ad format. Must match the pool: SINGLE_IMAGE
                        / CAROUSEL_IMAGE require `imageUrls`, SINGLE_VIDEO
                        requires `videoUrls` (400 otherwise). Defaults to
                        SINGLE_IMAGE with `imageUrls`, SINGLE_VIDEO with
                        `videoUrls`.
                      enum:
                        - SINGLE_IMAGE
                        - CAROUSEL_IMAGE
                        - SINGLE_VIDEO
                      type: string
                    bodies:
                      description: Primary-text variations (the body copy).
                      items:
                        type: string
                      maxItems: 5
                      type: array
                    callToActionTypes:
                      description: CTA-button variations. Required.
                      items:
                        enum:
                          - BOOK_TRAVEL
                          - CONTACT_US
                          - DONATE
                          - DONATE_NOW
                          - DOWNLOAD
                          - GET_DIRECTIONS
                          - GO_LIVE
                          - INTERESTED
                          - LEARN_MORE
                          - SEE_DETAILS
                          - LIKE_PAGE
                          - MESSAGE_PAGE
                          - RAISE_MONEY
                          - SAVE
                          - SEND_TIP
                          - SHOP_NOW
                          - SIGN_UP
                          - VIEW_INSTAGRAM_PROFILE
                          - INSTAGRAM_MESSAGE
                          - LOYALTY_LEARN_MORE
                          - PURCHASE_GIFT_CARDS
                          - PAY_TO_ACCESS
                          - SEE_MORE
                          - TRY_IN_CAMERA
                          - WHATSAPP_LINK
                          - GET_IN_TOUCH
                          - TRY_NOW
                          - ASK_A_QUESTION
                          - START_A_CHAT
                          - CHAT_NOW
                          - ASK_US
                          - CHAT_WITH_US
                          - SHOP_ON_RETAILER
                          - BOOK_NOW
                          - CHECK_AVAILABILITY
                          - ORDER_NOW
                          - WHATSAPP_MESSAGE
                          - GET_MOBILE_APP
                          - INSTALL_MOBILE_APP
                          - USE_MOBILE_APP
                          - INSTALL_APP
                          - USE_APP
                          - PLAY_GAME
                          - TRY_DEMO
                          - WATCH_VIDEO
                          - WATCH_MORE
                          - OPEN_LINK
                          - NO_BUTTON
                          - LISTEN_MUSIC
                          - MOBILE_DOWNLOAD
                          - GET_OFFER
                          - GET_OFFER_VIEW
                          - BUY_NOW
                          - BUY_TICKETS
                          - UPDATE_APP
                          - BET_NOW
                          - ADD_TO_CART
                          - SELL_NOW
                          - GET_SHOWTIMES
                          - LISTEN_NOW
                          - GET_EVENT_TICKETS
                          - REMIND_ME
                          - SEARCH_MORE
                          - PRE_REGISTER
                          - SWIPE_UP_PRODUCT
                          - SWIPE_UP_SHOP
                          - PLAY_GAME_ON_FACEBOOK
                          - VISIT_WORLD
                          - OPEN_INSTANT_APP
                          - JOIN_GROUP
                          - GET_PROMOTIONS
                          - SEND_UPDATES
                          - INQUIRE_NOW
                          - VISIT_PROFILE
                          - CHAT_ON_WHATSAPP
                          - EXPLORE_MORE
                          - CONFIRM
                          - JOIN_CHANNEL
                          - MAKE_AN_APPOINTMENT
                          - ASK_ABOUT_SERVICES
                          - BOOK_A_CONSULTATION
                          - GET_A_QUOTE
                          - BUY_VIA_MESSAGE
                          - ASK_FOR_MORE_INFO
                          - VIEW_PRODUCT
                          - VIEW_CHANNEL
                          - WATCH_LIVE_VIDEO
                          - JOIN_LIVE_VIDEO
                          - IMAGINE
                          - WATCH_NOW
                          - STREAM_NOW
                          - BUY_ACTIVITY_TICKETS
                          - CALL
                          - MISSED_CALL
                          - CALL_NOW
                          - CALL_ME
                          - APPLY_NOW
                          - BUY
                          - GET_QUOTE
                          - SUBSCRIBE
                          - RECORD_NOW
                          - VOTE_NOW
                          - GIVE_FREE_RIDES
                          - REGISTER_NOW
                          - OPEN_MESSENGER_EXT
                          - EVENT_RSVP
                          - CIVIC_ACTION
                          - SEND_INVITES
                          - REFER_FRIENDS
                          - REQUEST_TIME
                          - SEE_MENU
                          - SEARCH
                          - TRY_IT
                          - TRY_ON
                          - LINK_CARD
                          - DIAL_CODE
                          - FIND_YOUR_GROUPS
                          - START_ORDER
                        type: string
                      type: array
                    descriptions:
                      description: Description (link caption) variations.
                      items:
                        type: string
                      maxItems: 5
                      type: array
                    imageUrls:
                      description: >-
                        Pool of image URLs (1-10). Uploaded to the ad account
                        and referenced by hash in the asset feed. Mutually
                        exclusive with `videoUrls`.
                      items:
                        format: uri
                        type: string
                      maxItems: 10
                      minItems: 1
                      type: array
                    linkUrls:
                      description: >-
                        Destination URL variations. At least one is required
                        unless `goal` is `lead_generation`.
                      items:
                        format: uri
                        type: string
                      type: array
                    titles:
                      description: Headline variations.
                      items:
                        type: string
                      maxItems: 5
                      type: array
                    videoUrls:
                      description: >-
                        Pool of video URLs (1-10). Uploaded to the ad account
                        and referenced by video id in the asset feed. No
                        thumbnails are needed: Meta auto-generates a poster per
                        video. Mutually exclusive with `imageUrls`; `adFormat`
                        defaults to SINGLE_VIDEO.
                      items:
                        format: uri
                        type: string
                      maxItems: 10
                      minItems: 1
                      type: array
                  type: object
                endDate:
                  description: >-
                    When the ad ends. If omitted: on a lifetime budget, the ad
                    ends 7 days after it starts (reported in
                    `appliedDefaults.endDate`); a daily budget runs until
                    paused.
                  format: date-time
                  type: string
                existingCampaignId:
                  description: >-
                    Create the new objects under this EXISTING campaign instead
                    of creating a new one. Supported on Meta, Google Ads,
                    LinkedIn, TikTok and Reddit Ads. Mutually exclusive with
                    `adSetId` and `creatives[]`. Must be yours: it is checked
                    through the connection before the request is sent, and an id
                    that is not yours answers not_found.
                  type: string
                existingCreativeId:
                  description: >-
                    Meta only. Reuse an EXISTING ad creative by id instead of
                    building a new one from the copy/media fields (which are
                    then ignored). Combine with `existingCampaignId` to build a
                    multi-ad-set campaign that shares one creative.
                  type: string
                gender:
                  default: all
                  description: >-
                    Restrict the audience by gender. 'male' targets men only,
                    'female' targets women only, 'all' (default) targets
                    everyone. Applied on Meta, TikTok, Pinterest and Reddit.
                    Ignored on Google, LinkedIn and X.
                  enum:
                    - all
                    - male
                    - female
                  type: string
                goal:
                  description: >-
                    The ad's goal. Available goals vary by platform. When
                    omitted, it is inferred from the ad (see
                    `appliedDefaults.goal` in the response); the attach shape
                    inherits it from the ad set. Meta `conversions`:
                    OUTCOME_SALES.
                  enum:
                    - engagement
                    - traffic
                    - awareness
                    - video_views
                    - lead_generation
                    - lead_conversion
                    - conversions
                    - app_promotion
                    - catalog_sales
                    - page_likes
                    - page_visits
                    - job_applicants
                  type: string
                headline:
                  description: >-
                    Ad headline. Required for Meta, Google, Pinterest, LinkedIn,
                    OpenAI Ads and Reddit Ads on legacy + attach shapes (for
                    multi-creative, skip it and use `creatives[].headline`).
                    Ignored for TikTok.
                  type: string
                headlines:
                  description: >-
                    Meta only. Headline variations for Multiple Text Options.
                    Must be sent alongside `bodies`. The top-level `headline`
                    field is used as the `object_story_spec.link_data.name`
                    (`video_data.title` on a video creative).
                  items:
                    maxLength: 255
                    type: string
                  maxItems: 5
                  minItems: 1
                  type: array
                identityId:
                  description: >-
                    TikTok: the identity the ad runs as, from GET
                    /apis/v1/ads/tiktok-identities. Overrides the connected
                    account's own identity; must be authorized on the
                    advertiser.
                  type: string
                identityType:
                  description: >-
                    TikTok only. Forces the identity attribution on the ad:
                    `TT_USER`: the posting account's open_id (real @username
                    branding). Requires a connected TikTok posting account on
                    the same profile.
                  enum:
                    - TT_USER
                    - CUSTOMIZED_USER
                    - BC_AUTH_TT
                  type: string
                imageUrl:
                  description: >-
                    Image creative for Meta/Google/Pinterest/LinkedIn on legacy
                    + attach shapes. Mutually exclusive with `video`. LinkedIn:
                    required unless `video` is set.
                  format: uri
                  type: string
                images:
                  description: >-
                    Google Display (Responsive Display Ads) only. Google RDA
                    requires both a landscape (1.91:1) and a square (1:1)
                    marketing image; sending only one is rejected upstream as
                    'Too few.' (NOT_ENOUGH_*_MARKETING_IMAGE_ASSET). Supply both
                    URLs here.
                  properties:
                    landscape:
                      description: >-
                        Landscape 1.91:1 marketing image URL (e.g. 1200x628).
                        Also accepted via the top-level `imageUrl` for backward
                        compatibility.
                      format: uri
                      type: string
                    square:
                      description: >-
                        Square 1:1 marketing image URL (e.g. 1080x1080).
                        Required for Google Display.
                      format: uri
                      type: string
                  type: object
                incomeTier:
                  description: >-
                    Normalized household-income tier. Meta and TikTok express
                    all four; Google maps only `top_10`; rejected on LinkedIn,
                    X, and Pinterest. On Meta, income targeting is incompatible
                    with housing/employment/credit `specialAdCategories`.
                  enum:
                    - top_5
                    - top_10
                    - top_10_25
                    - top_25_50
                  type: string
                instagramAccountId:
                  description: >-
                    Meta only. Overrides the Instagram account the ad is
                    delivered as. Pass an Instagram Business Account ID (e.g.
                    17841...), mapped to the creative's `instagram_user_id`; it
                    is sent as-is and never replaced.
                  type: string
                interests:
                  description: >-
                    Interest objects from
                    /apis/v1/ads/targeting/search?dimension=interest (or
                    dimension=interestKeyword on TikTok). Each must include id
                    and name. TikTok: Bare numeric ids are interest categories
                    (`interest_category_ids`).
                  items:
                    properties:
                      id:
                        type: string
                      name:
                        type: string
                    required:
                      - id
                      - name
                    type: object
                  type: array
                isSkadnetworkAttribution:
                  description: >-
                    Meta app promotion only. Immutable campaign flag. Set true
                    for iOS 14+ SKAdNetwork campaigns and supply
                    promotedObject.applicationId plus
                    promotedObject.objectStoreUrl. The campaign receives
                    promotedObject only when this flag is true.
                  type: boolean
                keywords:
                  description: >-
                    Google Search only. Keywords on the new ad group; entries
                    are strings (BROAD) or { text, matchType }. Editable later
                    via PUT /apis/v1/ads/{adId} targeting.keywords.
                  items:
                    description: >-
                      A Google Search keyword: a bare string (BROAD match), or
                      an object naming the match type.
                    oneOf:
                      - description: Keyword text; defaults to BROAD match
                        maxLength: 80
                        minLength: 1
                        type: string
                      - properties:
                          matchType:
                            description: >-
                              Defaults to broad. Accepted in any case (EXACT,
                              Exact) and stored lowercase.
                            enum:
                              - exact
                              - phrase
                              - broad
                            type: string
                          text:
                            maxLength: 80
                            minLength: 1
                            type: string
                        required:
                          - text
                        type: object
                  maxItems: 1000
                  type: array
                languages:
                  description: >-
                    Language codes, e.g. ["en","es"]. Google: campaign language
                    targeting (language_constant) using Google's language codes
                    (ISO 639-1, plus variants such as `zh_CN`). Unknown codes
                    return 400.
                  items:
                    type: string
                  type: array
                leadGenFormId:
                  description: >-
                    Lead Gen form ID to attach to the ad's creative. REQUIRED
                    when `goal` is `lead_generation`. Create one via POST
                    /apis/v1/ads/lead-forms. Meta (facebook/instagram): the
                    leadgen_forms ID.
                  type: string
                linkUrl:
                  description: >-
                    The ad's destination URL. Required on legacy + attach shapes
                    (skip for multi-creative). NOT required when `goal` is
                    `lead_generation` (the ad opens a Lead Gen form instead).
                  format: uri
                  type: string
                locationTargetingType:
                  description: >-
                    Google only (400 elsewhere). Set on the new campaign; a
                    request that joins an existing campaign
                    (`existingCampaignId` or `adSetId`) returns 400, change that
                    campaign with PUT
                    /apis/v1/ads/campaigns/{campaignId}/targeting instead.
                  enum:
                    - presence
                    - presence_or_interest
                  type: string
                longHeadline:
                  description: >-
                    Google Display only. Defaults to `headline` if omitted. On
                    LinkedIn, reused as the optional secondary description text
                    on traffic (link) ads; omitted if not provided.
                  maxLength: 90
                  type: string
                manualCpc:
                  additionalProperties: false
                  description: >-
                    Google Search and Display only. Manual CPC bidding. Enhanced
                    CPC is not offered: Google no longer lets Search and Display
                    campaigns enable it. Exclusive with every other strategy
                    field.
                  properties:
                    maxCpc:
                      description: >-
                        Max CPC of the ad groups, in the account's currency
                        units: set on the ad group created with the campaign,
                        and on every ad group of the campaign when an update
                        switches it to Manual CPC. Google gives an ad group
                        without one a 0.01 bid.
                      exclusiveMinimum: 0
                      type: number
                  required:
                    - maxCpc
                  type: object
                metros:
                  description: >-
                    DMA / metro-area geo targeting (Meta and TikTok). `key` is
                    the platform's metro ID from
                    /apis/v1/ads/targeting/search?dimension=geo&geoType=metro
                    (TikTok metros appear as type `metro`, e.g. the New York
                    DMA).
                  items:
                    oneOf:
                      - type: string
                      - properties:
                          key:
                            type: string
                          name:
                            type: string
                        required:
                          - key
                        type: object
                  type: array
                multiAdvertiser:
                  description: >-
                    Meta only. Multi-advertiser ads: whether Meta may show this
                    ad alongside other advertisers' in one unit. Meta
                    auto-enrols since Aug 2024, so send OPT_OUT to leave.
                  enum:
                    - OPT_IN
                    - OPT_OUT
                  type: string
                name:
                  description: >-
                    Omitted, the ad is named `Ad ` (UTC) and the response
                    reports it in `appliedDefaults.name`.
                  maxLength: 255
                  type: string
                negativeKeywords:
                  description: >-
                    Google Search only; other platforms return 400.
                    Ad-group-level negative keywords on the new ad group.
                    Editable later via PUT /apis/v1/ads/{adId}
                    targeting.negativeKeywords.
                  items:
                    description: >-
                      A Google Search keyword: a bare string (BROAD match), or
                      an object naming the match type.
                    oneOf:
                      - description: Keyword text; defaults to BROAD match
                        maxLength: 80
                        minLength: 1
                        type: string
                      - properties:
                          matchType:
                            description: >-
                              Defaults to broad. Accepted in any case (EXACT,
                              Exact) and stored lowercase.
                            enum:
                              - exact
                              - phrase
                              - broad
                            type: string
                          text:
                            maxLength: 80
                            minLength: 1
                            type: string
                        required:
                          - text
                        type: object
                  maxItems: 1000
                  type: array
                networkSettings:
                  additionalProperties: false
                  description: >-
                    Google Search only, when the call creates the campaign (400
                    with existingCampaignId or adSetId).
                  properties:
                    displayNetwork:
                      description: >-
                        campaign.network_settings.target_content_network (Search
                        with Display expansion)
                      type: boolean
                    searchPartners:
                      description: campaign.network_settings.target_search_network
                      type: boolean
                  type: object
                optimizationGoal:
                  description: >-
                    Explicit optimization goal. Supported on: TikTok with goal
                    video_views: ENGAGED_VIEW (the 6-second default) or
                    ENGAGED_VIEW_FIFTEEN; both bill per view.
                  type: string
                optimizeCardOrder:
                  description: >-
                    Meta only (a 400 on any other platform), and only with
                    `carouselCards` (a 400 without them). Sets the creative's
                    `link_data.multi_share_optimized`. `false`: keeps the cards
                    in the order given.
                  type: boolean
                organizationId:
                  description: >-
                    LinkedIn only (ignored by every other platform). The Company
                    Page that authors the Direct Sponsored Content ("dark") post
                    backing the ad. Accepts a numeric organization ID or a full
                    `urn:li:organization:N` URN. Required unless it defaults:
                  type: string
                pageId:
                  description: >-
                    Meta only. The Facebook Page the ad runs as
                    (`object_story_spec.page_id`). Defaults to the Page bound to
                    the connection. Pass another Page ID to run the ad as that
                    Page.
                  type: string
                phoneNumber:
                  description: >-
                    Meta attach shape only (`adSetId`). The phone number (E.164,
                    e.g. `+4712345678`) for an ad added to a "website and phone
                    call" ad set (destination_type `WEBSITE_AND_PHONE_CALL`),
                    sent as the creative's call configuration.
                  pattern: ^\+[1-9]\d{6,14}$
                  type: string
                placementAssets:
                  description: >-
                    Meta only. Pins a SPECIFIC asset (image OR video) to each
                    placement group on a SINGLE ad (e.g. a 9:16 on Stories/Reels
                    and a 4:5 on Feed).
                  properties:
                    defaultImageUrl:
                      description: >-
                        Image mode. Catch-all image for any placement no rule
                        matches. Required in image mode (Meta mandates a default
                        rule).
                      format: uri
                      type: string
                    defaultThumbnailUrl:
                      description: >-
                        Video mode (optional). Poster image for the default
                        video; Meta auto-generates one when omitted.
                      format: uri
                      type: string
                    defaultVideoUrl:
                      description: >-
                        Video mode. Catch-all video for any placement no rule
                        matches. Required in video mode.
                      format: uri
                      type: string
                    rules:
                      description: >-
                        One entry per placement group you want to pin a specific
                        asset to.
                      items:
                        properties:
                          body:
                            description: >-
                              One primary text pinned to this rule. Omit to
                              inherit the top-level body.
                            minLength: 1
                            type: string
                          description:
                            description: >-
                              One link description pinned to this rule. Omit to
                              inherit the top-level description.
                            maxLength: 255
                            minLength: 1
                            type: string
                          headline:
                            description: >-
                              One headline pinned to this rule. Omit to inherit
                              the top-level headline.
                            maxLength: 255
                            minLength: 1
                            type: string
                          imageUrl:
                            description: >-
                              Image mode. The image to deliver for this rule's
                              placements.
                            format: uri
                            type: string
                          placements:
                            description: >-
                              Placements this asset is pinned to. At least one
                              field must be set (an empty rule is invalid; that
                              role is served by the default asset). Same enums
                              as the top-level `placements` object.
                            properties:
                              audienceNetworkPositions:
                                items:
                                  enum:
                                    - classic
                                    - rewarded_video
                                  type: string
                                type: array
                              devicePlatforms:
                                items:
                                  enum:
                                    - mobile
                                    - desktop
                                  type: string
                                type: array
                              facebookPositions:
                                items:
                                  enum:
                                    - feed
                                    - right_hand_column
                                    - marketplace
                                    - story
                                    - search
                                    - instream_video
                                    - facebook_reels
                                    - facebook_reels_overlay
                                    - profile_feed
                                    - notification
                                  type: string
                                type: array
                              instagramPositions:
                                items:
                                  enum:
                                    - stream
                                    - story
                                    - explore
                                    - explore_home
                                    - reels
                                    - profile_feed
                                    - ig_search
                                    - profile_reels
                                  type: string
                                type: array
                              messengerPositions:
                                items:
                                  enum:
                                    - messenger_home
                                    - sponsored_messages
                                    - story
                                  type: string
                                type: array
                              publisherPlatforms:
                                items:
                                  enum:
                                    - facebook
                                    - instagram
                                    - threads
                                    - messenger
                                    - audience_network
                                    - whatsapp
                                    - meta
                                  type: string
                                type: array
                              threadsPositions:
                                items:
                                  enum:
                                    - threads_stream
                                  type: string
                                type: array
                              whatsappPositions:
                                items:
                                  enum:
                                    - status
                                  type: string
                                type: array
                            type: object
                          thumbnailUrl:
                            description: >-
                              Video mode (optional). Poster image for this
                              rule's video; auto-generated when omitted.
                            format: uri
                            type: string
                          videoUrl:
                            description: >-
                              Video mode. The video to deliver for this rule's
                              placements.
                            format: uri
                            type: string
                        required:
                          - placements
                        type: object
                      maxItems: 10
                      minItems: 1
                      type: array
                  required:
                    - rules
                  type: object
                placements:
                  description: >-
                    Meta only; non-Meta platforms reject this field. Manual ad
                    placements. Omit for automatic placements (Meta's default,
                    recommended for most cases, since Meta optimises delivery
                    across all eligible surfaces).
                  properties:
                    audienceNetworkPositions:
                      items:
                        enum:
                          - classic
                          - rewarded_video
                        type: string
                      type: array
                    devicePlatforms:
                      description: >-
                        Restrict by device. Omit to deliver on both mobile and
                        desktop.
                      items:
                        enum:
                          - mobile
                          - desktop
                        type: string
                      type: array
                    facebookPositions:
                      items:
                        enum:
                          - feed
                          - right_hand_column
                          - marketplace
                          - story
                          - search
                          - instream_video
                          - facebook_reels
                          - facebook_reels_overlay
                          - profile_feed
                          - notification
                        type: string
                      type: array
                    instagramPositions:
                      items:
                        enum:
                          - stream
                          - story
                          - explore
                          - explore_home
                          - reels
                          - profile_feed
                          - ig_search
                          - profile_reels
                        type: string
                      type: array
                    messengerPositions:
                      items:
                        enum:
                          - messenger_home
                          - sponsored_messages
                          - story
                        type: string
                      type: array
                    publisherPlatforms:
                      description: >-
                        Top-level platforms to deliver on. A position field
                        below is only honoured when its parent platform is
                        included here.
                      items:
                        enum:
                          - facebook
                          - instagram
                          - threads
                          - messenger
                          - audience_network
                          - whatsapp
                          - meta
                        type: string
                      type: array
                    threadsPositions:
                      items:
                        enum:
                          - threads_stream
                        type: string
                      type: array
                    whatsappPositions:
                      items:
                        enum:
                          - status
                        type: string
                      type: array
                  type: object
                platformSpecificData:
                  description: >-
                    Platform-specific options. The platform is derived from
                    `connectionId`; options for a different platform return a
                    400. LinkedIn (campaign bidding and delivery controls) and
                    Meta (the bid trio) have options today. Meta
                  oneOf:
                    - additionalProperties: false
                      description: >-
                        LinkedIn-specific options for POST /apis/v1/ads/boost
                        and POST /apis/v1/ads/create: campaign bidding and
                        delivery controls, plus the LinkedIn-only creative
                        formats on /apis/v1/ads/create. Unknown keys are
                        rejected.
                      properties:
                        audienceExpansionEnabled:
                          description: >-
                            Enable LinkedIn audience expansion. Defaults to
                            false.
                          type: boolean
                        carousel:
                          additionalProperties: false
                          description: >-
                            POST /apis/v1/ads/create only. Carousel ad with 2-10
                            image cards. Mutually exclusive with the other
                            creative sources.
                          properties:
                            cards:
                              items:
                                additionalProperties: false
                                properties:
                                  headline:
                                    description: >-
                                      Card title. Falls back to the ad-level
                                      headline.
                                    type: string
                                  imageUrl:
                                    format: uri
                                    type: string
                                  landingUrl:
                                    description: >-
                                      Per-card click destination. LinkedIn
                                      requires one on every card; the ad-level
                                      `linkUrl` backfills cards that omit it.
                                    format: uri
                                    type: string
                                required:
                                  - imageUrl
                                type: object
                              maxItems: 10
                              minItems: 2
                              type: array
                          required:
                            - cards
                          type: object
                        connectedTelevisionOnly:
                          description: Restrict delivery to Connected TV inventory.
                          type: boolean
                        conversation:
                          additionalProperties: false
                          description: >-
                            POST /apis/v1/ads/create only. Conversation Ad: a
                            choose-your-path message tree delivered to the
                            member's LinkedIn inbox. Messages are flat nodes
                            wired by local ids. Each button either opens a url
                            or leads to nextMessageId.
                          properties:
                            body:
                              description: Optional intro body (HTML allowed).
                              type: string
                            firstMessageId:
                              type: string
                            footer:
                              description: Terms shown at the bottom of the message.
                              type: string
                            headline:
                              description: >-
                                Conversation headline. Defaults to the first
                                message's first line.
                              type: string
                            messages:
                              items:
                                additionalProperties: false
                                properties:
                                  buttons:
                                    items:
                                      additionalProperties: true
                                      type: object
                                    maxItems: 5
                                    minItems: 1
                                    type: array
                                  id:
                                    type: string
                                  text:
                                    maxLength: 500
                                    type: string
                                required:
                                  - id
                                  - text
                                type: object
                              maxItems: 25
                              minItems: 1
                              type: array
                            sender:
                              description: >-
                                Person or organization URN. Defaults to the
                                authoring Company Page. The sender must be
                                approved for the ad account first (Campaign
                                Manager > Manage message ad senders) or LinkedIn
                                rejects the create with
                                SINMAIL_SENDER_NOT_APPROVED.
                              type: string
                            subject:
                              description: InMail subject shown in the inbox.
                              type: string
                          required:
                            - firstMessageId
                            - messages
                            - subject
                          type: object
                        costType:
                          description: >-
                            Campaign cost model (billing event). Defaults to
                            `CPM`. Required when `unitCost` is set so the manual
                            bid applies to an explicit cost model.
                          enum:
                            - CPM
                            - CPC
                            - CPV
                          type: string
                        creativeSelection:
                          description: >-
                            How LinkedIn rotates creatives within the campaign.
                            Defaults to `OPTIMIZED`.
                          enum:
                            - OPTIMIZED
                            - ROUND_ROBIN
                          type: string
                        document:
                          additionalProperties: false
                          description: >-
                            POST /apis/v1/ads/create only. Document ad rendered
                            as an in-feed viewer. PDF, PPT or DOC up to 100MB.
                            Mutually exclusive with the other creative sources.
                          properties:
                            title:
                              description: Document title.
                              type: string
                            url:
                              format: uri
                              type: string
                          required:
                            - title
                            - url
                          type: object
                        event:
                          additionalProperties: false
                          description: >-
                            POST /apis/v1/ads/create only. Promotes an existing
                            LinkedIn Event; no headline needed. Mutually
                            exclusive with the other creative sources.
                          properties:
                            urn:
                              description: LinkedIn Event URN, urn:li:event:N.
                              pattern: ^urn:li:event:\d+$
                              type: string
                          required:
                            - urn
                          type: object
                        follower:
                          additionalProperties: false
                          description: >-
                            POST /apis/v1/ads/create only. Dynamic Follower Ad
                            promoting the Company Page. Supported goals:
                            engagement, awareness. headline and description take
                            exactly one of preApproved or custom. Mutually
                            exclusive with the other creative sources.
                          properties:
                            callToAction:
                              enum:
                                - VISIT_ORGANIZATION_COMPANY_PAGE
                                - VISIT_ORGANIZATION_LIFE_PAGE
                                - VISIT_ORGANIZATION_JOBS_PAGE
                                - VISIT_ORGANIZATION_CAREERS_PAGE
                              type: string
                            description:
                              additionalProperties: false
                              properties:
                                custom:
                                  description: Free text, reviewed by LinkedIn.
                                  type: string
                                preApproved:
                                  description: >-
                                    LinkedIn preset id, not reviewed. Example
                                    GET_LATEST_JOBS_AND_INDUSTRY_NEWS.
                                  type: string
                              type: object
                            headline:
                              additionalProperties: false
                              properties:
                                custom:
                                  description: Free text, reviewed by LinkedIn.
                                  type: string
                                preApproved:
                                  description: >-
                                    LinkedIn preset id, not reviewed. Example
                                    GROW_YOUR_BUSINESS_INSIGHTS.
                                  type: string
                              type: object
                            logoUrl:
                              format: uri
                              type: string
                            organizationName:
                              type: string
                            showMemberProfilePhoto:
                              description: Defaults to true.
                              type: boolean
                          required:
                            - callToAction
                            - description
                            - headline
                          type: object
                        jobs:
                          additionalProperties: false
                          description: >-
                            POST /apis/v1/ads/create only. Dynamic Jobs Ad
                            promoting your open roles, personalized with the
                            viewer's profile photo. Mutually exclusive with the
                            other creative sources.
                          properties:
                            buttonLabel:
                              additionalProperties: false
                              properties:
                                custom:
                                  description: Free text, reviewed by LinkedIn.
                                  type: string
                                preApproved:
                                  description: >-
                                    LinkedIn preset id, not reviewed. One of
                                    SEE_MORE_JOBS, VIEW_MORE,
                                    CAREERS_AT_COMPANY.
                                  type: string
                              type: object
                            headline:
                              additionalProperties: false
                              properties:
                                custom:
                                  description: Free text, reviewed by LinkedIn.
                                  type: string
                                preApproved:
                                  description: >-
                                    LinkedIn preset id, not reviewed. Example
                                    MEMBER_READY_FOR_YOUR_DREAM_JOB.
                                  type: string
                              type: object
                            logoUrl:
                              format: uri
                              type: string
                            organizationName:
                              type: string
                            showMemberProfilePhoto:
                              description: Defaults to true.
                              type: boolean
                          required:
                            - buttonLabel
                            - headline
                          type: object
                        offsiteDeliveryEnabled:
                          description: >-
                            Deliver on the LinkedIn Audience Network. Defaults
                            to false.
                          type: boolean
                        optimizationTargetType:
                          description: >-
                            Campaign `optimizationTargetType` (e.g. `MAX_CLICK`,
                            `TARGET_COST_PER_CLICK`, `MAX_IMPRESSION`).
                            Forwarded verbatim; LinkedIn validates compatibility
                            with the objective and `costType`. Default when
                            omitted, derived from the objective:
                          type: string
                        spotlight:
                          additionalProperties: false
                          description: >-
                            POST /apis/v1/ads/create only. Dynamic Spotlight Ad
                            personalized with the viewer's profile photo.
                            Supported goals: traffic, awareness.
                          properties:
                            backgroundImageUrl:
                              description: >-
                                Custom background. Replaces the description and
                                the profile photo.
                              format: uri
                              type: string
                            callToAction:
                              description: Button label text.
                              type: string
                            description:
                              description: Mutually exclusive with backgroundImageUrl.
                              type: string
                            headline:
                              type: string
                            landingUrl:
                              format: uri
                              type: string
                            logoUrl:
                              format: uri
                              type: string
                            organizationName:
                              type: string
                            showMemberProfilePhoto:
                              description: Defaults to true.
                              type: boolean
                          required:
                            - callToAction
                            - headline
                            - landingUrl
                          type: object
                        textAd:
                          additionalProperties: false
                          description: >-
                            POST /apis/v1/ads/create only. Classic right-rail
                            Text Ad. The copy lives here; ad-level body and
                            headline are not used. Mutually exclusive with the
                            other creative sources.
                          properties:
                            description:
                              maxLength: 75
                              type: string
                            headline:
                              maxLength: 25
                              type: string
                            imageUrl:
                              description: Optional 100x100 image.
                              format: uri
                              type: string
                            landingUrl:
                              format: uri
                              type: string
                          required:
                            - description
                            - headline
                            - landingUrl
                          type: object
                        thoughtLeader:
                          additionalProperties: false
                          description: >-
                            POST /apis/v1/ads/create only. Sponsors an existing
                            LinkedIn post (a share or ugcPost authored by your
                            organization's Company Page) as the creative,
                            keeping its commentary, author and engagement.
                          properties:
                            postUrn:
                              description: >-
                                LinkedIn share or ugcPost URN: urn:li:share:N or
                                urn:li:ugcPost:N. Get it via "Copy link to post"
                                on the target LinkedIn post. The URL contains
                                -share- (share) or -ugcPost- (ugcPost), then the
                                numeric id.
                              pattern: ^urn:li:(share|ugcPost):\d+$
                              type: string
                          required:
                            - postUrn
                          type: object
                        unitCost:
                          description: >-
                            Manual bid in WHOLE account-currency units (e.g. 2.5
                            = $2.50). Requires `costType`. Omit for LinkedIn's
                            automated (max delivery) bidding. LinkedIn enforces
                            its own per-audience min/max bid bounds.
                          type: number
                      type: object
                    - additionalProperties: false
                      description: >-
                        Meta (facebook/instagram) options for
                        platformSpecificData on POST /apis/v1/ads/boost and
                        /apis/v1/ads/create. Unknown keys are rejected, not
                        dropped.
                      properties:
                        adSchedule:
                          description: >-
                            Dayparting on the ad set being created (Meta
                            `adset_schedule` with `pacing_type:
                            ["day_parting"]`). Change it later with `PUT
                            /apis/v1/ads/ad-sets/{adSetId}`. A 400 with `param:
                            platformSpecificData.adSchedule` when:
                          items:
                            additionalProperties: false
                            properties:
                              dayOfWeek:
                                enum:
                                  - MONDAY
                                  - TUESDAY
                                  - WEDNESDAY
                                  - THURSDAY
                                  - FRIDAY
                                  - SATURDAY
                                  - SUNDAY
                                type: string
                              endHour:
                                description: >-
                                  Must be after startHour. 24 is midnight at the
                                  end of the day.
                                maximum: 24
                                minimum: 1
                                type: integer
                              startHour:
                                maximum: 23
                                minimum: 0
                                type: integer
                              timezoneType:
                                default: USER
                                description: >-
                                  Meta `timezone_type`: USER runs the hours in
                                  each viewer's time zone, ADVERTISER in the ad
                                  account time zone.
                                enum:
                                  - USER
                                  - ADVERTISER
                                type: string
                            required:
                              - dayOfWeek
                              - endHour
                              - startHour
                            type: object
                          maxItems: 168
                          minItems: 1
                          type: array
                        bidAmount:
                          description: >-
                            Whole currency units (USD: 5 = $5.00). Required when
                            bidStrategy is LOWEST_COST_WITH_BID_CAP or COST_CAP.
                          type: number
                        bidStrategy:
                          description: >-
                            Meta bid strategy. Same enum applies at campaign and
                            ad-set level; ad-set value (when set) overrides
                            campaign-level. Cross-field rules:
                            `LOWEST_COST_WITHOUT_CAP` (default): auto-bid,
                            forbids `bidAmount` and `roasAverageFloor`.
                          enum:
                            - LOWEST_COST_WITHOUT_CAP
                            - LOWEST_COST_WITH_BID_CAP
                            - COST_CAP
                            - LOWEST_COST_WITH_MIN_ROAS
                          type: string
                        customerLifecycle:
                          additionalProperties: false
                          description: >-
                            Meta's Customer Lifecycle Strategy on a Sales ad set
                            (Meta `ad_set_goal`). Rejected with 400 in adSetId
                            attach mode: use PUT /apis/v1/ads/ad-sets/{adSetId}
                            for an ad set that already exists.
                          properties:
                            engagedAudienceIds:
                              description: >-
                                Custom audience ids of people who engaged but
                                have not bought. Required with
                                new_customers_excluding_engaged, not allowed
                                with the other strategies. Must be yours: it is
                                checked through the connection before the
                                request is sent, and an id that is not yours
                                answers not_found.
                              items:
                                type: string
                              type: array
                            existingCustomerAudienceIds:
                              description: >-
                                Custom audience ids that define your existing
                                customers. Required with both new_customers
                                strategies (Meta answers 400 subcode 1870251
                                without them); not allowed with all_customers.
                                Must be yours: it is checked through the
                                connection before the request is sent, and an id
                                that is not yours answers not_found.
                              items:
                                type: string
                              type: array
                            strategy:
                              description: >-
                                `all_customers` is "Maximize conversions from
                                all customers". `new_customers` is "Acquire new
                                customers" (excludes existing customers).
                                `new_customers_excluding_engaged` also excludes
                                people who engaged with you but have not bought
                                yet.
                              enum:
                                - all_customers
                                - new_customers
                                - new_customers_excluding_engaged
                              type: string
                          required:
                            - strategy
                          type: object
                        dailyMinSpendTarget:
                          description: >-
                            Meta daily_min_spend_target on the ad set being
                            created: the least it should spend per day, in whole
                            currency units. A target, not a guarantee.
                          type: number
                        lifetimeMinSpendTarget:
                          description: >-
                            Meta lifetime_min_spend_target: the lifetime-budget
                            flavour of dailyMinSpendTarget, in whole currency
                            units. Same rules and same rejections.
                          type: number
                        roasAverageFloor:
                          description: >-
                            Decimal ROAS multiplier (2.0 = 2.0x). Required when
                            bidStrategy is LOWEST_COST_WITH_MIN_ROAS; sending it
                            without bidStrategy is a 400.
                          type: number
                      type: object
                portfolioBidStrategyId:
                  description: >-
                    Google Search and Display only. Performance Max rejects
                    portfolio bidding. Attach an existing portfolio bid strategy
                    (numeric id from GET /apis/v1/ads/bid-strategies) to the new
                    campaign instead of a standard one.
                  pattern: ^\d+$
                  type: string
                promotedObject:
                  additionalProperties: false
                  description: >-
                    What the ad optimises against. Behaviour depends on the
                    platform. Platforms other than Meta, TikTok, OpenAI and
                    Reddit ignore `promotedObject` entirely. Meta: forwarded to
                    the ad set's `promoted_object` (snake-cased).
                  properties:
                    applicationId:
                      description: 'App ID. Required for `goal: app_promotion`.'
                      type: string
                    customConversionId:
                      description: >-
                        Custom Conversion ID, when optimising against one
                        instead of a standard event. Accepted alone by this API,
                        without `pixelId` or `customEventType`.
                      type: string
                    customEventStr:
                      description: >-
                        Meta only. Pixel custom-event name to optimise against
                        (Meta's `custom_event_str`), exactly as it appears in
                        Events Manager and your CAPI payloads (case-sensitive,
                        not uppercased).
                      type: string
                    customEventType:
                      description: >-
                        The event the campaign/ad group optimises against. Meta:
                        a standard event like `PURCHASE`, `LEAD`,
                        `COMPLETE_REGISTRATION`, `ADD_TO_CART`. Uppercased
                        internally, so any case works. Required for `goal:
                        conversions`.
                      type: string
                    objectStoreUrl:
                      description: >-
                        App Store / Play Store listing URL. Required for `goal:
                        app_promotion`.
                      format: uri
                      type: string
                    offlineConversionDataSetId:
                      description: >-
                        Meta only. Offline event set (dataset) to optimise
                        toward. Post-merger these are datasets: the id is the
                        dataset id (for pixel-backed datasets, the pixel id).
                      type: string
                    pageId:
                      description: >-
                        Facebook Page ID. Used by `goal: lead_generation`.
                        Auto-filled from the connected Page when omitted.
                      type: string
                    pixelId:
                      description: >-
                        Pixel ID. Meta: Facebook Pixel ID, required for `goal:
                        conversions`.
                      type: string
                    productCatalogId:
                      description: >-
                        Optional catalog ID. A catalog ID cannot replace
                        productSetId.
                      type: string
                    productSetId:
                      description: >-
                        Meta product SET ID, for example from GET
                        /apis/v1/ads/catalogs/{catalogId}/product-sets. Creating
                        catalog ads needs only ads_management on the Meta login,
                        not catalog_management. Where it goes.
                      type: string
                    whatsappPhoneNumber:
                      description: >-
                        Meta only. WhatsApp number on messaging-destination ad
                        sets.
                      type: string
                  type: object
                promotion:
                  description: >-
                    Not supported. Send null or omit the field, and set the
                    Promotion on the ad in Ads Manager. Any object is rejected
                    with 400 invalid_field_value.
                  type:
                    - object
                    - 'null'
                rawTargeting:
                  additionalProperties: true
                  description: Meta only.
                  type: object
                regionalRegulatedCategories:
                  description: >-
                    Meta only. Regional regulation categories required when the
                    ad set targets certain countries.
                  items:
                    type: string
                  type: array
                regionalRegulationIdentities:
                  additionalProperties:
                    type:
                      - string
                      - integer
                  description: >-
                    Meta only. Verified identity IDs of the beneficiary and
                    payer for each declared regionalRegulatedCategories value.
                    Ignored when adSetId adds the ad to an existing ad set.
                  type: object
                regions:
                  description: >-
                    Region-level (state/province) geo targeting (Meta, Google
                    and TikTok). Each region is targeted by the platform's
                    opaque `key` (the region ID) which can be looked up via `GET
                    /apis/v1/ads/targeting/search?dimension=geo&q=&countryCode=`.
                  items:
                    oneOf:
                      - type: string
                      - properties:
                          key:
                            description: >-
                              Platform region ID, from
                              /apis/v1/ads/targeting/search results.
                            type: string
                        required:
                          - key
                        type: object
                  type: array
                rfPredictionId:
                  description: >-
                    Meta only. The RESERVED prediction id the R&F ad set runs on
                    (reserving mints a new id, so pass that one). Requires
                    buyingType RESERVED.
                  type: string
                roasAverageFloor:
                  description: >-
                    Deprecated: send it inside `platformSpecificData` instead
                    (Meta today; TikTok's nested shape is planned). The flat
                    field keeps working during the deprecation window. Sending
                    both shapes returns a 400.
                  type: number
                savedTargetingId:
                  description: >-
                    ID of a `saved_targeting` audience (created via POST
                    /apis/v1/ads/audiences). When set, its stored TargetingSpec
                    is expanded as the base targeting; inline fields on this
                    body merge on top. Must be yours: it is checked through the
                    connection before the request is sent, and an id that is not
                    yours answers not_found.
                  type: string
                sitelinks:
                  description: >-
                    Google Search only. Sitelink assets to create and attach at
                    the campaign level. Each entry becomes an Asset (with
                    sitelink_asset + Asset.final_urls) plus a CampaignAsset link
                    (field_type SITELINK).
                  items:
                    properties:
                      description1:
                        description: >-
                          First description line under the link text (optional).
                          35-char cap.
                        maxLength: 35
                        minLength: 1
                        type: string
                      description2:
                        description: >-
                          Second description line (optional; usually paired with
                          description1).
                        maxLength: 35
                        minLength: 1
                        type: string
                      linkUrl:
                        description: Final URL the sitelink navigates to.
                        format: uri
                        type: string
                      text:
                        description: >-
                          The clickable link text shown under the ad. 25-char
                          cap comes from Google.
                        maxLength: 25
                        minLength: 1
                        type: string
                    required:
                      - linkUrl
                      - text
                    type: object
                  maxItems: 20
                  minItems: 2
                  type: array
                smartPlus:
                  description: >-
                    TikTok only. Creates the ad as a TikTok Upgraded Smart+
                    campaign: TikTok automates targeting, bidding and delivery.
                    Supported goals: `conversions`: Smart+ Web Conversions.
                  type: boolean
                smartTargeting:
                  description: >-
                    TikTok only (a 400 elsewhere). TikTok Smart Targeting on the
                    ad group. When on, TikTok may deliver beyond the selected
                    audiences or interests. `audience`: TikTok's
                    `smart_audience_enabled`.
                  properties:
                    audience:
                      description: TikTok smart_audience_enabled.
                      type: boolean
                    interestsBehaviors:
                      description: TikTok smart_interest_behavior_enabled.
                      type: boolean
                  type: object
                specialAdCategories:
                  description: >-
                    Meta only. Declares the ad's special category, required for
                    housing, employment, credit, or political/social-issue ads
                    (Meta enforces restricted targeting for these). Note:
                    setting a special category disables income/zip targeting on
                    Meta.
                  items:
                    enum:
                      - HOUSING
                      - EMPLOYMENT
                      - CREDIT
                      - FINANCIAL_PRODUCTS_SERVICES
                      - ISSUES_ELECTIONS_POLITICS
                      - ONLINE_GAMBLING_AND_GAMING
                    type: string
                  type: array
                specialAdCategoryCountry:
                  description: >-
                    Meta (metaads) only. 2-letter ISO country codes the special
                    ad category applies to. Requires specialAdCategories to be
                    set (400 otherwise).
                  items:
                    type: string
                  type: array
                startDate:
                  description: >-
                    Ad-set start time (ISO 8601, e.g. "2026-06-10T09:00:00Z").
                    When omitted the ad starts delivering immediately. Same
                    field as on `POST /apis/v1/ads/boost`.
                  format: date-time
                  type: string
                status:
                  description: >-
                    Publish state of the created entities, on every platform.
                    Omitted or ACTIVE publishes live (default, back-compat).
                  enum:
                    - ACTIVE
                    - PAUSED
                  type: string
                structuredSnippets:
                  description: >-
                    Google Search only. Structured snippets: one header from
                    Google's predefined list plus 3-10 values (max 25 chars
                    each). Each becomes one Asset (`structured_snippet_asset`)
                    plus a CampaignAsset link with field_type
                    STRUCTURED_SNIPPET.
                  items:
                    properties:
                      header:
                        description: One of Google's 13 predefined snippet headers.
                        enum:
                          - Amenities
                          - Brands
                          - Courses
                          - Degree programs
                          - Destinations
                          - Featured hotels
                          - Insurance coverage
                          - Models
                          - Neighborhoods
                          - Service catalog
                          - Shows
                          - Styles
                          - Types
                        type: string
                      values:
                        items:
                          maxLength: 25
                          minLength: 1
                          type: string
                        maxItems: 10
                        minItems: 3
                        type: array
                    required:
                      - header
                      - values
                    type: object
                  maxItems: 20
                  minItems: 1
                  type: array
                targetImpressionShare:
                  additionalProperties: false
                  description: >-
                    Google Search only. Target impression share bidding.
                    Exclusive with bidStrategy, portfolioBidStrategyId and
                    manualCpc; bidAmount is refused alongside it (the ceiling is
                    maxCpc).
                  properties:
                    location:
                      enum:
                        - ANYWHERE_ON_PAGE
                        - TOP_OF_PAGE
                        - ABSOLUTE_TOP_OF_PAGE
                      type: string
                    maxCpc:
                      description: >-
                        Max CPC bid limit, in the account's currency units.
                        Google requires it.
                      exclusiveMinimum: 0
                      type: number
                    percent:
                      description: >-
                        Target share of impressions, in percent (65 = 65%). Sent
                        to Google as location_fraction_micros (1% = 10,000).
                      exclusiveMinimum: 0
                      maximum: 100
                      type: number
                  required:
                    - location
                    - maxCpc
                    - percent
                  type: object
                targeting:
                  description: >-
                    Nested targeting object: the same TargetingSpec shape as
                    `POST /apis/v1/ads/boost`, `POST
                    /apis/v1/ads/targeting/reach-estimate`, and
                    `saved_targeting` audiences.
                  properties:
                    ageMax:
                      description: >-
                        Maximum age. Same per-platform application and clamping
                        as ageMin.
                      maximum: 100
                      minimum: 13
                      type: integer
                    ageMin:
                      description: >-
                        Minimum age. Applied on Meta, TikTok, Pinterest,
                        LinkedIn, X and Google Search/Display (Google excludes
                        the age ranges outside the request). Rejected with 400
                        on OpenAI, Reddit and Google Performance Max / Demand
                        Gen.
                      maximum: 100
                      minimum: 13
                      type: integer
                    audienceExclude:
                      description: >-
                        Platform audience IDs to exclude; same ID formats as
                        audienceInclude. Not supported on OpenAI (400). Must be
                        yours: it is checked through the connection before the
                        request is sent, and an id that is not yours answers
                        not_found.
                      items:
                        type: string
                      type: array
                    audienceInclude:
                      description: >-
                        Platform audience IDs to include, as returned by GET
                        /apis/v1/ads/audiences: Meta: custom audience ids.
                        TikTok: audience ids. Pinterest: customer list ids.
                        LinkedIn: segment ids (the platformAudienceId from GET
                        /apis/v1/ads/audiences). Must be yours: it is checked
                        through the connection before the request is sent, and
                        an id that is not yours answers not_found.
                      items:
                        type: string
                      type: array
                    behaviors:
                      description: >-
                        Behaviour entities from
                        /apis/v1/ads/targeting/search?dimension=behavior (Meta,
                        TikTok and LinkedIn). On TikTok they target people who,
                        in the picked categories:
                      items:
                        properties:
                          id:
                            type: string
                          name:
                            type: string
                        required:
                          - id
                        type: object
                      type: array
                    cities:
                      description: >-
                        City targeting. Optional `radius` + `distanceUnit`
                        extend beyond the city limits; both must be set together
                        or both omitted. `radius` is only honoured on platforms
                        whose capability map allows city radius (Meta).
                      items:
                        oneOf:
                          - type: string
                          - properties:
                              distanceUnit:
                                description: Required if radius is set.
                                enum:
                                  - mile
                                  - kilometer
                                type: string
                              key:
                                type: string
                              name:
                                type: string
                              radius:
                                description: >-
                                  Radius around the city. Requires distanceUnit.
                                  Meta enforces a minimum city radius (~17 km /
                                  10 mi); smaller values resolve to a 0-size
                                  audience and the ad fails at launch.
                                type: number
                            required:
                              - key
                            type: object
                      type: array
                    communities:
                      description: >-
                        Reddit only (400 elsewhere). Subreddits to target, by
                        name, with or without the `r/` prefix (e.g.
                        `['marketing', 'r/startups']`), as returned by
                        /apis/v1/ads/targeting/search?dimension=community.
                      items:
                        minLength: 1
                        type: string
                      type: array
                    companySizes:
                      description: >-
                        LinkedIn B2B only. Single-letter size codes (A to I), or
                        the full urn:li:staffCountRange:* URN from
                        /apis/v1/ads/targeting/search?dimension=companySize.
                      items:
                        type: string
                      type: array
                    conversationKeywords:
                      description: >-
                        Reddit only (400 elsewhere). Keywords that place the ad
                        in Reddit conversations about them, as returned by
                        /apis/v1/ads/targeting/search?dimension=conversationKeyword.
                      items:
                        minLength: 1
                        type: string
                      type: array
                    countries:
                      description: ISO 3166-1 alpha-2 country codes (e.g. ['US']).
                      items:
                        type: string
                      type: array
                    countryGroups:
                      description: >-
                        Meta only. Continents and trade blocs
                        (`geo_locations.country_groups`), for targeting a whole
                        region without listing its countries. Combines with
                        `countries` rather than replacing it, and is also
                        accepted under `excludedLocations`.
                      items:
                        enum:
                          - africa
                          - asia
                          - europe
                          - north_america
                          - south_america
                          - oceania
                          - central_america
                          - caribbean
                          - eea
                          - euro_area
                          - nafta
                          - mercosur
                          - afta
                          - apec
                          - gcc
                          - cisfta
                          - emerging_markets
                          - itunes_app_store
                          - android_free_store
                          - android_paid_store
                        type: string
                      type: array
                    customLocations:
                      description: >-
                        Point-radius (lat/lng) targeting (Meta custom_locations
                        / Google proximity). Honoured on Meta and Google;
                        ignored on platforms without radius support.
                      items:
                        properties:
                          address:
                            description: >-
                              Optional label, sent to Meta as `address_string`.
                              latitude/longitude take precedence for the pin
                              location.
                            type: string
                          distanceUnit:
                            enum:
                              - mile
                              - kilometer
                            type: string
                          latitude:
                            maximum: 90
                            minimum: -90
                            type: number
                          longitude:
                            maximum: 180
                            minimum: -180
                            type: number
                          name:
                            type: string
                          radius:
                            description: Positive radius around the point.
                            type: number
                        required:
                          - distanceUnit
                          - latitude
                          - longitude
                          - radius
                        type: object
                      type: array
                    excludedCommunities:
                      description: >-
                        Reddit only (400 elsewhere). Subreddits to exclude,
                        named like `communities`.
                      items:
                        minLength: 1
                        type: string
                      type: array
                    excludedConversationKeywords:
                      description: >-
                        Reddit only (400 elsewhere). Conversation keywords to
                        keep the ad away from.
                      items:
                        minLength: 1
                        type: string
                      type: array
                    excludedLocations:
                      description: >-
                        Geo to exclude from the audience. Mirrors the inclusion
                        geo shape. Meta (excluded_geo_locations): excluded
                        cities can carry a radius catchment, and excluded custom
                        (lat/lng) pins are supported.
                      properties:
                        cities:
                          description: >-
                            Cities to exclude. Optional `radius` +
                            `distanceUnit` exclude a catchment around the city
                            (both must be set together or both omitted); Meta
                            honours the radius on excluded cities.
                          items:
                            properties:
                              distanceUnit:
                                description: Required if radius is set.
                                enum:
                                  - mile
                                  - kilometer
                                type: string
                              key:
                                type: string
                              radius:
                                description: >-
                                  Radius around the excluded city. Requires
                                  distanceUnit.
                                type: number
                            required:
                              - key
                            type: object
                          type: array
                        countries:
                          items:
                            type: string
                          type: array
                        countryGroups:
                          description: >-
                            Meta only. Continents and trade blocs to exclude
                            (`excluded_geo_locations.country_groups`).
                          items:
                            enum:
                              - africa
                              - asia
                              - europe
                              - north_america
                              - south_america
                              - oceania
                              - central_america
                              - caribbean
                              - eea
                              - euro_area
                              - nafta
                              - mercosur
                              - afta
                              - apec
                              - gcc
                              - cisfta
                              - emerging_markets
                              - itunes_app_store
                              - android_free_store
                              - android_paid_store
                            type: string
                          type: array
                        customLocations:
                          description: >-
                            Point-radius (lat/lng) pins to exclude (Meta
                            excluded_geo_locations.custom_locations). Mirrors
                            the inclusion customLocations shape.
                          items:
                            properties:
                              address:
                                description: >-
                                  Optional label, sent to Meta as
                                  `address_string`. latitude/longitude take
                                  precedence for the pin location.
                                type: string
                              distanceUnit:
                                enum:
                                  - mile
                                  - kilometer
                                type: string
                              latitude:
                                maximum: 90
                                minimum: -90
                                type: number
                              longitude:
                                maximum: 180
                                minimum: -180
                                type: number
                              name:
                                type: string
                              radius:
                                description: Positive radius around the point.
                                type: number
                            required:
                              - distanceUnit
                              - latitude
                              - longitude
                              - radius
                            type: object
                          type: array
                        neighborhoods:
                          description: >-
                            Named neighbourhood areas to exclude. `key` from
                            /apis/v1/ads/targeting/search.
                          items:
                            properties:
                              key:
                                type: string
                            required:
                              - key
                            type: object
                          type: array
                        places:
                          description: >-
                            Named points of interest to exclude. `key` from
                            /apis/v1/ads/targeting/search.
                          items:
                            properties:
                              key:
                                type: string
                            required:
                              - key
                            type: object
                          type: array
                        regions:
                          items:
                            properties:
                              key:
                                type: string
                              name:
                                type: string
                            required:
                              - key
                            type: object
                          type: array
                        zips:
                          items:
                            properties:
                              key:
                                type: string
                              name:
                                type: string
                            required:
                              - key
                            type: object
                          type: array
                      type: object
                    gender:
                      description: Restrict by gender. 'all' (default) targets everyone.
                      enum:
                        - all
                        - male
                        - female
                      type: string
                    incomeTier:
                      description: >-
                        Normalized household-income tier (ZIP/percentile based).
                        Meta and TikTok express all four. Google maps only
                        `top_10` (its INCOME_RANGE_90_UP); other tiers on
                        Google, and any income tier on LinkedIn / X / Pinterest,
                        are rejected.
                      enum:
                        - top_5
                        - top_10
                        - top_10_25
                        - top_25_50
                      type: string
                    industries:
                      description: >-
                        LinkedIn B2B only. Industry URN id fragments, or the
                        full urn:li:industry:* URN from
                        /apis/v1/ads/targeting/search?dimension=industry.
                      items:
                        type: string
                      type: array
                    interests:
                      description: >-
                        Interest entities from
                        /apis/v1/ads/targeting/search?dimension=interest. Each
                        carries the platform's opaque id.
                      items:
                        properties:
                          id:
                            type: string
                          name:
                            type: string
                        required:
                          - id
                        type: object
                      type: array
                    jobFunctions:
                      description: >-
                        LinkedIn B2B only. Function URN id fragments, or the
                        full urn:li:function:* URN from
                        /apis/v1/ads/targeting/search?dimension=jobFunction.
                      items:
                        type: string
                      type: array
                    languages:
                      description: >-
                        Language codes restricting the audience by language.
                        Applied on Meta, Google, TikTok, LinkedIn, X, Pinterest
                        and Reddit; rejected with 400 on OpenAI. A code the
                        platform cannot target returns 400 listing the ones it
                        can.
                      items:
                        type: string
                      type: array
                    metros:
                      description: >-
                        DMA / metro-area targeting. `key` is the platform's
                        metro ID (e.g. Meta `DMA:807`).
                      items:
                        properties:
                          key:
                            type: string
                          name:
                            type: string
                        required:
                          - key
                        type: object
                      type: array
                    regions:
                      description: >-
                        Region/state targeting. `key` is the platform location
                        ID from
                        /apis/v1/ads/targeting/search?dimension=geo&geoType=region.
                        An entry may also be that id as a plain string
                        (`"20321"` is `{ key: "20321" }`).
                      items:
                        oneOf:
                          - type: string
                          - properties:
                              key:
                                type: string
                              name:
                                type: string
                            required:
                              - key
                            type: object
                      type: array
                    seniorities:
                      description: >-
                        LinkedIn B2B only. Seniority URN id fragments, or the
                        full urn:li:seniority:* URN from
                        /apis/v1/ads/targeting/search?dimension=seniority.
                      items:
                        type: string
                      type: array
                    skills:
                      description: >-
                        LinkedIn B2B only. Member skills (e.g. Python,
                        Recruiting): skill URN id fragments, or the full
                        urn:li:skill:* URN from
                        /apis/v1/ads/targeting/search?dimension=skill. Values
                        are ORed; the facet is ANDed with the other facets.
                      items:
                        type: string
                      type: array
                    userDevice:
                      description: >-
                        Meta only. Device models such as iPhone. Emitted as
                        user_device. May also be supplied inside targeting.
                      items:
                        minLength: 1
                        type: string
                      minItems: 1
                      type: array
                    userOs:
                      description: >-
                        Meta only. Operating systems and version ranges, such as
                        iOS_ver_14.0_and_above or Android. Emitted as user_os.
                        May also be supplied inside targeting.
                      items:
                        minLength: 1
                        type: string
                      minItems: 1
                      type: array
                    workEmployers:
                      description: >-
                        Meta only. Employer entities from
                        /apis/v1/ads/targeting/search?dimension=workEmployer.
                      items:
                        properties:
                          id:
                            type: string
                          name:
                            type: string
                        required:
                          - id
                        type: object
                      type: array
                    workIndustries:
                      description: >-
                        Meta only. Work-industry entities from
                        /apis/v1/ads/targeting/search?dimension=workIndustry.
                        Not interchangeable with the LinkedIn `industries` URN
                        fragments.
                      items:
                        properties:
                          id:
                            type: string
                          name:
                            type: string
                        required:
                          - id
                        type: object
                      type: array
                    workPositions:
                      description: >-
                        Meta only. Job title entities from
                        /apis/v1/ads/targeting/search?dimension=workPosition.
                        Not interchangeable with the LinkedIn `jobTitles` URN
                        fragments.
                      items:
                        properties:
                          id:
                            type: string
                          name:
                            type: string
                        required:
                          - id
                        type: object
                      type: array
                    zips:
                      description: >-
                        Postal/ZIP targeting. `key` is the platform's postal
                        location ID (e.g. Meta `US:94304`). Supported on Meta,
                        Google, TikTok, Pinterest, X.
                      items:
                        properties:
                          key:
                            type: string
                          name:
                            type: string
                        required:
                          - key
                        type: object
                      type: array
                  type: object
                tracking:
                  description: >-
                    Ad tracking. Meta, plus `urlTags` on ChatGPT (OpenAI) and
                    `pixelId` on Reddit. Meta: attaches pixel measurement to the
                    ad regardless of the optimization goal (the "Website events"
                    tracking row in Ads Manager).
                  properties:
                    pixelId:
                      description: >-
                        Meta Pixel ID to attach for offsite-conversion
                        measurement, or the Reddit pixel of the new ad group.
                      type: string
                    urlTags:
                      description: >-
                        Click-URL params. Meta: stored on the creative as
                        `url_tags` and returned by GET
                        /apis/v1/ads/{adId}/tracking-tags.
                      items:
                        properties:
                          key:
                            type: string
                          value:
                            type: string
                        required:
                          - key
                          - value
                        type: object
                      type: array
                  type: object
                translations:
                  description: >-
                    Meta only. Multi-language ads (Dynamic Language
                    Optimization, the "Languages" toggle in Ads Manager): ONE ad
                    with per-locale copy and, optionally, per-locale media.
                  items:
                    properties:
                      body:
                        description: >-
                          Primary text for this language. REQUIRED, and must
                          differ from every other locale and from the ad's
                          top-level body.
                        type: string
                      description:
                        description: >-
                          Link description for this language. REQUIRED, and must
                          differ from every other locale and from the ad's
                          top-level description.
                        maxLength: 255
                        type: string
                      headline:
                        description: >-
                          Headline for this language. REQUIRED, and must differ
                          from every other locale and from the ad's top-level
                          headline.
                        maxLength: 255
                        type: string
                      imageUrl:
                        description: >-
                          Image for this language. Inherits the ad's `imageUrl`
                          when omitted. The feed is all-image OR all-video.
                        format: uri
                        type: string
                      linkUrl:
                        description: >-
                          Destination URL for this language. Inherits the ad's
                          top-level `linkUrl` when omitted, and requires it to
                          be present (400 otherwise): the top-level URL is the
                          destination for every locale you did not override.
                        format: uri
                        type: string
                      locale:
                        description: >-
                          Language code, resolved to Meta's numeric locale id.
                          Bare codes target the '(All)' umbrella (`es` = every
                          Spanish variant); region-qualified codes target the
                          variant (`pt_BR`, `en_GB`).
                        type: string
                      thumbnailUrl:
                        description: Poster frame for this language's video.
                        format: uri
                        type: string
                      videoUrl:
                        description: >-
                          Video for this language. Inherits the ad's `video.url`
                          when omitted. The feed is all-image OR all-video.
                        format: uri
                        type: string
                    required:
                      - body
                      - description
                      - headline
                      - locale
                    type: object
                  maxItems: 10
                  minItems: 1
                  type: array
                userDevice:
                  description: >-
                    Meta only. Device models such as iPhone. Emitted as
                    user_device. May also be supplied inside targeting.
                  items:
                    minLength: 1
                    type: string
                  minItems: 1
                  type: array
                userOs:
                  description: >-
                    Meta only. Operating systems and version ranges, such as
                    iOS_ver_14.0_and_above or Android. Emitted as user_os. May
                    also be supplied inside targeting.
                  items:
                    minLength: 1
                    type: string
                  minItems: 1
                  type: array
                validateOnly:
                  description: >-
                    Validate the request without creating anything. Any other
                    platform, or a Google campaignType other than pmax or
                    demand_gen, returns 501 `feature_not_available`.
                  type: boolean
                valueRuleSetId:
                  description: >-
                    Meta only (facebook, instagram; other platforms return 400).
                    Value rule set to attach to the new ad set, from
                    `/apis/v1/ads/value-rule-sets`. Attachment is driven by this
                    id, so `valueRulesApplied` is optional alongside it.
                  pattern: ^\d+$
                  type: string
                valueRulesApplied:
                  description: >-
                    Meta only (facebook, instagram; other platforms return 400).
                    Optional when attaching, and requires `valueRuleSetId`.
                  type: boolean
                video:
                  description: >-
                    Creates a single VIDEO ad. Meta (facebook, instagram),
                    LinkedIn and Reddit. Mutually exclusive with `imageUrl`.
                    Supply `url` to upload a file, or `id` to reuse a video
                    already on the ad account (list them with GET
                    /apis/v1/ads/videos).
                  properties:
                    id:
                      description: >-
                        Meta only. Reuse a video ALREADY uploaded to this ad
                        account instead of re-uploading the file: pass the
                        `videoId` returned by a previous create.
                      type: string
                    thumbnailUrl:
                      description: >-
                        Public URL of a still-image thumbnail for the video.
                        OPTIONAL. Meta, omitted: the poster is auto-generated
                        from Meta's own preferred video thumbnail (the
                        candidates Ads Manager shows), so video ads usually
                        publish without one.
                      format: uri
                      type: string
                    url:
                      description: >-
                        Public URL of the video. Meta: uploaded via chunked
                        transfer on /act_X/advideos, then the request blocks on
                        Meta's transcoding until status.video_status ===
                        'ready'.
                      format: uri
                      type: string
                  type: object
                workEmployers:
                  description: >-
                    Meta only. Employer entities from
                    /apis/v1/ads/targeting/search?dimension=workEmployer. Each
                    must include id.
                  items:
                    properties:
                      id:
                        type: string
                      name:
                        type: string
                    required:
                      - id
                    type: object
                  type: array
                workIndustries:
                  description: >-
                    Meta only. Work-industry entities from
                    /apis/v1/ads/targeting/search?dimension=workIndustry. Each
                    must include id. Rejected on other platforms (use LinkedIn's
                    `industries` there).
                  items:
                    properties:
                      id:
                        type: string
                      name:
                        type: string
                    required:
                      - id
                    type: object
                  type: array
                workPositions:
                  description: >-
                    Meta only. Job title entities from
                    /apis/v1/ads/targeting/search?dimension=workPosition. Each
                    must include id. Rejected on other platforms (use LinkedIn's
                    `jobTitles` there).
                  items:
                    properties:
                      id:
                        type: string
                      name:
                        type: string
                    required:
                      - id
                    type: object
                  type: array
                zips:
                  description: >-
                    Postal/ZIP geo targeting. `key` is the platform's postal
                    location ID from
                    /apis/v1/ads/targeting/search?dimension=geo&geoType=zip.
                    Supported on Meta, Google, TikTok, Pinterest, X.
                  items:
                    oneOf:
                      - type: string
                      - properties:
                          key:
                            type: string
                          name:
                            type: string
                        required:
                          - key
                        type: object
                  type: array
              required:
                - adAccountId
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  appliedDefaults:
                    description: >-
                      What the create filled in for fields the request left out.
                      Empty when every field was sent. A passing validateOnly
                      returns it too, so a dry run previews these values before
                      anything is created.
                    properties:
                      budgetType:
                        description: Sent when `budgetAmount` came without `budgetType`.
                        enum:
                          - daily
                        type: string
                      countries:
                        description: >-
                          Sent when the request sent no countries and the ad
                          gets the long-standing United States default. Not sent
                          on attach, Google Performance Max or Demand Gen, or a
                          Google ad group joining `existingCampaignId`, which
                          keep their own geo.
                        items:
                          type: string
                        type: array
                      endDate:
                        description: >-
                          Sent when a lifetime budget had no `endDate`: 7 days
                          after the start. A daily budget never gets one and
                          runs until paused. A start with an offset (or no
                          start) gets a UTC instant.
                        type: string
                      goal:
                        description: >-
                          `lead_generation`: with a `leadGenFormId`.
                          `app_promotion`: when `promotedObject` names an app.
                          `conversions`: with `promotedObject.pixelId` and
                          `customEventType`.
                        type: string
                      name:
                        description: 'Sent when `name` was omitted: `Ad ` in UTC.'
                        type: string
                    type: object
                  message:
                    type: string
                  results:
                    items:
                      properties:
                        node:
                          enum:
                            - campaign
                            - adSet
                            - creative
                            - ad
                            - performanceMaxCampaign
                          type: string
                        reason:
                          description: >-
                            Explanation for the node's result: On skipped: why
                            the node could not be validated. On unverified: why
                            Meta could not dry-run it although the other nodes
                            passed.
                          type: string
                        status:
                          enum:
                            - validated
                            - skipped
                            - unverified
                          type: string
                      type: object
                    type: array
                  validateOnly:
                    description: Always true in a validate-only response.
                    type: boolean
                type: object
          description: validateOnly dry-run passed, nothing was created
        '201':
          content:
            application/json:
              schema:
                oneOf:
                  - description: 'Legacy + attach shapes: one ad returned.'
                    properties:
                      ad:
                        properties:
                          _id:
                            type: string
                          adSetName:
                            type: string
                          adType:
                            enum:
                              - boost
                              - standalone
                            type: string
                          bidAmount:
                            description: >-
                              Bid amount in WHOLE currency units of the ad
                              account (USD: 5 = $5.00; JPY: 100 = ¥100). Meta:
                              `bid_amount` on the ad set (smallest-denomination
                              int, decoded here).
                            type:
                              - number
                              - 'null'
                          bidStrategy:
                            anyOf:
                              - description: >-
                                  Meta bid strategy. Same enum applies at
                                  campaign and ad-set level; ad-set value (when
                                  set) overrides campaign-level. Cross-field
                                  rules: `LOWEST_COST_WITHOUT_CAP` (default):
                                  auto-bid, forbids `bidAmount` and
                                  `roasAverageFloor`.
                                enum:
                                  - LOWEST_COST_WITHOUT_CAP
                                  - LOWEST_COST_WITH_BID_CAP
                                  - COST_CAP
                                  - LOWEST_COST_WITH_MIN_ROAS
                                type: string
                              - type: 'null'
                            description: >-
                              Ad-set bid strategy (overrides campaign level on
                              Meta). Populated for Meta and TikTok.
                          budget:
                            properties:
                              amount:
                                type: number
                              daily:
                                description: >-
                                  LinkedIn and X only. The daily budget
                                  (LinkedIn: the parent campaign's
                                  `dailyBudget`; X: the line item's, or the
                                  campaign's when the line item has none).
                                type: number
                              lifetime:
                                description: >-
                                  LinkedIn and X only. The lifetime total
                                  (LinkedIn: the parent campaign's
                                  `totalBudget`; X:
                                  `total_budget_amount_local_micro`, for example
                                  the `lifetimeBudgetCap` of a boost), readable
                                  even when a daily budget is also set.
                                type: number
                              pacing:
                                description: >-
                                  LinkedIn only. The campaign's
                                  `pacingStrategy`: how fast LinkedIn may spend
                                  the budget. Typically LINEAR or ACCELERATED;
                                  the list is open.
                                type: string
                              type:
                                enum:
                                  - daily
                                  - lifetime
                                type: string
                            type:
                              - object
                              - 'null'
                          campaignName:
                            type: string
                          configuredStatus:
                            description: >-
                              The ad's own on/off switch as configured on the
                              platform, independent of its parents. An ACTIVE ad
                              under a paused ad set or campaign still reads
                              ACTIVE here while `status` reads `paused`.
                              Sources: Meta: `configured_status`.
                            type:
                              - string
                              - 'null'
                          costType:
                            description: >-
                              LinkedIn only. The campaign's EFFECTIVE cost model
                              (billing event) as applied by LinkedIn, refreshed
                              on every sync rather than echoing what was passed
                              on create. `null` for non-LinkedIn ads. `CPM`:
                              cost per thousand impressions.
                            type:
                              - string
                              - 'null'
                          createdAt:
                            format: date-time
                            type: string
                          creative:
                            description: >-
                              Platform-specific creative data. Fields vary by
                              platform.
                            properties:
                              adFormat:
                                description: >-
                                  LinkedIn only. The LinkedIn ad format, in
                                  LinkedIn's own vocabulary: STANDARD_UPDATE,
                                  SINGLE_VIDEO, CAROUSEL, NATIVE_DOCUMENT,
                                  EVENT, TEXT_AD, SPOTLIGHT, FOLLOW_COMPANY,
                                  JOBS, SPONSORED_INMAILS and others.
                                type:
                                  - string
                                  - 'null'
                              assetGroup:
                                description: >-
                                  Google Performance Max creative assets. At
                                  least one description must be 60 characters or
                                  fewer. Texts within each list must be
                                  distinct.
                                properties:
                                  businessName:
                                    maxLength: 25
                                    minLength: 1
                                    type: string
                                  descriptions:
                                    description: >-
                                      At least one description must be 60
                                      characters or fewer.
                                    items:
                                      maxLength: 90
                                      minLength: 1
                                      type: string
                                    maxItems: 5
                                    minItems: 2
                                    type: array
                                    uniqueItems: true
                                  finalUrl:
                                    description: Required destination URL.
                                    format: uri
                                    pattern: ^https?://
                                    type: string
                                  headlines:
                                    items:
                                      maxLength: 30
                                      minLength: 1
                                      type: string
                                    maxItems: 15
                                    minItems: 3
                                    type: array
                                    uniqueItems: true
                                  images:
                                    additionalProperties: true
                                    description: >-
                                      Public HTTP(S) image URLs. GIF, JPEG or
                                      PNG, at most 5120 KB per image. Google
                                      validates dimensions and aspect ratios.
                                    type: object
                                  longHeadline:
                                    maxLength: 90
                                    minLength: 1
                                    type: string
                                  name:
                                    description: Defaults to the request name.
                                    maxLength: 128
                                    minLength: 1
                                    type: string
                                  youtubeVideoId:
                                    description: >-
                                      Optional existing YouTube video id. Google
                                      can generate video when omitted. Video
                                      uploads and arbitrary video URLs are not
                                      supported.
                                    pattern: ^[A-Za-z0-9_-]{11}$
                                    type: string
                                required:
                                  - businessName
                                  - descriptions
                                  - finalUrl
                                  - headlines
                                  - images
                                  - longHeadline
                                type: object
                              assetGroupResourceName:
                                description: >-
                                  Google resource name of the created
                                  Performance Max asset group.
                                type: string
                              assetResourceName:
                                description: >-
                                  Google Display only. Resource name of the
                                  landscape marketing image asset
                                  (`creative.imageUrl`), for example
                                  customers/1234567890/assets/123.
                                type: string
                              assets:
                                description: >-
                                  Google Display only. Native Google asset
                                  resource name of each image on the responsive
                                  display ad, keyed by Google's image role.
                                properties:
                                  marketingImages:
                                    description: >-
                                      Landscape (1.91:1) marketing images. The
                                      first item matches `assetResourceName`.
                                    items:
                                      additionalProperties: true
                                      type: object
                                    type: array
                                  squareMarketingImages:
                                    description: Square (1:1) marketing images.
                                    items:
                                      additionalProperties: true
                                      type: object
                                    type: array
                                type: object
                              bodies:
                                description: >-
                                  Meta: every primary text variation of the
                                  creative (`asset_feed_spec.bodies`), the same
                                  shape as the `bodies` create input. Present
                                  only with 2 or more texts; a single text is
                                  `body`.
                                items:
                                  type: string
                                type: array
                              body:
                                description: Ad copy/text
                                type: string
                              callToAction:
                                description: >-
                                  Meta: the call to action type
                                  (`call_to_action.type`, or the first
                                  `asset_feed_spec.call_to_action_types` entry),
                                  e.g. LEARN_MORE or SIGN_UP.
                                type: string
                              carouselCards:
                                description: >-
                                  Meta only today. The carousel's cards in
                                  display order, one per Meta
                                  `link_data.child_attachments` entry, using the
                                  same field names as the `carouselCards` create
                                  input. Absent on non-carousel ads and other
                                  platforms.
                                items:
                                  additionalProperties: true
                                  type: object
                                type: array
                              catalog:
                                properties:
                                  format:
                                    description: >-
                                      object_story_spec.template_data.format_option,
                                      from catalogFormat.
                                    enum:
                                      - single_image
                                      - carousel_images_multi_items
                                      - carousel_images_single_item
                                      - carousel_slideshows
                                    type: string
                                  formatTransformationSpec:
                                    description: >-
                                      The format_transformation_spec sent on the
                                      creative, as Meta's raw objects. Present
                                      for single_image.
                                    items:
                                      additionalProperties: true
                                      type: object
                                    type: array
                                  productSetId:
                                    description: The creative's product_set_id.
                                    type: string
                                type: object
                              creativeFeatures:
                                additionalProperties:
                                  enum:
                                    - OPT_IN
                                    - OPT_OUT
                                  type: string
                                description: >-
                                  Meta Advantage+ creative enhancements. Map
                                  snake_case feature names to OPT_IN or OPT_OUT;
                                  Meta validates supported keys and unspecified
                                  features default to OPT_OUT.
                                type: object
                              creativeId:
                                description: >-
                                  Meta ad creative id backing this ad, refreshed
                                  from Meta on every sync. Reusable via
                                  existingCreativeId on POST
                                  /apis/v1/ads/create, and readable raw through
                                  GET /apis/v1/ads/creatives/{creativeId}.
                                type:
                                  - string
                                  - 'null'
                              description:
                                description: >-
                                  Meta: the creative's description under the
                                  title (`link_data.description`,
                                  `video_data.link_description`, or the first
                                  `asset_feed_spec.descriptions` entry).
                                type: string
                              descriptions:
                                description: >-
                                  Google RSA: the description assets as objects
                                  (2 to 4). Meta: every description variation of
                                  the creative (`asset_feed_spec.descriptions`)
                                  as strings, the same shape as the
                                  `descriptions` create input.
                                items:
                                  oneOf:
                                    - type: string
                                    - additionalProperties: true
                                      type: object
                                maxItems: 4
                                type: array
                              effectiveInstagramMediaId:
                                description: >-
                                  Meta `effective_instagram_media_id`, the
                                  Instagram media ID of the boosted post the
                                  ad's engagement lives on. Pass to GET
                                  /apis/v1/ads?effectiveInstagramMediaId= to map
                                  a Business-Manager-visible IG post back to
                                  this ad.
                                type:
                                  - string
                                  - 'null'
                              effectiveObjectStoryId:
                                description: >-
                                  Meta `effective_object_story_id`, the
                                  `{pageId}_{postId}` of the Facebook post the
                                  ad's engagement (comments) lives on.
                                type:
                                  - string
                                  - 'null'
                              finalUrls:
                                description: >-
                                  Google RSA only. Replaces final URLs. Omitted
                                  lists stay unchanged.
                                items:
                                  format: uri
                                  type: string
                                minItems: 1
                                type: array
                              googleDescription:
                                description: Google Ads description
                                type: string
                              googleHeadline:
                                description: Google Ads headline
                                type: string
                              headline:
                                description: >-
                                  Meta: the creative's title (`link_data.name`,
                                  `video_data.title`, or the first
                                  `asset_feed_spec.titles` entry). Absent when
                                  the creative has none.
                                type: string
                              headlines:
                                description: >-
                                  Google RSA: the headline assets as objects (3
                                  to 15). Meta: every title variation of the
                                  creative (`asset_feed_spec.titles`) as
                                  strings, the same shape as the `headlines`
                                  create input.
                                items:
                                  oneOf:
                                    - type: string
                                    - additionalProperties: true
                                      type: object
                                maxItems: 15
                                type: array
                              imageHash:
                                description: >-
                                  Meta: the ad image hash (`image_hash`),
                                  reusable as `imageHash` on POST
                                  /apis/v1/ads/create within the same ad
                                  account. `thumbnailUrl` and `mediaUrls` carry
                                  its stable full resolution permalink when Meta
                                  resolves it.
                                type: string
                              imageUrl:
                                description: Alternative image URL
                                type: string
                              instagramPermalinkUrl:
                                description: >-
                                  Meta `instagram_permalink_url`, the public
                                  Instagram post URL of the boosted media.
                                type:
                                  - string
                                  - 'null'
                              instagramUserId:
                                description: >-
                                  Meta `instagram_user_id`, the Instagram-scoped
                                  business ID that owns the boosted media.
                                type:
                                  - string
                                  - 'null'
                              instagramVideoFallback:
                                description: >-
                                  Meta only. `instagram_video_reuploaded`: the
                                  video was copied into the ad account, and the
                                  ad still references the original post.
                                properties:
                                  kind:
                                    enum:
                                      - instagram_video_reuploaded
                                      - instagram_video_rehosted_copy
                                    type: string
                                  linkedToOriginalPost:
                                    description: >-
                                      True when the ad still references the
                                      original Instagram post and keeps its
                                      engagement.
                                    type: boolean
                                  platformError:
                                    additionalProperties: true
                                    description: Meta's original refusal.
                                    type: object
                                  videoId:
                                    description: >-
                                      instagram_video_reuploaded: the copy in
                                      the ad account video library (possibly one
                                      made by an earlier boost of the same
                                      media, reused).
                                    type: string
                                required:
                                  - kind
                                  - linkedToOriginalPost
                                  - platformError
                                  - videoId
                                type: object
                              isServing:
                                description: >-
                                  LinkedIn only. Whether LinkedIn is currently
                                  serving this specific creative. Complements
                                  the ad-level `servingStatuses`, which
                                  describes the parent campaign.
                                type:
                                  - boolean
                                  - 'null'
                              leadGenFormId:
                                description: >-
                                  Meta: the instant form the call to action
                                  opens
                                  (`call_to_action.value.lead_gen_form_id`, or
                                  the asset feed's `call_to_actions` on a
                                  dynamic creative), the same value as the
                                  `leadGenFormId` create input. Absent on ads
                                  without a lead form.
                                type: string
                              linkUrl:
                                description: Destination URL
                                type: string
                              mediaUrls:
                                description: >-
                                  All media URLs for this ad (carousel images,
                                  multiple assets). Populated for Meta (carousel
                                  child_attachments), Google Ads (responsive
                                  display marketing_images), and LinkedIn
                                  (multi-image posts).
                                items:
                                  type: string
                                type: array
                              objectStoryId:
                                description: >-
                                  Meta creative `object_story_id` (the SHARE
                                  reference). Frequently absent, because Meta
                                  omits it for SHARE creatives. Use
                                  effectiveObjectStoryId instead.
                                type:
                                  - string
                                  - 'null'
                              objectType:
                                description: >-
                                  Meta creative object_type (e.g. SHARE, VIDEO,
                                  PRIVACY_CHECK_FAIL, POST_DELETED). Use this to
                                  render state-aware previews: when Meta
                                  moderation strips image/video fields, only
                                  thumbnailUrl at 64x64 is available.
                                type: string
                              pageId:
                                description: >-
                                  Facebook Page backing the creative (Meta
                                  only). What the `pageId` filter on
                                  /apis/v1/ads, /apis/v1/ads/campaigns and
                                  /apis/v1/ads/tree matches against. Absent for
                                  non-Meta ads and rare Meta creatives with no
                                  page signal.
                                type:
                                  - string
                                  - 'null'
                              pinterestDescription:
                                type: string
                              pinterestImageUrl:
                                type: string
                              pinterestTitle:
                                type: string
                              servingHoldReasons:
                                description: >-
                                  LinkedIn only. Why this specific creative is
                                  not being served. Empty when it is serving.
                                items:
                                  type: string
                                type: array
                              thumbnailUrl:
                                description: Primary thumbnail/image URL
                                type:
                                  - string
                                  - 'null'
                              urlTags:
                                description: >-
                                  Meta: the creative's `url_tags` query string
                                  appended to the destination URL.
                                type:
                                  - string
                                  - 'null'
                              videoId:
                                description: >-
                                  Meta video ID for VIDEO-type ads. Null for
                                  non-video ads. Callers that need an embeddable
                                  MP4 can call GET /{videoId}?fields=source with
                                  the page access token.
                                type:
                                  - string
                                  - 'null'
                              videoUrl:
                                description: Null for non-video ads.
                                type:
                                  - string
                                  - 'null'
                              whatsappPhoneNumber:
                                description: >-
                                  Explicit E.164 WhatsApp number supplied when
                                  creating a Meta boost or messaging ad. Absent
                                  when omitted by the caller or on older
                                  records.
                                type: string
                              youtubeVideoIds:
                                description: >-
                                  Google only. YouTube video ids behind a Video
                                  campaign ad (video and responsive video ads)
                                  or a Demand Gen video ad, same id as
                                  `youtubeVideoId` on Performance Max asset
                                  groups.
                                items:
                                  type: string
                                type: array
                            type:
                              - object
                              - 'null'
                          creativeType:
                            description: >-
                              Creative format, classified from the media the
                              creative carries. `null` when the creative carries
                              no media to classify. An unsynced creative and a
                              genuine text-only ad are indistinguishable, so
                              neither is guessed at.
                            enum:
                              - carousel
                              - video
                              - document
                              - image
                              - null
                            type:
                              - string
                              - 'null'
                          goal:
                            description: 'Available goals vary by platform:'
                            enum:
                              - engagement
                              - traffic
                              - awareness
                              - video_views
                              - lead_generation
                              - lead_conversion
                              - conversions
                              - app_promotion
                              - catalog_sales
                              - page_likes
                              - page_visits
                              - job_applicants
                            type: string
                          isExternal:
                            description: True for ads synced from platform ad managers
                            type: boolean
                          metrics:
                            anyOf:
                              - properties:
                                  actionValues:
                                    additionalProperties:
                                      type: number
                                    description: >-
                                      Monetary mirror of `actions`, from Meta's
                                      Insights `action_values[]` array. Meta and
                                      TikTok; other platforms return {}. Same
                                      history note as `actions`.
                                    type: object
                                  actions:
                                    additionalProperties:
                                      type: integer
                                    description: >-
                                      Per-action-type counts summed over the
                                      date range, keyed by the platform's
                                      action-type names. Keys differ by
                                      platform, so branch on the ad's platform
                                      when interpreting them. Empty object when
                                      no actions are reported.
                                    type: object
                                  allConversions:
                                    description: >-
                                      All conversions, including actions
                                      excluded from the Conversions column
                                      (Google metrics.all_conversions). 0 on
                                      platforms without the concept.
                                    type: number
                                  clicks:
                                    type: integer
                                  conversions:
                                    description: >-
                                      Count of conversion events over the
                                      requested date range. FRACTIONAL:
                                      attribution splits one conversion across
                                      touchpoints and Google also reports
                                      modeled conversions, so values like 0.347
                                      are normal.
                                    type: number
                                  costPerAction:
                                    additionalProperties:
                                      type: number
                                    description: >-
                                      Derived `spend / actions[type]` for every
                                      action type with a non-zero count, in
                                      ad-account native currency. Same keys as
                                      `actions`. Rounded to 4 decimals, because
                                      cheap actions cost well under a cent.
                                    type: object
                                  costPerConversion:
                                    description: >-
                                      Derived spend / conversions in the same
                                      currency as spend. 0 when conversions is
                                      0.
                                    type: number
                                  costPerThruplay:
                                    description: >-
                                      Derived `spend /
                                      videoThruplayWatchedActions`, in
                                      ad-account native currency. Rounded to 4
                                      decimals rather than the usual 2 because a
                                      ThruPlay routinely costs well under a
                                      cent. 0 when the ad has no ThruPlays
                                      (ThruPlay is Meta-only).
                                    type: number
                                  cpc:
                                    description: Cost per click
                                    type: number
                                  cpm:
                                    description: Cost per 1000 impressions
                                    type: number
                                  ctr:
                                    description: Click-through rate (%)
                                    type: number
                                  engagement:
                                    type: integer
                                  engagementBreakdown:
                                    description: >-
                                      The single `engagement` total, split into
                                      the interactions behind it.
                                    properties:
                                      comments:
                                        description: Comments on the ad's post.
                                        type: integer
                                      linkClicks:
                                        description: >-
                                          Attributed link clicks (`link_click`).
                                          This is the attribution-window count,
                                          which differs from the in-session count
                                          in the sibling `inlineLinkClicks` field.
                                        type: integer
                                      pageEngagement:
                                        description: >-
                                          Meta's own page-engagement total
                                          (`page_engagement`). Meta-only.
                                        type: integer
                                      pageLikes:
                                        description: >-
                                          New Page likes attributed to the ad
                                          (`like`).
                                        type: integer
                                      postEngagement:
                                        description: >-
                                          Meta's own post-engagement total
                                          (`post_engagement`). Meta-only.
                                        type: integer
                                      reactions:
                                        description: >-
                                          Reactions on the ad's post
                                          (`post_reaction`). For TikTok these are
                                          its paid likes.
                                        type: integer
                                      saves:
                                        description: >-
                                          Saves of the ad's post
                                          (`onsite_conversion.post_save`).
                                        type: integer
                                      shares:
                                        description: >-
                                          Shares of the ad's post. Meta reports
                                          these under the action type literally
                                          named `post`; TikTok under `share`.
                                        type: integer
                                      videoViews:
                                        description: >-
                                          Video views, from the `video_view`
                                          action. Meta counts a 3-second view;
                                          LinkedIn's own `videoViews` threshold (2
                                          continuous seconds, or 25% of the video)
                                          lands under the same key, so compare
                                          across platforms with care.
                                        type: integer
                                    type: object
                                  funnel:
                                    description: >-
                                      Named conversion-funnel steps, resolved
                                      from the same data as `actions` so you
                                      never have to parse action-type strings
                                      yourself.
                                    properties:
                                      appInstalls:
                                        description: >-
                                          Mobile app installs attributed to the
                                          ad.
                                        type: integer
                                      cartAdds:
                                        description: >-
                                          Adds to cart (Meta `AddToCart` pixel
                                          event).
                                        type: integer
                                      checkoutsInitiated:
                                        description: >-
                                          Checkouts started (Meta
                                          `InitiateCheckout` pixel event).
                                        type: integer
                                      contentViews:
                                        description: >-
                                          Content views (Meta `ViewContent` pixel
                                          event).
                                        type: integer
                                      landingPageViews:
                                        description: >-
                                          Landing page views: the visitor actually
                                          loaded the destination, unlike a link
                                          click. Meta `landing_page_view`.
                                        type: integer
                                      leads:
                                        description: >-
                                          Leads, from either the website pixel or
                                          an instant form, whichever the ad uses.
                                        type: integer
                                      messagingConversationsStarted:
                                        description: >-
                                          Messaging conversations started within 7
                                          days, the headline metric for
                                          click-to-WhatsApp and click-to-Messenger
                                          ads.
                                        type: integer
                                      messagingFirstReplies:
                                        description: >-
                                          Messaging threads where the person sent
                                          a first reply.
                                        type: integer
                                      paymentInfoAdds:
                                        description: >-
                                          Payment details added at checkout (Meta
                                          `AddPaymentInfo` pixel event).
                                        type: integer
                                      purchases:
                                        description: >-
                                          Purchases. Pair with `purchaseValue` for
                                          revenue.
                                        type: integer
                                      registrationsCompleted:
                                        description: >-
                                          Completed registrations (Meta
                                          `CompleteRegistration` pixel event).
                                        type: integer
                                      searches:
                                        description: >-
                                          On-site searches (Meta `Search` pixel
                                          event).
                                        type: integer
                                      wishlistAdds:
                                        description: >-
                                          Adds to wishlist (Meta `AddToWishlist`
                                          pixel event).
                                        type: integer
                                    type: object
                                  impressions:
                                    type: integer
                                  inlineLinkClickCtr:
                                    description: >-
                                      Derived `inlineLinkClicks / impressions *
                                      100`, recomputed from sums at every rollup
                                      level.
                                    type: number
                                  inlineLinkClicks:
                                    description: >-
                                      In-session link clicks. Differs from the
                                      attributed `link_click` count in
                                      `actions`/`engagementBreakdown.linkClicks`,
                                      which uses the attribution window.
                                      Meta-only.
                                    type: integer
                                  lastSyncedAt:
                                    description: >-
                                      Present on individual ads only, not on
                                      campaign aggregations
                                    format: date-time
                                    type: string
                                  outboundClicks:
                                    description: >-
                                      Clicks leading off Meta's surfaces to the
                                      advertiser's destination. Meta-only; other
                                      platforms report 0.
                                    type: integer
                                  outboundClicksCtr:
                                    description: >-
                                      Derived `outboundClicks / impressions *
                                      100`, recomputed from sums at every rollup
                                      level.
                                    type: number
                                  purchaseValue:
                                    description: >-
                                      Convenience sum of purchase-type action
                                      values, in ad-account native currency. 0
                                      when the campaign has no purchase event
                                      configured.
                                    type: number
                                  reach:
                                    description: >-
                                      Unique people reached in the requested
                                      date range. Meta (facebook/instagram) and
                                      TikTok: the platform's own de-duplicated
                                      reach for the exact range, fetched live
                                      and cached up to ~1 hour (may lag recent
                                      delivery).
                                    type: integer
                                  roas:
                                    description: >-
                                      Return on ad spend, derived as
                                      `purchaseValue / spend`. 0 when `spend` is
                                      0. Equivalent to Meta's `purchase_roas`
                                      under default attribution.
                                    type: number
                                  spend:
                                    type: number
                                  uniqueClicks:
                                    description: >-
                                      People who clicked at least once. NOT
                                      additive: summed across days/children it
                                      overcounts people who clicked on multiple
                                      days or ads, so treat rollups as an upper
                                      bound (same caveat as `reach`). Meta-only.
                                    type: integer
                                  uniqueCtr:
                                    description: >-
                                      Derived `uniqueClicks / impressions * 100`
                                      (NOT Meta's reach-based unique_ctr).
                                      Inherits the non-additivity caveat of
                                      `uniqueClicks`.
                                    type: number
                                  video2SecWatchedActions:
                                    description: >-
                                      Plays of at least 2 seconds, replays
                                      excluded. Hook rate =
                                      video2SecWatchedActions / impressions.
                                      Sources: TikTok `video_watched_2s` (TikTok
                                      only; Meta's closest field, 2-second
                                      continuous plays, is not synced).
                                    type: integer
                                  video30SecWatchedActions:
                                    description: >-
                                      Views of at least 30 seconds (or to the
                                      end, for shorter videos).
                                    type: integer
                                  video6SecFocusedViews:
                                    description: >-
                                      TikTok's 6-second focused views: plays of
                                      at least 6 seconds (or to the end, for
                                      shorter videos) or with an interaction in
                                      the first 6 seconds, so it is at least
                                      `video6SecWatchedActions`. Sources: TikTok
                                      `engaged_view` (TikTok only).
                                    type: integer
                                  video6SecWatchedActions:
                                    description: >-
                                      Plays of at least 6 seconds, replays
                                      excluded. Hold rate =
                                      video6SecWatchedActions /
                                      video2SecWatchedActions. Sources: TikTok
                                      `video_watched_6s` (TikTok only). Same
                                      history note as `video2SecWatchedActions`.
                                    type: integer
                                  videoAvgTimeWatchedActions:
                                    description: >-
                                      Average seconds watched per play.
                                      Aggregated over date ranges and across
                                      children as a play-weighted average (total
                                      watch time / total plays), never a plain
                                      average of averages.
                                    type: number
                                  videoP100WatchedActions:
                                    description: Views reaching 100% of the video's length.
                                    type: integer
                                  videoP25WatchedActions:
                                    description: >-
                                      Views reaching 25% of the video's length.
                                      With the other percentile fields, powers
                                      hook/hold/drop-off analysis (e.g. hook
                                      rate = videoP25WatchedActions /
                                      videoPlayActions).
                                    type: integer
                                  videoP50WatchedActions:
                                    description: Views reaching 50% of the video's length.
                                    type: integer
                                  videoP75WatchedActions:
                                    description: Views reaching 75% of the video's length.
                                    type: integer
                                  videoP95WatchedActions:
                                    description: >-
                                      Views reaching 95% of the video's length.
                                      Sources: Meta `video_p95_watched_actions`,
                                      Pinterest `TOTAL_VIDEO_P95_COMBINED`.
                                    type: integer
                                  videoPlayActions:
                                    description: >-
                                      Number of times the video started playing,
                                      summed over the date range and across
                                      children at ad-set/campaign level. 0 for
                                      non-video ads.
                                    type: integer
                                  videoThruplayWatchedActions:
                                    description: >-
                                      ThruPlays (watched to completion, or at
                                      least 15 seconds). Sources: Meta
                                      `video_thruplay_watched_actions` (Meta
                                      only).
                                    type: integer
                                type: object
                              - type: 'null'
                          name:
                            type: string
                          optimizationGoal:
                            description: >-
                              What the delivery system optimizes for, at ad-set
                              level. The value space depends on `platform`:
                              Meta: ad set `optimization_goal` (e.g.
                              OFFSITE_CONVERSIONS, VALUE, LEAD_GENERATION,
                              LINK_CLICKS).
                            type:
                              - string
                              - 'null'
                          platform:
                            enum:
                              - facebook
                              - instagram
                              - tiktok
                              - linkedin
                              - pinterest
                              - google
                              - twitter
                              - openai
                              - reddit
                              - microsoft
                            type: string
                          platformAdAccountId:
                            type: string
                          platformAdAccountName:
                            description: >-
                              Human-readable advertiser/account name (Meta
                              `AdAccount.name`, TikTok `advertiser_name`,
                              LinkedIn / X / Pinterest equivalents). Refreshed
                              every sync so platform-side renames propagate
                              within one cycle.
                            type:
                              - string
                              - 'null'
                          platformAdId:
                            type: string
                          platformAdSetId:
                            type: string
                          platformCampaignId:
                            type: string
                          platformCreatedAt:
                            description: >-
                              Platform-reported creation timestamp (Meta
                              `created_time`, TikTok `create_time`). Read this
                              field to sort or filter by when the ad was
                              actually created on the platform.
                            format: date-time
                            type:
                              - string
                              - 'null'
                          platformObjective:
                            description: >-
                              The platform's own campaign objective, verbatim,
                              alongside the normalized `goal` it maps to. The
                              mapping is many-to-one, so `goal` alone cannot be
                              mapped back to it. Meta: campaign `objective`
                              (e.g.
                            type:
                              - string
                              - 'null'
                          promotedObject:
                            description: >-
                              Meta promoted object containing conversion event
                              details. Structure varies by objective. Only
                              present for Meta ads.
                            properties:
                              application_id:
                                description: Facebook app ID
                                type: string
                              custom_event_type:
                                description: >-
                                  Conversion event type (e.g. PURCHASE, LEAD,
                                  COMPLETE_REGISTRATION, ADD_TO_CART)
                                type: string
                              page_id:
                                description: Facebook page ID
                                type: string
                              pixel_id:
                                description: Meta pixel ID
                                type: string
                              product_set_id:
                                description: Product catalog set ID
                                type: string
                            type:
                              - object
                              - 'null'
                          rejectionReason:
                            type: string
                          reviewStatus:
                            description: >-
                              Platform review state of this ad, independent of
                              delivery `status` / `configuredStatus`. Absent
                              when the platform reports no review signal.
                            enum:
                              - in_review
                              - approved
                              - rejected
                              - with_issues
                            type: string
                          roasAverageFloor:
                            description: >-
                              Minimum ROAS as a decimal multiplier (2.0 = 2.0x
                              ROAS). Populated when bidStrategy is
                              `LOWEST_COST_WITH_MIN_ROAS`.
                            type:
                              - number
                              - 'null'
                          schedule:
                            description: Delivery window as UTC instants.
                            properties:
                              endDate:
                                format: date-time
                                type: string
                              startDate:
                                format: date-time
                                type: string
                            type:
                              - object
                              - 'null'
                          servingStatuses:
                            description: >-
                              LinkedIn only. Why the parent campaign is (or is
                              not) delivering, verbatim from LinkedIn. A
                              campaign can report `status: ACTIVE` and still
                              serve nothing; this array says so.
                            items:
                              type: string
                            type: array
                          status:
                            description: >-
                              Delivery status. Derived from the platform
                              `effective_status`, so it inherits ancestor pauses
                              (an ACTIVE ad under a PAUSED campaign reads
                              `paused`).
                            enum:
                              - active
                              - paused
                              - pending_review
                              - rejected
                              - completed
                              - cancelled
                              - error
                            type: string
                          synced:
                            description: >-
                              Only on GET /apis/v1/ads/{adId}. An unsynced ad
                              has no `id`.
                            type: boolean
                          targeting:
                            description: >-
                              The ad set's targeting (age, gender, geo,
                              interests, placements, audience
                              inclusions/exclusions). May be absent if the ad
                              set exposes no targeting or the lookup fails.
                            type: object
                          updatedAt:
                            format: date-time
                            type: string
                        type: object
                      appliedDefaults:
                        description: >-
                          What the create filled in for fields the request left
                          out. Empty when every field was sent. A passing
                          validateOnly returns it too, so a dry run previews
                          these values before anything is created.
                        properties:
                          budgetType:
                            description: >-
                              Sent when `budgetAmount` came without
                              `budgetType`.
                            enum:
                              - daily
                            type: string
                          countries:
                            description: >-
                              Sent when the request sent no countries and the ad
                              gets the long-standing United States default. Not
                              sent on attach, Google Performance Max or Demand
                              Gen, or a Google ad group joining
                              `existingCampaignId`, which keep their own geo.
                            items:
                              type: string
                            type: array
                          endDate:
                            description: >-
                              Sent when a lifetime budget had no `endDate`: 7
                              days after the start. A daily budget never gets
                              one and runs until paused. A start with an offset
                              (or no start) gets a UTC instant.
                            type: string
                          goal:
                            description: >-
                              `lead_generation`: with a `leadGenFormId`.
                              `app_promotion`: when `promotedObject` names an
                              app. `conversions`: with `promotedObject.pixelId`
                              and `customEventType`.
                            type: string
                          name:
                            description: 'Sent when `name` was omitted: `Ad ` in UTC.'
                            type: string
                        type: object
                      message:
                        type: string
                      warnings:
                        description: >-
                          Meta only, present only when needed. An
                          `activation_failed:` entry means Meta refused the
                          final switch to ACTIVE.
                        items:
                          type: string
                        type: array
                    type: object
                  - description: >-
                      Multi-creative shape: N ads returned sharing
                      platformCampaignId / platformAdSetId.
                    properties:
                      ads:
                        items:
                          properties:
                            _id:
                              type: string
                            adSetName:
                              type: string
                            adType:
                              enum:
                                - boost
                                - standalone
                              type: string
                            bidAmount:
                              description: >-
                                Bid amount in WHOLE currency units of the ad
                                account (USD: 5 = $5.00; JPY: 100 = ¥100). Meta:
                                `bid_amount` on the ad set
                                (smallest-denomination int, decoded here).
                              type:
                                - number
                                - 'null'
                            bidStrategy:
                              anyOf:
                                - description: >-
                                    Meta bid strategy. Same enum applies at
                                    campaign and ad-set level; ad-set value
                                    (when set) overrides campaign-level.
                                    Cross-field rules: `LOWEST_COST_WITHOUT_CAP`
                                    (default): auto-bid, forbids `bidAmount` and
                                    `roasAverageFloor`.
                                  enum:
                                    - LOWEST_COST_WITHOUT_CAP
                                    - LOWEST_COST_WITH_BID_CAP
                                    - COST_CAP
                                    - LOWEST_COST_WITH_MIN_ROAS
                                  type: string
                                - type: 'null'
                              description: >-
                                Ad-set bid strategy (overrides campaign level on
                                Meta). Populated for Meta and TikTok.
                            budget:
                              properties:
                                amount:
                                  type: number
                                daily:
                                  description: >-
                                    LinkedIn and X only. The daily budget
                                    (LinkedIn: the parent campaign's
                                    `dailyBudget`; X: the line item's, or the
                                    campaign's when the line item has none).
                                  type: number
                                lifetime:
                                  description: >-
                                    LinkedIn and X only. The lifetime total
                                    (LinkedIn: the parent campaign's
                                    `totalBudget`; X:
                                    `total_budget_amount_local_micro`, for
                                    example the `lifetimeBudgetCap` of a boost),
                                    readable even when a daily budget is also
                                    set.
                                  type: number
                                pacing:
                                  description: >-
                                    LinkedIn only. The campaign's
                                    `pacingStrategy`: how fast LinkedIn may
                                    spend the budget. Typically LINEAR or
                                    ACCELERATED; the list is open.
                                  type: string
                                type:
                                  enum:
                                    - daily
                                    - lifetime
                                  type: string
                              type:
                                - object
                                - 'null'
                            campaignName:
                              type: string
                            configuredStatus:
                              description: >-
                                The ad's own on/off switch as configured on the
                                platform, independent of its parents. An ACTIVE
                                ad under a paused ad set or campaign still reads
                                ACTIVE here while `status` reads `paused`.
                                Sources: Meta: `configured_status`.
                              type:
                                - string
                                - 'null'
                            costType:
                              description: >-
                                LinkedIn only. The campaign's EFFECTIVE cost
                                model (billing event) as applied by LinkedIn,
                                refreshed on every sync rather than echoing what
                                was passed on create. `null` for non-LinkedIn
                                ads. `CPM`: cost per thousand impressions.
                              type:
                                - string
                                - 'null'
                            createdAt:
                              format: date-time
                              type: string
                            creative:
                              description: >-
                                Platform-specific creative data. Fields vary by
                                platform.
                              properties:
                                adFormat:
                                  description: >-
                                    LinkedIn only. The LinkedIn ad format, in
                                    LinkedIn's own vocabulary: STANDARD_UPDATE,
                                    SINGLE_VIDEO, CAROUSEL, NATIVE_DOCUMENT,
                                    EVENT, TEXT_AD, SPOTLIGHT, FOLLOW_COMPANY,
                                    JOBS, SPONSORED_INMAILS and others.
                                  type:
                                    - string
                                    - 'null'
                                assetGroup:
                                  additionalProperties: true
                                  description: >-
                                    Google Performance Max creative assets. At
                                    least one description must be 60 characters
                                    or fewer. Texts within each list must be
                                    distinct.
                                  type: object
                                assetGroupResourceName:
                                  description: >-
                                    Google resource name of the created
                                    Performance Max asset group.
                                  type: string
                                assetResourceName:
                                  description: >-
                                    Google Display only. Resource name of the
                                    landscape marketing image asset
                                    (`creative.imageUrl`), for example
                                    customers/1234567890/assets/123.
                                  type: string
                                assets:
                                  additionalProperties: true
                                  description: >-
                                    Google Display only. Native Google asset
                                    resource name of each image on the
                                    responsive display ad, keyed by Google's
                                    image role.
                                  type: object
                                bodies:
                                  description: >-
                                    Meta: every primary text variation of the
                                    creative (`asset_feed_spec.bodies`), the
                                    same shape as the `bodies` create input.
                                    Present only with 2 or more texts; a single
                                    text is `body`.
                                  items:
                                    type: string
                                  type: array
                                body:
                                  description: Ad copy/text
                                  type: string
                                callToAction:
                                  description: >-
                                    Meta: the call to action type
                                    (`call_to_action.type`, or the first
                                    `asset_feed_spec.call_to_action_types`
                                    entry), e.g. LEARN_MORE or SIGN_UP.
                                  type: string
                                carouselCards:
                                  description: >-
                                    Meta only today. The carousel's cards in
                                    display order, one per Meta
                                    `link_data.child_attachments` entry, using
                                    the same field names as the `carouselCards`
                                    create input. Absent on non-carousel ads and
                                    other platforms.
                                  items:
                                    additionalProperties: true
                                    type: object
                                  type: array
                                catalog:
                                  additionalProperties: true
                                  type: object
                                creativeFeatures:
                                  additionalProperties: true
                                  description: >-
                                    Meta Advantage+ creative enhancements. Map
                                    snake_case feature names to OPT_IN or
                                    OPT_OUT; Meta validates supported keys and
                                    unspecified features default to OPT_OUT.
                                  type: object
                                creativeId:
                                  description: >-
                                    Meta ad creative id backing this ad,
                                    refreshed from Meta on every sync. Reusable
                                    via existingCreativeId on POST
                                    /apis/v1/ads/create, and readable raw
                                    through GET
                                    /apis/v1/ads/creatives/{creativeId}.
                                  type:
                                    - string
                                    - 'null'
                                description:
                                  description: >-
                                    Meta: the creative's description under the
                                    title (`link_data.description`,
                                    `video_data.link_description`, or the first
                                    `asset_feed_spec.descriptions` entry).
                                  type: string
                                descriptions:
                                  description: >-
                                    Google RSA: the description assets as
                                    objects (2 to 4). Meta: every description
                                    variation of the creative
                                    (`asset_feed_spec.descriptions`) as strings,
                                    the same shape as the `descriptions` create
                                    input.
                                  items:
                                    oneOf:
                                      - type: string
                                      - additionalProperties: true
                                        type: object
                                  maxItems: 4
                                  type: array
                                effectiveInstagramMediaId:
                                  description: >-
                                    Meta `effective_instagram_media_id`, the
                                    Instagram media ID of the boosted post the
                                    ad's engagement lives on. Pass to GET
                                    /apis/v1/ads?effectiveInstagramMediaId= to
                                    map a Business-Manager-visible IG post back
                                    to this ad.
                                  type:
                                    - string
                                    - 'null'
                                effectiveObjectStoryId:
                                  description: >-
                                    Meta `effective_object_story_id`, the
                                    `{pageId}_{postId}` of the Facebook post the
                                    ad's engagement (comments) lives on.
                                  type:
                                    - string
                                    - 'null'
                                finalUrls:
                                  description: >-
                                    Google RSA only. Replaces final URLs.
                                    Omitted lists stay unchanged.
                                  items:
                                    format: uri
                                    type: string
                                  minItems: 1
                                  type: array
                                googleDescription:
                                  description: Google Ads description
                                  type: string
                                googleHeadline:
                                  description: Google Ads headline
                                  type: string
                                headline:
                                  description: >-
                                    Meta: the creative's title
                                    (`link_data.name`, `video_data.title`, or
                                    the first `asset_feed_spec.titles` entry).
                                    Absent when the creative has none.
                                  type: string
                                headlines:
                                  description: >-
                                    Google RSA: the headline assets as objects
                                    (3 to 15). Meta: every title variation of
                                    the creative (`asset_feed_spec.titles`) as
                                    strings, the same shape as the `headlines`
                                    create input.
                                  items:
                                    oneOf:
                                      - type: string
                                      - additionalProperties: true
                                        type: object
                                  maxItems: 15
                                  type: array
                                imageHash:
                                  description: >-
                                    Meta: the ad image hash (`image_hash`),
                                    reusable as `imageHash` on POST
                                    /apis/v1/ads/create within the same ad
                                    account. `thumbnailUrl` and `mediaUrls`
                                    carry its stable full resolution permalink
                                    when Meta resolves it.
                                  type: string
                                imageUrl:
                                  description: Alternative image URL
                                  type: string
                                instagramPermalinkUrl:
                                  description: >-
                                    Meta `instagram_permalink_url`, the public
                                    Instagram post URL of the boosted media.
                                  type:
                                    - string
                                    - 'null'
                                instagramUserId:
                                  description: >-
                                    Meta `instagram_user_id`, the
                                    Instagram-scoped business ID that owns the
                                    boosted media.
                                  type:
                                    - string
                                    - 'null'
                                instagramVideoFallback:
                                  additionalProperties: true
                                  description: >-
                                    Meta only. `instagram_video_reuploaded`: the
                                    video was copied into the ad account, and
                                    the ad still references the original post.
                                  type: object
                                isServing:
                                  description: >-
                                    LinkedIn only. Whether LinkedIn is currently
                                    serving this specific creative. Complements
                                    the ad-level `servingStatuses`, which
                                    describes the parent campaign.
                                  type:
                                    - boolean
                                    - 'null'
                                leadGenFormId:
                                  description: >-
                                    Meta: the instant form the call to action
                                    opens
                                    (`call_to_action.value.lead_gen_form_id`, or
                                    the asset feed's `call_to_actions` on a
                                    dynamic creative), the same value as the
                                    `leadGenFormId` create input. Absent on ads
                                    without a lead form.
                                  type: string
                                linkUrl:
                                  description: Destination URL
                                  type: string
                                mediaUrls:
                                  description: >-
                                    All media URLs for this ad (carousel images,
                                    multiple assets). Populated for Meta
                                    (carousel child_attachments), Google Ads
                                    (responsive display marketing_images), and
                                    LinkedIn (multi-image posts).
                                  items:
                                    type: string
                                  type: array
                                objectStoryId:
                                  description: >-
                                    Meta creative `object_story_id` (the SHARE
                                    reference). Frequently absent, because Meta
                                    omits it for SHARE creatives. Use
                                    effectiveObjectStoryId instead.
                                  type:
                                    - string
                                    - 'null'
                                objectType:
                                  description: >-
                                    Meta creative object_type (e.g. SHARE,
                                    VIDEO, PRIVACY_CHECK_FAIL, POST_DELETED).
                                    Use this to render state-aware previews:
                                    when Meta moderation strips image/video
                                    fields, only thumbnailUrl at 64x64 is
                                    available.
                                  type: string
                                pageId:
                                  description: >-
                                    Facebook Page backing the creative (Meta
                                    only). What the `pageId` filter on
                                    /apis/v1/ads, /apis/v1/ads/campaigns and
                                    /apis/v1/ads/tree matches against. Absent
                                    for non-Meta ads and rare Meta creatives
                                    with no page signal.
                                  type:
                                    - string
                                    - 'null'
                                pinterestDescription:
                                  type: string
                                pinterestImageUrl:
                                  type: string
                                pinterestTitle:
                                  type: string
                                servingHoldReasons:
                                  description: >-
                                    LinkedIn only. Why this specific creative is
                                    not being served. Empty when it is serving.
                                  items:
                                    type: string
                                  type: array
                                thumbnailUrl:
                                  description: Primary thumbnail/image URL
                                  type:
                                    - string
                                    - 'null'
                                urlTags:
                                  description: >-
                                    Meta: the creative's `url_tags` query string
                                    appended to the destination URL.
                                  type:
                                    - string
                                    - 'null'
                                videoId:
                                  description: >-
                                    Meta video ID for VIDEO-type ads. Null for
                                    non-video ads. Callers that need an
                                    embeddable MP4 can call GET
                                    /{videoId}?fields=source with the page
                                    access token.
                                  type:
                                    - string
                                    - 'null'
                                videoUrl:
                                  description: Null for non-video ads.
                                  type:
                                    - string
                                    - 'null'
                                whatsappPhoneNumber:
                                  description: >-
                                    Explicit E.164 WhatsApp number supplied when
                                    creating a Meta boost or messaging ad.
                                    Absent when omitted by the caller or on
                                    older records.
                                  type: string
                                youtubeVideoIds:
                                  description: >-
                                    Google only. YouTube video ids behind a
                                    Video campaign ad (video and responsive
                                    video ads) or a Demand Gen video ad, same id
                                    as `youtubeVideoId` on Performance Max asset
                                    groups.
                                  items:
                                    type: string
                                  type: array
                              type:
                                - object
                                - 'null'
                            creativeType:
                              description: >-
                                Creative format, classified from the media the
                                creative carries. `null` when the creative
                                carries no media to classify. An unsynced
                                creative and a genuine text-only ad are
                                indistinguishable, so neither is guessed at.
                              enum:
                                - carousel
                                - video
                                - document
                                - image
                                - null
                              type:
                                - string
                                - 'null'
                            goal:
                              description: 'Available goals vary by platform:'
                              enum:
                                - engagement
                                - traffic
                                - awareness
                                - video_views
                                - lead_generation
                                - lead_conversion
                                - conversions
                                - app_promotion
                                - catalog_sales
                                - page_likes
                                - page_visits
                                - job_applicants
                              type: string
                            isExternal:
                              description: True for ads synced from platform ad managers
                              type: boolean
                            metrics:
                              anyOf:
                                - properties:
                                    actionValues:
                                      additionalProperties: true
                                      description: >-
                                        Monetary mirror of `actions`, from
                                        Meta's Insights `action_values[]` array.
                                        Meta and TikTok; other platforms return
                                        {}. Same history note as `actions`.
                                      type: object
                                    actions:
                                      additionalProperties: true
                                      description: >-
                                        Per-action-type counts summed over the
                                        date range, keyed by the platform's
                                        action-type names. Keys differ by
                                        platform, so branch on the ad's platform
                                        when interpreting them. Empty object
                                        when no actions are reported.
                                      type: object
                                    allConversions:
                                      description: >-
                                        All conversions, including actions
                                        excluded from the Conversions column
                                        (Google metrics.all_conversions). 0 on
                                        platforms without the concept.
                                      type: number
                                    clicks:
                                      type: integer
                                    conversions:
                                      description: >-
                                        Count of conversion events over the
                                        requested date range. FRACTIONAL:
                                        attribution splits one conversion across
                                        touchpoints and Google also reports
                                        modeled conversions, so values like
                                        0.347 are normal.
                                      type: number
                                    costPerAction:
                                      additionalProperties: true
                                      description: >-
                                        Derived `spend / actions[type]` for
                                        every action type with a non-zero count,
                                        in ad-account native currency. Same keys
                                        as `actions`. Rounded to 4 decimals,
                                        because cheap actions cost well under a
                                        cent.
                                      type: object
                                    costPerConversion:
                                      description: >-
                                        Derived spend / conversions in the same
                                        currency as spend. 0 when conversions is
                                        0.
                                      type: number
                                    costPerThruplay:
                                      description: >-
                                        Derived `spend /
                                        videoThruplayWatchedActions`, in
                                        ad-account native currency. Rounded to 4
                                        decimals rather than the usual 2 because
                                        a ThruPlay routinely costs well under a
                                        cent. 0 when the ad has no ThruPlays
                                        (ThruPlay is Meta-only).
                                      type: number
                                    cpc:
                                      description: Cost per click
                                      type: number
                                    cpm:
                                      description: Cost per 1000 impressions
                                      type: number
                                    ctr:
                                      description: Click-through rate (%)
                                      type: number
                                    engagement:
                                      type: integer
                                    engagementBreakdown:
                                      additionalProperties: true
                                      description: >-
                                        The single `engagement` total, split
                                        into the interactions behind it.
                                      type: object
                                    funnel:
                                      additionalProperties: true
                                      description: >-
                                        Named conversion-funnel steps, resolved
                                        from the same data as `actions` so you
                                        never have to parse action-type strings
                                        yourself.
                                      type: object
                                    impressions:
                                      type: integer
                                    inlineLinkClickCtr:
                                      description: >-
                                        Derived `inlineLinkClicks / impressions
                                        * 100`, recomputed from sums at every
                                        rollup level.
                                      type: number
                                    inlineLinkClicks:
                                      description: >-
                                        In-session link clicks. Differs from the
                                        attributed `link_click` count in
                                        `actions`/`engagementBreakdown.linkClicks`,
                                        which uses the attribution window.
                                        Meta-only.
                                      type: integer
                                    lastSyncedAt:
                                      description: >-
                                        Present on individual ads only, not on
                                        campaign aggregations
                                      format: date-time
                                      type: string
                                    outboundClicks:
                                      description: >-
                                        Clicks leading off Meta's surfaces to
                                        the advertiser's destination. Meta-only;
                                        other platforms report 0.
                                      type: integer
                                    outboundClicksCtr:
                                      description: >-
                                        Derived `outboundClicks / impressions *
                                        100`, recomputed from sums at every
                                        rollup level.
                                      type: number
                                    purchaseValue:
                                      description: >-
                                        Convenience sum of purchase-type action
                                        values, in ad-account native currency. 0
                                        when the campaign has no purchase event
                                        configured.
                                      type: number
                                    reach:
                                      description: >-
                                        Unique people reached in the requested
                                        date range. Meta (facebook/instagram)
                                        and TikTok: the platform's own
                                        de-duplicated reach for the exact range,
                                        fetched live and cached up to ~1 hour
                                        (may lag recent delivery).
                                      type: integer
                                    roas:
                                      description: >-
                                        Return on ad spend, derived as
                                        `purchaseValue / spend`. 0 when `spend`
                                        is 0. Equivalent to Meta's
                                        `purchase_roas` under default
                                        attribution.
                                      type: number
                                    spend:
                                      type: number
                                    uniqueClicks:
                                      description: >-
                                        People who clicked at least once. NOT
                                        additive: summed across days/children it
                                        overcounts people who clicked on
                                        multiple days or ads, so treat rollups
                                        as an upper bound (same caveat as
                                        `reach`). Meta-only.
                                      type: integer
                                    uniqueCtr:
                                      description: >-
                                        Derived `uniqueClicks / impressions *
                                        100` (NOT Meta's reach-based
                                        unique_ctr). Inherits the non-additivity
                                        caveat of `uniqueClicks`.
                                      type: number
                                    video2SecWatchedActions:
                                      description: >-
                                        Plays of at least 2 seconds, replays
                                        excluded. Hook rate =
                                        video2SecWatchedActions / impressions.
                                        Sources: TikTok `video_watched_2s`
                                        (TikTok only; Meta's closest field,
                                        2-second continuous plays, is not
                                        synced).
                                      type: integer
                                    video30SecWatchedActions:
                                      description: >-
                                        Views of at least 30 seconds (or to the
                                        end, for shorter videos).
                                      type: integer
                                    video6SecFocusedViews:
                                      description: >-
                                        TikTok's 6-second focused views: plays
                                        of at least 6 seconds (or to the end,
                                        for shorter videos) or with an
                                        interaction in the first 6 seconds, so
                                        it is at least
                                        `video6SecWatchedActions`. Sources:
                                        TikTok `engaged_view` (TikTok only).
                                      type: integer
                                    video6SecWatchedActions:
                                      description: >-
                                        Plays of at least 6 seconds, replays
                                        excluded. Hold rate =
                                        video6SecWatchedActions /
                                        video2SecWatchedActions. Sources: TikTok
                                        `video_watched_6s` (TikTok only). Same
                                        history note as
                                        `video2SecWatchedActions`.
                                      type: integer
                                    videoAvgTimeWatchedActions:
                                      description: >-
                                        Average seconds watched per play.
                                        Aggregated over date ranges and across
                                        children as a play-weighted average
                                        (total watch time / total plays), never
                                        a plain average of averages.
                                      type: number
                                    videoP100WatchedActions:
                                      description: >-
                                        Views reaching 100% of the video's
                                        length.
                                      type: integer
                                    videoP25WatchedActions:
                                      description: >-
                                        Views reaching 25% of the video's
                                        length. With the other percentile
                                        fields, powers hook/hold/drop-off
                                        analysis (e.g. hook rate =
                                        videoP25WatchedActions /
                                        videoPlayActions).
                                      type: integer
                                    videoP50WatchedActions:
                                      description: >-
                                        Views reaching 50% of the video's
                                        length.
                                      type: integer
                                    videoP75WatchedActions:
                                      description: >-
                                        Views reaching 75% of the video's
                                        length.
                                      type: integer
                                    videoP95WatchedActions:
                                      description: >-
                                        Views reaching 95% of the video's
                                        length. Sources: Meta
                                        `video_p95_watched_actions`, Pinterest
                                        `TOTAL_VIDEO_P95_COMBINED`.
                                      type: integer
                                    videoPlayActions:
                                      description: >-
                                        Number of times the video started
                                        playing, summed over the date range and
                                        across children at ad-set/campaign
                                        level. 0 for non-video ads.
                                      type: integer
                                    videoThruplayWatchedActions:
                                      description: >-
                                        ThruPlays (watched to completion, or at
                                        least 15 seconds). Sources: Meta
                                        `video_thruplay_watched_actions` (Meta
                                        only).
                                      type: integer
                                  type: object
                                - type: 'null'
                            name:
                              type: string
                            optimizationGoal:
                              description: >-
                                What the delivery system optimizes for, at
                                ad-set level. The value space depends on
                                `platform`: Meta: ad set `optimization_goal`
                                (e.g. OFFSITE_CONVERSIONS, VALUE,
                                LEAD_GENERATION, LINK_CLICKS).
                              type:
                                - string
                                - 'null'
                            platform:
                              enum:
                                - facebook
                                - instagram
                                - tiktok
                                - linkedin
                                - pinterest
                                - google
                                - twitter
                                - openai
                                - reddit
                                - microsoft
                              type: string
                            platformAdAccountId:
                              type: string
                            platformAdAccountName:
                              description: >-
                                Human-readable advertiser/account name (Meta
                                `AdAccount.name`, TikTok `advertiser_name`,
                                LinkedIn / X / Pinterest equivalents). Refreshed
                                every sync so platform-side renames propagate
                                within one cycle.
                              type:
                                - string
                                - 'null'
                            platformAdId:
                              type: string
                            platformAdSetId:
                              type: string
                            platformCampaignId:
                              type: string
                            platformCreatedAt:
                              description: >-
                                Platform-reported creation timestamp (Meta
                                `created_time`, TikTok `create_time`). Read this
                                field to sort or filter by when the ad was
                                actually created on the platform.
                              format: date-time
                              type:
                                - string
                                - 'null'
                            platformObjective:
                              description: >-
                                The platform's own campaign objective, verbatim,
                                alongside the normalized `goal` it maps to. The
                                mapping is many-to-one, so `goal` alone cannot
                                be mapped back to it. Meta: campaign `objective`
                                (e.g.
                              type:
                                - string
                                - 'null'
                            promotedObject:
                              description: >-
                                Meta promoted object containing conversion event
                                details. Structure varies by objective. Only
                                present for Meta ads.
                              properties:
                                application_id:
                                  description: Facebook app ID
                                  type: string
                                custom_event_type:
                                  description: >-
                                    Conversion event type (e.g. PURCHASE, LEAD,
                                    COMPLETE_REGISTRATION, ADD_TO_CART)
                                  type: string
                                page_id:
                                  description: Facebook page ID
                                  type: string
                                pixel_id:
                                  description: Meta pixel ID
                                  type: string
                                product_set_id:
                                  description: Product catalog set ID
                                  type: string
                              type:
                                - object
                                - 'null'
                            rejectionReason:
                              type: string
                            reviewStatus:
                              description: >-
                                Platform review state of this ad, independent of
                                delivery `status` / `configuredStatus`. Absent
                                when the platform reports no review signal.
                              enum:
                                - in_review
                                - approved
                                - rejected
                                - with_issues
                              type: string
                            roasAverageFloor:
                              description: >-
                                Minimum ROAS as a decimal multiplier (2.0 = 2.0x
                                ROAS). Populated when bidStrategy is
                                `LOWEST_COST_WITH_MIN_ROAS`.
                              type:
                                - number
                                - 'null'
                            schedule:
                              description: Delivery window as UTC instants.
                              properties:
                                endDate:
                                  format: date-time
                                  type: string
                                startDate:
                                  format: date-time
                                  type: string
                              type:
                                - object
                                - 'null'
                            servingStatuses:
                              description: >-
                                LinkedIn only. Why the parent campaign is (or is
                                not) delivering, verbatim from LinkedIn. A
                                campaign can report `status: ACTIVE` and still
                                serve nothing; this array says so.
                              items:
                                type: string
                              type: array
                            status:
                              description: >-
                                Delivery status. Derived from the platform
                                `effective_status`, so it inherits ancestor
                                pauses (an ACTIVE ad under a PAUSED campaign
                                reads `paused`).
                              enum:
                                - active
                                - paused
                                - pending_review
                                - rejected
                                - completed
                                - cancelled
                                - error
                              type: string
                            synced:
                              description: >-
                                Only on GET /apis/v1/ads/{adId}. An unsynced ad
                                has no `id`.
                              type: boolean
                            targeting:
                              description: >-
                                The ad set's targeting (age, gender, geo,
                                interests, placements, audience
                                inclusions/exclusions). May be absent if the ad
                                set exposes no targeting or the lookup fails.
                              type: object
                            updatedAt:
                              format: date-time
                              type: string
                          type: object
                        type: array
                      appliedDefaults:
                        description: >-
                          What the create filled in for fields the request left
                          out. Empty when every field was sent. A passing
                          validateOnly returns it too, so a dry run previews
                          these values before anything is created.
                        properties:
                          budgetType:
                            description: >-
                              Sent when `budgetAmount` came without
                              `budgetType`.
                            enum:
                              - daily
                            type: string
                          countries:
                            description: >-
                              Sent when the request sent no countries and the ad
                              gets the long-standing United States default. Not
                              sent on attach, Google Performance Max or Demand
                              Gen, or a Google ad group joining
                              `existingCampaignId`, which keep their own geo.
                            items:
                              type: string
                            type: array
                          endDate:
                            description: >-
                              Sent when a lifetime budget had no `endDate`: 7
                              days after the start. A daily budget never gets
                              one and runs until paused. A start with an offset
                              (or no start) gets a UTC instant.
                            type: string
                          goal:
                            description: >-
                              `lead_generation`: with a `leadGenFormId`.
                              `app_promotion`: when `promotedObject` names an
                              app. `conversions`: with `promotedObject.pixelId`
                              and `customEventType`.
                            type: string
                          name:
                            description: 'Sent when `name` was omitted: `Ad ` in UTC.'
                            type: string
                        type: object
                      message:
                        type: string
                      platformAdSetId:
                        type: string
                      platformCampaignId:
                        type: string
                      warnings:
                        description: >-
                          Meta only, present only when needed. An
                          `activation_failed:` entry means Meta refused the
                          final switch to ACTIVE for the ads it names (or for
                          their ad set or campaign).
                        items:
                          type: string
                        type: array
                    type: object
          description: Ad(s) created
        default:
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type:
                          - string
                          - 'null'
                      details:
                        additionalProperties: {}
                        type:
                          - object
                          - 'null'
                      message:
                        type:
                          - string
                          - 'null'
                      param:
                        type:
                          - string
                          - 'null'
                      retryHint:
                        type:
                          - string
                          - 'null'
                      retryable:
                        type:
                          - boolean
                          - 'null'
                      type:
                        type:
                          - string
                          - 'null'
                    type:
                      - object
                      - 'null'
                type: object
          description: Error. The code field is stable; see the error catalog.
components:
  securitySchemes:
    bearerAuth:
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.