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

# Snap Ads adapter compatibility

> Exact AdCP-to-Snap Ads mapping, implemented coverage, proof state, and known limits.

Snap Ads maps AdCP media buys to campaigns, packages to ad squads, and creative assignments to ads and creatives. Three product families and two ordinary creative formats have deterministic/static round-trip coverage; this is not provider-observed full-lifecycle proof or fresh provider eligibility.

<Note>
  **Review-ready, not provider-endorsed · last verified 2026-08-16.**
  This is an Interchange compatibility review for technical feedback, not a Snap certification or endorsement. “Implemented” means a provider write/read path exists.
  It does not mean fresh signed live evidence exists or that the selected account
  is currently eligible.
</Note>

## Coverage and execution-package model

| Layer                         | State                                     | Current contract                                                                                                                                                                                  |
| ----------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Provider-observed denominator | `not_certified`                           | The ten classified rows are an implemented and blocked execution catalog, not a certified complete inventory of every Ads Manager creation path.                                                  |
| Wholesale product archetype   | `classified`                              | Product rows represent materially different launch contracts. Signals, activation resources, targeting and delivery overlays, and creative choices do not create extra product rows.              |
| Exact execution package       | `exact_static_base_plus_runtime_bindings` | Each product ID fixes the provider objective, optimization, and billing tuple; pixels, audiences, catalogs, profiles, creative, targeting, budget, bid, and flight are separate runtime bindings. |
| Current account eligibility   | `account_check_required`                  | Organization permissions, ad-account feature access, resource readiness, market, and exact creative support determine whether an implemented product is runnable now.                             |

## Claim provenance gaps

Object-mapping and reporting rows have no exported, code-owned complete
denominator on current main. They remain published because they are useful,
but the contract marks the missing drift oracle instead of pretending a
same-test literal prevents drift.

| Claim family      | State                            | Drift enforced | Trace sources                                                                             | Gap                                                                                             |
| ----------------- | -------------------------------- | -------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| `object_mappings` | `manual_plan_trace_non_enforced` | `false`        | packages/storefront-adapters/src/platforms/snap/adapter.ts, docs/adapter-plans/snap.md    | No code-owned complete object-mapping denominator exists; these rows remain manually traced.    |
| `reporting`       | `manual_plan_trace_non_enforced` | `false`        | packages/storefront-adapters/src/platforms/snap/tasks/media-buy/get-media-buy-delivery.ts | No exported code-owned reporting projection constant exists; these rows are not drift-enforced. |

## Evidence state

Static certification and live certification are different claims. Deterministic
tests can prove code-owned catalog classifications and fail-closed behavior
without contacting the provider. Object-mapping and reporting rows are validated
for shape, presence, and uniqueness only; the provenance table above records that
they are not compared with a complete code-owned denominator.
Fresh live evidence must be dated, signed, bound to the exact account, product,
resources, fixture revision, requested package, readback, no-spend result, and
cleanup result. Live evidence is treated as stale after 30 days, and a newer
failure overrides an older pass.

| Layer                           | State                                   | Last verified | What it means                                                                                                                                                                                                                                    |
| ------------------------------- | --------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Static / deterministic contract | `contract_tested`                       | 2026-08-16    | Every configured product is classified as executable or blocked. The hosted image and video formats have deterministic/static round-trip tests; the existing-post path is code-complete but governed-canary-only and externally allowlist-gated. |
| Fresh signed live evidence      | `harness_ready_signed_evidence_pending` | —             | The protected harness is ready, but every Snap readiness axis remains live\_evidence false: no successful dated signed run currently proves the exact account, product, resources, lifecycle, and fixture revision.                              |
| AAO discovery                   | `community_catalog`                     | 2026-08-16    | The public registry record uses a broad Snapchat full-screen discovery placement and is not publisher-owned authorization.                                                                                                                       |

## Markets

**`account_check_required`.** No global market allowlist is asserted by this public contract.

This page publishes no global market allowlist.

Authority: The selected account's live provider eligibility and targeting-country reads are authoritative.

## Object mapping

| AdCP / Interchange    | Snap Ads           | Mapping                                                                                   |
| --------------------- | ------------------ | ----------------------------------------------------------------------------------------- |
| `account`             | `ad account`       | Explicit account selected from the authorized organization.                               |
| `media_buy`           | `campaign`         | Objective, lifecycle, and campaign spend cap.                                             |
| `package`             | `ad squad`         | Targeting, budget, bid, billing event, optimization, flight, and placement configuration. |
| `creative`            | `media + creative` | Uploaded image/video or an authorized existing Snap.                                      |
| `creative_assignment` | `ad`               | Ad links one creative to one ad squad.                                                    |
| `signal`              | `audience segment` | Account-owned first-party or provider audience segment.                                   |

## Operations

| Public adapter operation | Surface              | State             | Provider path                                                                        |
| ------------------------ | -------------------- | ----------------- | ------------------------------------------------------------------------------------ |
| `list_accounts`          | AdCP buyer operation | `implemented`     | Organization and ad-account discovery                                                |
| `sync_accounts`          | AdCP buyer operation | `not_implemented` | Account synchronization is not implemented.                                          |
| `get_products`           | AdCP buyer operation | `implemented`     | Three executable and seven blocked product mappings                                  |
| `sync_creatives`         | AdCP buyer operation | `implemented`     | Media upload, creative creation, and exact identity readback for round-trip formats  |
| `list_creatives`         | AdCP buyer operation | `implemented`     | Creative/media inventory and assignment projection                                   |
| `create_media_buy`       | AdCP buyer operation | `implemented`     | Campaign → ad squad → ad                                                             |
| `get_media_buys`         | AdCP buyer operation | `implemented`     | Campaign hierarchy and targeting provenance                                          |
| `update_media_buy`       | AdCP buyer operation | `implemented`     | Lifecycle, budget, bid, geography, audiences, and creative assignments with readback |
| `get_media_buy_delivery` | AdCP buyer operation | `implemented`     | Campaign/ad-squad stats timeseries                                                   |
| `get_signals`            | AdCP buyer operation | `implemented`     | Governed targeting segment discovery                                                 |
| `sync_audiences`         | AdCP buyer operation | `implemented`     | Audience create/replace/status lifecycle                                             |
| `sync_event_sources`     | AdCP buyer operation | `implemented`     | Snap Pixel discovery and readiness                                                   |
| `log_event`              | AdCP buyer operation | `implemented`     | Conversions API event ingestion                                                      |
| `sync_catalogs`          | AdCP buyer operation | `implemented`     | Catalog synchronization with tenant isolation                                        |
| `get_account_financials` | AdCP buyer operation | `implemented`     | Currency and account funding context                                                 |

## Wholesale products and exact execution bases

| Product ID             | Exact provider execution base                                                          | Implemented       | Static certification     | Current eligibility      | Known gap                         |
| ---------------------- | -------------------------------------------------------------------------------------- | ----------------- | ------------------------ | ------------------------ | --------------------------------- |
| `snap_awareness`       | objective `AWARENESS_AND_ENGAGEMENT`; optimization `IMPRESSIONS`; billing `IMPRESSION` | `implemented`     | `deterministic_contract` | `account_check_required` | —                                 |
| `snap_traffic`         | objective `TRAFFIC`; optimization `SWIPES`; billing `IMPRESSION`                       | `implemented`     | `deterministic_contract` | `account_check_required` | —                                 |
| `snap_web_conversions` | objective `SALES`; optimization `PIXEL_PURCHASE`; billing `IMPRESSION`                 | `implemented`     | `deterministic_contract` | `account_check_required` | —                                 |
| `snap_catalog_traffic` | objective `TRAFFIC`; optimization `SWIPES`; billing `IMPRESSION`                       | `not_implemented` | `not_certified`          | `not_eligible`           | creative\_round\_trip\_incomplete |
| `snap_app_installs`    | objective `APP_PROMOTION`; optimization `APP_INSTALLS`; billing `IMPRESSION`           | `not_implemented` | `not_certified`          | `not_eligible`           | creative\_round\_trip\_incomplete |
| `snap_story_ads`       | objective `AWARENESS_AND_ENGAGEMENT`; optimization `STORY_OPENS`; billing `IMPRESSION` | `not_implemented` | `not_certified`          | `not_eligible`           | creative\_round\_trip\_incomplete |
| `snap_collection`      | objective `SALES`; optimization `SWIPES`; billing `IMPRESSION`                         | `not_implemented` | `not_certified`          | `not_eligible`           | creative\_round\_trip\_incomplete |
| `snap_lead_gen`        | objective `LEADS`; optimization `LEAD_FORM_SUBMISSIONS`; billing `IMPRESSION`          | `not_implemented` | `not_certified`          | `not_eligible`           | creative\_round\_trip\_incomplete |
| `snap_sponsored_snaps` | objective `AWARENESS_AND_ENGAGEMENT`; optimization `IMPRESSIONS`; billing `IMPRESSION` | `not_implemented` | `not_certified`          | `not_eligible`           | creative\_round\_trip\_incomplete |
| `snap_commercial`      | objective `AWARENESS_AND_ENGAGEMENT`; optimization `VIDEO_VIEWS`; billing `IMPRESSION` | `not_implemented` | `not_certified`          | `not_eligible`           | creative\_round\_trip\_incomplete |

## Creative formats

The format state is deliberately narrower than the provider format catalog.
Only `executable` formats have the ordinary provider write and readback path;
`canary_only` formats are restricted to governed proof, and
`catalog_declared` formats are present in current code without a public
ordinary-execution certification claim.
`declared_not_buyer_selectable` formats are not sold through the adapter.

| Format ID                       | Kind             | State                           | Provider shape                                                                                       |
| ------------------------------- | ---------------- | ------------------------------- | ---------------------------------------------------------------------------------------------------- |
| `snap_ad_video_9x16`            | `video_hosted`   | `executable`                    | SNAP\_AD creative backed by video media                                                              |
| `snap_ad_image_9x16`            | `image`          | `executable`                    | SNAP\_AD creative backed by image media                                                              |
| `snap_existing_post`            | `native_in_feed` | `canary_only`                   | exact Public Profile Snap ID; code-complete but protected-canary-only and externally allowlist-gated |
| `story_ad`                      | `video_hosted`   | `declared_not_buyer_selectable` | COMPOSITE                                                                                            |
| `collection_ad`                 | `image_carousel` | `declared_not_buyer_selectable` | COLLECTION                                                                                           |
| `lead_gen_ad`                   | `video_hosted`   | `declared_not_buyer_selectable` | LEAD\_GENERATION                                                                                     |
| `snap_promoted_offerings`       | `image`          | `declared_not_buyer_selectable` | one ad squad and creative per offering                                                               |
| `snap_generated_image_9x16`     | `native_in_feed` | `declared_not_buyer_selectable` | generated vertical image                                                                             |
| `snap_generated_offerings`      | `native_in_feed` | `declared_not_buyer_selectable` | generated image per offering                                                                         |
| `snap_sponsored_snap`           | `image`          | `declared_not_buyer_selectable` | WEB\_VIEW creative with chat\_properties                                                             |
| `snap_generated_sponsored_snap` | `native_in_feed` | `declared_not_buyer_selectable` | generated WEB\_VIEW creative with chat\_properties                                                   |
| `snap_commercial`               | `video_hosted`   | `declared_not_buyer_selectable` | SNAP\_AD with SIX\_SECONDS forced view                                                               |

## Placements

| Placement ID           | Surface                        | State              | Provider mapping                                                                                                     |
| ---------------------- | ------------------------------ | ------------------ | -------------------------------------------------------------------------------------------------------------------- |
| `snapchat_full_screen` | Snapchat full-screen inventory | `provider_limited` | AAO discovery umbrella; executable products use placement\_v2 AUTOMATIC rather than a first-class placement selector |

## Targeting

| AdCP dimension     | State         | Provider mapping                                      |
| ------------------ | ------------- | ----------------------------------------------------- |
| `geo_countries`    | `implemented` | targeting.geos.country\_code                          |
| `geo_regions`      | `implemented` | ISO subdivision → provider region\_id with provenance |
| `geo_postal_areas` | `implemented` | targeting.geos.postal\_code                           |
| `audience_include` | `implemented` | targeting.segments INCLUDE                            |
| `audience_exclude` | `implemented` | targeting.segments EXCLUDE                            |
| `signals`          | `implemented` | Governed interest and segment IDs                     |
| `frequency_cap`    | `implemented` | cap\_and\_exclusion\_config                           |

## Reporting

| AdCP output       | Provider source                          | Notes                                     |
| ----------------- | ---------------------------------------- | ----------------------------------------- |
| `impressions`     | `impressions \| paid_impressions`        | Values must agree when both are returned  |
| `clicks`          | `swipes`                                 | Mapped to canonical clicks                |
| `spend`           | `spend`                                  | Provider micro-currency converted exactly |
| `views`           | `video_views`                            | Video starts/views                        |
| `completed_views` | `video_views_15s \| quartile completion` | Mapped when returned                      |
| `reach`           | `total_reach`                            | Unique logged-in Snapchat accounts        |
| `screen_time`     | `screen_time_millis`                     | Projected to average video view time      |
| `granularity`     | `TOTAL \| DAY \| HOUR`                   | Campaign and ad-squad timeseries          |

## Conversion and audience support

* **Optimization:** The executable conversion product maps purchase, add-to-cart, or signup to one exact Snap Pixel source.
* **Event sources:** Snap Pixels are discovered and readiness checked.
* **Event ingestion:** Conversions API events are supported through log\_event.
* **Audiences:** Audience synchronization, readiness polling, and include/exclude targeting are implemented.

## Known limits

* Catalog traffic, app installs, Story Ads, Collection Ads, lead generation, Sponsored Snaps, and Commercials remain blocked until creative round-trip coverage is complete.
* snap\_existing\_post is not an ordinarily executable format: the code-complete Public Profile path requires the protected canary gate and external provider allowlisting, and remains Yellow/ready\_for\_live.
* The protected Snap harness is ready, but no successful dated signed run currently supplies live-provider lifecycle evidence.
* The public AAO community mirror excludes snap\_existing\_post, so discovery metadata does not advertise it as ordinarily eligible.
* The AAO full-screen placement is a discovery umbrella; the ordinary executable path uses provider automatic placement.
* Account permissions and provider feature eligibility can narrow audience, pixel, catalog, and creative availability.
* A live canary result applies only to its exact account, fixture revision, product, and format.

## Public review endpoints

* [AAO registry record](https://agenticadvertising.org/api/registry/publisher?domain=snapchat.com\&include=placements)
* Staging MCP/AdCP state: `relationship_gated_storefront_id_required`.
* Route template after a storefront relationship supplies its registered platform ID: `https://api.staging.interchange.io/seller/{registered_storefront_platform_id}/mcp`
* No provider-ID-derived URL is published. The shared MCP route requires the registered storefront platform ID assigned to the relationship; the adapter provider ID snap is not asserted to be that record ID.

The staging endpoint is connection-gated. Its presence here is not an invitation
to send mutating requests without a jointly approved test account and canary window.

## Provider references

* [Snap Marketing API overview](https://developers.snap.com/marketing-api/Ads-API/overview)
* [Snap Campaigns](https://developers.snap.com/marketing-api/Ads-API/campaigns)
* [Snap Ad Squads](https://developers.snap.com/marketing-api/Ads-API/ad-squads)
* [Snap Measurement](https://developers.snap.com/marketing-api/Ads-API/measurement)

## Review questions

If a provider mapping is incomplete or has changed, send the exact product, format, targeting dimension, metric, market, or provider API field that differs. We update the governed contract and add code-owned drift checks where a denominator exists; otherwise the explicit non-enforced provenance gap remains.
