Track brand and competitor mentions with the Google News API

Poll a set of query terms on a schedule, dedupe by article link, and see only what changed since the last run. Tested against a real response in August 2026.

You want to know when your company, your product, or a competitor gets mentioned in the news. Google Alerts already does something like this, but it shows up as an email on Google’s own schedule, mixed into your inbox with every other alert you have running, and there is nothing to hook a script to. What you actually want is a query you control, on your own schedule, that tells you only what changed since the last time you checked.

What /v1/news gives you

Send a query to /v1/news and you get back news_results, a list of articles with a title, a snippet, a source (the publication name, not a domain), a url, and a field called lastUpdated. We ran this against the phrase “web scraping api” while writing this post, in August 2026, and got 10 articles back for 5 credits, from sources including 24-7 Press Release Newswire, HackerNoon and KDnuggets. In your own job the query is your brand name, your product name, or a competitor’s name instead.

The catch with “since last run”

The obvious way to find new articles is to compare lastUpdated against the last time you polled. Do not build it that way. In our sample, lastUpdated came back as “2 days ago” for one article and “May 12, 2026” for another, in the same response. Google News mixes relative and absolute formats depending on how recent an article is, and parsing “2 days ago” correctly means knowing exactly when the request ran, in what timezone, and redoing that math every time.

The url field works better as a dedupe key, even though it is not the publisher’s bare link. It is a relative Google redirect path, starting with /goto?url=, not something you would show a reader as-is, but every article in the response gets a different one, which is exactly what a dedupe key needs. Keep a set of url values you have already seen, on disk, and treat anything not in that set as new.

Poll it like a scheduled job

import json
import requests

API_KEY = "faf_live_..."  # your FastAF key
SEEN_FILE = "seen_articles.json"

def fetch_news(query):
    resp = requests.get(
        "https://api.fastaf.co/v1/news",
        params={"query": query, "results": 10},
        headers={"Authorization": f"Bearer {API_KEY}"},
        timeout=60,
    )
    resp.raise_for_status()
    return resp.json()["news_results"]

def load_seen():
    try:
        with open(SEEN_FILE) as f:
            return set(json.load(f))
    except FileNotFoundError:
        return set()

def save_seen(seen):
    with open(SEEN_FILE, "w") as f:
        json.dump(sorted(seen), f)

seen = load_seen()
new_articles = []

for term in ["Acme Robotics", "Acme Robotics recall"]:
    for article in fetch_news(term):
        link = article["url"]
        if link in seen:
            continue
        seen.add(link)
        new_articles.append((term, article))

save_seen(seen)

for term, a in new_articles:
    print(f'[{term}] {a["source"]} ({a["lastUpdated"]}): {a["title"]}')

Run this from cron, or whatever scheduler you already use, once an hour or once a day. The first run prints everything, because seen_articles.json does not exist yet. Every run after that prints only articles whose url was not already in the file: no re-reading yesterday’s mentions, no digest email to skim, just what is new.

What this will not do

This queries Google’s news index, not a firehose of everything published anywhere. If an outlet is not indexed by Google News, a mention there will not show up no matter how often you poll, because the endpoint sees the same index a person would see on the results page. Polling more often closes the gap between publication and Google indexing it; it does not add sources Google News does not already have.

What it costs

A call is 5 credits. Watching three terms an hour apart is 72 calls a day, 360 credits a day, about 10,800 credits a month: the $10 Starter pack’s 20,000 credits cover almost two months of it, and the $29 Growth pack’s 75,000 nearly seven. Failed requests are not charged, so getting the query terms wrong a few times costs nothing.

Start with the free tier, 500 credits and no card, which is 100 calls: enough to run a few terms for a day and see what your own market actually looks like in Google News before committing to a schedule.