estimate_reach
Preview how broad an audience a custom_audience filter describes — FREE: no model calls, no wallet debit, returns in under a second. Call it before a run that uses custom_audience to check the spec is valid and to see how tight the cut is.
A small audience is NOT a blocked one. Every panel is delivered at the population_size you request, with every respondent satisfying your filter. So never refuse or abandon a run because this returns audience_size 'small' — run it, and tell the user the audience is narrow. The band tells you how much natural variety sits behind the panel: a small audience's results carry an audience_note (incidence 'low', or 'very_low' for the rarest) saying they reflect a narrower range of perspectives, which is a reason to suggest widening the filter, not to stop.
Returns: { audience_size ('small' | 'medium' | 'large'), narrowed_by (the single filter cutting hardest — age, gender, geo, income, ethnicity, religion, interests or exclusions; null if nothing is narrowing it), narrowing_filters (every narrowing filter, strongest first; narrowed_by is its first entry), preset_key, and — with include_by_dimension=true — by_dimension as percentage shares }.
Note on interests: respondents each carry a handful of tags from a ~200-topic taxonomy, so ANY single tag describes only a small slice of a market. Pass several related tags (they are OR-matched) when you want a broader cut — e.g. 'Stock Trading' plus 'Day Trading' and 'Personal Investing' rather than 'Stock Trading' alone.
The market is preset_key; demographic_preset, the name the run tools use, is accepted too (both at once must name the same market).
An impossible spec (unknown country, gender, heritage value, currency code or income_match; an interest that is not a taxonomy tag; a city or region the market does not have; an unknown market; a heritage cut on a market without that axis; an income range no band on the market's ladder falls inside) returns audience_size=null plus spec_errors (human strings) and spec_error_details [{code, field, values, allowed, message}] — the same stable codes a run would reject with (422, before any charge) — so fix the spec here, for free.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| targeting | Yes | 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. | |
| preset_key | No | Market preset to sample. Use list_demographic_presets for the roster. Default: us_general_population. | |
| sample_size | No | How much evidence the size band rests on. Default 500. Snapped up to the nearest of 100/250/500/1000/2500/5000/10000. An input only — it is not echoed in the response. | |
| demographic_preset | No | The same market under the name the run tools use. Send this or preset_key; if both are sent they must name the same market. | |
| include_by_dimension | No | Also return the matched sample's composition by age band / gender / region / income. |