Google News Scraper — Multi-Query Topic & Brand Monitoring avatar

Google News Scraper — Multi-Query Topic & Brand Monitoring

Pricing

from $150.00 / 1,000 query feed delivereds

Go to Apify Store
Google News Scraper — Multi-Query Topic & Brand Monitoring

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

B

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

25 minutes ago

Last modified

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 / dateTo for 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; excludeWords drops the noise before it is ever fetched.
  • Market & industry intelligence — topics sections (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/dateTo gives you an exact historical window to compare against.
  • News aggregation & dashboards — one schema for queries and sections alike, source_domain pre-normalised for grouping, maxTotal as a hard budget cap so a scheduled job can never surprise you.
  • Crisis & reputation alerts — pair negative-phrase queries with a narrow timeRange and 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

ParameterTypeDefaultDescription
queriesarray—Topics, brands, competitors or exact phrases (use quotes). Each harvested query = one paid event. Leave empty if you only want topics sections.
topicsarray[]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.
topicUrlsarray[]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.
timeRangestring—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.
dateFromstring—Only articles published on or after this date, YYYY-MM-DD. Overrides timeRange.
dateTostring—Only articles on or before this date. Use with dateFrom.
siteFilterarray[]Restrict to these publisher domains (reuters.com, bbc.com), OR-ed together. Applied inside the Google query.
excludeWordsarray[]Drop articles containing these words/phrases — applied by Google's own -word operator, so excluded articles are never fetched or billed.
languagestringenEdition 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).
geostringautoCountry edition (51 available). Defaults to the language's home country; en + gb/in/au/ca/ie/sg/za gives local English editions.
regionLanguagestring—Power users: raw Google News edition token, COUNTRY:lang (GB:en, BR:pt-419, TW:zh-Hant). Overrides language and geo.
sortBystringrelevancenewest / oldest for a chronological feed. Applied before maxPerQuery truncates, per query/section.
maxPerQueryinteger100Row cap per query or section. Typical topics return 20–100; sections 38–70.
maxTotalinteger0Hard cap across the whole run. 0 = no cap. Once full, remaining entries are skipped and not charged.
enrichbooleanfalseDecode 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.
enrichLimitinteger10Rows to enrich per entry (in delivery order) when enrich: true.
webhookUrlstring—Free: POSTs a JSON run summary on every finished run, including empty ones (heartbeat for monitoring pipelines).
telegramBotTokenstring—Free: bot token from @BotFather for the human-readable digest.
telegramChatIdstring—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

Real run output: queries “openai” + “artificial intelligence”, enrich: true, sortBy newest — 30 rows, first 15 shown, 9 of 16 fields

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 finish
curl -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 dataset
curl "https://api.apify.com/v2/datasets/$DATASET_ID/items?clean=true&format=json"

Python (apify-client):

from apify_client import ApifyClient
client = 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): a POST with 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:

  • queries is an array; topics is an array of Google News section names. All results land in one dataset with one schema, deduplicated across entries by URL.
  • language sets the edition language and geo the country; regionLanguage takes a raw COUNTRY:lang token (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 before maxPerQuery truncates, 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.
  • timeRange uses Google's when: operator. Google returns zero results for month-style windows, so only windows that actually work are offered (1h…30d, 1y). Use dateFrom/dateTo for anything longer or fixed.
  • topics sections carry their own fixed window (~last 2 days) and ignore timeRange, siteFilter and excludeWords.
  • ~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. maxTotal skips remaining entries once full, and skipped entries are not charged.
  • published_at can 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

fieldnotes
querythe topic this item was harvested for (topic:TECHNOLOGY for sections)
titlearticle headline
urlGoogle News redirect URL — resolves to the publisher article
source_name / source_urlpublisher
source_domainpublisher domain, www. stripped, lowercased — group and filter on this
published_atISO 8601 UTC (empty string when the feed carries no date)
fetched_atISO 8601 UTC harvest time
language / geoedition used
topicGoogle News section, empty for search queries
feed_urlthe exact RSS URL this row came from — reproducible in a browser
description_snippetfirst 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 pulls og:image / og:description into new fields article_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 raw regionLanguage (ceid) override; siteFilter and excludeWords applied inside the Google query; sortBy (relevance/newest/oldest) applied before truncation; run-wide maxTotal cap; new output fields source_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