Industry

PR & Media Monitoring with News Search API

By Serpent API Team· · 9 min read

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

MetricWhat It MeasuresWhy It Matters
Volume of mentionsTotal articles per periodBaseline activity and campaign impact
Share of voiceYour mentions vs. competitorsRelative media presence
Source authorityTier 1/2/3 publication breakdownQuality of coverage
Geographic spreadWhere coverage appearsRegional campaign effectiveness
Topic associationThemes linked to your brandNarrative control and positioning
Sentiment indicatorsPositive/negative/neutral toneBrand 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

EndpointSourceResultsCost (Scale/1K)
/api/news?engine=googleGoogle News RSS100+ articles$0.03
/api/news?engine=ddgDuckDuckGo NewsUp to 30 articles$0.14
/api/news?engine=yahooYahoo NewsUp 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 CaseQueriesFrequencyMonthly Cost (Scale)
Single brand monitoring104x daily$0.04
Brand + 3 competitors404x daily$0.14
PR agency (10 clients)2004x daily$0.72
Enterprise (global, multi-region)500Hourly$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 Key

Explore: News API · SERP API · Pricing · Try in Playground