Meta Ads4 prompts · controlled inputs

Search Meta ads by keyword, brand or slogan.

Find active Meta ads containing one exact phrase, then verify its literal occurrence and requested role in a bounded set of opened candidates.

10candidate rows max
6ad openings max
3–5verified ads target

Example run · 13 Oct 2026

Published by Spytrend · 9 Oct 2026 · Methodology

Run in order

A 4-step exact-phrase workflow

Prompts update with the controlled inputs above.

Validate and discover

Validate the literal phrase and run one bounded active-ad search.

View promptHide prompt
Prompt 01
Cost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. If a search reports `pagination.total_status=restricted` (a free-plan archive window; `meta.plan_window_cutoff` names the boundary), tell the user the result covers only ads that started on or before that date, and never report a zero from it as "no such ads exist". Cost notices are not part of the final customer report.

Find active Meta ads launched in the last **30 completed UTC days** in **United States / US** whose returned ad text may contain the literal **Product** phrase **acne patches**.

Use Spytrend read-only. This is step 1 of 4. Do not produce the customer report yet.

Accept Search type only as Literal phrase, Product, Brand, Slogan or Offer; one supported ISO-2 country; and window 7, 14, 30 or 90 completed UTC days. Country is given as `Name / code`: use only the ISO-2 code after `/` in calls and only the country name before `/` in the answer. Trim whitespace only at the phrase edges. Require 2-80 characters. Preserve spelling, punctuation, case and language. Do not translate, correct, add synonyms or generate variants.

Set `date_to` to the last completed UTC date and calculate inclusive `date_from` for exactly the selected number of dates. Run exactly one `search_ads(source="meta", query=<literal phrase>, country=<ISO-2>, search_in="text", date_from=<date>, date_to=<date>, status_today="active", sort_by="most_reused_creative", sort_order="desc", dedupe=true, limit=10)` call. Retry once only for a retryable busy/timeout response and only after its returned wait interval. Do not retry invalid input or completed zero. Do not paginate or broaden.

Require query, country, text scope, launch dates, active status, reuse sort and deduplication to be applied without semantic substitution or ignored filters. Otherwise preserve a terminal `Unavailable` state for Step 4. A returned inactive row does not invalidate an otherwise successfully applied active-status route: mark only that row `ineligible - inactive` and continue with the remaining rows.

Treat the query as candidate discovery. Mark an eligible active row `visible exact` only when the complete phrase occurs contiguously and case-insensitively in returned title or body. Mark it `needs opening` when body text is explicitly omitted. Mark a returned inactive row `ineligible - inactive`. A partial-token or separate-word match is not exact. Deduplicate by ad ID and preserve server order.

Retain for the next step: validated inputs and calculated dates; route status; total rows; the ordered candidate IDs; `is_multilang` for every row; visible title/body or explicit omission marker; visible exact-match state; advertiser ID and name when returned; active status; launch and last-seen dates; format; CTA; landing URL/domain; creative ID; selection reuse; lifetime reuse; stable evidence URL when returned. Do not discard a candidate merely because an optional field is missing.

Reply only with a compact Step 1 checkpoint: route status, date window, row count and ordered candidate IDs with `visible exact`, `needs opening`, `not exact` or `ineligible - inactive`. Do not expose tokens or quotas. End with `Ready for Step 2.`
Open and verify

Open eligible candidates in server order until the verification cap is reached.

View promptHide prompt
Prompt 02
Cost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. If a search reports `pagination.total_status=restricted` (a free-plan archive window; `meta.plan_window_cutoff` names the boundary), tell the user the result covers only ads that started on or before that date, and never report a zero from it as "no such ads exist". Cost notices are not part of the final customer report.

Continue the retained **Product** search for **acne patches** in **United States / US**. This is step 2 of 4. Do not rerun discovery and do not produce the customer report yet.

If Step 1 preserved terminal `Unavailable` or completed zero, make no calls, preserve that state and reply with a compact checkpoint ending `Ready for Step 3.`

Otherwise open retained eligible active candidates sequentially in server order with `get_ad(id=<ad ID>)` until five ads verify or six candidates have been opened, whichever comes first. Skip rows marked `ineligible - inactive` or `is_multilang=true` without counting them toward the six-opening cap. Never substitute an ad outside that page. Retry each required detail call once only for a retryable busy/timeout response and only after its returned wait interval.

Retain an opened ad only when it is factually active and the complete phrase occurs contiguously and case-insensitively in opened title/body. For Literal phrase, exact occurrence is sufficient. For Product, the phrase must identify the product or product class. For Brand, it must identify a brand or branded product. For Slogan, it must function as a slogan or tagline rather than ordinary prose. For Offer, it must state the offer. Reject a literal match with the wrong role.

For every opened candidate retain: ad ID; pass/reject reason; advertiser ID and explicit name when returned; an 80-160 character context excerpt around the match; explicit offer; factual active status; launch and last-seen dates; format; CTA; exact landing URL/domain; creative ID; selection reuse; lifetime reuse; stable evidence URL. Preserve unavailable fields as unavailable. Preserve selection and lifetime reuse separately only when both are internally consistent. If selection reuse exceeds lifetime reuse or either scope is unclear, retain `Reuse comparison unavailable` plus the coverage inconsistency.

Reply only with a compact Step 2 checkpoint: number opened, verified IDs, rejected IDs with brief reasons, and whether the five-result or six-opening stop was reached. Do not expose tokens or quotas. End with `Ready for Step 3.`
Resolve identity and groups

Resolve missing advertiser names and group only exact creative or exact-text matches.

View promptHide prompt
Prompt 03
Cost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. If a search reports `pagination.total_status=restricted` (a free-plan archive window; `meta.plan_window_cutoff` names the boundary), tell the user the result covers only ads that started on or before that date, and never report a zero from it as "no such ads exist". Cost notices are not part of the final customer report.

Continue the retained **Product** search for **acne patches** in **United States / US**. This is step 3 of 4. Do not rerun discovery or reopen ads. Do not produce the customer report yet.

For each distinct advertiser ID among retained verified ads, use the advertiser or page name returned with the opened ad, including a returned page or webmaster name, and call `get_advertiser(id=<exact advertiser_id>)` only when the opened ad returns no such name. Retry a required identity call once only for a retryable busy/timeout response and only after its returned wait interval. A failed identity lookup does not remove the verified ad; retain `Name unavailable`.

Group duplicate creative IDs. When creative ID is unavailable, group only rows with the same explicit advertiser identity, identical normalized full opened body and identical landing route. Do not merge merely similar copy, different routes or different advertisers. Retain the number of observed ads and all evidence IDs for each exact group (internal only). Do not infer an offer family.

Retain for Step 4 every verified result/group with advertiser name, context excerpt, observed ad count, offer, active status, launch and last-seen dates, format, CTA, exact landing route, reuse comparison or its explicit unavailability, creative ID when available, and stable evidence URLs. Also retain the Step 1 route status and dates, total discovered rows, number opened, and any required verification gap.

Reply only with a compact Step 3 checkpoint: resolved advertiser names, final group count, observed-ad count per group and any unresolved required evidence. Do not expose raw advertiser IDs, tokens or quotas. End with `Ready for Step 4.`
Present the report

Return verified phrase evidence, ad context, landing routes and coverage limits.

View promptHide prompt
Prompt 04
Using only retained evidence from Steps 1-3, write the final customer report for the **Product** phrase **acne patches** in **United States / US**. Make no new calls.

Use no table and stay under 300 words. Start with `# Active Meta Ads Containing "acne patches": <country name>`, then `**[N] verified ads · [M] advertisers · [Complete/Partial/Unavailable]**`. `N` is the number of verified observed ads before exact grouping, not the displayed group count.

Add `## Verified ads`. For each exact result/group show advertiser, concise context proving both the exact phrase and requested Search type role, observed-ad count when grouped, offer, factual active status and launch date, format, CTA, landing route, selection/lifetime reuse or `Reuse comparison unavailable`, and the stable spytrend.com evidence URL when returned (never a raw ad ID).

Add at most three `## Research coverage` bullets stating the launch window, bounded ten-row candidate sample, how many candidates were opened, exact-phrase verification and any material gap.

A completed discovery with successful required verification is `Complete`, including when optional creative ID, last-seen date, offer wording, advertiser name or reuse fields are unavailable. Completed discovery with no verified row is `Complete` zero; say none was verified in the bounded sample, not that no ad exists. A terminal discovery failure is `Unavailable`. Use `Partial` only when required phrase, active-status or landing evidence was lost for an otherwise retainable opened ad, and name the gap.

Do not expose service/tool names, calls, parameters, quotas, tokens, timing, retries, raw advertiser or ad IDs or rejected rows. Literal phrase reports textual occurrence without assigning a semantic role. Do not infer affiliation, authorization, infringement, counterfeit status, spend, clicks, conversions, revenue, performance, profitability or complete market coverage.

End exactly:

`Ad text, destination and creative-reuse data are observed research signals. They do not prove affiliation, authorization, spend, conversions, revenue or advertising performance.`
Use the complete workflow in one promptAll research stages and evidence rulesView promptHide prompt
Complete workflow
Cost guard: before each paid Spytrend call, run the free `estimate_cost` with the same tool and arguments, estimate the cost and stay within the user's stated budget; if the user has not stated a budget, tell them the estimate before the first paid call. If pricing consent is required, show the returned terms and stop until the customer explicitly agrees; never accept on the customer's behalf. If a required call does not fit the stated budget, make no paid call and return `Budget limit prevents required research`; omit an optional call that does not fit and disclose reduced coverage. When opening ads with `get_ad`, skip multilang ads (`is_multilang`) and never call `get_media` after `get_ad`. Retry once only when `retryable=true`, after `retry_after_seconds`. Read `params.ignored` after every search; an ignored required filter never counts as applied. If a search reports `pagination.total_status=restricted` (a free-plan archive window; `meta.plan_window_cutoff` names the boundary), tell the user the result covers only ads that started on or before that date, and never report a zero from it as "no such ads exist". Cost notices are not part of the final customer report.
Find active Meta ads launched in the last **30 completed UTC days** in **United States / US** whose returned ad text contains the literal **Product** phrase **acne patches**.

Use Spytrend read-only. Execute all stages in one turn and return only the final customer report.

## Validate

1. Accept Search type only as Literal phrase, Product, Brand, Slogan or Offer; one supported ISO-2 country; and window 7, 14, 30 or 90 completed UTC days. Country is given as `Name / code`: use only the ISO-2 code after `/` in calls and only the country name before `/` in the answer.
2. Trim whitespace only at the phrase edges. Require 2–80 characters. Preserve spelling, punctuation, case and language. Do not translate, correct, tokenize into alternatives, add synonyms or generate variants.
3. Set `date_to` to the last completed UTC date and calculate inclusive `date_from` for exactly the selected number of dates. The window means Facebook launch date; results are ads launched in that window and active now.

## Discover

4. Run exactly one `search_ads(source="meta", query=<literal phrase>, country=<ISO-2>, search_in="text", date_from=<date>, date_to=<date>, status_today="active", sort_by="most_reused_creative", sort_order="desc", dedupe=true, limit=10)` call. Do not paginate or broaden.
5. Retry once only for a retryable busy/timeout response and only after its returned wait interval. Do not retry invalid input or completed zero.
6. Require query, country, text scope, launch dates, active status, reuse sort and deduplication to be applied without semantic substitution or ignored filters. Otherwise return `Unavailable`. A returned inactive row does not invalidate an otherwise successfully applied active-status route: mark only that row ineligible and continue with the remaining rows.
7. Treat server query as candidate discovery. A row is immediately exact only when the complete literal phrase occurs contiguously and case-insensitively in returned title or body. Separate-word or partial-token matches fail. When body text is explicitly omitted, keep an eligible active row as `needs opening`; absence from the returned title alone is not rejection. Deduplicate by ad ID and preserve server order.

## Verify

8. Open eligible active candidates sequentially in server order with `get_ad(id=<ad ID>)` until five ads verify or six candidates have been opened, whichever comes first. Skip any row returned as inactive or with `is_multilang=true` without counting it toward the six-opening cap. Never substitute an ad outside the page.
9. Retain only when the opened ad is factually active and the complete phrase occurs contiguously and case-insensitively in opened title/body. For Literal phrase, that exact textual occurrence is sufficient. For every other Search type, verify its role using explicit surrounding text: Product must identify the product/product class; Brand must identify a brand or branded product; Slogan must function as a slogan/tagline rather than ordinary prose; Offer must state the offer. A literal match with the wrong role is rejected. Preserve a concise 80–160 character context excerpt around the match, explicit offer, launch and last-seen dates, format, CTA, exact landing URL/domain and creative ID. Preserve selection reuse and lifetime reuse separately only when both are available and internally consistent. If selection reuse exceeds lifetime reuse or either scope is unclear, show `Reuse comparison unavailable` and name the inconsistency in coverage; do not repair or reinterpret counts.
10. For each distinct verified advertiser_id, use the advertiser or page name returned with the opened ad, including a returned page or webmaster name, and call `get_advertiser(id=<exact advertiser_id>)` only when the opened ad returns no such name. A failed identity lookup does not remove the verified ad; report `Name unavailable`.
11. Group exact duplicate creative IDs. When creative ID is unavailable, group only rows with the same explicit advertiser identity, identical normalized opened body and identical landing route; report the number of observed ads in that exact-text group. Do not merge merely similar copy, different routes or different advertisers, and do not infer an offer family.

## Answer

12. Use no table and stay under 300 words. Start with `# Active Meta Ads Containing “acne patches”: <country name>`, then `**[N] verified ads · [M] advertisers · [Complete/Partial/Unavailable]**`.
13. Add `## Verified ads`. For each result or exact-text group show advertiser, concise context excerpt proving both the exact phrase and requested Search type role, observed ad count when grouped, offer, active status and launch date, format, CTA, landing route, selection/lifetime reuse and the stable spytrend.com evidence URL when returned (never a raw ad ID).
14. Add at most three `## Research coverage` bullets stating the launch window, bounded ten-row candidate sample, how many candidates were opened, exact-phrase verification and any material gap.
15. A completed discovery with successful required verification is `Complete`, including when optional creative ID, last-seen date, offer wording, advertiser name or reuse fields are unavailable. Completed route with no verified row is `Complete` zero; say none was verified in the bounded sample, not that no ad exists. A terminal discovery failure is `Unavailable`. Use `Partial` only when required phrase, active-status or landing evidence was lost for an otherwise retainable opened ad, and name the gap.
16. Do not expose service/tool names, calls, parameters, quotas, tokens, timing, retries, raw internal advertiser or ad IDs or rejected rows.
17. Search type is a local qualification rule, not a server filter. Literal phrase reports textual occurrence without assigning a semantic role. Do not call an ordinary-prose match a slogan, an unrelated mention a brand use, or a descriptive sentence an offer. Do not infer affiliation, authorization, infringement, counterfeit status, spend, clicks, conversions, revenue, performance, profitability or complete market coverage.

End exactly:

`Ad text, destination and creative-reuse data are observed research signals. They do not prove affiliation, authorization, spend, conversions, revenue or advertising performance.`
Example output

Active US ads that mention “acne patches”.

A live run on 13 Oct 2026 searched for the product phrase “acne patches” in active US ads launched over the last 30 completed days. Eight candidates came back; five were opened and all five contained the exact phrase used for a patch product.

Evidence boundaryThree of the five ads come from one advertiser and differ only in the opening line, so they are listed separately rather than merged. One ad links through a short link that leads to an Amazon listing. Reuse counts are shown only where the data returned them.
Exact-phrase ad sampleExample run · 13 Oct 2026
AdvertiserAd text excerptAd details
01Natasha Pehrsoncreator page · amzlink.to short link to Amazon“These Amazon acne patches turn blemish care into something way more fun to wear.”Active · USImage carousel · Shop now · launched 8 Oct 2026Same creative in 5 ads of this search
02Helmet Headhelmet-head.com/products/anti-acne-sports-patch“Made for sweat, helmets, and riding. Helmet Head's anti-acne patches are formulated with gentle, skin-safe ingredients.”Active · USVideo · Shop now · launched 8 Oct 2026Same creative in 3 ads of this search
03Helmet Headhelmet-head.com/products/anti-acne-sports-patch“Made for any activity that requires a helmet! Helmet Head's anti-acne patches…”Active · USVideo · Shop now · launched 1 Oct 2026
04Helmet Headhelmet-head.com/products/anti-acne-sports-patch“Made for any sport that requires a helmet! Helmet Head's anti-acne patches…”Active · USVideo · Shop now · launched 1 Oct 2026
05Hypothesis.biohypothesis.bio/products/precision-microdart-blemish-patches“Ever wonder why many acne patches don't do anything for early-stage pimples? … Ours go beneath it.”Active · USSix-image carousel · Shop now · launched 8 Oct 2026Same creative in 4 ads over its lifetime
Example run: 1 phrase search, 8 candidates, 5 opened ads · 5 verified ads from 3 advertisers · Complete
Methodology

How literal Meta ad matches are verified.

Published by Spytrend from the controlled workflow contract updated 9 Oct 2026.

One exact query

The search preserves the phrase and uses no variants, synonyms or pagination.

01

Ordered openings

Eligible active rows are opened in server order under the opening cap; multi-language uploads are skipped.

02

Role verification

Non-literal search types must match the requested semantic role in explicit text.

03

Exact grouping

Only exact creative IDs or strict same-text, same-route, same-advertiser evidence may group.

04
FAQ

Before you run it.

Does the server query prove an exact phrase match?

No. Search produces candidates; opened ad text provides the exact verification.

Is phrase matching case-sensitive?

No. The complete phrase must be contiguous and matches case-insensitively.

Can a slogan match ordinary prose?

No. Slogan mode requires the phrase to function as a slogan or tagline.

Does a brand match prove affiliation?

No. The workflow reports observed text and does not infer authorization or affiliation.

Spytrend MCP

Verify an exact phrase in active Meta ads.

Connect Spytrend MCP, choose the controlled inputs and run the four prompts.