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:
hlis the interface language, such asen-USorde.glis the country edition, such asUSorDE.ceidcombines them asCOUNTRY:language, such asUS:enorDE:de.
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:
- The use is personal or a throwaway prototype, consistent with the feed’s own terms.
- You need some recent coverage, and the view of a specific market and device does not matter.
- Position, snippets and images do not matter.
- A silent break would not cost anything.
When to use structured results
Use an API when any of these hold:
- It is a product or a business process. Client alerts, PR reporting, adverse media screening and trading signals all fall outside personal use.
- Position matters. Share of voice in news, “who leads the story”, and pickup velocity all need ranks.
- 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.
- You need to say what the article says. Snippets let an alert stand on its own without fetching every page.
- 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.
- Map each feed to a task. One feed URL becomes one task payload:
qtoquery,gltocountry, the language part ofhltohl. Keepwhen:in the query only if you test that the results page honours it for your queries. - Key tasks by meaning. Build an
idempotencyKeyfrom query id, market and polling window, such asnews:acme:DE:2026-09-17T14. Re-running a submission after a crash then creates nothing twice. Idempotency keys explained covers the design. - Submit on a schedule. Send every query for the window in one
POST /v1/async/task/batchcall (1 to 500 tasks per batch) withtaskType: "GOOGLE_NEWS". - Receive by webhook. Add
webhook: {"url": ...}to each task and verify theWebhook-Signatureheader; see verifying webhook signatures. - 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. - 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.
- 20 entities in 3 markets, hourly during a 12-hour business day: 20 × 3 × 12 = 720 tasks, 2,160 credits a day.
- The same set every four hours around the clock: 20 × 3 × 6 = 360 tasks, 1,080 credits a day.
- The free tier’s 500 credits a month cover 166 async news tasks: enough to validate queries and markets before you schedule anything.
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
- Treating the feed as the page. RSS order and membership differ from the results page. Do not report RSS counts as “Google News visibility”.
- Ignoring the copyright element. It is the only usage statement the feeds carry, and it is restrictive.
- Deduping on redirect URLs. The same article gets different redirect tokens in different feeds.
- Polling too slowly for broad queries. A 100-item window on a busy topic rolls over in hours; narrow the query or shorten the interval.
- Comparing relative dates across runs.
2 hours agomeans different times on different fetches; storefetched_at. - One market for a global brand. Coverage in Germany and Japan is not a translation of US coverage. Query each market in its own language.
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.