Google News API & URL Decoder: Real Article URLs avatar

Google News API & URL Decoder: Real Article URLs

Pricing

from $1.26 / 1,000 news article returneds

Go to Apify Store
Google News API & URL Decoder: Real Article URLs

Google News API & URL Decoder: Real Article URLs

Google News API and URL decoder: search any keyword or topic in any country, or paste news.google.com/rss/articles links or RSS feed URLs, and get the publisher's real article URL as JSON (searches add title, date, snippet). $0.80 per 1,000 decoded links; failures free. Unofficial.

Pricing

from $1.26 / 1,000 news article returneds

Rating

0.0

(0)

Developer

hiver

hiver

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 hours ago

Last modified

Categories

Share

An API for Google News: send a keyword, a full Google News query or a topic section, for any country and language edition, and get JSON back. One row per article: title, publisher, the publisher's real article URL (Google News RSS links are encoded news.google.com redirects; this Actor decodes them), publish time, snippet, image and the search that found it. Switch on only new since last run and schedule it to monitor a brand, a topic or a keyword.

Already have news.google.com/rss/articles/... links? Paste them (or a Google News RSS feed URL) into articleUrls and get one row per link with the publisher's article URL, at $0.80 per 1,000 decoded links. Links that cannot be decoded come back as free rows with the reason (for example not_decoded: Google rate-limited, retry later) and the run still succeeds. See Decode Google News links below, or use the free decoder script (Python, CSV out).

Google has no official Google News API: it retired its News Search API (deprecated 2011, switched off 2016). This Actor reads the public Google News RSS feeds instead and is called like any API (Python, JavaScript or plain HTTP, below).

Google News API on the Apify Store: keyword searches and topic sections in any country and language, then the bench table

Watch the 1.5-minute walkthrough (MP4) · Free example on GitHub: daily Google News alerts to Slack or Discord

Unofficial. Not affiliated with, endorsed by or sponsored by Google or Microsoft. It reads the public Google News and Bing News RSS feeds, with no login, at a polite pace (about 2 requests a second to Google at most), and never tries to get around a block. Article titles and snippets belong to their publishers; check the terms of the feeds and sites before you republish them.

Measured against the alternatives

Our board's Lab bench gives this Actor and two of the most-used Google News Actors on the Apify Store the same two searches, past 7 days: one in the US English edition, one in the German edition. Answers are checked against 14 facts read by hand from the Google News feed and the publishers' own pages (article URL, publisher, date, snippet, image). The two latest runs, 2026-10-10:

This ActorMost-used Google News ActorAnother popular Google News Actor
Facts matched, 05:24 UTC run (our build 0.1.11)14 of 144 of 144 of 14
Facts matched, 03:46 UTC run (our build 0.1.9)12 of 1414 of 144 of 14
Fields filled, 05:24 / 03:46 UTC86% / 83%67% / 87%83% / 83%
Price per 1,000 articles in these runs$1.63$4.00$2.67
Run time per search, 05:24 UTC10.4 s17.2 s2.8 s

Our article URL, publisher and date checks matched in both runs, at less than half the most-used Actor's price. The most-used one has a link-decoding option (on in both runs): at 03:46 UTC it decoded its news.google.com links and filled one snippet and one image we missed; at 05:24 UTC it returned the encoded news.google.com/rss/articles/... links, so its URL checks failed. The other alternative matched 4 of 14 in both runs (encoded links at 05:24 UTC), and it is much faster. Two searches is a small sample; the bench runs again after every new build.

Use it as a Google News API

Get your Apify API token (free account; Apify Console > Settings > API & Integrations), then:

Python (pip install "apify-client>=3.2")

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hiver/google-news-scraper").call(run_input={
"queries": ["electric vehicles"],
"country": "US", "language": "en",
"timeWindow": "day", "maxItems": 50,
})
for article in client.dataset(run.default_dataset_id).iterate_items():
print(article["publishedAt"], article["publisher"], article["url"])

HTTP (one call, waits for the run and returns the rows as JSON)

curl -X POST "https://api.apify.com/v2/acts/hiver~google-news-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["electric vehicles"], "timeWindow": "day", "maxItems": 20}'

Add &format=csv to that URL for CSV. The same input works from JavaScript (apify-client), Make, Zapier, n8n and Apify schedules.

Paste encoded article URLs into articleUrls, or supply a Google News RSS feed URL:

{
"articleUrls": ["https://news.google.com/rss/search?q=business&hl=en-US&gl=US&ceid=US:en"],
"maxItems": 20
}

Article URL paths /rss/articles/<id>, /articles/<id> and /read/<id> are accepted, with or without query strings. /rss/search, /rss/topics and /rss/headlines feeds expand into item links in feed order. Duplicate article IDs are returned once, in first-input order. queries and topics are optional; if supplied too, links run first and all modes share maxItems.

Set maxItems to at least the number of links you paste (default 50, up to 5,000): it caps the rows of the whole run, and error rows count toward it.

Each link row has inputUrl, url, urlResolved, publisherDomain and status. Status is decoded, not_google_news_link, or not_decoded: <reason>; an unresolved publisher URL is null. Feed items also carry title, publisher and UTC publication date; directly pasted articles leave these three fields null. The Output tab has a Decoded Google News links view.

This mode never fetches publisher pages, snippets or Bing, regardless of addSnippets. Only successful rows charge decoded-link; duplicates and error rows are free. Query/topic rows continue to charge article. Google requests keep the existing pacing and backoff; after repeated 429/503 or sorry responses, remaining links produce free not_decoded: Google rate-limited, retry later rows and the run finishes successfully. No IP rotation or block bypass.

A real run. The board's test run of build 0.1.16 (2026-10-12, run OWYXDZh9msX4hICmK, 512 MB) got 8 links: 5 Google News article links, the first one again without ?oc=5, a made-up article id and a non-Google URL. It returned 7 rows in 15 seconds: the 5 publisher URLs below (the Lab checked each against the expected article), the repeated link once, and 2 free error rows. Apify recorded 5 decoded-link charges and no article charges.

inputUrl (shortened)urlstatus
news.google.com/rss/articles/CBMiowFB...?oc=5https://www.scotusblog.com/2026/10/trump-announces-committee-investigation-of-fed-governor-lisa-cook/decoded
news.google.com/rss/articles/CBMipwFB...?oc=5https://www.aljazeera.com/economy/2026/10/9/trump-launches-probe-into-federal-reserve-governor-lisa-cookdecoded
news.google.com/articles/CBMiiAFB...https://www.nbcnews.com/business/economy/trump-probe-fed-gov-lisa-cook-rcna602500decoded
news.google.com/rss/articles/CBMib0FV...?oc=5https://www.cnbc.com/2026/10/09/american-debt-delinquency.htmldecoded
news.google.com/rss/articles/CBMi1wFB...?oc=5https://www.deutschlandfunk.de/bundesbank-vorstandsmitglied-theurer-sieht-noch-keine-systemische-staatsschuldenkrise-aber-warnsigna-100.htmldecoded
news.google.com/rss/articles/CBMiNOTAREALID...nullnot_decoded: Google did not return a publisher URL
example.com/news/storynullnot_google_news_link

Google decides how fast it answers. In the board's run of the previous build 25 minutes earlier (0.1.15, same 8 links), Google refused that worker's requests from the start: no link was decoded, all 7 rows came back free (not_decoded: Google rate-limited, retry later for 5 of them), nothing but the run start was charged, and the run still ended as succeeded after 102 seconds. Re-send such rows later.

From Python (for googlenewsdecoder users): same token and client as above.

run = client.actor("hiver/google-news-scraper").call(run_input={
"articleUrls": links, # news.google.com/rss/articles/... links and/or RSS feed URLs
"maxItems": 1000, # row cap for the whole run: error rows count, a feed URL adds one row per item
})
for row in client.dataset(run.default_dataset_id).iterate_items():
print(row["status"], row["url"]) # url is None unless status == "decoded"

What it does

  • Searches: plain keywords or Google News operators: "exact phrase", OR, -exclude, intitle:, site:, source:. Many searches per run; each row says which search found it (query), and an article found by several searches is returned once (allQueries).
  • Topic sections: Top stories, World, Nation, Business, Technology, Entertainment, Sports, Science, Health, for the edition you choose.
  • Editions: any country + language pair Google News offers (US/en, GB/en, DE/de, FR/fr, BR/pt, JP/ja, IN/en ...).
  • Time window: past hour, 24 hours, 7 days, 30 days, 90 days or a year.
  • More than 100 per search: one Google News request returns about 100 articles. For bigger limits the Actor splits the window into days and asks again, de-duplicating (test: electric vehicles, 30 days, limit 250 returned 250 articles, 247 distinct headlines, in 12 seconds without link resolving).
  • Publisher URLs: Google's links are encoded redirects. By default each is resolved to the real article URL and publisher domain (urlResolved). A link that cannot be resolved is kept and flagged urlResolved: false, never silently dropped.
  • Snippets and images: addSnippets is on by default. For each resolved article, one normal GET reads meta name=description (or og:description) into snippet and og:image into imageUrl. Bing descriptions are fallback when metadata is missing. Three workers share a six-second metadata budget and read at most 512 KiB per page. Only HTTP 200 HTML is parsed; 401/403/429 or recognized challenges leave both fields null. No retries, redirect following, login, proxies or bypass. Turning this option off skips Bing and article metadata.
  • Publisher filters: keep or drop domains, for example only reuters.com, or no msn.com.
  • Monitor mode: onlyNew + monitorId returns only articles that earlier runs with that ID did not return. The first run is the baseline. Use Apify schedules and webhooks for alerts, or the ready-made Slack/Discord alert repo in the FAQ.
  • Hard limits: maxItems stops the whole run (and billing) exactly there; maxItemsPerQuery limits each search. Newest first by default.

Output (one row per article: a real bench row, build 0.1.11, 2026-10-10, German edition)

{
"query": "Lufthansa A340-600",
"title": "Lufthansa verabschiedet den Airbus A340-600",
"publisher": "airliners.de",
"publisherUrl": "https://www.airliners.de",
"publisherDomain": "airliners.de",
"url": "https://www.airliners.de/lufthansa-verabschiedet-airbus-a340-600/90593",
"urlResolved": true,
"publishedAt": "2026-10-05T08:30:00Z",
"snippet": "Lufthansa mustert den Airbus A340-600 aus: Der letzte Linienflug LH419 landet am 19. Oktober in Frankfurt. ...",
"imageUrl": "https://images.airliners.de/2024/10/presseburo-spath-026-KLBCAa__wide__1320?v=1729069132",
"sourceFeeds": ["google", "bing"],
"allQueries": ["Lufthansa A340-600"],
"edition": "DE:de"
}

Topic rows have topic set instead of query. A run with no results writes one row with a note explaining why; it is not charged.

Pricing

Pay per event: $0.0018 per article returned by a search or topic ($1.80 per 1,000), and $0.0008 per Google News link decoded in articleUrls mode ($0.80 per 1,000; link mode reads no publisher pages, snippets or images). Notes, errors, duplicate links and already-seen articles in only-new mode are free. Set maxItems to cap the cost.

Speed

Default input (2 searches + 1 section, 40 articles, links resolved): about 1 minute. Link mode: the board's 8-link test run above took 15 seconds in total. Resolving costs about 1 second per article; turn resolvePublisherUrl off for roughly 10x faster runs.

Good to know

  • Google News shows what Google News shows: results depend on the edition and change minute to minute. The Actor does not rank or filter beyond what you set.
  • Section feeds return the current headlines of the edition; the time window trims them but cannot reach back further than the feed holds.
  • Dates are UTC. Rows are not de-duplicated across different runs unless onlyNew is on.
  • If Google or Bing refuse requests, the Actor backs off, stops using that host for the rest of the run and says so in the log or the note row. It does not try to bypass the block.
  • For a list of companies with name disambiguation use Company News Monitor from the same publisher.

Pricing table & example

Pay per event. Prices per 1,000 events, by Apify plan (higher plans get a discount automatically):

EventFreeStarter (Bronze)Scale (Silver)Business (Gold)
News article returned (article)$1.80$1.62$1.44$1.26
Google News link decoded (decoded-link)$0.80$0.70$0.65$0.60

Worked example: 5,000 billable article events on the Free plan cost 5,000 × $0.0018 = $9.00; on Gold, 5,000 × $0.00126 = $6.30. Decoding 10,000 Google News links on the Free plan costs 10,000 × $0.0008 = $8.00. Rows that the Price section lists as free cost nothing. Apify platform usage is included in these prices.

Input example

{
"queries": [
"artificial intelligence regulation",
"\"supply chain\" AND semiconductors"
],
"topics": [
"TECHNOLOGY"
],
"country": "US",
"language": "en",
"timeWindow": "week",
"maxItemsPerQuery": 15,
"maxItems": 40
}

FAQ

Is there an official Google News API?
No. Google retired its News Search API (deprecated 2011, switched off 2016). The public Google News RSS feed still exists but gives encoded news.google.com links and no snippets; this Actor turns that feed into JSON rows with the publisher's URL, snippet and image.

How do I turn a news.google.com link into the real article URL?
Paste it into articleUrls (a list of links, or a Google News RSS feed URL): each row's url is the publisher's article URL, at $0.80 per 1,000 decoded links, and a link that cannot be decoded comes back free with the reason in status. When you search by keyword or topic instead, leave resolvePublisherUrl on (the default): each article's Google link is decoded the same way, and one that cannot be decoded is kept and flagged urlResolved: false, never dropped.

Using the gnews Python package and getting news.google.com links?
gnews reads the same Google News RSS feed, so get_news() returns the encoded news.google.com/rss/articles/... links (a default install of gnews 0.8.3 on 2026-10-12 returned 20 of 20 links in that form); its README says real article URLs need its Playwright extra (a headless Chromium) or a SearchApi key. Send the same keyword in queries here and each row's url is already the publisher's article URL, or paste the links you already have into articleUrls. Ready-made example: gnews real article URLs.

What happens when Google answers HTTP 429?
The Actor paces its requests to Google and backs off. If Google keeps refusing, the remaining links come back as free not_decoded: Google rate-limited, retry later rows and the run still succeeds. It does not rotate IPs or try to get around the refusal, so send those links again later.

How many articles per search?
One Google News request returns about 100. For larger limits the Actor splits the time window into days; the total is also bounded by what the news feed holds.

Why do some rows have no snippet?
Google News feeds carry none. By default the Actor reads the resolved publisher page's description and thumbnail metadata; Bing descriptions are fallback. Missing tags, redirects, refusals, challenges and the six-second metadata budget can leave snippet or imageUrl null. On the 2026-10-10 05:24 UTC bench (build 0.1.11) every hand-checked snippet and image matched; on the earlier 03:46 UTC run (build 0.1.9) one US article's snippet and image were missing.

Can I monitor a topic?
Yes: only-new plus a monitor ID, on an Apify schedule. The first run is the baseline. For alerts in Slack, Discord or a daily Markdown digest, the free google-news-alerts repo runs this Actor from GitHub Actions once a day, posts only articles it has not sent before and links each one to the publisher's article (Python, MIT, 20 offline tests).

Is this official?
No. Unofficial and not affiliated with, endorsed by or sponsored by any company or site named in the results or this README.

Something looks wrong or you need a field added?
Open an issue from the Actor's Issues tab with the input and run link.