> ## 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.

# OpenAI Ads adapter compatibility

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

OpenAI Ads maps an AdCP media buy to a campaign, one or more ad groups, and ads. Both current OpenAI creative types and impression-, click-, and conversion-optimized buying are implemented.

<Note>
  **Review-ready, not provider-endorsed · last verified 2026-08-16.**
  This is an Interchange compatibility review for technical feedback, not an OpenAI 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 six rows are an implemented execution catalog, not a claim that every OpenAI Ads creation path has been enumerated.                                                                                                         |
| 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; account-owned audiences, event sources, creative or feed assets, targeting, budget, and flight are bound separately at planning and create time. |
| Current account eligibility   | `account_check_required`                  | The selected account's permissions, live geography lookup, event-source readiness, feed state, and creative inputs 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/openai-ads/adapter.ts | No code-owned complete mapping denominator exists; these rows remain manually traced to adapter code and public provider documentation. |
| `reporting`       | `manual_plan_trace_non_enforced` | `false`        | packages/storefront-adapters/src/platforms/openai-ads/adapter.ts | No exported code-owned reporting projection constant exists; the public rows are plan-traced rather than 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    | The provider OpenAPI, creative enum, product mappings, readback, and AAO record have automated drift coverage. |
| Fresh signed live evidence      | `not_live_proven`   | —             | The protected, paused canary is wired for both formats, but no OpenAI provider write or spend has occurred.    |
| AAO discovery                   | `community_catalog` | 2026-08-16    | The public registry lists ChatGPT and both formats; it is not publisher-owned authorization.                   |

## Markets

**`verified_planning_snapshot`.** The public snapshot is planning guidance only; a listed market is not proof that the selected account is currently eligible.

Published planning snapshot: `AU`, `BR`, `CA`, `JP`, `KR`, `MX`, `NZ`, `GB`, `US`.

Authority: The selected account's live /geo\_lookup/search response is authoritative at create and update time.

## Object mapping

| AdCP / Interchange    | OpenAI Ads                   | Mapping                                                                                           |
| --------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------- |
| `account`             | `ad_account`                 | One bearer key resolves to one OpenAI ad account and must match the selected connection.          |
| `media_buy`           | `campaign`                   | Objective, lifetime budget, status, flight, and top-level targeting container.                    |
| `package`             | `ad_group`                   | Bid, billing, context, audiences, product selection, and package delivery.                        |
| `creative_assignment` | `ad`                         | Binds a chat card or product template to an ad group.                                             |
| `creative`            | `file + ad creative payload` | Chat cards upload a durable image; product templates reuse feed-owned image and destination data. |

## Operations

| Public adapter operation | Surface                                                    | State             | Provider path                                                                                                                                                    |
| ------------------------ | ---------------------------------------------------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `list_accounts`          | AdCP buyer operation                                       | `implemented`     | GET /ad\_account                                                                                                                                                 |
| `sync_accounts`          | AdCP buyer operation                                       | `not_implemented` | Account synchronization is not implemented.                                                                                                                      |
| `get_products`           | AdCP buyer operation                                       | `implemented`     | Six governed objective × creative product mappings                                                                                                               |
| `sync_creatives`         | AdCP buyer operation                                       | `implemented`     | POST /files and typed creative validation                                                                                                                        |
| `list_creatives`         | AdCP buyer operation                                       | `implemented`     | Durable Interchange creative identities plus provider readback                                                                                                   |
| `create_media_buy`       | AdCP buyer operation                                       | `implemented`     | POST /campaigns → /ad\_groups → /ads with exact readback                                                                                                         |
| `get_media_buys`         | AdCP buyer operation                                       | `implemented`     | Paginated campaign hierarchy reconstruction                                                                                                                      |
| `update_media_buy`       | AdCP buyer operation                                       | `implemented`     | Governed campaign, ad-group, ad, targeting, bid, status, and archive updates                                                                                     |
| `get_media_buy_delivery` | AdCP buyer operation                                       | `implemented`     | Campaign insights with package, creative, product, country, and device projections                                                                               |
| `analyze_account`        | Admin/ops introspection (not an AdCP buyer wire operation) | `implemented`     | Admin/ops introspection; not an AdCP buyer wire operation. Account readiness, trailing delivery, creative mix, audience, event-source, and product-feed analysis |
| `get_signals`            | AdCP buyer operation                                       | `implemented`     | Account-owned custom audience discovery and readiness                                                                                                            |
| `sync_audiences`         | AdCP buyer operation                                       | `not_implemented` | No governed provider member-delta lifecycle is available                                                                                                         |
| `sync_event_sources`     | AdCP buyer operation                                       | `implemented`     | Conversion event-setting discovery and verification                                                                                                              |
| `log_event`              | AdCP buyer operation                                       | `not_implemented` | Conversions API secrets remain outside the buyer-facing adapter                                                                                                  |
| `sync_catalogs`          | AdCP buyer operation                                       | `not_implemented` | Catalog synchronization is not implemented.                                                                                                                      |
| `get_account_financials` | AdCP buyer operation                                       | `not_implemented` | Account financial reporting is not implemented.                                                                                                                  |

## Wholesale products and exact execution bases

| Product ID                            | Exact provider execution base                                               | Implemented   | Static certification     | Current eligibility      | Known gap |
| ------------------------------------- | --------------------------------------------------------------------------- | ------------- | ------------------------ | ------------------------ | --------- |
| `openai_ads_chat_card_impressions`    | objective `standard`; optimization `impressions`; billing `impressions`     | `implemented` | `deterministic_contract` | `account_check_required` | —         |
| `openai_ads_chat_card_clicks`         | objective `standard`; optimization `clicks`; billing `clicks`               | `implemented` | `deterministic_contract` | `account_check_required` | —         |
| `openai_ads_chat_card_conversions`    | objective `standard`; optimization `conversions`; billing `clicks`          | `implemented` | `deterministic_contract` | `account_check_required` | —         |
| `openai_ads_product_feed_impressions` | objective `product_feed`; optimization `impressions`; billing `impressions` | `implemented` | `deterministic_contract` | `account_check_required` | —         |
| `openai_ads_product_feed_clicks`      | objective `product_feed`; optimization `clicks`; billing `clicks`           | `implemented` | `deterministic_contract` | `account_check_required` | —         |
| `openai_ads_product_feed_conversions` | objective `product_feed`; optimization `conversions`; billing `clicks`      | `implemented` | `deterministic_contract` | `account_check_required` | —         |

## 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        |
| -------------------------------- | ---------------- | ------------ | --------------------- |
| `openai_ads_chat_card`           | `native_in_feed` | `executable` | chat\_card            |
| `openai_ads_product_ad_template` | `native_in_feed` | `executable` | product\_ad\_template |

## Placements

This provider exposes no placement selector that Interchange can map without inventing inventory.

## Targeting

| AdCP dimension                    | State         | Provider mapping                                              |
| --------------------------------- | ------------- | ------------------------------------------------------------- |
| `geo_countries`                   | `implemented` | Country IDs resolved through account-scoped geo lookup        |
| `geo_regions`                     | `implemented` | ISO 3166-2 regions resolved through account-scoped geo lookup |
| `dma`                             | `implemented` | Nielsen DMA IDs where OpenAI exposes them                     |
| `context_hints`                   | `implemented` | Up to 100 canonicalized ad-group context hints                |
| `audience_include`                | `implemented` | Ready account-owned custom audience IDs                       |
| `audience_exclude`                | `implemented` | Ready account-owned custom audience IDs                       |
| `custom_audience_bid_multipliers` | `implemented` | Provider micros values with exact ad-group readback           |
| `product_set`                     | `implemented` | One typed filter per supported feed field                     |

## Reporting

| AdCP output                               | Provider source                | Notes                                                           |
| ----------------------------------------- | ------------------------------ | --------------------------------------------------------------- |
| `impressions`                             | `impressions`                  | Campaign, package, creative, and optional segment totals        |
| `clicks`                                  | `clicks`                       | Campaign, package, creative, and optional segment totals        |
| `spend`                                   | `spend`                        | Provider-authoritative currency amount                          |
| `conversions`                             | `click_through_conversions`    | Canonical conversions exclude view-through attribution          |
| `ext.openai_ads.view_through_conversions` | `view_through_conversions`     | Reporting-only provider metric                                  |
| `breakdowns`                              | `product \| country \| device` | Hourly, daily, or monthly subject to provider combination rules |

## Conversion and audience support

* **Optimization:** One active standard conversion event setting can drive oCPC.
* **Event-source discovery:** Existing settings are listed and ownership/readiness checked.
* **Event ingestion:** Not exposed through AdCP; one-time Conversions API secrets are never returned or persisted.
* **Audiences:** Existing ready custom audiences can be targeted, but governed member add/remove sync is not claimed.

## Known limits

* Initial product-feed connection and full upload happen through Ads Manager and SFTP, not the Advertiser API.
* The provider exposes no placement selector, so the adapter does not invent ChatGPT placements.
* The current nine-market planning snapshot is advisory; live account-scoped geo lookup is authoritative.
* Live conformance remains unproven until the dedicated staging account runs the protected canary.

## Public review endpoints

* [AAO registry record](https://agenticadvertising.org/api/registry/publisher?domain=chatgpt.com\&include=placements)
* Staging MCP/AdCP state: `unavailable_no_registered_storefront`.
* 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. OpenAI Ads is built into the adapter library but has no registered storefront record, so no reachable staging seller endpoint is published.

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

* [OpenAI Ads API quickstart](https://developers.openai.com/ads/api-quickstart)
* [OpenAI campaigns](https://developers.openai.com/ads/api-reference/campaigns)
* [OpenAI ads](https://developers.openai.com/ads/api-reference/ads)
* [OpenAI insights](https://developers.openai.com/ads/api-reference/insights)
* [OpenAI campaign targeting](https://developers.openai.com/ads/campaign-targeting)
* [OpenAI product feeds](https://developers.openai.com/ads/product-feeds)

## Review questions

* Are the campaign, ad-group, ad, file, and product-feed object mappings accurate?
* Is the nine-market planning snapshot and its live account lookup boundary accurate?
* Which additional public proof would be useful before a jointly approved paused canary?
