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

# Creative preview support

> See which ad platforms provide authoritative creative previews and when Apostra fails closed.

Apostra uses a platform's own preview when one is available. These previews
show the platform's supported preview surface; when the provider addresses
placements, Apostra maps them exactly. They do not guarantee approval or
delivery.

<Warning>
  Buyer adapter preview links are provider-hosted and may expire. Those adapter
  surfaces return links and never execute provider embed code. In seller
  creative review, a publisher-designated `preview_creative` route may return
  HTML or a URL. Apostra preserves its authority, fidelity, and expiry, but
  does not mount those provider-controlled bytes in the reviewer's browser.
  Submitted creative tags, VAST, trackers, and other source markup likewise
  remain inert text. When a safe image thumbnail is available on buyer adapter
  surfaces, Apostra can show the actual creative inline.
</Warning>

## Support by platform

| Platform      | Available through Apostra  | Provider boundary                                                                                                                                                                                                                                                                                                                                                                                                                                 | Current behavior                                                                                                                                                                                                                                             |
| ------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Meta Ads      | Yes                        | Saved creatives and transient image specifications.                                                                                                                                                                                                                                                                                                                                                                                               | Apostra previews eligible Facebook and Instagram placements. Saved creatives must belong to your selected ad account.                                                                                                                                        |
| TikTok Ads    | Saved video only           | Saved Asset Library video with an authored CTA.                                                                                                                                                                                                                                                                                                                                                                                                   | Apostra previews an already-synced `tiktok_in_feed_video` after selected-account ledger and video readback. Other TikTok formats and unsynchronized or transient inputs fail closed.                                                                         |
| Pinterest Ads | Yes                        | Expiring shareable previews for saved ads in one selected ad group.                                                                                                                                                                                                                                                                                                                                                                               | Apostra verifies one saved assignment and preserves Pinterest's URL and expiry. Unsynchronized creatives do not use a fallback.                                                                                                                              |
| Snap Ads      | Yes                        | Hosted links for saved 9:16 image and video creatives.                                                                                                                                                                                                                                                                                                                                                                                            | Apostra verifies the selected-account creative and media before returning Snap's signed preview. Unsynchronized manifests and explicit placement selections fail closed.                                                                                     |
| Google Ads    | Saved Performance Max only | Shareable previews for saved Performance Max asset groups.                                                                                                                                                                                                                                                                                                                                                                                        | Apostra returns one verified Performance Max UI preview from the selected customer. It does not claim placements, dimensions, thumbnails, or transient fallback.                                                                                             |
| OpenAI Ads    | Not yet                    | The Ads prose reference names a 24-hour preview operation, but the published OpenAPI schema defines neither the operation nor its response.                                                                                                                                                                                                                                                                                                       | The adapter does not advertise `preview_creative`. The account `preview_url` is a favicon preview, not an ad preview, and no approximation is used.                                                                                                          |
| Amazon Ads    | Not yet                    | [Amazon DSP](https://advertising.amazon.com/API/docs/en-us/guides/dsp/creative-management) accepts saved or transient creatives; Sponsored Display accepts transient specifications; Sponsored TV accepts saved creative or verified-asset identities. The APIs return provider markup—HTML, plus VAST 2 or VAST 3 for DSP video—and do not document an artifact expiry. Sponsored Brands and Sponsored Products have no documented preview path. | The adapter does not advertise `preview_creative`. It must implement each product-specific account, identity, format, markup-isolation, and lifetime boundary before support is enabled.                                                                     |
| LinkedIn Ads  | Not yet                    | The [Ad Preview API](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads/account-structure/ad-preview?view=li-lms-2026-07) supports saved SponsoredCreative URNs and separate transient live-preview actions. Saved preview iframe sources last up to three hours; transient responses use `srcdoc`.                                                                                                                            | The adapter does not advertise `preview_creative`. A first slice must verify a saved creative under the selected account, return only a validated HTTPS link, preserve device roles, cap expiry at request time plus three hours, and discard provider HTML. |
| Reddit Ads    | Not yet                    | [Reddit previews](https://ads-api.reddit.com/docs/v3/guides/programs/campaign/preview-an-ad) are saved-ad only. The API can refresh an existing link for up to 30 days, but the first link must be generated in Ads Manager and propagation can take up to 20 minutes.                                                                                                                                                                            | The adapter does not advertise `preview_creative`. A missing initial link, transient creative, account mismatch, or stale expiry fails closed.                                                                                                               |
| Spotify Ads   | Not yet                    | Account-scoped [saved-ad reads](https://developer.spotify.com/documentation/ads-api/reference/v3.0/getAd) can expose `AD_PREVIEW_URL`; draft ads do not, and Spotify documents no preview expiry or anonymous-access guarantee.                                                                                                                                                                                                                   | The adapter does not advertise `preview_creative`. It must prove selected-account identity, URL safety, accessibility, and lifetime without creating an ad solely for preview.                                                                               |

For the wider unavailable OpenAI boundary, see
[OpenAI Ads](/v2/guides/ad-platform-compatibility/openai-ads).

See each platform's compatibility page for its wider creative and campaign
support.

## Meta preview boundary

Meta preview requests use the ad account selected on Apostra
connection. If the source creative has already been synchronized, Apostra
resolves its Meta creative ID from that advertiser and account's creative
record, then verifies the creative still reads back under the selected account.
Meta preview links are treated as expiring after five minutes; use **Refresh**
to request a new link after that deadline.

For an unsynchronized image manifest, Apostra can submit a read-only
transient specification. Other unsynchronized creative types must be synced
before previewing. A request fails closed when the creative identity, account,
format, or requested placement cannot be verified.

The response contains one or more HTTPS Meta preview links, labeled by
placement. Creatives already synced to Meta may also include a provider-readback
image thumbnail; transient previews remain link-only. Apostra does not
return executable preview HTML.

## TikTok preview boundary

TikTok preview requests use the advertiser account and delegated credential
selected on Apostra connection. Apostra resolves the source
creative through that tenant and account's ledger, then re-reads the exact
TikTok Asset Library video. The video must still be displayable and explicitly
eligible for `PLACEMENT_TIKTOK`.

The provider request uses TikTok's `SINGLE_VIDEO` preview mode with the saved
video ID and authored display name, ad text, and required stored CTA. Existing
creatives that store the historical `DOWNLOAD` value continue to work;
Apostra preserves that authored identity and sends TikTok's current
`DOWNLOAD_NOW` value only on provider requests. The response is one link
labeled with the existing `tiktok_for_you_feed` public placement ID.
That ID maps to the provider's complete `PLACEMENT_TIKTOK` bundle and does not
prove a single feed destination. Apostra conservatively requires a fresh
preview after 24 hours. Provider iframe HTML and adjustment tips are discarded;
no thumbnail fallback is returned.

TikTok's `ADS_CREATION` table documents `SINGLE_IMAGE` as Pangle-only, and its
separate `SINGLE_IMAGE` preview example uses `PLACEMENT_PANGLE`. This adapter
publishes `PLACEMENT_TIKTOK` and has no faithful saved-image mapping for that
preview shape. Carousel, Spark, generated, raw-URL transient, and delivery
variant requests require fields or identities the generic creative manifest
does not faithfully carry. Apostra rejects those shapes instead of
inventing provider fields or substituting a placement.

## Pinterest preview boundary

Pinterest preview requests use the ad account selected on Apostra
connection. The source creative must already be synchronized and resolve to
exactly one completed assignment in that account. Before requesting the
preview, Apostra reads back the selected account, ad group, Pin, and ad from
Pinterest and verifies that they still match the saved source record and each
other. The preview's placement label is the ad group's exact Pinterest
`placement_group` (`ALL`, `BROWSE`, `SEARCH`, or `OTHER`); Apostra does not
substitute another placement.

Apostra then uses Pinterest's
[`campaign_ad_preview`](https://developers.pinterest.com/docs/work-with-ads/generate-shareable-ad-previews/)
surface and returns one credential-free HTTPS Pinterest preview link with the
expiry Pinterest supplied. The result is link-only: it has no executable HTML,
iframe, script, or inline thumbnail. Pinterest creates an expiring preview
record for the existing assignment; this request does not create or change the
campaign, ad group, ad, or Pin. Pinterest classifies this POST under the
`ads:write` OAuth scope even though it does not mutate those campaign objects.
Pinterest batches accept at most four creatives; every accepted item starts in
the four-worker pool under one 30-second aggregate deadline, and a larger batch
is rejected before account, ledger, or provider work.

Unsynchronized manifests do not use Pinterest's transient Pin or image preview
surface because that path cannot preserve the same saved account, assignment,
placement, and provider-expiry identity. Ambiguous assignments, stale or
foreign provider objects, unsupported formats, unsafe URLs, and mismatched
placement requests fail closed. Pinterest has no reference-renderer fallback
through Apostra.

## Snap preview boundary

Snap preview requests use the delegated credential and ad account selected on
Apostra connection. Apostra resolves an already synchronized source
creative through that tenant and account's creative record, then reads the Snap
ad account, creative, and backing media before requesting Snap's hosted preview.
The ordinary supported formats are 9:16 image and video creatives; other or
unsynchronized manifests must be synchronized first.

Snap batches accept at most four creatives; every accepted item starts in the
four-worker pool under one 30-second aggregate deadline. Apostra rejects a
larger batch before reading the account, saved creative record, or Snap API.

Snap's preview endpoint does not accept a transient creative specification or
a placement selector. Apostra therefore rejects every explicit placement
request rather than substituting automatic placement. A successful request
returns one generic 1080×1920 full-screen render. The role describes the hosted
render; it does not claim a campaign placement was selected.

Snap documents its hosted page as requiring no login and remaining available
for 90 days. Apostra returns the provider's exact expiry and only constructs
the external `ad-preview.snapchat.com` link when the signed creative ID, expiry,
and signature agree with Snap's response. It returns no provider HTML or
thumbnail.

## Google Performance Max preview boundary

Google preview requests use the customer account selected on Apostra
connection. The source creative must already be synchronized as
`google_performance_max` and resolve to exactly one completed asset-group
assignment for that tenant, customer, and source. Apostra reads back the
selected non-manager customer, exact Performance Max campaign, and exact saved
asset group before requesting Google's `UI_PREVIEW`. A renamed, removed,
foreign, missing, duplicated, or in-flight identity fails closed.

The response contains one expiring, credential-free HTTPS Google Ads external
preview link. Apostra preserves Google's expiry and returns no provider
HTML, iframe, script, thumbnail, or invented dimensions. Google's aggregate
Performance Max UI preview does not expose a placement selector, so any
requested placement is rejected; Apostra does not label the page as a
Search, Display, YouTube, Gmail, Maps, or Discover placement.

Unsynchronized or transient input, YouTube, responsive search, responsive
display, delivery variants, unsafe URLs, and response identity drift are not
approximated. Google preview never falls back to the future community reference
renderer. This saved-preview boundary is separate from campaign creation and
does not make Performance Max buying generally available.

## OpenAI Ads preview boundary

The official OpenAI [Ads reference](https://developers.openai.com/ads/api-reference/ads)
names `POST /ads/{ad_id}/preview` and says the preview expires after 24 hours.
However, the official [OpenAPI schema](https://developers.openai.com/ads/openapi.json)
does not define that path, its response, an ad-preview URL field, or
preview-expiry metadata. The separate account `preview_url` is documented as a
[favicon preview](https://developers.openai.com/ads/api-reference/ad-account),
so Apostra does not use it as creative-preview output.

Apostra also does not approximate either OpenAI creative type. OpenAI does
not publish enough ChatGPT layout detail to reproduce a Chat Card faithfully,
and a Product Ad Template receives its image and destination from whichever
eligible feed item OpenAI selects when the ad serves, as described in the
[Product Feeds guide](https://developers.openai.com/ads/product-feeds). Until
OpenAI publishes a complete response contract and a selected-account proof
establishes a public HTTPS preview URL and exact expiry timestamp, OpenAI Ads
preview requests fail closed.

## Reference-renderer fallback

First-party platform previews remain authoritative. A future community
reference renderer may provide a clearly labeled approximation for a specific
canonical format family when a platform preview is unavailable. No adapter
currently advertises this fallback. It can become available only after that
exact family is proved faithful and its ephemeral preview store is merged,
deployed, configured, and able to enforce the full advertised link lifetime.
A code proposal or a permanent public creative bucket is not that boundary.
Until then, unsupported requests fail closed; an adapter with a first-party
implementation does not silently switch to a reference renderer. TikTok, Snap,
and Google have no such path today; their unsupported or unsynchronized inputs
fail closed. Shared creative-generation adapters follow the same boundary.

## Creative-production outputs are different

`preview_creative` shows how an ad platform renders a creative. A creative
production tool may instead return its finished reviewable asset directly from
`build_creative`. For example, [AudioStack](/v2/guides/ad-platform-compatibility/audiostack-creative)
returns the rendered `audio_hosted` asset, which can be played without a
separate preview call. That does not make AudioStack an ad-platform adapter or
advertise `preview_creative` for it.

Provider references: [Meta Business SDK preview surface](https://github.com/facebook/facebook-python-business-sdk/blob/main/facebook_business/adobjects/adcreative.py), [TikTok creative preview](https://business-api.tiktok.com/portal/docs?id=1739403070695426), [TikTok video search](https://business-api.tiktok.com/portal/docs?id=1740050472224769), [Snap creative preview](https://developers.snap.com/marketing-api/Ads-API/creatives), [Pinterest shareable previews](https://developers.pinterest.com/docs/work-with-ads/generate-shareable-ad-previews/), [Google ShareablePreviewService](https://developers.google.com/google-ads/api/reference/rpc/v25/ShareablePreviewService), and [OpenAI Ads preview reference](https://developers.openai.com/ads/api-reference/ads).
