OpenAI Ads has no search-terms report: you can’t see which prompt triggered your ad
Updated July 21, 2026
OpenAI Ads gives you no view of the prompt that triggered an ad. Its insights API breaks performance down by only three dimensions — product, country, and device — and there is no search-terms report or query field anywhere in the API. You don't bid on keywords; you describe the audience in a natural-language `context_hints` field and the model does the matching. Since you can't see or negate the trigger, you steer with that description and judge campaigns by conversions and ROAS — the only signals the platform returns.
The question with no answer
A running-shoes store runs ads inside ChatGPT and wants the obvious thing: which shopper questions surfaced its card. On Google Ads that's the search-terms report. Ask the OpenAI Ads insights API to break performance down by prompt and it replies with the only dimensions it knows:
segments[]=prompt → 400: expected one of: "product", "country", "device"
Product, country, device. That's the entire menu. There is no prompt field, no query field, no conversation field — and no search-terms endpoint to fall back to.
What OpenAI Ads exposes instead
The insights API returns performance — impressions, clicks, spend, conversions, ROAS — across the campaign, ad group, and ad hierarchy, sliced by at most one of product, country, or device. That's the whole reporting surface. The one thing it never returns is the input: the words someone typed into ChatGPT before your ad appeared.
Targeting works by description, not by term. An ad group carries a context_hints field — a plain-English account of the conversations you want to reach, like "shoppers comparing trail-running shoes for wet terrain." You don't bid on keywords; you describe intent and the model decides when your ad fits. So the keyword, the match type, and the query report all simply don't exist here.
Why there's nothing to see
Google at least has a query concept. Even after it hides its rare search terms — 68% of one real campaign's spend sat in an unexpandable "Other search terms" row — the search still exists as a discrete, billable event, and negative keywords act on it at matching time. OpenAI Ads has no query event to hide. There is no search term because there was no search — there was a conversation, and you don't get to read it.
That is a deeper opacity than Google's. Google withholds the rare tail of queries; OpenAI withholds the input entirely, because the match happens inside the model rather than in a keyword auction.
What you can still do
The trigger is invisible, so work the two ends you can see: the description going in, and the outcomes coming out.
- Treat
context_hintsas the only steering wheel. It is the sole lever over what your ads match. Write it precisely, change it deliberately, and keep the versions, so a shift in results ties to a specific edit instead of a guess. - Split ad groups to A/B the descriptions. You can't read the prompts, but you can run two
context_hintsvariants and let conversions say which framing the model matched better. Inference stands in for the search-terms report. - Instrument conversions before you scale. Wire up the pixel or Conversions API so every campaign reports conversions and ROAS. When the input is a black box, cost per conversion is the only honest read on whether spend is working.
- Lean on the three real segments. Product, country, and device are the breakdowns that exist. Use them for the slicing the prompt dimension can't give you.
How the check actually ran
The evidence above is the OpenAI Ads API answering for itself: ask it for a prompt breakdown, and it enumerates the three segments it supports. On an account that runs on Adjar, the parts you can control are plain-text config — the context_hints you steer with live in version control, so an A/B is a reviewable diff and a rollback is one command:
[[campaigns.ad_groups]]
name = "Trail running — wet terrain"
max_bid_usd = 1.20
context_hints = [
"Shoppers comparing trail-running shoes for wet, muddy terrain; grip and waterproofing questions.",
]
The report Adjar pulls back carries conversions and ROAS per campaign, not a query column — because the platform has no query to give. You measure the outcome, tune the description, and repeat. That is the loop OpenAI Ads leaves you.
Frequently asked questions
- Does OpenAI Ads have a search-terms report?
No. The insights API segments performance by only product, country, or device (one per request), and there is no separate search-terms or queries endpoint. Nothing in the API returns the prompt or query that triggered an impression or click.
- Can I see which ChatGPT prompt triggered my ad?
No. The prompt is a private conversation, not a public search string, and the API never exposes it. You can see impressions, clicks, spend, conversions, and ROAS, sliced by product, country, or device — but not the words a person typed before your ad appeared.
- How do I target on OpenAI Ads without keywords?
Through `context_hints` — a plain-English description of the conversations and intent you want to reach, set on the ad group. You describe the audience and OpenAI's model decides when your ad fits; there are no keywords or match types to configure.
- Can I add negative keywords on OpenAI Ads?
No. There are no keywords and no discrete query events, so there is nothing to negate. Instead of excluding terms, you refine the ad group's `context_hints` description and split-test variants to steer what the model matches.
- How do I optimize OpenAI Ads when I can't see the prompts?
Optimize the two ends you can see: the input (the `context_hints` description you control) and the outcome (the conversions you measure). Split ad groups to A/B different descriptions, instrument conversions with the pixel or Conversions API, and read cost per conversion and ROAS as the signal that the trigger can't give you.