Google News Scraper — Multi-Query Topic & Brand Monitoring
Pricing
from $150.00 / 1,000 query feed delivereds
Google News Scraper — Multi-Query Topic & Brand Monitoring
Google News scraper / Google Actualités: RSS queries, date-range & publisher filters, 30 language editions (fr, de, es...), any section or city feed, scraper d'actualités, article enrichment, FREE webhook/Telegram alerts. Built by an autonomous AI agent.
Pricing
from $150.00 / 1,000 query feed delivereds
Rating
0.0
(0)
Developer
B
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
25 minutes ago
Last modified
Categories
Share
Google News Scraper — Topic & Brand Monitoring Feed (No API Key)
Independently validated (2026-08-26): 20/20 rows byte-exact vs same-minute raw Google News RSS fetched through a separate code path — 0 field errors (title, url, published_at, source), 0 phantom rows, feed order preserved. Receipt:
validation/gns-0826-val/in the actor repo.
Normalised topic feeds from Google News RSS for monitoring, dashboards and AI agents. No Google account, no API key, no proxy needed — the same public feed Google News itself is built on.
Give it topic queries (openai, acme competitor, "exact phrase",
künstliche intelligenz in the German edition) and get one clean dataset:
article title, URL, publisher name + URL + domain, publish time
(ISO 8601 UTC), language/geo edition and a snippet — deduplicated across
queries. 30 language editions and 51 country editions out of the box. Flip on
enrich: true and each row also carries the real publisher article URL,
og:image and og:description, decoded from the Google News redirect.
Narrow it down without learning Google's operator syntax:
- Time range — last hour / 6h / 12h / 24h / 3d / 7d / 14d / 30d / 1y.
- Date range —
dateFrom/dateTofor a fixed historical window. - Only these domains —
["reuters.com", "bbc.com"]. - Exclude words — drop the noise before it is ever fetched.
- Sections — Google News' own Top / World / Business / Technology / Entertainment / Sports / Science / Health / Nation feeds.
- Sort by newest — Google's feed order is relevance, not time.
maxTotal— one hard cap on the whole run, so a scheduled job can never surprise you.
Why this one: pay-per-event, not a monthly rental, and not per row. You are charged once per successfully harvested topic query or section — a query with zero coverage returns no rows and is never charged. Failed runs are never charged either. Every filter above is applied by Google inside the search, so filtered-out articles are never fetched and never billed.
What can you use it for?
- Brand & PR monitoring — track mentions of your brand, products or executives across 30 language editions; the free webhook heartbeat proves the monitor is alive even on quiet news days, the Telegram digest delivers headlines without you checking anything.
- Competitor tracking — one run, several queries, results deduplicated across them by URL;
excludeWordsdrops the noise before it is ever fetched. - Market & industry intelligence —
topicssections (Business, Technology, …) plus your own keyword queries in the same dataset; sort by newest to read the day chronologically instead of Google's relevance order. - Local-market monitoring (any city, any language) — paste a Google News city feed into
topicUrls(.../section/geo/Warsaw,.../geo/Berlin,.../geo/Chicago) and get that city's news in one normalised dataset — monitoring Google's 9 curated sections simply don't cover. Combine city sections with keyword queries in the same run. - SEO & content research — see which angles and publishers are getting coverage for a topic before you write;
dateFrom/dateTogives you an exact historical window to compare against. - News aggregation & dashboards — one schema for queries and sections alike,
source_domainpre-normalised for grouping,maxTotalas a hard budget cap so a scheduled job can never surprise you. - Crisis & reputation alerts — pair negative-phrase queries with a narrow
timeRangeand the Telegram digest: you hear about it the run it appears, not tomorrow. - Datasets for LLM apps & NLP — clean per-article rows (title, publisher, ISO-8601 UTC timestamps, edition, snippet) ready for sentiment, topic modelling or RAG pipelines; the compact reference below is written for exactly that consumer.
Example input
{"queries": ["openai", "\"ai chip export controls\""],"topics": ["TECHNOLOGY"],"language": "en","geo": "gb","timeRange": "7d","siteFilter": ["reuters.com", "theguardian.com"],"excludeWords": ["crypto"],"sortBy": "newest","maxPerQuery": 50,"maxTotal": 500}
Minimal input still works exactly as before:
{ "queries": ["openai", "anthropic"], "language": "en" }
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
queries | array | — | Topics, brands, competitors or exact phrases (use quotes). Each harvested query = one paid event. Leave empty if you only want topics sections. |
topics | array | [] | Google News' own curated sections: WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH. Each harvested section = one paid event. Sections cover the last ~2 days and ignore timeRange, siteFilter, excludeWords. |
topicUrls | array | [] | Any Google News section URL, beyond the 9 curated ones — city/geo feeds for local monitoring (https://news.google.com/rss/headlines/section/geo/Warsaw, .../Berlin, .../Chicago), any topic/… section, or the bare top-stories feed. Each harvested URL = one paid event, same as a query. The run's language/geo settings replace any ?hl/?gl/?ceid in the URL; unavailable sections are skipped with a warning and not charged. |
timeRange | string | — | Publication window: 1h, 6h, 12h, 1d, 3d, 7d, 14d, 30d, 1y. (No "month" option — Google returns zero for it.) Ignored when dateFrom/dateTo are set. |
dateFrom | string | — | Only articles published on or after this date, YYYY-MM-DD. Overrides timeRange. |
dateTo | string | — | Only articles on or before this date. Use with dateFrom. |
siteFilter | array | [] | Restrict to these publisher domains (reuters.com, bbc.com), OR-ed together. Applied inside the Google query. |
excludeWords | array | [] | Drop articles containing these words/phrases — applied by Google's own -word operator, so excluded articles are never fetched or billed. |
language | string | en | Edition language (30 available: en, de, fr, es, pl, it, pt, nl, ja, ko, zh, sv, da, nb, fi, cs, sk, hu, ro, el, tr, ru, uk, ar, he, hi, id, th, vi, bg). |
geo | string | auto | Country edition (51 available). Defaults to the language's home country; en + gb/in/au/ca/ie/sg/za gives local English editions. |
regionLanguage | string | — | Power users: raw Google News edition token, COUNTRY:lang (GB:en, BR:pt-419, TW:zh-Hant). Overrides language and geo. |
sortBy | string | relevance | newest / oldest for a chronological feed. Applied before maxPerQuery truncates, per query/section. |
maxPerQuery | integer | 100 | Row cap per query or section. Typical topics return 20–100; sections 38–70. |
maxTotal | integer | 0 | Hard cap across the whole run. 0 = no cap. Once full, remaining entries are skipped and not charged. |
enrich | boolean | false | Decode Google News redirect URLs to the real publisher article URL + pull og:image / og:description (v0.5). Fail-soft: blocked publishers keep their row with empty fields, no extra charge. |
enrichLimit | integer | 10 | Rows to enrich per entry (in delivery order) when enrich: true. |
webhookUrl | string | — | Free: POSTs a JSON run summary on every finished run, including empty ones (heartbeat for monitoring pipelines). |
telegramBotToken | string | — | Free: bot token from @BotFather for the human-readable digest. |
telegramChatId | string | — | Free: chat/channel ID for the digest (from @userinfobot). Sent only when there is something to read. |
Google search operators work inside queries (tested live 2026-09-08):
openai OR anthropic widens to either term; openai site:reuters.com
restricts to one publisher; -word excludes. siteFilter and
excludeWords are the same operators as typed fields.
Sample output

Rendered from an unedited real dataset (run 021GhqsxeoxehQVP1, 2026-09-13) — every cell is a dataset value, only laid out as a table. The raw JSON row below is exactly what your code receives.
Real row from a live run (2026-09-02, enrich: true)
{"query": "openai","title": "OpenAI says Astra AI model is its first that crosses 'Critical' cybersecurity capability - CNBC","url": "https://news.google.com/rss/articles/CBMisAFBVV95cUxPaHpSbHZkTWlhMjRzMExScVVuOFlpTlNLWVdaUWtDNDZq...?oc=5","article_url": "https://www.cnbc.com/2026/09/01/open-ai-astra-cyber-model.html","image_url": "https://image.cnbcfm.com/api/v1/image/108316427-1780524884815-gettyimages-2278945689-AFP_B4XB779.jpeg","article_description": "OpenAI said its newest AI model crosses the 'critical' line in cybersecurity capabilities…","published_at": "2026-09-01T20:30:00Z","source_name": "CNBC","source_url": "https://www.cnbc.com","source_domain": "cnbc.com","fetched_at": "2026-09-02T08:00:31.000000Z","language": "en","geo": "gb","topic": "","feed_url": "https://news.google.com/rss/search?q=openai%20-crypto%20when%3A7d&hl=en&gl=gb&ceid=GB:en","description_snippet": "OpenAI says Astra AI model is its first that crosses 'Critical' cybersecurity capability CNBC"}
The three article_* / image_url fields appear only with enrich: true
(v0.5); publishers that bot-wall the fetch keep their row with empty
enrichment fields — nothing is dropped, nothing extra is charged.
feed_url is the exact Google News RSS URL the row came from. Paste it into
a browser and you see the same articles — that is the whole verification
story, and it is why this actor has nothing to hide.
Use with AI agents (MCP)
Expose this actor as a tool to Claude, Cursor, VS Code or any MCP client — add the Apify MCP server pinned to this actor:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?actors=halobartku~google-news-scraper"}}}
Then just ask: "Pull everything about 'anthropic' from the last 24 hours, Reuters and Bloomberg only, newest first."
Integrate anywhere (API, Python, Node, Make, n8n)
The actor is plain Apify platform surface — every integration that runs an Apify actor works with it.
Start a run and fetch results (REST):
# start a run and wait for it to finishcurl -X POST "https://api.apify.com/v2/acts/halobartku~google-news-scraper/runs?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"queries":["openai"],"language":"en","timeRange":"24h","sortBy":"newest"}'# then fetch the datasetcurl "https://api.apify.com/v2/datasets/$DATASET_ID/items?clean=true&format=json"
Python (apify-client):
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("halobartku/google-news-scraper").call(run_input={"queries": ["openai", ""competitor name""],"language": "en", "timeRange": "24h", "sortBy": "newest", "maxTotal": 200,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["published_at"], item["source_domain"], item["title"][:60])
Node.js (apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('halobartku/google-news-scraper').call({queries: ['openai'], language: 'en', timeRange: '24h', sortBy: 'newest',});const { items } = await client.dataset(run.defaultDatasetId).list_items();console.log(items.length, 'rows');
Make / n8n (no code): use the native Apify module/step, pick this actor, map queries/language/timeRange, and route the dataset output to Google Sheets, Slack, Notion or your CRM. Pair it with a schedule (hourly/daily) and the free webhook heartbeat, and you have a zero-fixed-cost brand monitor.
Notifications (free)
Brand monitoring should reach you — not the other way round. Two optional, always-free outputs (no charge events, ever):
- Webhook (
webhookUrl): aPOSTwith a JSON run summary on every finished run — including empty ones. Machine endpoints want heartbeats, not surprises: you know the monitor is alive even on a quiet news day. Payload: edition, entries with rows / valid-empty / skipped, rows delivered, charges incurred, duration, up to 5 sample headlines. - Telegram (
telegramBotToken+telegramChatId): a human-readable digest (top headlines with publishers), sent only when there is something to read.
Both are fail-soft by contract: a broken webhook or bad token is logged and swallowed — it can never fail an otherwise-good run, and your dataset is already written before notifications fire.
Pair with a schedule (hourly/daily) and you have a $0-fixed-cost brand monitor: pay only for topics that actually return news.
For AI agents & LLM apps (compact reference)
Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: halobartku/google-news-scraper).
Purpose: One normalised Google News dataset for any set of topic queries — brand mentions, competitor moves, industry keywords — across 30 language editions, without API keys or proxies. Designed as the detection/routing layer of a news pipeline: find what changed, fetch full text in a second pass only where it matters.
Minimal input:
{ "queries": ["your brand", "\"competitor name\""], "language": "en" }
Output: one row per article — query, title, url (Google News redirect, resolves to publisher), source_name, source_url, source_domain, published_at (ISO 8601 UTC), fetched_at, language, geo, topic, feed_url, description_snippet.
Behaviors an agent should know:
queriesis an array;topicsis an array of Google News section names. All results land in one dataset with one schema, deduplicated across entries by URL.languagesets the edition language andgeothe country;regionLanguagetakes a rawCOUNTRY:langtoken (GB:en,BR:pt-419,TW:zh-Hant) when you need an edition the dropdowns do not list.- Feed order is Google's relevance ranking, not chronological — set
sortBy: "newest"for a time-ordered feed. Sorting happens beforemaxPerQuerytruncates, so "newest 20" really means the 20 newest. Sorting is applied per query and per section — rows are written one source at a time, so with several queries in one run the dataset is ordered within each source, not globally. timeRangeuses Google'swhen:operator. Google returns zero results for month-style windows, so only windows that actually work are offered (1h…30d,1y). UsedateFrom/dateTofor anything longer or fixed.topicssections carry their own fixed window (~last 2 days) and ignoretimeRange,siteFilterandexcludeWords.- ~100 items per query per fetch is the feed's coverage window; schedule recurring runs for continuous monitoring.
- A query with zero coverage returns zero rows and fires no charge event — safe to probe speculative queries cheaply.
maxTotalskips remaining entries once full, and skipped entries are not charged. published_atcan be an empty string when the feed carries no date; treat as unknown, not as epoch. Those rows always sort last.
What you get per item
| field | notes |
|---|---|
query | the topic this item was harvested for (topic:TECHNOLOGY for sections) |
title | article headline |
url | Google News redirect URL — resolves to the publisher article |
source_name / source_url | publisher |
source_domain | publisher domain, www. stripped, lowercased — group and filter on this |
published_at | ISO 8601 UTC (empty string when the feed carries no date) |
fetched_at | ISO 8601 UTC harvest time |
language / geo | edition used |
topic | Google News section, empty for search queries |
feed_url | the exact RSS URL this row came from — reproducible in a browser |
description_snippet | first 300 chars, HTML stripped |
article_url | (enrich only) real publisher article URL, decoded from the Google News redirect |
image_url | (enrich only) og:image from the article page (empty when the publisher blocks us) |
article_description | (enrich only) og:description from the article page |
FAQ
How many articles per query?
Google News RSS caps a topic at ~100 items per fetch — that is the feed's
coverage window, not ours. Section feeds return 38–70. Items arrive in feed
order (Google's relevance ranking); set sortBy: "newest" if you need
chronology.
Why is timeRange missing "last month"?
Because it does not work. Google News returns zero items for when:1m
and when:3m. We tested every window and shipped only the ones that return
real, correctly-filtered results — 30d is the honest "last month".
What if my query has zero coverage?
No rows, no charge. The feed-harvested event fires only after an entry's
rows are actually written. A run monitoring 10 brands where 3 have no news
costs 7 events.
Do I need a proxy, API key or Google account? No. The feed is public and keyless. Runs work without any proxy configuration in normal conditions.
Can I monitor competitors in other languages?
Yes — set language and query in that language; the country edition is
inferred (de→Germany, pl→Poland, ja→Japan, …), or pin it with geo. Exact
phrases in quotes work in every edition.
Does siteFilter guarantee on-topic results?
It guarantees the domains. Google's site: operator competes with your
keywords for ranking, so a very narrow domain list plus a wide time window
can surface loosely-related articles from those publishers. Narrow the
timeRange or widen the domain list if you see drift.
Images? Full article text? The real publisher URL instead of the redirect?
Article URL and image: yes, optionally (enrich: true, since v0.5) — the
run decodes Google News redirect URLs to the real publisher article URL and
pulls og:image + og:description into article_url, image_url,
article_description. Fail-soft by contract: a row whose publisher bot-walls
us is delivered with empty enrichment fields — never dropped, never charged
extra (see enrichLimit for the cost-free bound). Full article body text is
still out of scope: that needs per-publisher scraping behind paywalls and bot
walls, and it is not what you are paying us for. Feed-first, enrich second.
What does a failed run cost me? Nothing. Failed or empty queries are never charged — that is the core of our per-event pricing.
Pricing
Pay-per-event: one feed-harvested event per successfully harvested topic
query or section ($0.15). A run with 5 topics that all return coverage = 5
events, whether each returns 10 rows or 100. Empty queries and failed runs
are free. No monthly fee, no minimum.
Honest math vs the $19.99/month alternative: pay-per-event wins when you check occasionally or track a handful of topics (4 topics × 1 run/week ≈ $2.40/mo). If you poll 50 topics hourly, a monthly plan is cheaper — use the Pricing tab's calculator for your volume.
Changelog
0.9 — sample-output screenshot
The sample section now leads with a rendered screenshot of a real run (2 queries × 15 items, enrich: true) so buyers see the dataset before running anything. README-only change: no code, input, output-schema or pricing change; behavior identical to 0.8.
0.8 — section URLs (topicUrls)
New input: paste any Google News section URL — city/geo feeds (/rss/headlines/section/geo/Warsaw), any topic section, or the top-stories feed — for local-market and non-English monitoring beyond the 9 curated topics. Same billing as one query ($0.15 per harvested section); invalid or unavailable sections skip free. Redirect-oracle validated: Google answers HTTP 200 with wrong content (top-stories fallback) for unknown sections — the actor detects this via the redirect target and refuses to serve it.
- 0.7 — README: full input-parameter reference table (18 params) + live-tested Google operator notes (
OR,site:,-word). No code changes; behavior, inputs and output identical to 0.6. - 0.6 — listing parity: "What can you use it for?" (7 use cases) and "Integrate anywhere" (REST / Python / Node.js / Make / n8n) sections added to the README. No code changes; behavior, inputs and output identical to 0.5.
- 0.5 — optional enrichment (
enrich: true,enrichLimit): decodes the Google News redirect to the real publisher article URL and pullsog:image/og:descriptioninto new fieldsarticle_url,image_url,article_description. Fail-soft by contract (blocked publishers keep their row, empty enrichment fields, zero extra charge); no new charge events; default remains off — output for existing users is byte-identical. - 0.4 — SEO: notifications keywords (news alerts webhook, Telegram alerts, monitoring notifications) added to listing metadata. No code changes; behavior identical to 0.3.
- 0.3 — free notifications: optional
webhookUrl(JSON run summary on every finished run, including empty ones — heartbeat for monitoring pipelines) and Telegram digest (telegramBotToken+telegramChatId, sent only when there is something to read). Zero charge events; fail-soft by contract. Turns the actor into a set-and-forget brand monitor. - 0.2.1 — empty-coverage fix: a query with no results is now a SUCCEEDED run with 0 rows and no charge (it is the correct answer, not a failure). Previously a run where every query returned zero rows ended FAILED. Real fetch/parse errors are still skipped uncharged and still fail the run only when no query produced rows or a valid empty answer. Charge behavior for runs that return data is unchanged.
- 0.2 —
timeRange(9 verified windows) +dateFrom/dateTo; Google News section feeds (topics); language editions 11 → 30 and country editions 11 → 51 plus a rawregionLanguage(ceid) override;siteFilterandexcludeWordsapplied inside the Google query;sortBy(relevance/newest/oldest) applied before truncation; run-widemaxTotalcap; new output fieldssource_domain,topic,feed_url. All existing inputs and all existing output fields are unchanged. - 0.1 — initial release: multi-query harvest, 10-language editions, cross-query dedup, per-query pay-per-event pricing.
Disclosure
This actor was built and is operated by an AI agent (Jarvis, for its operator Bartosz). The parsing logic is deterministic, the listing claims are backed by live end-to-end runs, and the human operator reviews and publishes releases.
SEO keywords
google news scraper, google news api, google news rss feed, news scraper no api key, news feed scraper, topic monitoring news, brand monitoring news, competitor news monitoring, media monitoring api, press clipping service, news aggregation tool, google news search api, news dataset for llm, news data for ai agents, multilingual news scraper, google news python, headline aggregator, news by keyword api, google news scraper free, news monitoring without api key, google news by date, google news last 24 hours, google news by country, google news topic feed, news alerts webhook, google news telegram alerts, news monitoring notifications, google news article url, news article image, google news images, news scraper with images