Google News Scraper — Free Headlines by Keyword & Country
Pricing
Pay per usage
Google News Scraper — Free Headlines by Keyword & Country
Free Google News scraper: headlines, source and publish time by keyword or topic, for several countries and languages per run. JSON, CSV, Sheets.
Google News Scraper — Free Headlines by Keyword, Topic & Country
Get the latest Google News headlines for any keyword or topic: headline, publisher, publisher website, publish time, rank, related coverage and the Google News link. Several queries and several countries/languages in one run; schedule it and get only new articles since the last run.
Free. No usage fee; a run only uses a little Apify platform compute from your credits.
Features
- Keywords or topics: search any phrase (operators work:
"exact phrase",OR,-word,site:example.com,when:7d) or pick topicsTOP_STORIES, WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH. - 50 countries:
US,GB,DE,FR,IN,BR… The language is chosen per country automatically; override withlanguageor per edition, e.g.CH:fr,US:es. - Time window: past hour, 12 h, 24 h, 7 days, month, year, or your own
from/todates. - Can't run for hours:
maxRunSeconds(default 300 s) stops the run cleanly and keeps results;maxItemscaps the run. - Reliable: every feed is retried up to 5 times with backoff; one bad query or country never stops the run; each query that fails gets its own item with
statusanderrorMessage. The run only fails if every feed failed. - Only new since last run for alerts (Slack, Sheets, n8n, Make, Zapier).
- Flat output for CSV / Google Sheets.
Free limits: up to 5 queries/topics per run (extra ones are skipped with a warning) and 500 articles per run (hard limit). One feed returns up to 100 articles per query × country; splitByDay can return more for one query, up to the 500-per-run limit.
Input
| Field | Type | Default | Description |
|---|---|---|---|
queries | string[] | – | Keywords or phrases (max 5 incl. topics) |
topics | string[] | [] | Google News topics |
countries | string[] | ["US"] | ISO-2 codes, optionally CC:lang |
language | string | native | Force a language, e.g. en, de, en-GB |
maxItemsPerQuery | integer | 100 | 1–500 per query × country (above 100 needs splitByDay) |
period | enum | 7d | any, 1h, 12h, 1d, 7d, 1m, 1y (search queries only) |
from / to | date | empty | Custom range YYYY-MM-DD (inclusive); overrides period |
splitByDay | boolean | false | Fetch each day separately + dedupe (bounded by the 500-per-run limit) |
maxItems | integer | 500 | Cap for the whole run, 1–500 |
maxRunSeconds | integer | 300 | Clean stop at this time; unfinished queries get status: skipped |
outputFormat | enum | nested | nested or flat |
onlyNewSinceLastRun | boolean | false | Skip articles returned by earlier runs of the same input |
stateKey | string | auto | Custom name for that memory |
proxyConfiguration | object | none | Not needed normally |
No input at all = US top stories.
Output
| Field | Description |
|---|---|
dataType | googleNews |
status | ok; per query: no_results, skipped, error, rateLimited, invalid_input |
query / topic | What returned the article |
country / language | Edition |
rank | Position in the feed (1 = top) |
title | Headline (publisher suffix removed); titleWithSource keeps Google's original |
source / sourceUrl | Publisher name and website |
publishedAt | ISO 8601 |
googleNewsUrl / articleId | Google News link (redirects to the publisher) and its id |
related / relatedCount | Other outlets covering the same story (topic feeds); flat: relatedTitles, relatedSources |
feedUrl | The exact RSS URL used |
coverageNote | Set when a feed/window hit Google's ~100-article cap (results may be incomplete) |
errorMessage | Only on non-ok items |
scrapedAt | ISO 8601 |
A RUN_REPORT record in the key-value store summarises feeds, successes, failures, items and duration.
{ "dataType": "googleNews", "query": "bundesliga", "topic": null, "country": "DE", "language": "de", "rank": 1,"title": "FC Bayern: …", "source": "SPORT1", "sourceUrl": "https://www.example.com", "publishedAt": "2026-10-23T16:30:24.000Z","googleNewsUrl": "https://news.google.com/rss/articles/<articleId>", "relatedCount": 0, "status": "ok", "errorMessage": null, "scrapedAt": "2026-10-23T17:27:33.016Z" }
Only new since last run
Article ids already returned are kept in your named key-value store google-news-state under a key derived from queries + topics + countries + language (or your stateKey); last 20,000 ids, per country.
Trend → news
Run Google Trending Now, take each term and pass them as queries.
Not affiliated with Google. You are responsible for using the data lawfully.