Paid Media Guide

The ChatGPT Ads API in 2026: Campaign Structure, Bidding and What You Actually Control

OpenAI has shipped a complete advertising API: objectives, bid strategies, budget types, targeting, creative review, spend limits and insights. This is the media buyer's read on how it is structured, what it decides for you, and where the expensive mistakes are.

Distk Editorial Sep 2026 14 min read

The ChatGPT Ads API, formally the Advertiser API, runs at https://api.ads.openai.com with bearer authentication and one key per ad account. Structure is account, campaign, ad group, ad, with targeting on the campaign and bidding on the ad group. There are three objectives set as bidding_type (impressions, clicks, conversions) and three bid strategies (fixed_bid, maximize_clicks, maximize_conversions, the latter two branded Maximize Results), but only five valid combinations of objective, billing event and strategy. Maximize Results requires a daily budget, click billing, no explicit bid, no audience bid multipliers and a mandatory Idempotency-Key. Budgets and bids use micros at 1,000,000 per major currency unit, and impression bids are per impression, so a 60 USD CPM is 60000 micros. New resources are created paused and you activate from the ad upward. Campaign objective, the oCPC conversion event, a daily-to-lifetime budget change and an ad's parent ad group are all fixed after creation.

What Is the ChatGPT Ads API in 2026?

The ChatGPT Ads API, which OpenAI calls the Advertiser API, is the programmatic interface for creating and managing ads that appear inside ChatGPT. It handles campaigns, ad groups, ads, product feeds, conversion tracking and reporting. Requests go to https://api.ads.openai.com with a bearer token, and you create that key in the Settings page of Ads Manager at ads.openai.com.

This is a full ad platform rather than a placement you buy through someone else. It has objectives, bid strategies, budget types, geographic and platform targeting, audience inclusion and exclusion, creative review, spend limits, audit logs and an insights endpoint. If you buy media for a living, the useful question is not whether it works but which decisions it leaves you and which it takes away. This guide answers that, using only OpenAI's own documentation.

How Is a ChatGPT Ads Account Structured in 2026?

Four levels, each owning different settings. An ad account contains campaigns, each campaign contains ad groups, and each ad group contains ads. OpenAI's guidance is to configure each setting at the level that owns it, use separate campaigns when you need separate budgets, objectives or targeting, and use ad groups for different bid configurations, context hints or product sets.

Ad account
└── Campaign
    └── Ad group
        └── Ad
LevelWhat you configure hereWhat this means for a media buyer
Ad accountAdvertiser branding, currency, timezone, account access, spend limitsCurrency and timezone are creation-time choices and cannot be edited later.
CampaignObjective, budget, schedule, geographic and platform targeting, audience inclusion and exclusion, conversion eventsTargeting lives here, not on the ad group. One budget is shared across all its ad groups.
Ad groupBid strategy, context hints, audience bid multipliers, product setThis is your bidding and relevance layer.
AdCreative, image or product template, destination URLAn ad cannot be moved to another ad group after creation.

One structural constraint is worth planning around in 2026: targeting is a campaign-level setting. If you want two different geographies or two different audience definitions, that is two campaigns, and therefore two budgets. Teams used to building one campaign with many differently-targeted ad sets will need to restructure.

What Campaign Objectives Does ChatGPT Ads Support in 2026?

Three objectives, set as bidding_type on the campaign: impressions, clicks and conversions. The objective determines what delivery optimises for. A separate setting on the ad group, billing_event_type, determines what you actually pay for. Those two are not the same field and not always the same thing, which is the single most useful mechanic to understand before you build anything.

ObjectiveBest forHow you payWhat delivery optimises for
impressions (CPM)Reach and awarenessPer 1,000 impressionsBroad delivery at scale
clicks (CPC)Engagement and trafficPer valid clickClicks from people likely to engage
conversions (oCPC)A tracked action after a clickPer valid click, not per conversionClicks more likely to lead to your selected conversion event

The third row is the unusual one. A conversions campaign optimises toward a conversion event but bills on valid clicks, so the bid you set is a CPA bid used as an optimisation input rather than a price you pay per conversion. We cover that billing shape separately in the conversion-optimised campaigns guide.

How Do Bid Strategies Work in ChatGPT Ads in 2026?

Three strategies, set as bidding_config.strategy on the ad group. fixed_bid means you supply the bid. maximize_clicks and maximize_conversions let OpenAI adjust bids within your daily budget, and OpenAI brands those two jointly as Maximize Results. The documentation states both are available for standard and product-feed campaigns.

StrategyUse whenCompatible objectivesBudgetBid amount
fixed_bidYou want to set and adjust the bid yourselfImpressions, clicks, conversionsDaily or lifetimeProvide max_bid_micros
maximize_clicksYou want OpenAI to seek more clicks from your budgetClicksDaily onlyOmit max_bid_micros
maximize_conversionsYou want OpenAI to seek more conversions from your budgetConversionsDaily onlyOmit max_bid_micros

Only five combinations of objective, billing event and strategy are valid, and the documentation lists them explicitly. Memorise this table and most of your 400-level errors disappear.

Campaign bidding_typeAd group billing_event_typeAd group strategy
impressionsimpressionfixed_bid
clicksclickfixed_bid
clicksclickmaximize_clicks
conversionsclickfixed_bid
conversionsclickmaximize_conversions

The Maximize Results prerequisites people miss

How Do Budgets and Micros Work in 2026?

Budgets sit on the campaign and are expressed in micros, where one million micros equals one major unit of the account currency. You provide exactly one budget field: either daily_spend_limit_micros or lifetime_spend_limit_micros. A campaign cannot have both. Daily minimums depend on the account currency, and a request below the minimum returns an error stating the required amount.

Amount in a USD accountValue to send
1.00 USD1000000
2.50 USD2500000
50.00 USD50000000
500.00 USD lifetime500000000

Two behaviours matter operationally. A budget update sets the new amount rather than adding to the old one, so sending 75000000 makes the daily budget 75 USD and does not add 75 USD. And you cannot reduce a lifetime budget below what the campaign has already spent.

The budget switch that only works one way

You can switch a lifetime-budget campaign to a daily budget through a campaign update. You cannot switch a daily budget back to lifetime; OpenAI's documentation says to create a new campaign if you need a lifetime budget instead. That matters because Maximize Results requires a daily budget, so moving a lifetime campaign onto automated bidding is a one-way door for that campaign.

How Do You Set a Bid Correctly, Including CPM?

max_bid_micros uses the same micros scaling as budgets, so a 2.50 USD click bid is 2500000. Impression bidding is where teams get this wrong. The API expects a bid per impression, not per thousand impressions. OpenAI's own worked example: a 60 USD CPM is 0.06 USD per impression, so you send 60000 micros, calculated as 60 divided by 1,000 multiplied by 1,000,000.

Getting this backwards by a factor of 1,000 in either direction is the most expensive arithmetic error available on this platform in 2026, so it is worth a second pair of eyes on the first impressions campaign you build.

The default that protects you in 2026

OpenAI's documentation states that new resources are created paused so you can finish setup before enabling delivery. Nothing you create through the API starts spending on its own. Activation is a separate, explicit call on each level, and you activate from the bottom up: the ad, then the ad group, then the campaign.

How Do You Launch a First Campaign Through the API in 2026?

Five creates and three activations. The sequence below follows OpenAI's own quickstart: a paused clicks campaign with a fixed bid, then an ad group, then an uploaded image, then a chat-card ad, then preview and activate. Budget and bid values in the documentation are illustrative USD amounts.

1. Create the campaign

curl -X POST "https://api.ads.openai.com/v1/campaigns"   -H "Authorization: Bearer ${OPENAI_ADS_API_KEY}"   -H "Idempotency-Key: first-campaign-001"   -H "Content-Type: application/json"   -d '{
    "name": "Spring launch",
    "status": "paused",
    "bidding_type": "clicks",
    "budget": { "daily_spend_limit_micros": 50000000 },
    "targeting": { "locations": { "countries": ["US"] } }
  }'

2. Create the ad group with a bid and context hints

curl -X POST "https://api.ads.openai.com/v1/ad_groups"   -H "Authorization: Bearer ${OPENAI_ADS_API_KEY}"   -H "Idempotency-Key: first-ad-group-001"   -H "Content-Type: application/json"   -d '{
    "campaign_id": "cmpn_123",
    "name": "Trail running",
    "status": "paused",
    "context_hints": ["Trail running shoes for rocky terrain"],
    "bidding_config": {
      "billing_event_type": "click",
      "strategy": "fixed_bid",
      "max_bid_micros": 2000000
    }
  }'

3. Upload the creative image

curl -X POST "https://api.ads.openai.com/v1/upload"   -H "Authorization: Bearer ${OPENAI_ADS_API_KEY}"   -F "file=@/path/to/product-image.png"

Use JPEG, PNG or WebP at a minimum of 640 by 640 pixels, and save the returned file_id.

4. Create the ad

curl -X POST "https://api.ads.openai.com/v1/ads"   -H "Authorization: Bearer ${OPENAI_ADS_API_KEY}"   -H "Idempotency-Key: first-ad-001"   -H "Content-Type: application/json"   -d '{
    "ad_group_id": "adgrp_123",
    "name": "Trail shoe launch",
    "status": "paused",
    "creative": {
      "type": "chat_card",
      "title": "Find your next trail shoe",
      "body": "Explore shoes made for your next outdoor run.",
      "target_url": "https://example.com/trail-shoes",
      "file_id": "file_123"
    }
  }'

Creating an ad submits its creative for review. Titles run 3 to 50 characters, bodies up to 100 characters, and the destination must be an HTTP or HTTPS URL no longer than 2,048 characters that is accessible to OpenAI's ad crawlers.

5. Preview, inspect, then activate bottom-up

curl -X POST "https://api.ads.openai.com/v1/ads/ad_123/preview"   -H "Authorization: Bearer ${OPENAI_ADS_API_KEY}"

curl -X POST "https://api.ads.openai.com/v1/ads/ad_123/activate"   -H "Authorization: Bearer ${OPENAI_ADS_API_KEY}"
curl -X POST "https://api.ads.openai.com/v1/ad_groups/adgrp_123/activate"   -H "Authorization: Bearer ${OPENAI_ADS_API_KEY}"
curl -X POST "https://api.ads.openai.com/v1/campaigns/cmpn_123/activate"   -H "Authorization: Bearer ${OPENAI_ADS_API_KEY}"

OpenAI is explicit that a preview shows appearance and does not confirm serving eligibility, and that activation enables delivery only when the remaining requirements are satisfied.

What Cannot You Change After Creation in 2026?

More than on most ad platforms, and this is the section worth reading before you build a naming convention. OpenAI documents several settings as fixed at creation, which means your structure has to anticipate them rather than correct them later.

SettingChangeable?What to do instead
Campaign objective (bidding_type)NoCreate a new campaign.
Selected conversion event on an oCPC campaignNoCreate a new campaign.
Daily budget back to lifetimeNoCreate a new campaign.
Moving an ad to a different ad groupNoCreate the ad in the target ad group.
Account currency and timezoneNoSet correctly at account creation.
Bid strategy within the same objectiveYesUpdate bidding_config, respecting the budget rules.
CreativeYesUpdating it creates a new submitted version and starts another review.

How Do You Diagnose a Campaign That Is Not Delivering?

Two include parameters do most of the work. Request bid_too_low and serving_issues on the ad group, and serving_issues on the campaign. OpenAI is careful about what the first one means: bid_too_low: true indicates the bid may be too low for reliable delivery, and it is guidance rather than a serving restriction.

curl -G "https://api.ads.openai.com/v1/ad_groups/adgrp_123"   -H "Authorization: Bearer ${OPENAI_ADS_API_KEY}"   --data-urlencode 'include[]=bid_too_low'   --data-urlencode 'include[]=serving_issues'

Work through the layers in order, because each one can independently stop delivery: account status and account reviews, the account spend limit, the campaign budget and schedule, campaign targeting, the ad group bid, ad review status, and for product-feed campaigns whether any products match your filters. OpenAI states plainly that campaign budgets and account spend limits apply independently, so raising a campaign budget does not override an exhausted account limit. The account management guide covers that layer.

What Are the Rate Limits and Account Limits in 2026?

The Advertiser API enforces limits by both ad account and IP address, and a request has to stay within both. Bulk job creation has its own separate limit, covered in the Bulk API guide.

LimitValue
Per endpoint600 requests per minute
Overall1,200 requests per minute
Bulk job creation10 requests per 10 seconds per ad account
Self-serve campaigns per ad account5,000 non-archived
Self-serve ad groups per ad account5,000 non-archived
Self-serve ads per ad account5,000 active or paused
Location IDs per campaign2,500
Context hints per ad group2,000

How Do You Add Tracking Parameters to ChatGPT Ads?

Through landing_page_configuration.query_string_template, which can be set at campaign, ad group or ad level. The template supports macros, and the one that matters for stitching platform data to your own analytics is {oppref}, the click identifier.

{
  "landing_page_configuration": {
    "query_string_template": "utm_source=openai&utm_campaign={campaign_id}&utm_content={ad_id}&click_id={oppref}"
  }
}

Capture oppref on your landing page and pass it back on server-side conversions, because the Conversions API does not capture it automatically. That mechanic is the backbone of attribution on this platform and is covered in the Measurement Pixel and Conversions API guide.

How Should You Read ChatGPT Ads Reporting in 2026?

Through the Insights endpoints, and with patience about which numbers have settled. OpenAI documents three different processing speeds, and conflating them produces the classic false alarm on day one of a campaign.

MetricsFreshnessReporting history available
Impressions, clicks, CTRCan appear within minutes; recent values may changeHourly: about 30 days
Spend, CPC, CPMReflect finalised activity and can update laterNon-hourly, excluding product: most recent 365 days
Conversions and purchase outcomesDaily processing; allow at least one day to appearProduct reporting: about 30 days

Two reading notes from the documentation. CTR is returned as a ratio, so 0.04 means 4 percent. And a null metric means unavailable or not calculable, not zero, which matters for ROAS when purchase value is missing or spend is zero. Because recent clicks can arrive before finalised spend, dividing the latest spend by the latest clicks can disagree with the returned CPC.

What Has Changed in the ChatGPT Ads API During 2026?

OpenAI publishes a changelog, and the cadence tells you how young this platform is. The initial version was published as v1, and the documented 2026 additions run through the year.

Practical consequence for an agency in 2026: pin nothing to a capability you have not re-checked this quarter, and read the changelog before you conclude a feature does not exist.

What Are the Common Mistakes With the ChatGPT Ads API in 2026?

Key Takeaways for 2026

ChatGPT Ads in 2026 is a real auction platform with its own structural logic, and most of the early mistakes come from carrying Meta or Google habits across unchanged.

Distk builds and runs paid media for growth teams across India and internationally, including the measurement layer that makes a new channel readable rather than a guess. If you are evaluating ChatGPT Ads in 2026, the sensible first step is a small structured test with tracking verified end to end before any budget scales, and that is the piece we would set up with you.

Sources

Every endpoint, field, limit and default in this guide is quoted from OpenAI's published Ads documentation as of 30 September 2026. Platform capabilities change; check the changelog before relying on any specific behaviour.

ChatGPT Ads API in 2026: FAQs

What is the base URL and authentication for the ChatGPT Ads API?

Requests go to https://api.ads.openai.com with an Authorization bearer header. You create the Advertiser API key in the Settings page of Ads Manager at ads.openai.com. Each key works with one ad account, so you do not add an account header when using it.

What bid strategies does ChatGPT Ads support in 2026?

Three: fixed_bid, where you supply max_bid_micros, plus maximize_clicks and maximize_conversions, which OpenAI brands jointly as Maximize Results and which let OpenAI adjust bids within a daily budget. Both Maximize strategies are available for standard and product-feed campaigns.

Why is my Maximize Results ad group failing to create?

Check five things: the campaign needs a daily budget rather than lifetime, billing_event_type must be click, max_bid_micros must be omitted, audience bid multipliers must not be set, and an Idempotency-Key header is required for Maximize Results ad group creation.

How do I set a CPM bid in the ChatGPT Ads API?

The API expects a bid per impression, not per thousand impressions. Divide your CPM by 1,000 then multiply by 1,000,000. OpenAI's own example: a 60 USD CPM is 0.06 USD per impression, so you send 60000 micros.

What cannot be changed after a ChatGPT Ads campaign is created?

The campaign objective, the selected conversion event on a conversion-optimised campaign, and a daily budget cannot be switched back to lifetime. An ad also cannot be moved to a different ad group, and account currency and timezone are creation-time choices.

Why is my ChatGPT Ads campaign not delivering after activation?

Activation only permits delivery. Check account status and account reviews, the account spend limit, the campaign budget and schedule, targeting, the ad group bid using the bid_too_low include, and ad review status. Campaign budgets and account spend limits apply independently.

Test a new channel properly before you scale it

Distk sets up paid media on new platforms with tracking verified end to end first, so the data you get back tells you whether the message worked rather than whether the plumbing was broken.

Start the conversation →