---
title: "Create a standalone creative"
method: POST
path: "/v1/ads/creatives"
tags: ["Ad Creatives"]
---

# Create a standalone creative

`POST /v1/ads/creatives`

Creates a creative in the library WITHOUT an ad, reusable on the create endpoints via
`existingCreativeId`. Provide exactly one of `imageUrl` (uploaded server-side),
`imageHash` (from POST /v1/ads/images or the library list), or `carouselCards` (2-10
hand-built cards). The Page (and linked Instagram account, when present) is resolved
from `accountId` as the story actor. `creativeFeatures` configures Advantage+
enhancements. `promotion` is not supported and any object is rejected with 400.

## Request body

- object
  - `accountId` string, required — Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token and Page.
  - `adAccountId` string, required — Platform ad account id (Meta act_<n>, Google customer id, LinkedIn account id, ...).
  - `headline` string, required
  - `body` string, required — Primary text
  - `description` string — Link description below the headline; omitted = Meta scrapes the destination's OG description.
  - `callToAction` string — CTA type (same whitelist as POST /v1/ads/create).
  - `linkUrl` string, uri, required
  - `imageUrl` string, uri — Publicly reachable image; uploaded to the account's library server-side.
  - `imageHash` string — Existing library image hash (POST /v1/ads/images or GET /v1/ads/images).
  - `carouselCards` object[]
    - `imageUrl` string, uri, required
    - `linkUrl` string, uri, required
    - `headline` string
    - `description` string
    - `callToAction` string
  - `urlTags` string — Appended to every outbound URL (e.g. utm_source=fb).
  - `promotion` MetaPromotion, nullable — Not supported. Meta validates creative_sourcing_spec.promotion_metadata_spec on the create call and then discards it, so a Promotion set through the Marketing API never reaches the creative. Any object is rejected with 400 invalid_field_value. Send null or omit the field, and set the Promotion on the ad in Ads Manager. Verified on 2026-09-11 across Graph v19.0 to v25.0 and every write path.
  - `creativeFeatures` MetaCreativeFeatures — 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. auto_promotion_tag is an Advantage+ enhancement, not the Ads Manager Promotion setting. The deprecated standard_enhancements bundle is rejected by Meta.
  - `multiAdvertiser` 'OPT_IN' | 'OPT_OUT' — 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. It is a top-level creative field, NOT a `creativeFeatures` key, and Meta rejects it there.
  - `aiDisclosure` 'OPT_IN' | 'OPT_OUT' — Meta only. Meta's "Ad includes media created or edited with AI" disclosure, the checkbox in Ads Manager, stored on the creative as `generative_asset_spec.transparency_metadata.self_disclosure`. OPT_IN checks it, OPT_OUT explicitly declares no AI media, omitted leaves Meta's default. Applied to each new creative, including standalone, creatives[] and attach shapes, and preserved when a creative is rebuilt. This sets the disclosure on the ad; whether and when the viewer-facing label renders is Meta's decision.

## Response `201`

Creative created

- object
  - `adAccountId` string
  - `creativeId` string — Platform creative id, reusable via existingCreativeId.

## Other responses

- `400` — Invalid input, or Meta rejected the create
- `401` — Unauthorized
- `404` — The account or requested resource was not found or is not accessible. An account ID may have been disconnected and removed. Read GET /v1/accounts for current account IDs.
- `409` — The account exists but is inactive or needs reconnection. Reconnect it, then read GET /v1/accounts for its current account ID before retrying. Code: ads_connection_required.
- `422` — No Facebook Page found to act as the story actor
- `501` — Only supported on Meta (facebook/instagram)
- `502` — Meta accepted the request then failed to produce the media (upload session, chunk transfer, processing timeout, or a response with no image hash). Inspect `platformError.reason`.

## Changes

- **2026-09-25** `2c04683ce694` — 8 info
  - added the optional property `details/adAccountId` to the response with the `404` status
  - added the optional property `details/adAccountId` to the response with the `409` status
  - added the optional property `details/createdObjects` to the response with the `404` status
  - added the optional property `details/createdObjects` to the response with the `409` status
  - …4 more
- **2026-09-17** `be448f13ecdc` — 1 info
  - added the new optional request property `aiDisclosure`
- **2026-09-16** `3e6ddf2a99ea` — 2 info
  - added the optional property `details/budgetScope` to the response with the `404` status
  - added the optional property `details/budgetScope` to the response with the `409` status
- **2026-09-15** `0dba7d004d75` — 4 info
  - added the optional property `details/quotaExhausted` to the response with the `404` status
  - added the optional property `details/quotaExhausted` to the response with the `409` status
  - added the optional property `details/quotaScope` to the response with the `404` status
  - added the optional property `details/quotaScope` to the response with the `409` status
- **2026-09-12** `06acc34a7017` — 7 warning
  - removed the request property `promotion/code`
  - removed the request property `promotion/endDate`
  - removed the request property `promotion/startDate`
  - removed the request property `promotion/type`
  - …3 more

[Full history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/creatives/post.md)

---

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