AnswerLineStart free

, News · Google · Fundamentals

Google News RSS feeds: what they give you and where they stop

Google News RSS feeds are free, need no key, and return up to about 100 recent articles per query as XML. They are also undocumented, restricted to personal non-commercial use by the text inside every feed, and thin: no snippet, no position, no thumbnail, and every link is a Google redirect. For a personal reader or a prototype they are fine. For a product, a client report or anything that needs to reflect what a searcher in a given country sees, use structured results from an API instead.

What a Google News RSS feed is

A Google News RSS feed is an XML document served from news.google.com/rss that lists recent articles for the top stories page, a topic section, or a search query, in the RSS 2.0 format that feed readers consume.

Google does not publish documentation for these feeds on its developer or help sites (we found none on 2026-09-17; only community forum threads discuss them). Everything below is observed behaviour from live feeds checked 2026-09-17.

The three URL shapes

Feed URL pattern Items on 2026-09-17
Top stories https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en 38
Topic section https://news.google.com/rss/headlines/section/topic/TECHNOLOGY?hl=en-US&gl=US&ceid=US:en 52
Search https://news.google.com/rss/search?q=openai&hl=en-US&gl=US&ceid=US:en 100

The three edition parameters travel together:

Keep the three consistent and treat them as one setting per market.

Time windows with when:

Search feeds accept the when: operator inside q. On 2026-09-17, q=openai+when:1d returned 100 items, all from the previous 24 hours, and q=openai+when:1h returned 36 items from the last hour. This is the most useful lever the feeds have: it turns a “whatever Google picked” list into a rolling window you can poll.

What an item contains

We fetched the search feed for openai on 2026-09-17 and inspected every item. Each had these elements:

Element What it held
title Headline followed by - Publisher
link A news.google.com/rss/articles/...?oc=5 redirect URL, on all 100 items
guid An opaque id, isPermaLink="false"
pubDate RFC 822 timestamp
description Escaped HTML: an ordered list of related-coverage links (also redirect URLs) with publisher names in <font> tags
source Publisher name as text, with the publisher’s homepage in the url attribute

The channel adds title, link, language, lastBuildDate, copyright and a few generator fields. There were no media: elements, no images and no article snippet: the description is a cluster of related links, not a summary of the article.

The usage restriction lives in the feed

Each feed’s copyright element states that the feed is made available solely for rendering Google News results in a personal feed reader for personal, non-commercial use, and that any other use is expressly prohibited (source: the feed itself, news.google.com/rss/search?q=openai, checked 2026-09-17). It is the only usage statement the feeds carry. If you are building a monitoring product, a client deliverable or an internal dashboard that feeds a business process, read it before you ship.

The limits that bite in practice

1. No documented contract

The URL shapes, the item cap, operator support and the redirect format are observed behaviour with no published guarantee. A parser that works today can return empty lists after a change, and you will learn about it from a quiet dashboard rather than an error. If you depend on the feed, monitor item counts per query and alert when a query that usually returns dozens suddenly returns zero.

2. Redirect links instead of article URLs

Every link is a Google redirect. To store the publisher URL you either follow the redirect for each item (one extra request per article, and a request pattern that looks nothing like a feed reader) or you settle for source/@url, which is only the publisher’s homepage. Deduplicating the same article across queries is harder without the canonical URL, because the redirect token differs per feed.

3. No position, so no share of voice

RSS order is not the order a user sees on the results page, and items carry no rank. You can count mentions, but you cannot say “our press release held the top news slot in Germany for six hours” or compute a position-weighted visibility score.

4. No snippet and no image

The description element holds related coverage, not a summary. If your alert needs to say what the article says, you have to fetch the article. There is no thumbnail to show in a digest.

5. One page, no pagination

A search feed returns one list. On 2026-09-17 a query for openai with when:1d already filled all 100 items with articles from the previous 24 hours, so on busy topics older items fall out between polls unless you narrow the query or poll more often. There is no documented way to page back.

6. No device dimension

Feeds have no desktop or mobile variant. If your question is what a phone user sees, RSS cannot answer it.

7. Editions are not locations

gl and ceid select a country edition of the feed, which is a different thing from the results page a reader in that country gets for the same search.

Parsing a feed for personal use

For a personal reader or a quick look at coverage, the standard library is enough. This reads a search feed and prints publisher, time and title:

import urllib.parse
import urllib.request
import xml.etree.ElementTree as ET

def google_news_feed(query: str, hl: str = "en-US", gl: str = "US", ceid: str = "US:en") -> list[dict]:
    url = "https://news.google.com/rss/search?" + urllib.parse.urlencode(
        {"q": query, "hl": hl, "gl": gl, "ceid": ceid}
    )
    with urllib.request.urlopen(url, timeout=20) as resp:
        root = ET.fromstring(resp.read())
    items = []
    for item in root.iter("item"):
        source = item.find("source")
        items.append({
            "title": item.findtext("title"),
            "redirect": item.findtext("link"),
            "published": item.findtext("pubDate"),
            "publisher": source.text if source is not None else None,
            "publisher_home": source.get("url") if source is not None else None,
        })
    return items

for row in google_news_feed("renewable energy when:1d")[:10]:
    print(row["published"], row["publisher"], row["title"])

Strip the - Publisher suffix from title before comparing headlines, and key your own deduplication on guid plus publisher_home, since the redirect URL is not stable across feeds.

Structured news results via API

A Google News results API returns the news results page itself as typed JSON: one object per article, in the order shown, with the fields a feed leaves out.

This API’s endpoint is POST /v1/monitor/google/news. It takes a query, a country as country or gl, optionally hl for the interface language and device (desktop, mobile, ios or android):

curl -X POST https://api.answerline.dev/v1/monitor/google/news \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "renewable energy", "country": "DE", "hl": "de", "device": "mobile" }'

The response holds result.newsResults[]. Each entry has:

Field Meaning
position 1-indexed position in the news results
title Headline, without a publisher suffix
link The article URL
redirectLink Google’s redirect, present only when Google served one; link then holds the resolved destination
snippet Text describing the article
source Publisher name
date Publication date as displayed, for example 2 hours ago
thumbnail Image URL, when the page shows one
page Results page the item appeared on

include.html adds URLs to the raw page HTML if you want to archive what was served.

The same query in Python

import os
import requests

resp = requests.post(
    "https://api.answerline.dev/v1/monitor/google/news",
    headers={"Authorization": f"Bearer {os.environ['ANSWERLINE_API_KEY']}"},
    json={"query": "renewable energy", "country": "DE", "hl": "de"},
    timeout=360,
)
resp.raise_for_status()
for item in resp.json()["result"]["newsResults"]:
    print(item["position"], item["source"], item["title"], item["link"])

Synchronous calls wait for the result, which is convenient for a spot check. For scheduled polling, submit async tasks instead; they cost less and can be batched (see below).

RSS versus API, side by side

Question Google News RSS News results via this API
Documented contract No OpenAPI document (reference)
Usage terms Personal, non-commercial (feed copyright text) Your API agreement
Article URL Redirect only link resolved, redirectLink kept
Position No position and page
Snippet No (related links instead) snippet
Thumbnail No thumbnail when shown
Publisher source text and homepage source
Timestamp pubDate (absolute) date as displayed (often relative)
Market Edition via hl, gl, ceid country or gl, plus hl
Device No desktop, mobile, ios, android
Time window when:1h, when:1d in q Put the operator in query if you rely on it; verify results
Cost Free 3 credits per async task, 5 synchronous
Delivery You poll Sync, async polling or signed webhooks

One trade-off runs the other way: pubDate is an absolute timestamp, while the results page shows relative dates such as 2 hours ago. Store your own fetched_at with every row and convert relative dates against it, keeping the raw string alongside.

When RSS is enough

Use the feeds when all of these hold:

  1. The use is personal or a throwaway prototype, consistent with the feed’s own terms.
  2. You need some recent coverage, and the view of a specific market and device does not matter.
  3. Position, snippets and images do not matter.
  4. A silent break would not cost anything.

When to use structured results

Use an API when any of these hold:

  1. It is a product or a business process. Client alerts, PR reporting, adverse media screening and trading signals all fall outside personal use.
  2. Position matters. Share of voice in news, “who leads the story”, and pickup velocity all need ranks.
  3. Markets matter. Comparing how a story plays in the US, Germany and Japan needs country and language per request, and a mobile view when your audience reads on phones.
  4. You need to say what the article says. Snippets let an alert stand on its own without fetching every page.
  5. Breaks must be loud. A typed error with a code beats an empty XML list.

Moving a feed poller to the API

The migration is mostly a change of fetch function; the storage and dedupe logic stay.

  1. Map each feed to a task. One feed URL becomes one task payload: q to query, gl to country, the language part of hl to hl. Keep when: in the query only if you test that the results page honours it for your queries.
  2. Key tasks by meaning. Build an idempotencyKey from query id, market and polling window, such as news:acme:DE:2026-09-17T14. Re-running a submission after a crash then creates nothing twice. Idempotency keys explained covers the design.
  3. Submit on a schedule. Send every query for the window in one POST /v1/async/task/batch call (1 to 500 tasks per batch) with taskType: "GOOGLE_NEWS".
  4. Receive by webhook. Add webhook: {"url": ...} to each task and verify the Webhook-Signature header; see verifying webhook signatures.
  5. Dedupe on link. The resolved article URL is stable across queries and markets, which RSS redirect URLs are not. Keep first-seen time, best position and the markets it appeared in.
  6. Alert on transitions. New article for an entity, an article entering the top three, or a publisher appearing for the first time.
import os
import requests

API = "https://api.answerline.dev"
HEADERS = {"Authorization": f"Bearer {os.environ['ANSWERLINE_API_KEY']}"}

queries = {"acme": "acme corp", "rival": "rival inc"}
markets = [("US", "en"), ("DE", "de"), ("JP", "ja")]
window = "2026-09-17T14"

tasks = [
    {
        "taskType": "GOOGLE_NEWS",
        "payload": {"query": text, "country": country, "hl": hl},
        "idempotencyKey": f"news:{qid}:{country}:{window}",
        "webhook": {"url": "https://example.com/hooks/news"},
    }
    for qid, text in queries.items()
    for country, hl in markets
]

batch = requests.post(f"{API}/v1/async/task/batch", headers=HEADERS, json=tasks, timeout=60).json()
for item in batch["results"]:
    if not item["success"]:
        print(tasks[item["index"]]["idempotencyKey"], item["error"]["code"])

A RESOURCE_ALREADY_EXISTS item on a re-run means the task was already created for that window, which is the outcome you want.

What polling costs

A Google News async task costs 3 credits, a synchronous call 5. Failed tasks are not charged.

Cadence is the biggest cost lever. Poll fast-moving entities hourly and the long tail every few hours; monitoring cadence discusses how to set intervals by volatility. For current plan pricing see /pricing.

Pitfalls

For a broader view of news data sources, see free news APIs compared and Google Alerts alternatives with an API. The news monitoring use case shows the full pipeline shape.

Start with the Google News engine page or the quickstart.

Questions

Does Google News still offer RSS feeds?

Yes. On 2026-09-17, feeds at news.google.com/rss for top stories, topic sections and search queries returned valid RSS. Google does not document them on its developer or help sites, so the URL formats could change without notice.

Can I use Google News RSS feeds in a commercial product?

The copyright element inside each feed says it is made available for rendering Google News results in a personal feed reader for personal, non-commercial use, and that any other use is prohibited. Read that text in the feed you plan to use before building a product on it.

How many items does a Google News RSS search feed return?

A search feed for a common query returned 100 items when checked on 2026-09-17, and a narrower query with when:1h returned 36. There is no documented pagination, so you cannot fetch more than one feed's worth per query.

Why do Google News RSS links point to news.google.com instead of the publisher?

Every item link in the feeds checked on 2026-09-17 was a news.google.com/rss/articles redirect URL. The publisher's homepage appears only in the source element's url attribute, so you need an extra step to get the article URL.

What does a Google News results API add over RSS?

This API's Google News endpoint returns the results page as JSON with position, title, link, snippet, source, date, thumbnail and redirectLink per article, targeted by country, interface language and device. An async task costs 3 credits.

Try it on your own prompts

500 free credits a month, no card. One POST returns the answer, sources and citations as JSON.

Keep reading