The copy behind winning Meta ads: a two-step pull in Claude
Ask which words your best ads share and you get an answer either way. Whether any text was fetched to produce it depends on asking in two steps.
On Meta’s official ads connector, performance and ad copy live in different tools. The
entity reader that returns spend and results has no copy fields at all — body,
title, headline and primary_text all come back unknown from its
field catalogue. The words come from the creative reader, keyed by creative_id. So
“what do my winning ads say” is a join you ask for in two steps, and three things stay
outside it: the description line, multiple text options, and any text Meta rewrote at delivery.
You ask the connected chat for your best ads and the copy they share. Back comes a confident list of hooks — urgency, social proof, a question in the first line. Then you open two of the “winners” in Ads Manager and the text is not what the summary described, because the table it reasoned from never contained any text.
That is not the assistant lying so much as filling a gap. The fix is to know which tool holds which half of the question, and to ask for the halves separately.
Two tools, one join key
ads_get_ad_entities is the tool for spend, results, click-through and every other
metric. Asked on 2026-09-15 for body, title, headline,
primary_text, message, description,
call_to_action and object_story_spec, its field catalogue returned every one
of them in unknown_fields. What it does return at ad level is creative_id,
described as “the unique identifier of the creative used in the ad” — and marked
neither filterable nor sortable.
The copy sits in ads_get_creatives. Its schema lists the readable fields:
body, title, link_url, call_to_action_type,
child_attachments and a handful of media and identity fields. It also explains the
naming: body is what Ads Manager calls primary text, title is the headline.
The trap is in the listing. Called without IDs, the tool states it returns only id,
name, account_id and status, and warns the assistant, in capitals, against reading
those gaps as empty fields. Copy only arrives when you pass the creative IDs or name the fields. The per-ad
alternative is ads_get_ad_preview, which returns body text, headline and CTA button
alongside the rendered image — one ad at a time.
Ranking comes first and it has its own trap: several of your top ads can share one creative, so group by creative ID before reading any copy, or one piece of text gets counted as a pattern.
Splitting a question across the tools that hold its halves is a habit the Claude Ads Operator course drills, once the connector is attached properly.
ads_create_creative accepts description, which its schema maps to
link_data.description for image ads. The read tool’s list of supported fields has
no top-level description — only the per-card one inside
child_attachments for carousels (schema read 2026-09-15). The write side also calls the
fields message and headline while the read side calls them
body and title, so a prompt that uses one tool’s words against the
other tool is asking for a field that does not exist there.
| What you want | Where it lives | What to watch |
|---|---|---|
| Which ads won | ads_get_ad_entities, ad level | No copy fields; group by creative_id |
| Primary text and headline | ads_get_creatives with IDs | A plain listing returns names only |
| Description line | Not on the read field list | Check it in Ads Manager |
| Which of several text options won | Not in the catalogue | See below |
| The ad as served | ads_get_ad_preview, per ad | A preview, not a delivery log |
Asking for it so the join actually happens
Step one: at ad level, pull amount spent, results, cost per result
and creative_id for last_30d. Group rows that share a creative_id and
sum them. Show me the table and stop.
Step two: for the creative IDs I pick from that table, fetch body,
title and call_to_action_type from the creative tool, by ID. Quote the
text exactly as stored. Do not summarise it or name patterns yet.
The pause between the steps is the point. You choose the winners from real rows — and ideally not by cost per result on tiny spend, which is how the wrong ads get crowned. Only then does text enter the conversation, verbatim, where you can read it before anyone tells you what it has in common.
A vendor guide shows the shape people reach for. Supermetrics’ blog (Andrea Linehan, 28 May
2026) suggests asking Claude to
“break the data down by individual ad” and, for each ad,
“also pull the headline and primary text”. That prompt is written
for Supermetrics’ own connector, and this post has not tested it there. On Meta’s official
connector the same sentence is two tools, and “cost per acquisition” is not a field name
the catalogue knows — cost_per_result is, which is
why a metric can come back as not existing.
Where this breaks
Multiple text options. An ad built with several primary texts or headlines stores them in
what Meta’s
AdCreative
reference calls asset_feed_spec: “an asset feed with multiple images, text
and other assets used to generate variations of an ad.” That field is not on the creative
reader’s list, and ads_create_creative takes one message and one
headline, not a set. What body returns for such an ad is not documented on
the tool.
Meta does publish per-text reporting for these ads. Its
Insights breakdowns
page lists body_asset, title_asset, description_asset and
call_to_action_asset among the dynamic creative asset breakdowns, and says they
“only support a limited set of metrics”: impressions, clicks, spend, reach, actions and
action values. None of those names resolved in the connector’s catalogue on 2026-09-15. Whether
the entity tool accepts them as a breakdown anyway was not tested, so treat it as unknown rather than
unsupported.
Text Meta changed. ads_create_creative describes its Advantage+ Creative switch
as automatic per-impression optimisations including “text improvements”. Where that is on,
the stored body is what you wrote, not necessarily what every person saw. A pattern
drawn from stored text is a pattern in your drafts.
Video. The AdCreative reference describes body as “not supported for
video post creatives”, so an empty body on a video ad can mean the text lives elsewhere, not
that the ad had none.
The metrics table never contained the words. Anything said about them before the second call is a guess.
- Asking for patterns in one breath. The assistant will produce hooks and angles whether or not text was ever fetched. Make it quote the stored copy first.
- Counting a shared creative as several winners. Five ads on one creative are one piece of copy, not five votes for it.
- Crediting copy for a creative win. The same text on a different image is a different ad. Look at the preview before deciding the words did the work.
- Reading a multi-text ad’s body as its copy. Until you have checked Ads Manager, you do not know which option ran.
Try this tonight Run step one for your top ads by spend, then fetch the stored text for the three biggest creative IDs. Open the same three in Ads Manager. If the text matches and none uses multiple text options, the two-step pull is safe for your account and you can keep using it. If any differ, note which ones: those ads need judging from the preview, not from stored copy.
Can Claude see the image as well as the text?
Yes, through the preview tool, which returns the creative image as a separate item. It works per ad, so pick the winners first.
Can I filter ads by the words in their copy?
No. Copy is not in the entity reader’s catalogue, and the creative reader has no filtering parameter. You can filter by ad name, which is a separate string.
Should I let it rewrite the winning copy?
Drafts are fine, and ads the connector creates are created paused. Check every factual claim in a rewrite before it becomes a creative, because the creative tools declare copy immutable once published.
Ask the right tool for each half
The course is the routing: which tool holds which data, which fields the connector actually resolves, and the checks to run before you trust a summary of your own ads.
See what's inside — $67 founding pricePre-sale: the modules are still being recorded and founding members get the checkout link first. No charge today. Public price $97.