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.

15 tools
prefix: media

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_....

Sign in or sign up to create a key →

Tools in this integration

cluster_themes

Extract 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_brands

Compare 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)

count

Count 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_briefing

Executive 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_spikes

Find 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)

diff

Compare 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_spike

Deep-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_mention

Get 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")

group

Group 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_keywords

List all enabled keywords (brands/companies) being monitored. Parameters: none Returns: {keywords: [string], total: int} Example: list_keywords()

sample

Returns 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_distribution

Positive/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"})

timeseries

Mention 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_channels

Channels 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)

trending

Find 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

POST
/api/v1/tools/media/cluster_themes

Request body

strict
Extra fields are rejected (additionalProperties: false).
filter
object
strict
optional
max_clusters
integer
nullable
optional
min_cluster_size
integer
nullable
optional

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

compare_brands

POST
/api/v1/tools/media/compare_brands

Request body

strict
Extra fields are rejected (additionalProperties: false).
brands
array
nullable
required
filter
object
strict
optional
days
integer
nullable
optional

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

count

POST
/api/v1/tools/media/count

Request body

strict
Extra fields are rejected (additionalProperties: false).
filter
object
strict
optional

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

daily_briefing

POST
/api/v1/tools/media/daily_briefing

Request body

strict
Extra fields are rejected (additionalProperties: false).
filter
object
strict
optional
days
integer
required

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

detect_spikes

POST
/api/v1/tools/media/detect_spikes

Request body

strict
Extra fields are rejected (additionalProperties: false).
filter
object
strict
optional
lookback_days
integer
nullable
optional
window_days
integer
nullable
optional
threshold
number
nullable
optional

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

diff

POST
/api/v1/tools/media/diff

Request body

strict
Extra fields are rejected (additionalProperties: false).
base_filter
object
strict
required
compare_filter
object
strict
required

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

explain_spike

POST
/api/v1/tools/media/explain_spike

Request body

strict
Extra fields are rejected (additionalProperties: false).
filter
object
strict
optional
date
string
required

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

get_mention

POST
/api/v1/tools/media/get_mention

Request body

strict
Extra fields are rejected (additionalProperties: false).
mention_id
string
required
filter
object
strict
optional

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

group

POST
/api/v1/tools/media/group

Request body

strict
Extra fields are rejected (additionalProperties: false).
filter
object
strict
optional
by
string
required
limit
integer
nullable
optional

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

list_keywords

POST
/api/v1/tools/media/list_keywords

Request body

No parameters

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

sample

POST
/api/v1/tools/media/sample

Request body

strict
Extra fields are rejected (additionalProperties: false).
filter
object
strict
optional
limit
integer
nullable
optional
offset
integer
nullable
optional
sort
string
nullable
optional

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

sentiment_distribution

POST
/api/v1/tools/media/sentiment_distribution

Request body

strict
Extra fields are rejected (additionalProperties: false).
filter
object
strict
optional

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

timeseries

POST
/api/v1/tools/media/timeseries

Request body

strict
Extra fields are rejected (additionalProperties: false).
filter
object
strict
optional
bucket
string
nullable
optional

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

top_channels

POST
/api/v1/tools/media/top_channels

Request body

strict
Extra fields are rejected (additionalProperties: false).
filter
object
strict
optional
limit
integer
nullable
optional
offset
integer
nullable
optional
sort
string
nullable
optional

Response

result
string
required
structured_content
object
optional
meta
object
optional

Request

Common errors

401 Unauthorized

API key missing or invalid.

402 Payment Required

Out of credits, or this key hit its per-key budget cap. Top up or raise the cap.

403 Forbidden

Your org doesn't have access, or the key scope is too narrow.

404 Not Found

Tool was renamed or your access was revoked.

410 Gone

Tool disabled by an administrator.

422 Validation Error

Request body doesn't match the inputSchema. Check the field path.

429 Too Many Requests

Slow down; check the Retry-After header.

502 Bad Gateway

Upstream provider returned an error. Safe to retry.

503 Service Unavailable

Integration unreachable; try again shortly.

504 Gateway Timeout

Tool took too long. Retry or simplify the request.

Media: Redpine Connect API | Redpine Connect Docs