Documentation

Brand Mentality MCP Server - Client Documentation

The Brand Mentality MCP Server enables the intersection of real-time data listening and brand perception. The server provides Model Context Protocol (MCP) tools that allow clients to add these capabilities in conjunction with their existing data stack, enabling AI assistants and applications to access comprehensive brand profiles, discover cultural trends, and gather real-time insights from news articles and social media posts.

Key Capabilities

  • Brand Intelligence: Access detailed brand profiles including values, mission, vision, and brand positioning
  • Cultural Trend Analysis: Discover macro cultural trends and patterns by aggregating news moments and social media narratives
  • Real-Time News Insights: Find clustered news moments (day-to-day events) and search individual news articles
  • Social Media Intelligence: Track social media narratives (day-to-day conversations) and analyze individual posts
  • TikTok Trend Discovery: Get trending TikTok hashtags filtered by category, date range, country, and optional search terms
  • YouTube Intelligence: Search YouTube videos and channels from a curated dataset with filtering by language, country, categories, and engagement metrics
  • Audience Targeting: Generate platform-specific audience targeting segments for ad campaigns across multiple platforms

Data Hierarchy

The server organizes data in a hierarchical structure:

  • Individual Level: Articles and social media posts provide detailed, granular content
  • Cluster Level: Moments (news clusters) and Narratives (social media clusters) group related content
  • Trend Level: Trends aggregate moments and narratives to reveal long-term cultural patterns

     Social Posts ──► Narratives ──┐
                                   │
                                   ├──► Trends
                                   │
      Articles ──► Moments ────────┘

Hierarchy:

  • Social Posts → Clustered into Narratives (day-to-day conversations)
  • Articles → Clustered into Moments (day-to-day news events)
  • Narratives + Moments → Aggregated into Trends (long-term cultural patterns)

Connection

Protocol: Model Context Protocol (MCP) over HTTP Port: 8080 (default) Authentication: Authorization: Bearer <ACCESS_TOKEN>

All requests require the authentication token in the Authorization header.

Optional Headers:

  • X-Include-Image-URLs (case-insensitive true): adds an image_url field to each result item returned by get_news_articles, get_youtube_videos, get_youtube_channels, get_news_moments, and get_trends. When the header is absent, image_url is omitted to keep responses lean. Set it only if your client renders images.

Credentials: The MCP server URL and Access token will be provided by Sightly.

Note: The authorization method may change in future versions.

Array Parameters

Every parameter documented as an array below also accepts a string, for clients that cannot send real JSON arrays:

  • A JSON-encoded array, such as "[\"Nike\", \"Adidas\"]", is parsed into the equivalent array.
  • Any other string, such as "Nike", is treated as a single-element array.

Sending a real array is still preferred. The documented maximum item counts apply either way, and values are never split on commas, so "Nike, Adidas" is one value rather than two.

get_brand_profile1 params - 1 example

Get brand information, values, mission, and related entities.

Note: Brand profiles must be created in Brand Mentality before they can be retrieved via this tool.

Parameters:

  • brand_name (string, required): Brand name

Example:

{
  "tool": "get_brand_profile",
  "arguments": {
    "brand_name": "Nike"
  }
}

get_news_moments8 params - 3 examples

Find clustered news articles about topics (day-to-day events).

Parameters:

  • search_terms (array, 0-3 terms, optional): Search terms. If not provided, returns top moments sorted by article count (biggest story clusters first). When provided, do NOT also send sort_by — the two parameters are mutually exclusive
  • start_date (string, optional): UTC ISO datetime YYYY-MM-DDTHH:MM:SS, earliest 2026-01-01T00:00:00. Supports hour/minute precision — for a whole-day search use T00:00:00
  • end_date (string, optional): UTC ISO datetime YYYY-MM-DDTHH:MM:SS, earliest 2026-01-01T00:00:00. For a whole-day search use T23:59:59
  • category (array, optional): Filter by content categories (max 5)
  • entity (array, optional): Filter by entity names (max 5)
  • sort_by (string, optional): Mutually exclusive with search_terms — sending both returns an error. Omit this parameter whenever search_terms is provided (results are then ranked by relevance automatically). Only set when no search terms are given. Values: "size" (default) = article count (biggest story clusters first); "recency" = most recent moments first. Use "recency" only when the user explicitly requests chronological ordering
  • limit (int, optional): Results per search term (default: 8, max: 20)
  • include_total_statistics (bool, optional, default true): Include the aggregate_stats block of population statistics. Set false for sample records only, which is significantly faster. See Aggregate Statistics

Example with search terms:

{
  "tool": "get_news_moments",
  "arguments": {
    "search_terms": ["climate change"],
    "start_date": "2024-01-01T00:00:00",
    "end_date": "2024-01-31T23:59:59",
    "category": ["environment"],
    "limit": 10
  }
}

Example narrowing to a specific hour band:

{
  "tool": "get_news_moments",
  "arguments": {
    "search_terms": ["breaking news"],
    "start_date": "2026-05-13T08:00:00",
    "end_date": "2026-05-13T10:00:00",
    "limit": 10
  }
}

Example without search terms (browse top moments):

{
  "tool": "get_news_moments",
  "arguments": {
    "start_date": "2024-01-01T00:00:00",
    "end_date": "2024-01-31T23:59:59",
    "limit": 10
  }
}

get_social_media_narratives13 params - 2 examples

Find clustered social media posts about topics (day-to-day conversations).

Parameters:

  • search_terms (array, 0-3 terms, optional): Search terms. If not provided, returns top narratives sorted by post count (most discussed first). When provided, do NOT also send sort_by — the two parameters are mutually exclusive
  • start_date (string, optional): YYYY-MM-DD format, earliest 2026-01-01
  • end_date (string, optional): YYYY-MM-DD format, earliest 2026-01-01
  • sentiment (string, optional): Filter by sentiment: very_positive, positive, neutral, negative, very_negative
  • platform (array, optional): Filter by platforms (max 5): X, Reddit, Truth Social, Pinterest, Instagram, Bluesky, TikTok, Threads
  • theme (array, optional): Filter by themes (max 5): discounts, purchase, appearance, churn, cost, ads, experience, craftmanship, transaction, criminal, loyalty, stock, taste, temperature, ambiance, delivery, fit, injury, knowledge, leadership, comfort, access, illness, location, restrooms, speed, satisfaction, wait times, cleanliness, durability, friendliness, selection
  • entity (array, optional): Filter to narratives about a specific named person, brand, organization, product, event, or place (max 5) — e.g. ["Messi", "Nike"]. Case-insensitive substring; multiple values OR'd. Covers the ~two-thirds of narratives where an entity was detected. For broad topics/moods, use search_terms instead.
  • min_likes (int, optional): Only return narratives whose posts have at least this many likes in total (cluster-level engagement floor, must be ≥ 0). Narratives with no like total are excluded.
  • min_comments (int, optional): Only return narratives whose posts have at least this many comments in total (cluster-level engagement floor, must be ≥ 0). Narratives with no comment total are excluded.
  • min_shares (int, optional): Only return narratives whose posts have at least this many shares/reposts in total (cluster-level engagement floor, must be ≥ 0). Coverage is partial (present on roughly a quarter of narratives), so this can sharply narrow results — prefer min_likes/min_comments for general engagement filtering.
  • sort_by (string, optional): Mutually exclusive with search_terms — sending both returns an error. Omit this parameter whenever search_terms is provided (results are then ranked by relevance automatically). Only set when no search terms are given. Values: "size" (default) = post count (most discussed first); "recency" = most recent narratives first. Use "recency" only when the user explicitly requests chronological ordering
  • limit (int, optional): Results per search term (default: 8, max: 20)
  • include_total_statistics (bool, optional, default true): Include the aggregate_stats block of population statistics. Set false for sample records only, which is significantly faster. See Aggregate Statistics

Each returned narrative includes a sentiment_score — the cluster's overall sentiment on a -100 (most negative) to 100 (most positive) scale (omitted when unavailable). The sentiment filter buckets this score: very_negative (< -75), negative (< -25), neutral (-25…25), positive (> 25), very_positive (> 75). Each narrative also includes cluster-level engagement totals total_likes, total_comments, and total_shares (omitted when unavailable).

Example with search terms:

{
  "tool": "get_social_media_narratives",
  "arguments": {
    "search_terms": ["AI"],
    "start_date": "2024-01-01",
    "end_date": "2024-01-31",
    "sentiment": "positive",
    "platform": ["X", "Reddit"]
  }
}

Example without search terms (browse top narratives):

{
  "tool": "get_social_media_narratives",
  "arguments": {
    "start_date": "2024-01-01",
    "end_date": "2024-01-31",
    "platform": ["X"],
    "limit": 10
  }
}

get_news_articles10 params - 3 examples

Search individual news articles (detailed content).

Parameters:

  • search_terms (array, 0-3 terms, optional): Keep complete concepts together (e.g., "renewable energy policy" not ["renewable", "energy"]). If not provided, returns most recent articles sorted by publish date
  • start_date (string, optional): UTC ISO datetime YYYY-MM-DDTHH:MM:SS, earliest 2026-01-01T00:00:00. Supports hour/minute precision — for a whole-day search use T00:00:00
  • end_date (string, optional): UTC ISO datetime YYYY-MM-DDTHH:MM:SS, earliest 2026-01-01T00:00:00. For a whole-day search use T23:59:59
  • publisher (string, optional): Filter by publisher name
  • category (array, optional): Filter by content categories (max 5)
  • entity (array, optional): Filter by entity names (max 5)
  • publisher_location (string, optional): Filter by country: United States, United Kingdom, Canada
  • limit (int, optional): Results per search term (default: 10, max: 50)
  • include_total_statistics (bool, optional, default true): Include the aggregate_stats block of population statistics. Set false for sample records only, which is significantly faster. See Aggregate Statistics
  • include_full_body (bool, optional, default false): Return each article's full body text. By default bodies are truncated to 2,000 characters (at a word boundary) to keep responses small. Set true only when you need to read complete articles

Example with search terms:

{
  "tool": "get_news_articles",
  "arguments": {
    "search_terms": ["renewable energy policy"],
    "publisher_location": "United States",
    "limit": 20
  }
}

Example narrowing to a specific hour band:

{
  "tool": "get_news_articles",
  "arguments": {
    "search_terms": ["product launch"],
    "start_date": "2026-05-13T08:00:00",
    "end_date": "2026-05-13T10:00:00",
    "limit": 20
  }
}

Example without search terms (browse recent articles):

{
  "tool": "get_news_articles",
  "arguments": {
    "publisher_location": "United States",
    "category": ["technology"],
    "limit": 20
  }
}

get_social_media_posts14 params - 5 examples

Search individual social media posts (detailed content).

Parameters:

  • search_terms (array, 0-3 terms, optional): Keep complete concepts together. If not provided, returns most recent posts sorted by publish date. Use for topics, themes, concepts, or moods — anything that is not a specific named person/brand/product/event/place (use entity for those). When unsure, favor search_terms. Pair with entity to find a topic about a named entity
  • start_date (string, optional): UTC ISO datetime YYYY-MM-DDTHH:MM:SS, earliest 2026-01-01T00:00:00. Supports hour/minute precision — for a whole-day search use T00:00:00
  • end_date (string, optional): UTC ISO datetime YYYY-MM-DDTHH:MM:SS, earliest 2026-01-01T00:00:00. For a whole-day search use T23:59:59
  • platform (array, optional): Filter by platforms (max 5): X, Reddit, Truth Social, Pinterest, Instagram, Bluesky, TikTok, Threads
  • theme (array, optional): Filter by themes (max 5): discounts, purchase, appearance, churn, cost, ads, experience, craftmanship, transaction, criminal, loyalty, stock, taste, temperature, ambiance, delivery, fit, injury, knowledge, leadership, comfort, access, illness, location, restrooms, speed, satisfaction, wait times, cleanliness, durability, friendliness, selection
  • entity (array, optional): Filter to posts about a specific named person, brand, organization, product, event, or place (max 5) — e.g. "Messi", "Nike", "FIFA World Cup". Use this (rather than search_terms) when the user names such a thing; it is more precise for named subjects but only covers the ~half of posts where an entity was detected. Matching is case-insensitive substring ("contains") — "messi" matches "Lionel Messi", "world cup" matches "FIFA World Cup"; multiple values are OR'd. Use short, distinctive fragments (very short terms like "cup" can over-match). For broad topics/themes/moods, use search_terms (and favor search_terms when unsure). Combine with search_terms to find a topic about a named entity — e.g. entity: ["Nike"] + search_terms: ["product recall"].
  • min_likes (int, optional): Only return posts with at least this many likes (engagement floor, must be ≥ 0). Posts with no like count are excluded.
  • min_comments (int, optional): Only return posts with at least this many comments (engagement floor, must be ≥ 0). Posts with no comment count are excluded.
  • min_shares (int, optional): Only return posts with at least this many shares/reposts (engagement floor, must be ≥ 0). Coverage is partial and platform-dependent — many platforms do not report shares, so this filter excludes most posts and can sharply narrow results. Prefer min_likes/min_comments for general engagement filtering.
  • min_author_followers (int, optional): Only return posts whose author has at least this many followers (audience-reach floor, must be ≥ 0). Use this for questions about influential or large accounts — it measures the author's reach, whereas min_likes/min_comments/min_shares measure how an individual post performed. Posts with no follower count are excluded, which drops platforms that have no follower concept (Reddit, Facebook, Tumblr) entirely; follower counts are present on roughly three quarters of posts overall.
  • country (array, optional): Filter by the post's country of origin as lowercase ISO 3166-1 alpha-2 codes (max 5) — e.g. ["us", "gb", "ca", "au"] (the UK's code is gb, Australia's is au). Coverage is sparse — most posts have no country code, so this filter excludes them and can sharply narrow results. Excludes posts whose country is unknown or unsupported.
  • limit (int, optional): Results per search term (default: 10, max: 50)
  • include_total_statistics (bool, optional, default true): Include the aggregate_stats block of population statistics. Set false for sample records only, which is significantly faster. See Aggregate Statistics
  • include_full_body (bool, optional, default false): Return each post's full text. By default post text is truncated to 2,000 characters (at a word boundary) to keep responses small; most posts are shorter than that and are unaffected. Set true only when you need to read complete long-form posts

Each returned post includes likes, comments, and shares fields (integer like/favorite, comment/reply, and share/repost counts; omitted when the platform does not expose them — shares in particular is sparsely populated), author_followers (the posting account's follower count, a proxy for reach; omitted on platforms with no follower concept and where the account was not resolved), an entities array (named entities detected in the post; omitted when none were detected), and country (ISO 3166-1 alpha-2 origin country code; omitted when unknown.

Example with search terms:

{
  "tool": "get_social_media_posts",
  "arguments": {
    "search_terms": ["climate action"],
    "platform": ["X"],
    "theme": ["experience"],
    "limit": 25
  }
}

Example narrowing to a specific hour band:

{
  "tool": "get_social_media_posts",
  "arguments": {
    "search_terms": ["product launch"],
    "start_date": "2026-05-13T08:00:00",
    "end_date": "2026-05-13T10:00:00",
    "limit": 25
  }
}

Example without search terms (browse recent posts):

{
  "tool": "get_social_media_posts",
  "arguments": {
    "platform": ["Reddit"],
    "theme": ["experience"],
    "limit": 25
  }
}

Example filtering by entity (substring/contains match):

{
  "tool": "get_social_media_posts",
  "arguments": {
    "entity": ["Messi", "World Cup"],
    "limit": 25
  }
}

Example filtering by engagement (only higher-engagement posts):

{
  "tool": "get_social_media_posts",
  "arguments": {
    "search_terms": ["product launch"],
    "min_likes": 100,
    "min_comments": 10,
    "limit": 25
  }
}

get_tiktok_hashtags6 params - 2 examples

Get trending TikTok hashtags. Can optionally filter by search terms or get top hashtags by category and date range.

Parameters:

  • search_terms (array, 0-3 terms, optional): Optional search terms to filter results. If not provided, returns top hashtags according to other parameters
  • category_name (string, optional): Filter by TikTok category. When omitted, a query with search terms spans all categories, while a query without search terms defaults to the cross-category "ALL" leaderboard. Available categories: ALL, ACADEMIC_RESOURCES, ANIMATION_AND_COMICS, APPAREL_AND_ACCESSORIES, ART, AUTOMOTIVE, BABY_CARE, BABY_KIDS_AND_MATERNITY, BEAUTY, BEAUTY_AND_PERSONAL_CARE, BEAUTY_SERVICES, BUSINESS_AND_FINANCE, BUSINESS_SERVICES, CARD_AND_BOARD_GAMES, CAREER_AND_PROFESSIONAL_GROWTH, COLLEGE, COMEDY, COMMUNITY_UPDATES_AND_ISSUES, CONVENTIONAL_AND_MAINSTREAM_SPORTS, COOKING, CRAFTING_AND_CREATIONS, CULTURE, DANCE, DIARY_AND_VLOG, DRINKS, EATING_EXPERIENCES, EDUCATION, ENTERTAINMENT_AND_SPORTS_NEWS, ENVIRONMENT, EXERCISE_AND_FITNESS, EXTREME_AND_ADVENTURE_SPORTS, FAMILY, FINANCIAL_SERVICES, FOOD, FOOD_AND_BEVERAGE, FOOD_RECOMMENDATIONS, GADGETS_AND_INNOVATION, GAMES, GENERAL_TRAVEL, HAIR_CARE, HEALTH, HEALTH_AND_WELLNESS, HISTORY_AND_LITERATURE, HOME_AND_GARDEN, HOME_IMPROVEMENT, HOUSEHOLD_PRODUCTS, LEARNING_AND_DEVELOPMENT, LEISURE_AND_RECREATION_FACILITIES, LIFE_SERVICES, LIVESTOCK_AND_FARMING, MISCELLANEOUS_PERFORMANCES, MOVIES_AND_TV, MUSIC, NEWS_AND_ENTERTAINMENT, OTHER_BEAUTY, OTHER_FASHION, OTHER_TRANSPORTATION, OUTDOOR_RECREATION, OUTFITS, PERFORMING_ARTS, PERSONAL_PHOTOGRAPHY, PETS, PET_CARE_AND_ACCESSORIES, PHOTOGRAPHY, PRODUCTIVITY_AND_EFFICIENCY, ROMANCE, SCIENCE, SENSORY_EXPERIENCES, SHOWS_FESTIVALS_AND_EXHIBITIONS, SOFTWARE_AND_APPS, SPECIAL_EFFECTS, SPORTS, SPORTS_AND_OUTDOOR, SUPERNATURAL_AND_HORROR, TECHNOLOGY, TOYS_COLLECTIBLES_AND_MEMORABILIA, TRAVEL, VEHICLE_AND_TRANSPORTATION, VIDEO_GAMES, WILDLIFE_AND_EXOTIC_PETS
  • date_range (string, optional): Filter by date range (default: "1DAY"). Available options: "1DAY", "7DAY", "30DAY", "120DAY"
  • country (array, optional): Filter by country, as uppercase ISO 3166-1 alpha-2 codes (max 5). Supported: US, GB, CA, DE, ES, TR, ZA, NG, CN, IN, PH, TH, MX, BR, AR, FR, IT, NL, PL (the UK's code is GB). Lowercase codes are accepted and upcased. When omitted, returns hashtags across all available countries
  • limit (int, optional): Number of results per search term or total results if no search term (default: 50, max: 200)
  • include_total_statistics (bool, optional): When false, omits aggregate_stats. Defaults to true. Unlike the other tools, these statistics are computed over the returned rows (not the full dataset), so disabling them reduces response size but does not speed up the search

Response: search_results holds one entry per search term, or a single unlabeled entry when browsing without search terms. Each entry carries its own hashtags rows and, when include_total_statistics is true, an aggregate_stats block describing exactly those rows:

{
  "search_results": [
    {
      "search_term": "sports",
      "aggregate_stats": {
        "views_distribution": [
          {"range": "0-100K", "count": 4},
          {"range": "100K-1M", "count": 22},
          {"range": "1M-10M", "count": 18},
          {"range": "10M-100M", "count": 5},
          {"range": "100M+", "count": 1}
        ],
        "posts_distribution": [
          {"range": "0-1K", "count": 12},
          {"range": "1K-10K", "count": 26},
          {"range": "10K-100K", "count": 12},
          {"range": "100K-1M", "count": 0},
          {"range": "1M+", "count": 0}
        ],
        "rank_change_distribution": {"new": 28, "up": 11, "down": 9, "unchanged": 2},
        "top_country_distribution": {"US": 34, "GB": 9, "CA": 7}
      },
      "hashtags": [ ... ]
    }
  ]
}

All statistics describe the returned rows, never the full dataset. views_distribution and posts_distribution always list every bucket, so a count of 0 means no returned row fell in that range, and a row whose value is missing or non-numeric falls in no bucket. rank_change_distribution buckets each row's rank change in the order new, up, down, unchanged; rows with a missing or unrecognized rank change are skipped, and buckets with no rows are omitted. Expect new to dominate, since most hashtags in this dataset are new on any given day. top_country_distribution counts how often each country appears across the rows' top-country lists, most frequent first; unlike other top_-prefixed distributions it is exhaustive over the returned rows rather than truncated.

Example:

{
  "tool": "get_tiktok_hashtags",
  "arguments": {
    "search_terms": ["fitness"],
    "category_name": "EXERCISE_AND_FITNESS",
    "date_range": "7DAY",
    "limit": 20
  }
}

Example without search terms:

{
  "tool": "get_tiktok_hashtags",
  "arguments": {
    "category_name": "BEAUTY",
    "date_range": "1DAY",
    "limit": 15
  }
}

get_audience_targeting4 params - 2 examples

Generate audience targeting segments for specific ad platforms based on an audience description.

Parameters:

  • audience_name (string, required): The name of the audience to target (e.g., "Tech Enthusiasts", "Fitness Enthusiasts")
  • audience_description (string, required): A description of the audience to target (e.g., "Young professionals interested in technology and innovation")
  • platform (string, required): Which platform to target. Available platforms: Programmatic, YouTube, Pinterest, LinkedIn, TikTok, Snapchat, Meta, X, Reddit, Spotify

Platform-Specific Targeting Types:

  • YouTube: detailed_demographics, life_events, affinity_audiences, in_market_audiences, topics, keywords
  • Programmatic: categories, genres, ctv_segments, olv_segments
  • TikTok: interests, video_interactions, creator_interactions, hashtags
  • Meta: detailed_demographics, interests, behaviors
  • Snapchat: lifestyle, shoppers, visitors
  • LinkedIn: company_industries, member_interests, member_traits
  • X: interests, keywords, hashtags
  • Pinterest: interests, keywords
  • Spotify: interests, music_genres, playlist_themes, podcast_topics
  • Reddit: interest_groups, keywords

Returns: Platform-specific targeting segments organized by demographics and targeting types. The response structure varies by platform but includes:

  • Demographics (age, gender, income, parental status, etc.) - varies by platform
  • Targeting segments (interests, behaviors, keywords, etc.) - varies by platform
  • Audience name and platform identifier

Example:

{
  "tool": "get_audience_targeting",
  "arguments": {
    "audience_name": "Tech Enthusiasts",
    "audience_description": "Young professionals aged 25-35 interested in technology, innovation, and startups",
    "platform": "Meta"
  }
}

Example for YouTube:

{
  "tool": "get_audience_targeting",
  "arguments": {
    "audience_name": "Fitness Enthusiasts",
    "audience_description": "Adults interested in fitness, health, and wellness",
    "platform": "YouTube"
  }
}

get_youtube_videos13 params - 3 examples

Search YouTube videos from the Brand Mentality curated YouTube dataset.

Parameters:

  • search_terms (array, 0-3 terms, optional): Search terms for video title/description. If not provided, returns top videos sorted by view count (highest first). When provided, do NOT also send sort_by — the two parameters are mutually exclusive
  • start_date (string, optional): Start date for video publish date filtering (YYYY-MM-DD format, earliest 2005-02-14). While include_total_statistics is true the range may not exceed 180 days; omit this to search the most recent 180 days
  • end_date (string, optional): End date for video publish date filtering (YYYY-MM-DD format, earliest 2005-02-14). While include_total_statistics is true the range may not exceed 180 days
  • language (array, optional): Filter by language codes (e.g., "en", "es") - max 5
  • country (array, optional): Filter by channel country codes (e.g., "US", "UK") - max 5
  • iab_category (array, optional): Filter by IAB taxonomy category names (e.g., "Sports", "Music") - max 5
  • is_short (boolean, optional): Filter by video type: true for Shorts, false for long-form, omit for all
  • exclude_kids_content (boolean, optional): Exclude kids content when true
  • min_views (int, optional): Minimum view count threshold
  • min_channel_subscribers (int, optional): Minimum channel subscriber count
  • sort_by (string, optional): Mutually exclusive with search_terms — sending both returns an error. Omit this parameter whenever search_terms is provided (results are then ranked by relevance automatically). Only set when no search terms are given. Values: "size" (default) = view count (most viewed first); "recency" = newest videos first. Use "recency" only when the user explicitly requests chronological ordering
  • limit (int, optional): Results per search term (default: 10, max: 50)
  • include_total_statistics (bool, optional, default true): Include the aggregate_stats block of population statistics. Set false for sample records only, which is significantly faster. See Aggregate Statistics

Example with search terms:

{
  "tool": "get_youtube_videos",
  "arguments": {
    "search_terms": ["tech reviews"],
    "language": ["en"],
    "country": ["US"],
    "min_views": 10000,
    "limit": 20
  }
}

Example with subscriber filter (videos from larger channels):

{
  "tool": "get_youtube_videos",
  "arguments": {
    "search_terms": ["weight loss treatments"],
    "min_channel_subscribers": 100000,
    "limit": 20
  }
}

Example without search terms (browse top videos):

{
  "tool": "get_youtube_videos",
  "arguments": {
    "iab_category": ["Sports"],
    "is_short": false,
    "exclude_kids_content": true,
    "limit": 25
  }
}

get_youtube_channels12 params - 3 examples

Search YouTube channels from the Brand Mentality curated YouTube dataset.

Parameters:

  • search_terms (array, 0-3 terms, optional): Search terms for channel title/description. If not provided, returns top channels sorted by subscriber count (highest first). When provided, do NOT also send sort_by — the two parameters are mutually exclusive
  • start_date (string, optional): Start date for latest video publish date filtering (YYYY-MM-DD format, earliest 2005-02-14). While include_total_statistics is true the range may not exceed 180 days; omit this to search the most recent 180 days
  • end_date (string, optional): End date for latest video publish date filtering (YYYY-MM-DD format, earliest 2005-02-14). While include_total_statistics is true the range may not exceed 180 days
  • language (array, optional): Filter by language codes (e.g., "en", "es") - max 5
  • country (array, optional): Filter by country codes (e.g., "US", "UK") - max 5
  • exclude_kids_content (boolean, optional): Exclude kids content when true
  • min_subscribers (int, optional): Minimum subscriber count threshold
  • min_views (int, optional): Minimum total view count threshold
  • min_video_count (int, optional): Minimum video count on channel
  • sort_by (string, optional): Mutually exclusive with search_terms — sending both returns an error. Omit this parameter whenever search_terms is provided (results are then ranked by relevance automatically). Only set when no search terms are given. Values: "size" (default) = subscriber count (most popular first); "recency" = recently active channels first. Use "recency" only when the user explicitly requests chronological ordering
  • limit (int, optional): Results per search term (default: 10, max: 50)
  • include_total_statistics (bool, optional, default true): Include the aggregate_stats block of population statistics. Set false for sample records only, which is significantly faster. See Aggregate Statistics

Example with search terms:

{
  "tool": "get_youtube_channels",
  "arguments": {
    "search_terms": ["cooking recipes"],
    "language": ["en"],
    "min_views": 1000000,
    "limit": 15
  }
}

Example with subscriber filter (larger channels only):

{
  "tool": "get_youtube_channels",
  "arguments": {
    "search_terms": ["personal finance"],
    "country": ["US"],
    "language": ["en"],
    "min_subscribers": 5000,
    "limit": 20
  }
}

Example without search terms (browse top channels):

{
  "tool": "get_youtube_channels",
  "arguments": {
    "country": ["US"],
    "exclude_kids_content": true,
    "min_video_count": 50,
    "limit": 20
  }
}

All search tools return results with clear distinction between total matches and sample results:

Output Format

Every tool returns its result as a single text block: the data context (guidance on how to interpret the payload) followed by a blank line and the data payload (JSON for search tools, markdown for get_brand_profile). Read the entire text block — do not assume the context and the payload are delivered as separate parts.

Field Naming Convention

  • aggregate_stats.total_matches: Total number of matching records in the database
  • sample_*: The subset of example records returned (e.g., sample_social_media_posts, sample_news_articles)

This distinction helps clarify that aggregate_stats.total_matches represents the full scope of data matching your query, while the sample_* list contains representative examples limited by the limit parameter.

Population statistics are configurable. Computing them is expensive, so every search tool exposes the same switch:

  • Every search tool except get_tiktok_hashtags returns an aggregate_stats block (the total match count plus field

distributions) by default. Pass include_total_statistics=false when you only need a few example records and not population-level statistics: the aggregate_stats block is then omitted and the search is significantly faster.

  • For get_youtube_videos and get_youtube_channels, leaving include_total_statistics at true

caps the searched date range at 180 days (see Dates); include_total_statistics=false removes the cap.

  • get_tiktok_hashtags returns an aggregate_stats block per search result by default, computed

over the returned rows rather than the full dataset; include_total_statistics=false omits it (smaller response, no speed difference).

  • The sample_* records are always returned and unaffected.

Aggregate Statistics

Every search tool except get_tiktok_hashtags returns full aggregate statistics per search term by default (omitted when include_total_statistics=false). Statistics cover every record matching that search term's query, not just the returned sample. When you pass search_terms, that population is the set matched by the term's query; when you browse without search terms, it is the whole filtered date range.

Distributions over multi-valued fields (a narrative's platforms, a moment's categories) count a record in every bucket it belongs to, so those buckets can sum to more than total_matches.

  • get_social_media_posts: total_matches, platform_distribution, top_themes_distribution, date_distribution, likes_stats, comments_stats, and shares_stats (engagement summaries over matching posts: each has count, min, max, avg, sum; count reflects only posts that have a value for that metric — compare it to total_matches to gauge coverage, which is low for shares_stats)
  • get_news_articles: total_matches, top_publishers_distribution, top_categories_distribution, publisher_location_distribution, date_distribution
  • get_youtube_videos: total_matches, language_distribution, country_distribution, category_distribution, views_distribution, likes_distribution, date_distribution
  • get_youtube_channels: total_matches, language_distribution, country_distribution, subscriber_distribution, date_distribution
  • get_social_media_narratives: total_matches, total_post_count (combined posts across all matching narratives), sentiment_distribution (narrative counts keyed negative, neutral, positive), platform_distribution, narrative_size_distribution (narratives bucketed by post count), narratives_per_day_date_distribution (narratives counted by earliest post date), and total_likes_stats, total_comments_stats, total_shares_stats (summaries of each narrative's engagement totals: each has count, min, max, avg, sum; count reflects only narratives that have a value for that metric — compare it to total_matches to gauge coverage, which is lowest for total_shares_stats)
  • get_news_moments: total_matches, total_article_count (combined articles across all matching moments), moment_size_distribution (moments bucketed by article count), moments_per_day_date_distribution (moments counted by earliest article date)
  • get_trends: total_matches, total_article_count and total_post_count (combined counts across all matching trends), top_brands_distribution and top_people_distribution (how many matching trends list each name — not mention counts, and not limited to the 10 entities shown on each trend record), trends_per_day_date_distribution (trends counted by latest publish date)

Two notes on reading these:

  • The *_per_day_date_distribution series count clusters, not their contents: when stories broke, conversations started, or trends concluded. For article or post volume over time, call get_news_articles or get_social_media_posts, which bucket each record on its own publish date and give a true daily curve.
  • sentiment_distribution has three bands (negative, neutral, positive) while the sentiment filter accepts five, so they do not map one to one: the distribution's negative covers everything the filter would call negative or very_negative. Band edges are half-open, so a score of exactly 0.25 counts as positive in the distribution but matches sentiment="neutral" when filtering. Narratives with no sentiment score appear in no band, so the bands need not sum to total_matches.
  • Every bucket is always returned, including empty ones: date distributions include periods with no records as count: 0 so gaps are visible rather than collapsed, range distributions list every band, and sentiment_distribution lists all five. An absent bucket therefore means the field itself was not aggregated, never that the count was zero.

TikTok Hashtags returns aggregate_stats per search result (omitted when include_total_statistics=false): views_distribution, posts_distribution, rank_change_distribution, and top_country_distribution. These describe the returned rows rather than the full dataset. See get_tiktok_hashtags for details.

Example Response Structure

{
  "search_start_date": "2024-10-01",
  "search_end_date": "2024-12-01",
  "search_results": [
    {
      "search_term": "AI",
      "aggregate_stats": {
        "total_matches": 15420,
        "platform_distribution": {"X": 8500, "Reddit": 4200, "TikTok": 2720},
        "top_themes_distribution": {"experience": 3200, "knowledge": 2800},
        "date_distribution": {"interval": "1d", "buckets": [{"date": "2024-11-01", "count": 520}, ...]},
        "likes_stats": {"count": 14200, "min": 0, "max": 84210, "avg": 312.5, "sum": 4437500},
        "comments_stats": {"count": 13980, "min": 0, "max": 9120, "avg": 27.4, "sum": 383052},
        "shares_stats": {"count": 1120, "min": 0, "max": 4300, "avg": 18.2, "sum": 20384}
      },
      "sample_social_media_posts": [
        { "post_id": "...", "text": "...", "likes": 1280, "comments": 64, "shares": 22, "entities": ["Lionel Messi", "FIFA World Cup"], ... }
      ]
    }
  ]
}

Note: Distribution fields prefixed with top_ (e.g., top_themes_distribution) return the most frequent values, not exhaustive lists. The exception is get_tiktok_hashtags's top_country_distribution, which counts every country code present in the returned rows' top_country_list values rather than a truncated top-N.


Dates

  • Date-only format (YYYY-MM-DD, e.g., "2024-01-15"): used by get_trends and get_social_media_narratives, earliest 2026-01-01
  • UTC ISO datetime format (YYYY-MM-DDTHH:MM:SS, e.g., "2026-05-13T12:05:18"): used by get_news_articles, get_news_moments, and get_social_media_posts for hour/minute-precision filtering, earliest 2026-01-01T00:00:00. Naive UTC — do not include a timezone offset. For a whole-day search use T00:00:00 to T23:59:59.
  • YouTube tools (videos, channels): earliest 2005-02-14
  • Default: If not provided, uses the earliest available date as the start
  • YouTube tools with include_total_statistics: true (the default): the searched range is capped at 180 days. An omitted start_date defaults to the most recent 180 days instead of the earliest available date, and an explicit range wider than 180 days returns an error. The returned search_start_date and search_end_date always state the range actually searched, and the records and aggregate_stats always cover that same range. Send include_total_statistics: false to search the full history without population statistics.

Search Terms

  • 0-3 terms per request (optional for all tools)
  • Terms run in parallel when provided
  • For articles/posts: Keep complete concepts together
    • ✅ ["renewable energy policy"]
    • ❌ ["renewable", "energy", "policy"]
  • Without search terms: Tools return results sorted by a logical default, customizable with sort_by parameter:
    • Trends: default "size" (biggest trends), optional "recency" (most recent trends)
    • Moments: default "size" (biggest story clusters), optional "recency" (most recent moments)
    • Narratives: default "size" (most discussed), optional "recency" (most recent narratives)
    • Articles: sorted by publish date (most recent)
    • Posts: sorted by publish date (most recent)
    • TikTok Hashtags: sorted by rank position
    • YouTube Videos: default "size" (highest view count), optional "recency" (newest videos)
    • YouTube Channels: default "size" (highest subscriber count), optional "recency" (recently active channels)
  • sort_by is mutually exclusive with search_terms: For tools that accept sort_by (get_trends, get_news_moments, get_social_media_narratives, get_youtube_videos, get_youtube_channels), sending both sort_by and search_terms in the same request returns an error. When search terms are provided, results are automatically ranked by relevance — omit sort_by entirely.

Tool Selection

  • Brand info → get_brand_profile
  • Long-term trends → get_trends
  • News clusters → get_news_moments
  • Social clusters → get_social_media_narratives
  • Individual articles → get_news_articles
  • Individual posts → get_social_media_posts
  • Trending TikTok hashtags → get_tiktok_hashtags
  • YouTube videos → get_youtube_videos
  • YouTube channels → get_youtube_channels
  • Audience targeting segments → get_audience_targeting
Scroll to Top

Request Segments

Email *
First name *
Last name *
Company *
Preferred DSP
DSP Seat ID