Skip to main content

ChatGPT Ads Integration

Publish ads that appear inside ChatGPT responses as a “chat card” — a title, body, image, and click-through URL — and manage them conversationally from ChatGPT, Claude, or any supported AI client. ChatGPT Ads (OpenAI Ads) is a pay-per-click auction. Adspirer turns the launch, management, and measurement of these ads into plain-language requests across 36 tools: describe the ad you want and the agent builds the campaign, ad group, image upload, and chat_card ad for you — every object created PAUSED until you resume it.

Prerequisites

  • An OpenAI Ads (Advertiser) account with an Advertiser API key (generated in OpenAI Ads Manager → Settings → API keys)
  • Adspirer account connected via ChatGPT, Claude Code, or any supported AI client
  • A public image URL (PNG or JPG) for the ad creative

Connecting ChatGPT Ads

ChatGPT Ads is the first Adspirer platform that connects with a pasted API key instead of an OAuth browser login. You connect once in the Adspirer web app — the chat agent never asks for your key.
One API key = exactly one ad account. Unlike Google, Meta, TikTok, LinkedIn, and Amazon (which use an OAuth browser redirect and import several accounts at once), a ChatGPT Ads key maps to a single advertiser account. To manage more than one account, connect one key per account.
  1. In OpenAI Ads Manager, go to Settings → API keys and generate (or copy) your Advertiser API key
  2. Open the Adspirer web app and go to the Connections tab
  3. Click “Connect ChatGPT Ads”
  4. Paste your Advertiser API key and save — the key is stored encrypted
Once connected, the account joins your Adspirer multi-account switcher and is usable from chat. Verify the connection from your AI assistant:
You should see your ChatGPT Ads account listed with its name, account ID, and review status.

Managing several ChatGPT Ads accounts

Agencies and multi-brand advertisers can connect more than one ChatGPT Ads account. In the Connections tab, use “Connect another account” and paste that account’s own Advertiser API key. Each account is disconnected on its own, so removing one leaves the rest alone. How many you can keep active at once depends on your plan — see pricing. From chat, nothing changes while you have a single account connected: every tool uses it automatically and you never pass an account ID. Once you have two or more, tell the agent which account you mean. Ask for list_chatgpt_accounts to see each one with its account_id, name, and currency, then name the account in your request. If a request is ambiguous, the agent comes back with the list of your accounts rather than guessing at one — pick the one you meant and it re-runs against it.

See every connected ChatGPT Ads account with its ID and currency.

Open in Cursor

Optional: Conversions step

In the same Connect flow, set up conversion measurement (recommended). You can configure one or both:
  • Client-side Pixel — a small JS snippet you add to your site <head>, configured with your Pixel ID
  • Conversions API (server-side) — paste a Conversions API key for more reliable attribution
Supported events include order_created, lead_created, subscription_created, and trial_started. You can also configure and verify conversions from chat (see Conversion Tracking below).

What You Can Do (36 Tools)

ChatGPT Ads is driven through Adspirer’s conversational tools. Connecting and disconnecting are done in the web app, not via a chat tool — everything else is available from your AI assistant.

Accounts

  • list_chatgpt_accounts — Your connected ChatGPT Ads account(s), each with name, account_id, currency, and account review status

Campaigns

  • list_chatgpt_campaigns / get_chatgpt_campaign — List campaigns or get the full detail of one
  • create_chatgpt_campaign — Create a campaign (created PAUSED), with a budget, a bidding type, and included/excluded locations
  • update_chatgpt_campaign — Change budget, bidding, schedule, or targeting. Only the targeting side you name changes; the other is preserved
  • pause_chatgpt_campaign / resume_chatgpt_campaign — Stop serving, or resume to go live
  • archive_chatgpt_campaign — Archive a campaign. Permanent — asks you to confirm first

Ad Groups

  • list_chatgpt_ad_groups / get_chatgpt_ad_group — List ad groups or get one
  • create_chatgpt_ad_group — Add an ad group (bid + targeting) to a campaign
  • update_chatgpt_ad_group — Update bid, schedule, or targeting
  • pause_chatgpt_ad_group / resume_chatgpt_ad_group / archive_chatgpt_ad_group — Control ad-group state. Archiving is permanent and asks you to confirm

Ads

  • list_chatgpt_ads / get_chatgpt_ad — List ads or get one
  • create_chatgpt_ad — Create a chat_card ad (title, body, image, destination URL)
  • update_chatgpt_ad — Update an ad’s creative
  • pause_chatgpt_ad / resume_chatgpt_ad / archive_chatgpt_ad — Control ad state. Archiving is permanent and asks you to confirm

Launch & Creative

  • launch_chatgpt_ad — The one-shot orchestrator. Builds the whole paused ad in one step from URL + headline + body + image + budget + geo (creates the campaign, ad group, image upload, and chat_card ad)
  • upload_chatgpt_creative — Upload a chat_card image from a public URL
  • chatgpt_geo_lookup — Resolve a location like “California” to a valid targeting value (used for both included and excluded locations)

Insights

  • get_chatgpt_performance — Headline metrics: impressions, clicks, spend, CTR, CPC (plus conversions once the pixel/CAPI is live)
  • get_chatgpt_insights — Scoped, detailed insights with selectable fields, filters, sort, pagination, and zero-impression rows

Conversions

  • set_chatgpt_conversions_config / get_chatgpt_conversions_config — Configure (or review) your Pixel and Conversions API setup
  • list_chatgpt_conversion_events — See the conversion events being recorded
  • test_chatgpt_conversion — Send a test conversion to confirm tracking works end to end

Conversions Setup

Create the measurement sources themselves without leaving the conversation.
  • create_chatgpt_pixel — Create a web measurement pixel and get the ready-to-paste site snippet back
  • list_chatgpt_pixels — List your pixels, each with its Source ID and short Pixel ID
  • create_chatgpt_conversions_api_key — Create a server-side Conversions API key (shown once; saved encrypted so Adspirer can start sending events)
  • create_chatgpt_event_setting — Tie a conversion event (order_created, lead_created, a custom event) to a pixel or Conversions API source
  • list_chatgpt_event_settings — List your conversion event settings with their event type, source, and attribution window
The object model (Account → Campaign → Ad Group → Ad) is hidden by the agent — you just describe the ad you want, and it builds the right structure. Budgets and bids are in your account’s own currency, never micros — see Budgets, bidding, and targeting.

How a Launch Works

Launching never spends money on its own. Everything is created paused, and you resume it when you’re ready.
1

You describe the ad

“Run a ChatGPT ad for adspirer.com, $25/day, target California, headline ‘Your AI Paid Media Agent’, body ‘Run ads from ChatGPT’, use this image: [url].”
2

The agent builds everything — PAUSED

launch_chatgpt_ad resolves the location, creates the campaign + ad group, uploads the image from your URL, and builds the chat_card ad. Nothing serves or spends yet. (Prefer step-by-step control? The agent can build the same tree with create_chatgpt_campaigncreate_chatgpt_ad_groupupload_chatgpt_creativecreate_chatgpt_ad.)
3

You review

Check the campaign, budget, and creative. The agent reports the ad’s review status honestly — it never claims an ad is “live” while review is pending or rejected.
4

You resume to go live

On your say-so, resume_chatgpt_campaign takes it live — subject to OpenAI’s review. Want to stop again? pause_chatgpt_campaign.

Budgets, Bidding, and Targeting

Money is in your account’s currency

ChatGPT Ads accounts don’t all bill in dollars — AUD, BRL, CAD, GBP, MXN, and NZD are all in use. Every budget and bid you give the agent is read as your account’s own currency, never USD and never cents: ask for a budget of 25 and you get 25 a day in whatever currency the account bills in. list_chatgpt_accounts shows each account’s currency. Create and update responses read the applied budget and bidding back to you in that currency, so you can confirm the number that landed rather than assume it.
OpenAI’s floor for a daily budget is 25 a day, not 1. A smaller daily budget is caught before the request is sent, with your account’s currency named in the message.

Bidding type

create_chatgpt_campaign and update_chatgpt_campaign take a bidding_type: conversions needs exactly one conversion event to optimize toward, passed as conversion_event_setting_ids. Get the ID from list_chatgpt_event_settings, or create the event first with create_chatgpt_event_setting (see Conversion Tracking). Ask for conversions bidding without one and the agent says so before sending the request.

Move a ChatGPT Ads campaign onto conversions bidding.

Open in Cursor

Including and excluding locations

Target places by name or by OpenAI location ID, and exclude them the same way:
  • location_query / location_ids — where the campaign should serve
  • exclude_location_query / exclude_location_ids — where it shouldn’t
Editing targeting only changes the side you name. Add an exclusion and your existing included locations stay exactly as they were.
A location the agent can’t resolve is treated as an error, not an empty list — a misspelled place name leaves your targeting untouched and tells you so. To genuinely serve everywhere, ask for targeting to be cleared; the agent uses clear_targeting rather than inferring it from an empty list.
update_chatgpt_campaign also compares OpenAI’s response against what you asked for and names any field OpenAI left at its previous value, so an edit that didn’t take is never reported as done.

Add a location exclusion without disturbing existing targeting.

Open in Cursor

Example Prompts

Launch an Ad

Launch a ChatGPT chat_card ad — created paused so you review before it goes live.

Open in Cursor

Check Performance

ChatGPT Ads metrics for the week — impressions, clicks, spend, CTR, CPC.

Open in Cursor

Pause or Adjust Budget

Pause a ChatGPT campaign or change its daily budget.

Open in Cursor

Creative Requirements

The ChatGPT ad renders as a single chat_card — a title, body, image, and destination URL.
Provide a public, reachable image URL. Non-PNG/JPG files or unreachable URLs are rejected up front. Non-square or smaller-than-256px images produce a warning — they can still be rejected at review.

Conversion Tracking

Conversion measurement is optional but recommended. Set it up in the Conversions step of the Connect flow (see Connecting ChatGPT Ads), or configure and verify it from chat with set_chatgpt_conversions_config and test_chatgpt_conversion. You can use either or both methods:
  • Client-side Pixel — add a small JS snippet to your site <head>, configured with your Pixel ID
  • Conversions API (server-side) — paste a Conversions API key for more reliable attribution
Supported events: Use test_chatgpt_conversion to fire a test event and confirm tracking works, then list_chatgpt_conversion_events to see what’s being recorded. Once the pixel or Conversions API is live, conversions appear alongside impressions, clicks, spend, CTR, and CPC in get_chatgpt_performance.

Creating the pixel and API key from chat

You no longer need OpenAI Ads Manager to create the measurement sources — the agent can build them for you and hand back what you need.
1

Create the pixel

create_chatgpt_pixel creates a web measurement pixel and returns the site snippet ready to paste into your <head>, plus two identifiers: a short Pixel ID for the snippet and Conversions API, and a Source ID (cds_…) you use in the next step. Automatic Advanced Matching — which hashes the customer details your site forms collect so more conversions match — is on by default; ask for it off if you’d rather opt out.
2

Add a Conversions API key (optional)

create_chatgpt_conversions_api_key creates a server-side key. The secret is shown once and can never be retrieved again, so copy it if you need it elsewhere. By default Adspirer stores it encrypted so it can start sending server-side conversions immediately.
3

Define what counts as a conversion

create_chatgpt_event_setting ties an event — order_created, lead_created, one of the other supported types, or a custom event of your own — to a pixel or Conversions API source, with an attribution window (OpenAI recommends 30 days). list_chatgpt_event_settings shows what you’ve defined.
Pixels, Conversions API keys, and event settings are permanent. OpenAI provides no way to delete them, so the agent asks you to confirm before creating one, and it will not replace a pixel or key you already have unless you explicitly tell it to.

Ad Review and Policy

Every ad — and the account itself — must pass OpenAI’s review before it can serve. OpenAI’s ad policies disallow some categories, notably “third-party AI services”, so AI-company advertisers should expect extra scrutiny. The agent reports the review status (in_reviewapproved/rejected) honestly — it will not tell you an ad is “live” while review is pending or rejected.

Safety Guardrails

These are built into the tools, not optional settings:
  • Everything is created PAUSED. Nothing serves or spends until you resume it with resume_chatgpt_campaign.
  • The agent speaks in your account’s currency, never micros, and reads the applied budget back to you after a create or update.
  • Archiving asks first. OpenAI has no un-archive endpoint, so archive_chatgpt_campaign, archive_chatgpt_ad_group, and archive_chatgpt_ad require an explicit confirmation — and the agent offers pausing instead when that’s what you meant.
  • Targeting edits never widen your reach by accident. Changing one side of a campaign’s location targeting preserves the other, and an unresolvable location leaves targeting untouched rather than clearing it.
  • Review status is reported honestly — no false “live” claims while review is pending or rejected. An update that OpenAI silently ignored is reported as ignored, not as applied.

Best Use Cases for ChatGPT Ads

  • Reaching people inside ChatGPT — put your offer in front of users at the moment they’re asking an AI for help
  • Simple, single-card creative — one headline, one short body line, one image, one link; no video production required
  • Pay-per-click testing — start at OpenAI’s 25-a-day daily minimum, review before you resume, and read CTR/CPC before scaling
Not ideal for: rich multi-format creative (use Meta Ads for image/video/carousel), high-intent search capture (use Google Ads), or categories OpenAI’s policies disallow (e.g. third-party AI services).

Troubleshooting

”Not connected” — ChatGPT Ads doesn’t appear

ChatGPT Ads is connected in the web app, not from chat. Open the Adspirer web app → Connections tab → “Connect ChatGPT Ads” and paste your Advertiser API key. Then ask your assistant to “Check my connected ad platforms."

"Invalid API key”

The pasted key is wrong, revoked, or for the wrong account. Generate a fresh Advertiser API key in OpenAI Ads Manager → Settings → API keys, then re-paste it in the Connections tab. Remember: one key = one ad account.

Ad stuck in review

OpenAI reviews both the account and each ad before it can serve. in_review is normal for new ads and accounts. AI-related advertisers face extra scrutiny — if the ad is rejected, the category may be disallowed (see Ad Review and Policy). Use list_chatgpt_accounts to check the account review status.

A budget change didn’t take effect

Budget updates on ChatGPT Ads campaigns used to report success without changing anything — the value reached OpenAI in the wrong shape and was discarded. That’s fixed. If a campaign has been spending at an old rate since you changed it from chat, check the current budget with get_chatgpt_campaign and set it again; the response now reads back the budget that actually applied.

Image rejected

Make the image square and at least 256×256 px, in PNG or JPG, served from a public, reachable URL. Non-PNG/JPG files and unreachable URLs are rejected up front; non-square or undersized images warn and may be rejected at review.

FAQ

ChatGPT Ads (OpenAI Ads) authenticates with an Advertiser API key, not an OAuth browser redirect like Google, Meta, TikTok, LinkedIn, and Amazon. You paste the key once in the Adspirer web app’s Connections tab; it’s stored encrypted and the chat agent never asks for it. One key maps to exactly one ad account.
Yes. Because a ChatGPT Ads key maps to one advertiser account, several accounts means several keys — add each with “Connect another account” in the Connections tab, and disconnect them one at a time. How many you can keep active at once depends on your plan; see pricing.With one account connected, tools use it automatically. With two or more, name the account you mean in your request — list_chatgpt_accounts shows each one’s account_id, name, and currency. Leave it ambiguous and the agent replies with your account list instead of picking one for you.
Yes. create_chatgpt_pixel creates the pixel and returns the site snippet ready to paste into your <head>, so you don’t have to open OpenAI Ads Manager. create_chatgpt_conversions_api_key does the same for server-side tracking, and create_chatgpt_event_setting defines what counts as a conversion.All three create something permanent — OpenAI has no delete endpoint for them — so the agent confirms with you first and won’t overwrite a pixel or key you already have unless you tell it to. A Conversions API key’s secret is shown once and can’t be retrieved again.
Adspirer pricing is based on tool calls, not ad spend. Free tier: 15 calls/month. Plus: 49150/mo.Pro:49–150/mo. Pro: 99–600/mo. Max: $199–3,000/mo. Launching a ChatGPT ad uses a handful of tool calls. Your ad spend is billed separately by OpenAI. See full pricing.
No. Everything is created PAUSED — nothing serves or spends until you resume it with resume_chatgpt_campaign. The agent always speaks in your account’s own currency (not micros) and reads the applied budget back to you, so the number is clear before you go live, and you can pause_chatgpt_campaign at any time. Archiving — the one irreversible action, since OpenAI has no un-archive — needs an explicit confirmation of its own.
One image, supplied as a public PNG or JPG URL — Adspirer uploads it from the URL (no file upload). Square, at least 256×256 px is recommended. Non-square or smaller images produce a warning and may be rejected at review; non-PNG/JPG or unreachable URLs are rejected up front.
Yes. Your Advertiser API key is stored encrypted in the Adspirer web app and is never exposed to the chat agent. All connections are HTTPS-encrypted. You can disconnect the account from the Connections tab at any time, and you can revoke the key from OpenAI Ads Manager.
get_chatgpt_performance reports impressions, clicks, spend, CTR, and CPC. get_chatgpt_insights gives a scoped, detailed view with selectable fields, filters, sort, and pagination. Once you’ve configured the client-side Pixel or the Conversions API, conversions (order_created, lead_created, subscription_created, trial_started) appear alongside those metrics.
Last modified on August 19, 2026