test_ads
Test ad creatives in Ads Labo, as on the web: a panel scrolls past the ad in the feed you choose (Facebook feed, Instagram feed, Reels or Stories) and says whether it would click, stop scrolling and remember the brand. One creative returns its predicted click-through rate with a 95% interval, stop-scroll and brand-recall rates, sentiment and breakdowns by age, gender, income and interest. Two to four return a verdict (ship one, tied, or neither), each version's share of the panel's picks and a head-to-head of the top two. You get the totals, without individual answers. Predicted rates are a panel's reading, set against the typical click rate for the placement and industry; read them as a comparison, not a forecast of a live campaign.
Every plan tests up to 4 creatives on a panel of 100, 200 (the default), 400 or 1,000, the sizes the web offers; priced per respondent, however many creatives.
Pass each creative as a public https link straight to the file (PNG/JPG/WEBP/GIF up to 10 MB, MP4/MOV/WebM/AVI/MKV/M4V up to 100 MB) that opens without signing in, not a page that shows it. Put the ad copy (brand, headline, post text, button) in campaign; the panel reads it with the creative.
RECOMMENDED FLOW: if the user didn't pick an audience, call list_demographic_presets and propose one or two; call preview_cost for the price; confirm with the user; then run. Studies are charged to the account's wallet at the same per-respondent rate as on the web. Price it with preview_cost(mode='ad_lab', population_size).
Takes a few minutes; the tool waits up to ~15 minutes and reports progress. On error='timeout' with a sim_id the study keeps running: collect it with get_simulation, do not re-run.
Returns: { id, status, mode='ad_lab', topic, demographic_preset, population_size, run_type, and for one creative: metrics {predicted_ctr, ctr_ci_low, ctr_ci_high, stop_scroll_pct, brand_recall_pct, sentiment_*_pct, mean_conviction, predicted_cvr}, creative {summary, core_message, emotional_tone, hook_strength}, context_benchmark {typical_ctr_pct, placement, vertical}; for 2-4: verdict {call, winner, headline}, variants [ {key, label, share_pct, pull_index} ], head_to_head; both: counts, cohorts, billing }.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| media | Yes | The creatives, in order (Variant A is the first): 1 to predict its performance, 2-4 to find which one the panel would click. | |
| campaign | No | The ad around the creative. Every field is optional; an ad with no copy is tested on the creative alone. | |
| language | No | Language the respondents answer in. Default: en. | en |
| include_cvr | No | Also predict how many who click would complete the objective (predicted_cvr). | |
| custom_audience | No | Optional filter narrowing the panel INSIDE the market preset. Keys (all optional): countries, regions, cities (each market's own vocabulary), age_min / age_max, genders ('all' | 'men' | 'women' | 'non_binary'), interests / interest_exclusions (taxonomy tags), income_min_tier / income_max_tier (affluence ladder 0-7, 7 = top), income_currency + income_min_amount / income_max_amount (REAL annual household amounts in a named ISO currency — currency is required with amounts; e.g. {'income_currency': 'USD', 'income_min_amount': 100000}), income_match ('position' = the equivalent affluence standing within each market's own income ladder, the default; 'absolute' = actual earnings at indicative FX), ethnicities / religions (multi-ethnic markets only). Preview a custom_audience with the free estimate_reach tool before paying for a run — it reports the audience size and which constraint cuts hardest. A 'small' audience is not a blocker: the panel is still delivered at the population_size you ask for, with every respondent matching the filter, and its age and gender mix follows the market's profile within the filter's age, gender, place, income and heritage terms (interest tags pick who within each group, not how many of each). Results carry panel_check (the panel's age, gender and region mix against that profile) and, for an uncommon audience, audience_note. Guide: https://crowdos.ai/mcp. | |
| population_size | No | Respondents: 100, 200 (the default), 400 or 1,000, the panels the web offers. | |
| demographic_preset | No | The market the panel is drawn from. Use list_demographic_presets to see all options. Default: us_general_population. | us_general_population |