PR & Media Monitoring with News Search API
Public relations is, at its core, about managing how information about your organization appears in the media. Every press release, media pitch, product launch, and crisis response eventually shows up (or fails to show up) in news coverage. Knowing when, where, and how your brand is mentioned in the media is not a luxury. It is a fundamental operating requirement for any PR team.
Yet most PR professionals still rely on a patchwork of manual Google searches, email alerts, and expensive media monitoring subscriptions to track coverage. Enterprise tools like Meltwater and Cision cost $5,000 to $50,000 per year. Google Alerts is free but notoriously unreliable. There is a better middle ground: building custom monitoring workflows using a news search API.
Why Media Monitoring Matters
For In-House PR Teams
In-house communications teams need media monitoring to accomplish several things. They need to report on campaign outcomes to leadership, quantifying how many articles were generated by a press release or media event. They need to catch negative coverage early, before it spreads or escalates. They need to track competitors' media presence to understand the broader competitive narrative. And they need to identify journalists who are actively covering their industry, as those journalists are the most likely to be receptive to pitches.
For PR Agencies
Agencies have an additional layer of requirements. They need to generate coverage reports for clients, demonstrate ROI to justify retainer fees, and monitor multiple brands simultaneously across different industries. The cost of enterprise monitoring tools multiplied across a dozen client accounts makes an API-based approach significantly more attractive.
Key Metrics PR Teams Track
| Metric | What It Measures | Why It Matters |
|---|---|---|
| Volume of mentions | Total articles per period | Baseline activity and campaign impact |
| Share of voice | Your mentions vs. competitors | Relative media presence |
| Source authority | Tier 1/2/3 publication breakdown | Quality of coverage |
| Geographic spread | Where coverage appears | Regional campaign effectiveness |
| Topic association | Themes linked to your brand | Narrative control and positioning |
| Sentiment indicators | Positive/negative/neutral tone | Brand perception health |
Limitations of Traditional Tools
Enterprise Platforms (Meltwater, Cision)
Enterprise media monitoring platforms are comprehensive, but they come with significant drawbacks. Annual contracts of $10,000 or more lock you in. The interfaces are complex and require training. Custom reporting often requires support tickets. And their data, while broad, is not always more timely than what appears in Google News, which many still use as a primary check anyway.
Google Alerts
Google Alerts is the tool most PR professionals start with, and it has well-known problems. Alert delivery is inconsistent: some queries generate daily emails while others go silent for weeks despite new matching content. There is no API, so you cannot integrate alerts into your own systems. There is no metadata (publication date, source authority, snippet text) in a structured format. And there is no way to aggregate or analyze results across multiple queries.
Manual Searching
Some PR teams assign a junior staff member to search Google News manually every morning. This is time-consuming, error-prone (people miss things), and produces data that lives in a spreadsheet rather than a system. It also does not scale: monitoring five brands with 10 queries each across three search engines means 150 manual searches per day.
The API-First Approach
A news search API solves these problems by giving you programmatic, structured access to news results. With Serpent API, you can query the Google News and DuckDuckGo News endpoints, receive structured JSON responses with article titles, sources, publication dates, and snippets, and feed this data into any system you build.
Available News Endpoints
| Endpoint | Source | Results | Cost (Scale/1K) |
|---|---|---|---|
/api/news?engine=google | Google News RSS | 100+ articles | $0.03 |
/api/news?engine=ddg | DuckDuckGo News | Up to 30 articles | $0.14 |
/api/news?engine=yahoo | Yahoo News | Up to 20 articles | $0.31 |
Google News is the most cost-effective source for media monitoring. At $0.03 per 1,000 searches on the Scale tier, monitoring 50 brand-related queries four times daily costs about $0.18 per month. That is not a typo. The economics of API-based monitoring are radically different from enterprise tool pricing.
Building a Brand Mention Tracker
A practical brand mention tracker queries news APIs on a schedule, deduplicates results, and stores them for analysis. Here is a Python implementation:
import requests
import json
from datetime import datetime
from hashlib import md5
SERPENT_API_KEY = "YOUR_API_KEY"
def fetch_news(query, engine="google", num=50):
"""Fetch news results from Serpent API."""
response = requests.get(
"https://apiserpent.com/api/news",
params={
"q": query,
"engine": engine,
"num": num,
"apiKey": SERPENT_API_KEY
},
timeout=15
)
response.raise_for_status()
return response.json()
def track_brand_mentions(brand_queries, seen_hashes=set()):
"""
Track brand mentions across multiple queries.
Returns only new (unseen) articles.
"""
new_articles = []
for query in brand_queries:
data = fetch_news(query)
articles = data.get("results", {}).get("news", [])
for article in articles:
# Deduplicate by title hash
article_hash = md5(article["title"].encode()).hexdigest()
if article_hash in seen_hashes:
continue
seen_hashes.add(article_hash)
new_articles.append({
"title": article["title"],
"source": article.get("source", "Unknown"),
"url": article.get("url", ""),
"snippet": article.get("snippet", ""),
"published": article.get("date", ""),
"query": query,
"found_at": datetime.now().isoformat()
})
return new_articles, seen_hashes
# Example usage
queries = [
'"Acme Corp"', # Exact brand name
'"Acme Corp" CEO', # Executive mentions
'"Acme Corp" product', # Product mentions
'"Acme Corp" funding', # Business news
]
new_mentions, seen = track_brand_mentions(queries)
print(f"Found {len(new_mentions)} new mentions")
Source Classification
Not all media mentions are equal. A mention in The New York Times carries more weight than a mention in a local blog. Classify sources into tiers to weight your analysis:
TIER_1_SOURCES = {
"nytimes.com", "wsj.com", "reuters.com", "bbc.com",
"bloomberg.com", "forbes.com", "techcrunch.com",
"theverge.com", "wired.com", "cnbc.com"
}
TIER_2_SOURCES = {
"businessinsider.com", "mashable.com", "zdnet.com",
"venturebeat.com", "theregister.com", "arstechnica.com"
}
def classify_source(url):
"""Classify a news source by authority tier."""
from urllib.parse import urlparse
domain = urlparse(url).hostname.replace("www.", "")
if domain in TIER_1_SOURCES:
return "tier_1"
elif domain in TIER_2_SOURCES:
return "tier_2"
else:
return "tier_3"
Measuring PR Campaign Impact
After a press release or media event, the critical question is: how much coverage did it generate? An API-based approach lets you measure this precisely.
Before and After Analysis
Run the same set of brand queries before your campaign launches to establish a baseline. Then run them again at intervals (1 day, 3 days, 7 days) after launch. The difference in volume, source quality, and topic association tells you the campaign's media impact.
def measure_campaign_impact(brand_queries, baseline_count, days_after=7):
"""
Compare current mention volume to pre-campaign baseline.
Returns lift metrics.
"""
current_mentions = []
for query in brand_queries:
data = fetch_news(query)
articles = data.get("results", {}).get("news", [])
current_mentions.extend(articles)
# Deduplicate
unique_titles = set(a["title"] for a in current_mentions)
current_count = len(unique_titles)
# Classify by source tier
tier_counts = {"tier_1": 0, "tier_2": 0, "tier_3": 0}
for article in current_mentions:
tier = classify_source(article.get("url", ""))
tier_counts[tier] += 1
lift = ((current_count - baseline_count) / baseline_count * 100
if baseline_count > 0 else 0)
return {
"baseline_mentions": baseline_count,
"current_mentions": current_count,
"lift_percentage": round(lift, 1),
"tier_breakdown": tier_counts,
"measurement_period_days": days_after
}
Share of Voice Tracking
Share of voice measures how much of the overall media conversation in your industry features your brand versus competitors. This is one of the most valuable metrics for competitive PR.
def calculate_share_of_voice(brands):
"""
Calculate share of voice across brands.
brands: dict of brand_name -> list of search queries
"""
mention_counts = {}
total = 0
for brand, queries in brands.items():
count = 0
for query in queries:
data = fetch_news(query)
articles = data.get("results", {}).get("news", [])
count += len(articles)
mention_counts[brand] = count
total += count
sov = {}
for brand, count in mention_counts.items():
sov[brand] = {
"mentions": count,
"share": round(count / total * 100, 1) if total > 0 else 0
}
return sov
Crisis Communication Monitoring
During a crisis, media monitoring shifts from a routine reporting function to a real-time operational necessity. You need to know what is being published, by whom, and how fast it is spreading.
Rapid Polling
In a crisis, increase your polling frequency from daily to every 30 to 60 minutes. Set up alerts that trigger when mention volume exceeds a threshold (e.g., more than 10 new articles in an hour, compared to a normal rate of 2 to 3 per day).
Narrative Tracking
During a crisis, the specific language used in coverage matters enormously. Track which keywords appear alongside your brand name in article snippets to understand how the narrative is being framed:
def extract_narrative_keywords(articles, brand_name):
"""
Extract frequently co-occurring keywords from article snippets.
Helps track how the media narrative is framing the brand.
"""
from collections import Counter
import re
stop_words = {"the", "a", "an", "is", "are", "was", "were", "in",
"on", "at", "to", "for", "of", "and", "or", "but",
"with", "has", "have", "had", "that", "this"}
word_counts = Counter()
brand_lower = brand_name.lower()
for article in articles:
snippet = article.get("snippet", "").lower()
words = re.findall(r'\b[a-z]{3,}\b', snippet)
meaningful = [w for w in words
if w not in stop_words and w != brand_lower]
word_counts.update(meaningful)
return word_counts.most_common(20)
If your brand name starts appearing alongside words like "lawsuit," "scandal," or "recall," that signals an escalation that requires an immediate response. Conversely, seeing words like "response," "apology," or "resolved" indicates your crisis communications are gaining traction.
Building Media Intelligence Dashboards
The value of media monitoring increases dramatically when data is visualized and accessible to your entire team. A media intelligence dashboard should show:
- Mention timeline — A line chart showing daily mention volume over the past 30/60/90 days
- Source breakdown — Pie chart of Tier 1/2/3 source distribution
- Share of voice — Stacked bar chart comparing your brand to competitors over time
- Topic cloud — Word cloud of frequently co-occurring keywords
- Recent mentions table — Sortable list of the latest articles with source, title, date, and tier
- Alert feed — Real-time stream of high-priority mentions (Tier 1 sources, negative sentiment indicators)
Cost for a Full Media Monitoring Setup
| Use Case | Queries | Frequency | Monthly Cost (Scale) |
|---|---|---|---|
| Single brand monitoring | 10 | 4x daily | $0.04 |
| Brand + 3 competitors | 40 | 4x daily | $0.14 |
| PR agency (10 clients) | 200 | 4x daily | $0.72 |
| Enterprise (global, multi-region) | 500 | Hourly | $10.80 |
Even the most aggressive enterprise monitoring setup costs under $11 per month in API calls. Compare that with Meltwater's starting price of $4,000 per year, and the economics of building your own solution become very clear.
Start Monitoring Your Media Coverage
Get started with Serpent API's news search endpoints. 100 free searches included, no credit card required.
Get Your Free API KeyExplore: News API · SERP API · Pricing · Try in Playground