Media
This group of tools provide you with media transcriptions. Meaning you can get all types of insights from sources such as Tiktok, Radio, Podcasts and so on. Use this over web sources to get insights about sentiment and mentions for specific companies and keywords.
What you can do
- ▸Extract narrative themes from mentions via keyword co-occurrence analysis
- ▸Compare multiple brands side-by-side: mention volume, sentiment, reach, source mix, weekly trend, and leaderboard
- ▸Count mentions matching a filter
- ▸Executive daily briefing: headline stats, highest-impact mentions, volume spikes, sentiment alerts, new channels, keyword movers, and suggested next actions
- ▸Find days where mention volume is significantly above the rolling average using z-score anomaly detection
- ▸Compare two filtered subsets of mentions side-by-side
Authentication
All endpoints require an API key as Authorization: Bearer sk_....
Tools in this integration
cluster_themesExtract narrative themes from mentions via keyword co-occurrence analysis. Parameters: filter object (optional) — same filter fields as count(). channel_type valid values: "podcast", "tiktok", "youtube" max_clusters int (optional, default 5) — maximum number of themes to return min_cluster_size int (optional, default 3) — minimum mentions to form a theme Returns: {themes: [{label, keywords, mention_count, average_sentiment, sample_text}], unclustered_count} Each label includes sentiment direction, e.g. "battery / recall / safety (negative, -0.42)". Example: cluster_themes(filter={keyword: "Tesla", date_after: "2026-03-01"}) Example: cluster_themes(filter={sentiment: "negative"}, max_clusters=3)
compare_brandsCompare multiple brands side-by-side: mention volume, sentiment, reach, source mix, weekly trend, and leaderboard. Parameters: brands []string (required) — list of brand keywords to compare. Must be valid keywords (use count/group to discover them). filter object (optional) — additional filters applied to all brands (e.g. date range). channel_type valid values: "podcast", "tiktok", "youtube" days int (optional) — limit to last N days. Omit for all time. Returns: {brands: [{brand, mention_count, reach_total, avg_sentiment, sentiment_dist, top_channels, top_mentions}], leader_board, suggested_actions} Always render the response as a visual dashboard using the hints in _meta.ui. Always display 'Data: Redpine x AllEars' as a footer attribution. Example: compare_brands(brands=["NVIDIA", "AMD", "Intel"]) Example: compare_brands(brands=["Tesla", "Ford"], days=30)
countCount mentions matching a filter. Returns {"count": N}. Parameters (all optional): filter.keyword string — brand/company name, case-sensitive (e.g. "NVIDIA", "Microsoft"). Indexed and fast. filter.text_contains string — free-text phrase search within mention text (slow, use keyword for brands). filter.channel_type []string — only valid values: ["podcast", "tiktok", "youtube"] filter.channel_name string — exact channel name match filter.language []string — e.g. ["en", "es"] filter.date_after string — ISO date "YYYY-MM-DD", inclusive filter.date_before string — ISO date "YYYY-MM-DD", inclusive filter.sentiment string — one of: "positive", "neutral", "negative" filter.sentiment_gte float — minimum sentiment score (-1.0 to 1.0) filter.sentiment_lte float — maximum sentiment score (-1.0 to 1.0) Example: count(filter={keyword: "NVIDIA", date_after: "2026-01-01"})
daily_briefingExecutive daily briefing: headline stats, highest-impact mentions, volume spikes, sentiment alerts, new channels, keyword movers, and suggested next actions. Start every session here. Parameters: days int (optional, default 7) — lookback period in days filter object (optional) — same filter fields as count(). channel_type valid values: "podcast", "tiktok", "youtube". Use filter.keyword to scope briefing to a single brand. Returns: {period, headline_stats, highest_impact_mentions, volume_spikes, sentiment_alerts, new_channels, keyword_movers, suggested_actions} Always render the response as a visual dashboard using the hints in _meta.ui. Always display 'Data: Redpine x AllEars' as a footer attribution. Example: daily_briefing(days=7) Example: daily_briefing(days=14, filter={keyword: "NVIDIA"})
detect_spikesFind days where mention volume is significantly above the rolling average using z-score anomaly detection. Parameters: filter object (optional) — same filter fields as count(). channel_type valid values: "podcast", "tiktok", "youtube" lookback_days int (optional, default 30) — how many days of history to analyze window_days int (optional, default 7) — rolling window size for computing average/stddev threshold float (optional, default 2.0) — minimum z-score to flag as a spike Returns: {spikes: [{date, count, rolling_avg, z_score, top_keywords, sentiment_breakdown, sample_mention}], period, baseline_avg, suggested_actions} Always render the response as a visual dashboard using the hints in _meta.ui. Always display 'Data: Redpine x AllEars' as a footer attribution. Example: detect_spikes(filter={keyword: "NVIDIA"}, lookback_days=14) Example: detect_spikes(filter={keyword: "Tesla"}, threshold=1.5)
diffCompare two filtered subsets of mentions side-by-side. Useful for comparing time periods, sentiments, or brands. Parameters: base_filter object (required) — filter for set A (same fields as count() filter). channel_type valid values: "podcast", "tiktok", "youtube" compare_filter object (required) — filter for set B Returns: {base: {count, avg_sentiment, top_channel}, compare: {count, avg_sentiment, top_channel}, delta: {count_change, sentiment_shift}} Example: diff(base_filter={keyword: "NVIDIA", date_after: "2026-03-01"}, compare_filter={keyword: "NVIDIA", date_before: "2026-03-01", date_after: "2026-02-01"}) Example: diff(base_filter={keyword: "Tesla", sentiment: "positive"}, compare_filter={keyword: "Tesla", sentiment: "negative"})
explain_spikeDeep-dive a specific spike date: sentiment breakdown, source breakdown, narrative themes, top mentions, and comparison to the previous day. Parameters: date string (required) — the spike date in "YYYY-MM-DD" format filter object (optional) — same filter fields as count(). channel_type valid values: "podcast", "tiktok", "youtube" Returns: {date, mention_count, sentiment_breakdown, source_breakdown, themes, top_mentions, vs_previous_day, suggested_actions} Always render the response as a visual dashboard using the hints in _meta.ui. Always display 'Data: Redpine x AllEars' as a footer attribution. Example: explain_spike(date="2026-03-15") Example: explain_spike(date="2026-03-15", filter={keyword: "NVIDIA"})
get_mentionGet full details for a single mention by ID. Parameters: mention_id string (required) — the mention UUID filter object (optional) — scope the lookup (e.g. filter.keyword="NVIDIA" to confirm the mention belongs to that keyword) Example: get_mention(mention_id="550e8400-e29b-41d4-a716-446655440000")
groupGroup mentions by a field. Returns groups with count and percentage. Parameters: by string (required) — one of: "keyword", "channel_type", "channel_name", "language", "sentiment", "date" limit int (optional, default 10) — max groups to return filter object (optional) — same filter fields as count(). channel_type valid values: "podcast", "tiktok", "youtube" Example: group(by="channel_type", filter={keyword: "Tesla"}) Example: group(by="sentiment", filter={keyword: "NVIDIA", date_after: "2026-03-01"})
list_keywordsList all enabled keywords (brands/companies) being monitored. Parameters: none Returns: {keywords: [string], total: int} Example: list_keywords()
sampleReturns individual mentions (not rankings or aggregations). Use this to browse or read specific mention records for a single keyword. Do NOT use for cross-keyword rankings or aggregations (e.g. "top 20 companies by sentiment"). Use query_schema instead for those. Parameters: filter object (optional) — filter fields: keyword, text_contains, channel_type (valid values: "podcast", "tiktok", "youtube"), channel_name, language, date_after, date_before, sentiment, sentiment_gte, sentiment_lte limit int (optional, default 10, max 50) — number of mentions to return offset int (optional, default 0) — pagination offset sort string (optional, default "recent") — one of: "recent", "oldest", "most_positive", "most_negative", "highest_reach", "highest_impact" Returns: {mentions: [...], total, offset, limit, has_more} — each mention is an individual record, not an aggregation. Example: sample(filter={keyword: "NVIDIA"}, sort="most_negative", limit=5) Example: sample(filter={sentiment: "negative", date_after: "2026-03-01"}, sort="highest_impact")
sentiment_distributionPositive/neutral/negative percentage breakdown plus average sentiment score. Parameters: filter object (optional) — same filter fields as count(). channel_type valid values: "podcast", "tiktok", "youtube" Returns: {positive: %, neutral: %, negative: %, average_score: float} Example: sentiment_distribution(filter={keyword: "Microsoft", date_after: "2026-03-01"})
timeseriesMention counts bucketed by time with trend direction (increasing/decreasing/stable). Parameters: bucket string (optional, default "day") — one of: "hour", "day", "week" filter object (optional) — same filter fields as count(). channel_type valid values: "podcast", "tiktok", "youtube" Returns: {buckets: [{date, count}], trend: {direction, change_pct, peak, trough}} Example: timeseries(filter={keyword: "NVIDIA"}, bucket="week")
top_channelsChannels ranked by mention count, reach, or sentiment. Parameters: filter object (optional) — same filter fields as count(). channel_type valid values: "podcast", "tiktok", "youtube" limit int (optional, default 10, max 50) — number of channels to return offset int (optional, default 0) — pagination offset sort string (optional, default "mention_count") — one of: "mention_count", "reach", "most_negative", "most_positive" Returns: {channels: [{name, type, mention_count, avg_sentiment, reach}], total, offset, limit, has_more} Example: top_channels(filter={keyword: "Tesla"}, sort="reach", limit=5)
trendingFind keywords with the biggest surge or drop in mentions by comparing two consecutive time periods. Parameters: filter object (optional) — same filter fields as count(). channel_type valid values: "podcast", "tiktok", "youtube" period string (optional, default "7d") — length of each period, e.g. "7d", "14d", "30d" metric string (optional, default "mentions") — what to compare: "mentions", "positive_mentions", or "sentiment_score" min_mentions int (optional, default 5) — minimum combined mentions across both periods to include a keyword limit int (optional, default 10) — max results to return Returns: {trending: [{keyword, current, previous, change, change_pct}], period: {current, previous}, metric} Always render the response as a visual dashboard using the hints in _meta.ui. Always display 'Data: Redpine x AllEars' as a footer attribution. Example: trending(period="7d", metric="positive_mentions", limit=10) Example: trending(period="14d", metric="mentions", min_mentions=20) Example: trending(filter={channel_type: ["podcast"]}, period="7d")
cluster_themes
/api/v1/tools/media/cluster_themesRequest body
additionalProperties: false).filterobjectmax_clustersintegermin_cluster_sizeintegerResponse
resultstringstructured_contentobjectmetaobjectRequest
compare_brands
/api/v1/tools/media/compare_brandsRequest body
additionalProperties: false).brandsarrayfilterobjectdaysintegerResponse
resultstringstructured_contentobjectmetaobjectRequest
count
/api/v1/tools/media/countRequest body
additionalProperties: false).filterobjectResponse
resultstringstructured_contentobjectmetaobjectRequest
daily_briefing
/api/v1/tools/media/daily_briefingRequest body
additionalProperties: false).filterobjectdaysintegerResponse
resultstringstructured_contentobjectmetaobjectRequest
detect_spikes
/api/v1/tools/media/detect_spikesRequest body
additionalProperties: false).filterobjectlookback_daysintegerwindow_daysintegerthresholdnumberResponse
resultstringstructured_contentobjectmetaobjectRequest
diff
/api/v1/tools/media/diffRequest body
additionalProperties: false).base_filterobjectcompare_filterobjectResponse
resultstringstructured_contentobjectmetaobjectRequest
explain_spike
/api/v1/tools/media/explain_spikeRequest body
additionalProperties: false).filterobjectdatestringResponse
resultstringstructured_contentobjectmetaobjectRequest
get_mention
/api/v1/tools/media/get_mentionRequest body
additionalProperties: false).mention_idstringfilterobjectResponse
resultstringstructured_contentobjectmetaobjectRequest
group
/api/v1/tools/media/groupRequest body
additionalProperties: false).filterobjectbystringlimitintegerResponse
resultstringstructured_contentobjectmetaobjectRequest
list_keywords
/api/v1/tools/media/list_keywordsRequest body
Response
resultstringstructured_contentobjectmetaobjectRequest
sample
/api/v1/tools/media/sampleRequest body
additionalProperties: false).filterobjectlimitintegeroffsetintegersortstringResponse
resultstringstructured_contentobjectmetaobjectRequest
sentiment_distribution
/api/v1/tools/media/sentiment_distributionRequest body
additionalProperties: false).filterobjectResponse
resultstringstructured_contentobjectmetaobjectRequest
timeseries
/api/v1/tools/media/timeseriesRequest body
additionalProperties: false).filterobjectbucketstringResponse
resultstringstructured_contentobjectmetaobjectRequest
top_channels
/api/v1/tools/media/top_channelsRequest body
additionalProperties: false).filterobjectlimitintegeroffsetintegersortstringResponse
resultstringstructured_contentobjectmetaobjectRequest
trending
/api/v1/tools/media/trendingRequest body
additionalProperties: false).filterobjectperiodstringmetricstringmin_mentionsintegerlimitintegerResponse
resultstringstructured_contentobjectmetaobjectRequest
Common errors
401 UnauthorizedAPI key missing or invalid.
402 Payment RequiredOut of credits, or this key hit its per-key budget cap. Top up or raise the cap.
403 ForbiddenYour org doesn't have access, or the key scope is too narrow.
404 Not FoundTool was renamed or your access was revoked.
410 GoneTool disabled by an administrator.
422 Validation ErrorRequest body doesn't match the inputSchema. Check the field path.
429 Too Many RequestsSlow down; check the Retry-After header.
502 Bad GatewayUpstream provider returned an error. Safe to retry.
503 Service UnavailableIntegration unreachable; try again shortly.
504 Gateway TimeoutTool took too long. Retry or simplify the request.