Ai Brand Insights
ai_brand_insightsFull Description
Brand market share trends between your owned and comparison sites
Parameters (1 required, 40 optional)
account_idintegerRequired. Single account ID to query data for. Must be within your API key's authorized scope.
aggregate_owned_brandsbooleanWhen true, aggregate all owned brand variations into a single "Your Brands" row.
FalsebrandstringFilter for a specific brand (case-insensitive). - sentiment_by_brand=true: Returns sentiment for that brand only. - Market share mode: Returns prompts/mentions for that brand only (use with prompt_breakdown). Example: "what about AJ Bell for core etfs" → brand="AJ Bell", prompt_breakdown=true.
brand_sentiment_trendbooleanWhen true, returns a democratic weekly sentiment score. HOW THE SCORE IS CALCULATED (4-level averaging): 1. Per brand per prompt: weighted score (positive=10, neutral=5, negative=1) 2. Per prompt: simple AVG of brand scores → equal vote per prompt 3. Per topic: simple AVG of prompt scores → equal vote per topic 4. Per week: simple AVG of topic scores → final score This is DIFFERENT from sentiment_by_brand which uses volume-weighted scoring. Use this when the user wants the TREND of overall sentiment health over time. USE brand_sentiment_trend=true when user asks: - "brand sentiment over time" - "how is my brand's sentiment trending?" - "show me sentiment score week by week" - "sentiment trend for my brand" - "how has sentiment changed over time?" - "is my brand sentiment improving or declining?" DO NOT use for: - "positive vs negative breakdown" → use sentiment_by_brand=true instead - "what is my market share?" → use default mode (sentiment_score is a side column) - "which brands have best sentiment?" → use default mode or sentiment_by_brand=true brand_sentiment_trend=true returns per week: - time_period_date: week start date - sentiment_score: 1-10 democratic weekly score - positive_count, neutral_count, negative_count: raw mention totals - total_sentiment_count: sum of all sentiment mentions Use latest_only=false to get multi-week trend (default for this mode). Use latest_only=true for current week only. Example: "Show me how my brand sentiment is trending" → brand_sentiment_trend=true, latest_only=false Example: "What is my brand sentiment score this week?" → brand_sentiment_trend=true, latest_only=true
collection_frequencystringFilter by collection cadence. Comma-separated for multiple. - DAILY: Daily collection - WEEKLY: Weekly collection
DAILYWEEKLYcollection_frequency_breakdownbooleanInclude collection frequency column and grouping when true.
competitors_onlybooleanWhen true, only return competitor brands.
Falseend_datestringEnd date of the time period (optional). Note - Results are automatically limited to the most recent 7 days ending on this date, regardless of start_date.
include_sentiment_sourcesbooleanDO NOT USE for basic sentiment questions like "show positive/negative counts". ONLY use when user explicitly asks about which SOURCES or DOMAINS gave positive/negative sentiment. For questions like: - "What's the sentiment breakdown?" → DON'T use (summary counts are enough) - "How many positive mentions?" → DON'T use (summary counts are enough) - "Which sources gave negative sentiment?" → USE this - "What domains have positive sentiment?" → USE this
Falseinclude_snippetsbooleanAdds text snippets/quotes to sentiment_sources array. REQUIREMENTS: Must use sentiment_by_brand=true AND include_sentiment_sources=true. Does NOT work with sentiment_by_source mode. Use when user asks for: quotes, examples, "what are people saying", actual text, WHY sentiment is positive/negative. CORRECT usage: sentiment_by_brand=true, include_sentiment_sources=true, include_snippets=true WRONG (snippets will be missing): sentiment_by_source=true, include_snippets=true WARNING: Makes response very large. Use sparingly.
FalseintentstringFilter by intent(s). Supports comma-separated values. Single: intent="Informational" Multiple: intent="Informational,Transactional"
intent_performancebooleanWhen true, returns brand coverage % per intent. TOOL DISAMBIGUATION — both ai_brand_insights and ai_citation_insights have this mode: - ai_brand_insights (THIS tool): measures BRAND MENTION coverage "What % of prompts per intent mention my brand?" - ai_citation_insights: measures WEBSITE CITATION coverage "What % of prompts per intent cite my website?" Route to THIS tool (ai_brand_insights) when user says: - "brand", "mentioned", "brand visibility", "brand mentions" - "intent performance for [brand name]" - "how often is my brand mentioned by intent" Route to ai_citation_insights when user says: - "website", "websites", "cited", "citation", "pages", "URL", "site" - "intent performance for [website name]" - "which intents cite my website" WHEN AMBIGUOUS (user says only "intent performance over time" with no website/brand signal): ASK: "Do you want intent performance by website citations (how often your site is cited) or by brand mentions (how often your brand name is mentioned)?" DO NOT use intent_share=true for these questions — even if the user says "by brand" or "break it down by brand" as a follow-up. Stay in intent_performance=true and use web_property_id to scope. intent_share=true is for the MARKET SHARE path — it adds intent as a dimension to brand market share, producing large inflated counts (sums per-brand mentions across all brands, not distinct prompts for your brand). intent_performance=true returns: - intent_name: the intent category - mentioned_count: distinct prompts where your brand was mentioned - total_collected_prompts: all prompts tracked for that intent (denominator) - brand_coverage_pct: mentioned_count / total_collected_prompts × 100 ALWAYS pair with owned_only=true to scope to the user's own brands. ALWAYS pair with latest_only=true unless user asks for trend over time. Example: "Show intent performance for my brand" → intent_performance=true, owned_only=true, latest_only=true
intent_sharebooleanInclude intent as a dimension in the MARKET SHARE output — adds intent_name, intent_total_mentions, and share_of_intent columns to the standard brand market share results. USE intent_share=true only when user wants: - market share broken down by intent (e.g., "which brands dominate the education intent?") - competitive share within a specific intent category DO NOT use for "intent performance" or "brand coverage by intent" questions — use intent_performance=true instead.
languagestringFilter by language(s). Supports comma-separated values. Single: language="English" Multiple: language="English,Spanish"
language_breakdownbooleanInclude language column and grouping when true.
latest_onlybooleanWhen true, only return results for the most recent time period.
FalselocalestringFilter by locale(s). Supports comma-separated values. Single: locale="US" Multiple: locale="US,UK,CA" OMIT entirely when user asks for "all locales" or does not specify one.
locale_breakdownbooleanInclude locale columns (country, description) and grouping when true.
owned_onlybooleanWhen true, only return your owned brands (excludes competitors from results). MUST set owned_only=true when user phrases include: - "which topics is MY brand mentioned for" - "show topics for iShares / BlackRock / [their brand]" - "where is my brand mentioned" - "my brand's topic coverage" - "topics where I appear" LEAVE as false (default) when user wants competitive context: - "how do I compare vs competitors per topic" - "who else appears in retirement investing" - "show all brands for each topic"
FalsepersonastringFilter by persona(s). Supports comma-separated values. Single: persona="Marketing Manager" Multiple: persona="Marketing Manager,SEO Specialist"
persona_breakdownbooleanAdds persona as a dimension to the MARKET SHARE pipeline. Use ONLY when the user wants to see brand market share split by persona (e.g. "which persona has the highest share of brand mentions across all brands?"). CRITICAL: DO NOT use for coverage/performance questions. "persona performance", "brand coverage % by persona", "how often is my brand mentioned per persona" → those all require persona_performance=true, NOT this parameter. Key difference: - persona_breakdown=true → market_share_percent (your brand's share of ALL mentions for that persona) - persona_performance=true → brand_coverage_pct (% of prompts for that persona that mention your brand) The denominator is completely different: - persona_breakdown: total_mentioned_count = all brand mentions across all brands - persona_performance: total_collected_prompts = all prompts tracked for that persona Phrase triggers that mean persona_breakdown (market share), NOT persona_performance: - "market share by persona" - "which persona drives the most brand mentions overall" - "competitive brand share per persona"
persona_performancebooleanWhen true, returns brand coverage % per persona. TOOL DISAMBIGUATION — both ai_brand_insights and ai_citation_insights have this mode: - ai_brand_insights (THIS tool): measures BRAND MENTION coverage "What % of prompts per persona mention my brand?" - ai_citation_insights: measures WEBSITE CITATION coverage "What % of prompts per persona cite my website?" Route to THIS tool (ai_brand_insights) when user says: - "brand", "mentioned", "brand visibility", "brand mentions" - "persona performance for [brand name]" - "how often is my brand mentioned by persona" Route to ai_citation_insights when user says: - "website", "websites", "cited", "citation", "pages", "URL", "site" - "persona performance for [website name]" - "which personas cite my website" WHEN AMBIGUOUS (user says only "persona performance over time" with no website/brand signal): ASK: "Do you want persona performance by website citations (how often your site is cited) or by brand mentions (how often your brand name is mentioned)?" DO NOT use persona_breakdown=true for these questions — even if the user says "by brand" or "break it down by brand" in a follow-up. If the conversation is already about persona performance / coverage %, stay in persona_performance=true mode and use web_property_id to scope to specific brands. persona_breakdown=true is for the MARKET SHARE path — it adds persona as a dimension to brand market share, producing inflated counts (sums per-brand mentions, not distinct prompts for your brand). persona_performance=true returns: - persona_name: the audience persona - mentioned_count: distinct prompts where your brand was mentioned - total_collected_prompts: all prompts tracked for that persona (denominator) - brand_coverage_pct: mentioned_count / total_collected_prompts × 100 ALWAYS pair with owned_only=true to scope to the user's own brands. ALWAYS pair with latest_only=true unless user asks for trend over time. Example: "Show persona performance for my brand" → persona_performance=true, owned_only=true, latest_only=true
promptstringFilter by tracked prompt text. MUST use exact parameter name "prompt". Example: prompt="best seo tools"
prompt_breakdownbooleanInclude prompt column and grouping when true.
prompt_statusstringFilter by prompt/query status. Comma-separated for multiple. - "ACTIVE": Only active prompts (default) - "INACTIVE": Only inactive prompts - "ACTIVE,INACTIVE": Both (matches UI default)
ACTIVEprompt_typestringFilter by prompt type (branded vs unbranded prompts). - "branded": Shows only prompts that include a brand name - "unbranded": Shows only generic/non-branded prompts - Omit parameter to show all prompts
brandedunbrandedsearch_enginestringFilter by AI search engine(s). Supports comma-separated values for multiple engines. Values: "gemini", "chatgpt", "perplexity", "google aio", "google ai mode", etc. Single: search_engine="perplexity" Multiple: search_engine="perplexity,gemini,google aio" OMIT entirely (do not pass this parameter) when user asks for "all search engines" or does not specify one. DO NOT make separate calls per search engine — one call with no filter covers all engines.
search_engine_breakdownbooleanInclude search engine name column and grouping when true.
sentiment_by_brandbooleanUSE THIS when the user wants a sentiment BREAKDOWN — positive vs negative counts, score per brand, or sentiment filtered to specific categories. This is the "what IS my sentiment?" mode. KEY SIGNALS to use this mode: - Words: "positive", "negative", "breakdown", "how positive", "what % is positive" - "what is my brand sentiment?" (snapshot, not trend) → sentiment_by_brand - "sentiment for [specific brand]" → sentiment_by_brand - "quotes", "what are people saying" → sentiment_by_brand + include_sentiment_sources + include_snippets - NOTE: sentiment_categories is just a filter — "Ethics sentiment" alone does NOT signal this mode. Use trend keywords (over time, trending) vs breakdown keywords (positive, negative, score) to decide. DO NOT use when user says "over time", "trending", "improving", "week by week" → use brand_sentiment_trend instead. DO NOT use when primary question is market share/rankings → default mode already includes sentiment score. Returns per-BRAND: - brand_sentiment_score (1-10) - positive_count, neutral_count, negative_count, total_sentiment_count - positive_pct, neutral_pct, negative_pct - sentiment_sources array (when include_sentiment_sources=true) with optional snippets Examples: - "What's the sentiment for BlackRock?" → sentiment_by_brand=true - "How many positive mentions does each brand have?" → sentiment_by_brand=true - "What is my Ethics sentiment?" → sentiment_by_brand=true, sentiment_categories="ethics" - "How is my Ethics sentiment trending over time?" → brand_sentiment_trend=true, sentiment_categories="ethics", latest_only=false - "What are people saying about my brand?" → sentiment_by_brand=true, include_sentiment_sources=true, include_snippets=true - "Show me actual quotes" → sentiment_by_brand=true, include_sentiment_sources=true, include_snippets=true
Falsesentiment_by_sourcebooleanUSE THIS when user asks about SOURCES, DOMAINS, or WHERE sentiment comes from. DO NOT use sentiment_by_brand for source questions - they are DIFFERENT modes. NOTE: This mode does NOT support snippets/quotes. For quotes, use sentiment_by_brand mode instead. Returns per-SOURCE (domain) breakdown like g2.com, reddit.com, forbes.com: - source: domain name (e.g., "g2.com", "reddit.com") - positive_count, neutral_count, negative_count, total_count - pct_of_positive: what % of ALL positive statements came from this source (pre-computed, use directly) - pct_of_negative: what % of ALL negative statements came from this source (pre-computed, use directly) IMPORTANT: Use pct_of_positive and pct_of_negative directly from the response — do NOT recompute percentages from raw counts. positive_count/total_count is a different metric (within-source rate). MUST USE for these questions: - "sources of my sentiments" → sentiment_by_source=true - "which sources have negative sentiment?" → sentiment_by_source=true - "what domains give positive sentiment?" → sentiment_by_source=true - "where is sentiment coming from?" → sentiment_by_source=true - "top sources with positive/negative sentiment" → sentiment_by_source=true
Falsesentiment_categoriesstringFilter by sentiment category/categories. Supports comma-separated values for multiple categories. Categories are DYNAMIC and vary by account - use sentiment_categories_only=true to discover them. Single: sentiment_categories="quality" Multiple: sentiment_categories="experience,health,popularity,price" Default (empty) includes all available categories for the account.
sentiment_categories_onlybooleanDiscovery mode - returns ONLY a list of available sentiment categories for this account. Use this FIRST to discover what sentiment categories exist, then use sentiment_categories parameter to filter. Returns simple array: [{"sentiment_category": "quality"}, {"sentiment_category": "price"}, ...] IMPORTANT: Cannot be combined with other mode switches or filters. When true, ignores all other parameters except account_id. Workflow: 1. Call with sentiment_categories_only=true -> get [{sentiment_category: "ethics"}, ...] 2. Call again with sentiment_categories="ethics, experience" -> filtered results
Falsesource_levelstringControls the granularity of source grouping in sentiment_sources array: - "domain" (default): Groups by root domain (e.g., "conductor.com") - matches UI behavior - "subdomain": Groups by subdomain (e.g., "www.conductor.com", "blog.conductor.com") - "url": Full URL detail (e.g., "https://www.conductor.com/blog/seo-guide") OMIT this parameter unless the user explicitly asks for subdomain or URL level detail. Default (domain) is always used when omitted — do NOT pass source_level="domain" explicitly.
domainsubdomainurldomainstart_datestringStart date of the time period (optional, ignored - calculated as end_date minus 6 days)
top_nintegerControls how many brands are returned per time period in market share mode. Defaults to 10. Use a higher value (e.g. top_n=25 or top_n=100) when the user asks for "top 25 brands", "show all brands", or "top 100". Not applicable to sentiment_by_brand or sentiment_by_source modes.
10top_sourcesintegerLimits sentiment_sources array to top N sources by mention count. Only relevant when include_sentiment_sources=true.
10topicstringFilter by topic(s). Supports comma-separated values for multiple topics. Single: topic="SEO Tools" Multiple: topic="SEO Tools,ai content optimization"
topic_breakdownbooleanInclude topic name column and grouping when true. When topic_breakdown=true, the response includes two share metrics: - share_of_topic: Brand's share WITHIN that specific topic (e.g., 57% of "Retirement Investing" mentions). THIS is the primary metric to present to users when they ask about topics. - market_share_percent: Brand's share of ALL mentions across ALL topics (global view). This is a secondary/context metric - do NOT present it as "topic market share". RULE: When the user asks "which topics is MY brand mentioned for" or "show my brand's topic coverage": - Always add owned_only=true to show only their brands per topic. - Present share_of_topic as the headline metric, not market_share_percent. RULE: When the user asks for competitive comparison within topics (e.g., "how do I compare vs competitors per topic"): - Omit owned_only (default false) to show all brands per topic. - Still present share_of_topic as the primary metric.
topic_statusstringFilter by topic/campaign status. Comma-separated for multiple. - "ACTIVE": Only active topics (default) - "INACTIVE": Only inactive topics - "ACTIVE,INACTIVE": Both (matches UI default)
ACTIVEtracked_brands_onlybooleanMUST use exact parameter name "tracked_brands_only". - true (default): Shows all brands (excludes products) - matches UI behavior - false: Shows ALL mentions including products Example: tracked_brands_only=true
Trueweb_property_idstringOptional. Comma-separated WPG IDs to scope brand attribution. If the user asks about multiple web properties, pass ALL their IDs together as a single comma-separated value in ONE call — e.g. "147878,147877". NEVER make separate calls per WPG and combine the results.