Google News Scraper — News Search API & Headlines
Pricing
from $1.75 / 1,000 articles
Google News Scraper — News Search API & Headlines
Turn Google News into structured rows. Search any keyword, topic or publication and get headline, publisher, publish time, snippet and link. Optional full article text with word count and top image. Filter by date range, site or excluded terms. Export to CSV, JSON or Excel.
What does Google News Scraper do?
Get a clean, deduplicated table of news headlines for any keyword, topic or publication — headline, publisher, publication time, snippet and link, one row per article. PR and comms teams use it to catch brand mentions the day they appear, analysts use it to measure share of coverage, and AI engineers use it to keep an agent supplied with fresh, structured news.
Use it to scrape Google News headlines by search term, by topic section (Technology, Business, Health...), by publication, or from any Google News URL you copied from your browser. It works as a Google News API alternative: no key to request, no quota to negotiate, no browser to drive. One feed request returns up to about 100 articles, so a run finishes in seconds and costs a fraction of a cent.
✨ Try it: press Start with the prefilled input. Twenty articles land in under 10 seconds.
🆕 Need the article itself? Turn on Include article text and every row also gets the publisher's own URL, the article's main text (articleText, extracted readability-style), wordCount, lead image (topImage) and canonicalUrl. That add-on is billed only when the text was actually extracted; paywalled or blocked pages are free and say why.
🔔 Only what is new since the last run. Turn on onlyNew and schedule the Actor: each run returns only articles that an earlier watch run has not returned, and you pay only for those. A quiet hour finishes green with one free not_found row per search.
📚 Hundreds of search terms in one run. Paste any number of keywords into queries; duplicates are removed and every term that finds nothing gives one free not_found row.
🔎 Filter before you pay: a date range (dateFrom / dateTo, absolute or relative such as 7 days), exclude terms, and only / exclude publishers (sites, excludeSites). Filtered-out rows are never saved and never charged.
Use cases: brand monitoring, market research, news datasets for AI agents
-
📣 PR and comms teams monitoring a brand. Schedule an hourly run on your company, your executives and your competitors, and push every new headline into Slack or a spreadsheet so nobody finds out about coverage from a customer.
-
📊 Market researchers and analysts. Pull the last few weeks of coverage for an industry or a company, then count articles per publisher, per week or per country to show where a story is actually landing.
-
🤖 AI engineers building a news dataset for an agent or RAG pipeline. Hand an LLM a fresh, deduplicated list of headlines with publisher names and ISO timestamps instead of raw HTML — every row carries a stable
guidso a scheduled run only adds what is new. -
💹 Investment and risk teams watching events. Track a ticker, a commodity or a regulator across country editions and flag the first mention of a keyword such as a recall, a lawsuit or a leadership change.
-
✍️ Editorial and SEO teams planning content. Watch a topic section or a single publication to see what is being covered right now, and which angles are saturated before you commission a piece.
-
🏢 Agencies reporting to clients. Run one job per client domain or brand name, export to Excel, and drop the coverage list straight into a monthly report.
-
🧠 RAG, summarisation and sentiment pipelines. With Include article text on, each row carries the article's clean main text and word count, ready to chunk, embed or summarise without writing a single extractor.
The Actor does not log in and does not get around paywalls. Article pages are downloaded only when you turn on Include article text.
What data you get
One row per article. The Articles view shows the first block; the All fields view adds feed context and identifiers.
The article itself
| Field | Type | What it tells you |
|---|---|---|
title | string | Headline exactly as Google News publishes it. Google usually appends - Publisher. |
source | string | Publisher name, e.g. Reuters. |
publishedAt | string | Publication time in ISO 8601 UTC, converted from the feed's RFC-822 pubDate. |
link | string | Google News article link. Opening it forwards to the publisher's article. Same value as url. |
snippet | string | Plain-text description from the feed. Never article body text. |
imageUrl | string | Image URL when the feed carries one. Search and topic feeds usually carry none. |
Identifiers and publisher
| Field | Type | What it tells you |
|---|---|---|
guid | string | Google News item identifier; stable across runs, so it is the right key for deduplication. |
sourceUrl | string | Publisher home page, from the feed's source element. |
publisherUrl | string | Article URL on the publisher's own site. Only filled when Resolve publisher URL is on and the link uses Google's older, decodable format (see Limitations). |
Article body (only with Include article text)
| Field | Type | What it tells you |
|---|---|---|
articleStatus | string | ok (text extracted, billed as article), or a free outcome: paywalled, blocked, not_found, no_text, unsupported, skipped (social or video item), unresolved, error. |
articleError | string | Why the body is missing or partial, when articleStatus is not ok. |
articleText | string | Main text of the article, paragraphs separated by blank lines. Menus, ads, related links and author lines are removed; e-mail addresses, phone numbers and social handles are replaced by markers. Cut at 100,000 characters. |
wordCount | integer | Words in articleText. |
articleTitle | string | Headline on the publisher's page, without Google's - Publisher suffix. |
topImage | string | Lead image of the article (og:image). |
canonicalUrl | string | Canonical URL the publisher declares; the best key to deduplicate one story across feeds. |
articleUrl | string | Final publisher URL after redirects. |
siteName | string | Publisher site name (og:site_name). |
articleLanguage | string | Page language, e.g. en-US. |
With the add-on on, publisherUrl is filled for every article that Google hands over.
Feed context and run metadata
| Field | Type | What it tells you |
|---|---|---|
language | string | Two-letter language code of the feed edition, e.g. en. |
country | string | Two-letter country code of the feed edition, e.g. US. |
feedTitle | string | Title of the feed the row came from, e.g. "apify" - Google News. |
feedUrl | string | URL of the feed the row came from, so you can tell rows apart when one run scrapes several feeds. |
position | integer | 1-based position of the article inside its feed, in Google's own order. |
url | string | The article's Google News link; present on every row, including error rows. |
status | string | ok, not_found or error (see below). |
error | string | Reason when status is not ok. |
scrapedAt | string | ISO 8601 time of extraction. |
A missing optional field is honest: it means Google News did not publish that value in the feed, never a guess.
Result status (tri-state output)
status | Meaning | Billed? |
|---|---|---|
ok | The article was found and extracted. | Yes |
not_found | Google News answered with a valid feed that contains no articles (a search nothing matches, or a topic with no current items). | No |
error | The feed could not be read after retries (network error, HTTP error, or an unexpected response). error says why. | No |
Output
Export the dataset as JSON, CSV, Excel, XML or HTML, or read it from the API. This is a real row from the default run (2026-09-08), followed by a free not_found row:
[{"url": "https://news.google.com/rss/articles/CBMigAFBVV95cUxPZkh6d3hkX2RaWUpjSGtmeEJjS0NLTXNzWkk4eF9CQWJxYTRFVGFhY2VlLVJIRFRaeE5nWnlVZ0trVy1NNVpENkRZUWxVRUoxRkFMR2FaLWZMeV9aVTlYZGtqaVJZcjBjd2xZNjV5dG12dERmWnhDS3E1dldhNm9IdA?oc=5","status": "ok","scrapedAt": "2026-09-08T11:42:49.977Z","title": "Early Data Indicates an A.I.-Generated Drug Could Slow Aging - The New York Times","link": "https://news.google.com/rss/articles/CBMigAFBVV95cUxPZkh6d3hkX2RaWUpjSGtmeEJjS0NLTXNzWkk4eF9CQWJxYTRFVGFhY2VlLVJIRFRaeE5nWnlVZ0trVy1NNVpENkRZUWxVRUoxRkFMR2FaLWZMeV9aVTlYZGtqaVJZcjBjd2xZNjV5dG12dERmWnhDS3E1dldhNm9IdA?oc=5","source": "The New York Times","sourceUrl": "https://www.nytimes.com","publishedAt": "2026-09-07T09:04:03.000Z","snippet": "Early Data Indicates an A.I.-Generated Drug Could Slow Aging The New York Times","guid": "CBMigAFBVV95cUxPZkh6d3hkX2RaWUpjSGtmeEJjS0NLTXNzWkk4eF9CQWJxYTRFVGFhY2VlLVJIRFRaeE5nWnlVZ0trVy1NNVpENkRZUWxVRUoxRkFMR2FaLWZMeV9aVTlYZGtqaVJZcjBjd2xZNjV5dG12dERmWnhDS3E1dldhNm9IdA","language": "en","country": "US","feedTitle": "\"artificial intelligence\" - Google News","feedUrl": "https://news.google.com/rss/search?q=artificial%20intelligence&hl=en-US&gl=US&ceid=US:en","position": 1},{"url": "https://news.google.com/rss/search?q=zzqx9v7wkjmqp4rtl2bnvx8yq&hl=en-US&gl=US&ceid=US:en","status": "not_found","error": "No results on this page","scrapedAt": "2026-09-08T11:42:50.104Z"}]
The Articles dataset view shows title, source, publishedAt, link, snippet, status, error and scrapedAt; the Article text view shows the body columns; the All fields view shows every column.
How to scrape Google News headlines by keyword, topic or publication
- Open the Actor in Apify Console and click Try for free.
- Choose what to scrape: paste a Google News URL into Google News URLs or RSS feeds, type a Search query, or pick a Topic section. Precedence is URLs, then query, then topic.
- Optionally set Language and Country edition (defaults
en/US) and Maximum results (default 20). - Click Start. The default input takes a few seconds and rows appear in the dataset in real time.
- Open the Output tab or Export the dataset as JSON, CSV, Excel, XML or HTML.
To automate it, use the API tab (Node.js, Python, curl examples) or add a Schedule and run it hourly.
Input
Every field, its default and when you would change it:
| Field | Type | Default | When to change it |
|---|---|---|---|
startUrls | array of strings | one sample search feed | Use it when you already have a Google News search, topic, publication or /rss/ URL — browser URLs are rewritten to the matching feed automatically. Pass several to cover several beats in one run. |
query | string | – | The simplest way to start: type a keyword or phrase instead of a URL. Google News operators such as when:7d, site:reuters.com or intitle: work here. Used only when startUrls is empty. |
queries | array of strings | – | Bulk mode: one search per entry, no limit on how many terms, duplicates removed (case-insensitive). Combined with query; used only when startUrls is empty. A term with no results gives one free not_found row. maxItems is the total across all terms, so raise it for long lists. |
topic | string | – | Pick a headline section (WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH) when you want general coverage rather than a search. Used only when startUrls and query are both empty. |
language | string | en | Change it to scrape a non-English edition (de, es, fr, pt, ja, ...). Applies to query and topic; a pasted Start URL keeps its own edition. |
country | string | US | Change it to scrape another country edition (GB, DE, IN, BR, ...), or run the same query across several countries to compare coverage. |
maxItems | integer | 20 | Raise it for production runs. One feed holds roughly 100 articles, so go above 100 only when you pass several feeds. It is also your hard cap on spend. |
dateFrom / dateTo | string | – | Keep only articles published in this window. Absolute (2026-10-01) or relative (7 days, 24 hours). For a Search query the window is also sent to Google News as after:/before:, so you get more matching articles. |
excludeTerms | array of strings | – | Drop articles whose headline or snippet contains any of these words or phrases (case-insensitive, whole words). |
sites / excludeSites | array of strings | – | Keep only, or drop, articles from these publisher domains (reuters.com; sub-domains count too). For a Search query they are also sent as site: operators. |
onlyNew | boolean | false | Watch mode: skip articles an earlier onlyNew run returned (never charged). The first run returns everything. A feed with nothing new gives one free not_found row. |
monitorStoreName | string | google-news-monitor | Named key-value store on your account that remembers the article ids (guid) already returned. One name per schedule keeps separate watch lists. |
includeArticleText | boolean | false | Turn it on to add each article's main text, word count, lead image, canonical URL and publisher URL. Billed as the extra article event only when the text was extracted. About 1-2 seconds per article. |
resolvePublisherUrl | boolean | false | Turn it on when you want the publisher's own URL where it can be decoded locally. It costs no extra request, but it only works for Google's older link format (see Limitations). |
proxyConfiguration | object | Apify Proxy off | Leave it off. Enable Apify Proxy (datacenter group) only if a run starts producing error rows; residential proxies are not needed. |
Example input (this is the whole thing):
{"startUrls": ["https://news.google.com/rss/search?q=artificial%20intelligence&hl=en-US&gl=US&ceid=US:en"],"language": "en","country": "US","maxItems": 20,"resolvePublisherUrl": false}
Search a keyword instead of a URL:
{ "query": "electric vehicles when:7d", "language": "en", "country": "GB", "maxItems": 50 }
Last week's coverage from two publishers, with the article text:
{ "query": "electric vehicles", "dateFrom": "7 days", "sites": ["electrek.co", "insideevs.com"], "includeArticleText": true, "maxItems": 50 }
Many terms in one run:
{ "queries": ["placeholder brand one", "placeholder brand two", "placeholder brand three"], "dateFrom": "7 days", "maxItems": 500 }
Only new coverage on a schedule (the same input every time):
{ "queries": ["placeholder brand one", "placeholder brand two"], "onlyNew": true, "monitorStoreName": "news-brand-watch", "maxItems": 500 }
Scrape a topic section:
{ "topic": "TECHNOLOGY", "language": "de", "country": "DE", "maxItems": 100 }
How much does it cost to scrape Google News?
This Actor uses pay-per-event pricing. The table below is the whole price list:
| Event | Charged when | Price |
|---|---|---|
| Actor start | Once per run, by the Apify platform (one event per GB of memory; the default is 1 GB). | $0.005 per run |
| Article | One article with status: ok is saved to the dataset. | $0.0025 per article |
| Article body | Add-on, only with Include article text: the article's main text was extracted (articleStatus: ok). Paywalled, blocked, missing or text-less pages are free. | $0.002 per article body |
- 1,000 articles cost about $2.51 ($0.005 start + 1,000 × $0.0025).
- 1,000 articles with their full text cost about $4.51 (1,000 × $0.0025 + 1,000 × $0.002); articles whose text could not be extracted pay only the $0.0025.
- Rows with
statusnot_foundorerrorare never charged — a query that matches nothing costs you the start fee only. In watch mode (onlyNew) articles returned by an earlier run are skipped and never billed. - The Actor stops gracefully when your run's maximum charge is reached. Cap spending with Maximum results and with the run's Max total charge option.
- The free Apify plan's $5 of monthly credit covers about 1,990 articles in a single run.
Speed and request budget
Measured on the default input (one search feed, maxItems: 20), 1 GB memory, no proxy, across three consecutive staging runs:
| Metric | Value |
|---|---|
| HTTP requests | 1 |
| Articles parsed from that request | 100 |
Rows saved (maxItems cap) | 20 |
| Run duration | 2.3 – 3.8 s |
One request covers a whole feed, so the request budget is roughly 0.01 requests per article — the reason this Actor is priced below the category median.
How it compares
This Actor is the cheap, fast, headline-level option. Its strengths are breadth and cost: one request per feed, up to ~100 articles from it, a stable guid for deduplication, every language and country edition Google News publishes, and a tri-state status so a scheduled job can tell "nothing matched" apart from "the fetch failed".
It is not for you if you need paywalled or subscriber-only content, anything behind a login, historical archives going back years, or per-article sentiment and entity extraction. It does not log in, get around paywalls or score sentiment. It is also not a general web crawler: the input is a Google News query, topic or URL, not an arbitrary site. If you need article bodies, turn on Include article text; pages it cannot read come back free with articleStatus saying why.
Integrations, API and AI agents
Results export to CSV, JSON, Excel, XML and HTML, and can be pushed to Google Sheets, Airtable, Slack or a CRM through Apify integrations and webhooks (n8n, Make and Zapier included). Add a Schedule to run it hourly and deduplicate downstream on guid.
The Actor can be called from the Apify API (Node.js, Python or curl — see the API tab), from the Apify MCP server, or from any AI agent: inputs are plain strings and every row is self-describing thanks to status and error, so an agent never has to guess why a run returned nothing.
FAQ
Do I get the full article text? Yes, when you turn on Include article text. The Actor opens each article on the publisher's site and extracts the main text. It does not log in or get around paywalls: a subscriber-only, blocked or text-less page comes back with articleStatus saying why, and you are not charged for its body. Article text is the publishers' copyrighted content; use it for analysis, search and summarisation under their terms, not for republishing.
Which sites block article text? Some large publishers (for example Reuters, Bloomberg, the Wall Street Journal and the New York Times) refuse automated requests, so their rows come back blocked. In our tests about 70% of articles in a typical search returned full text.
Is it legal to scrape Google News? Reading a publicly available RSS feed is generally lawful, but you are responsible for how you use the output. Google's feed terms restrict redistribution of the feed itself, and headlines and snippets remain the publishers' content. Read the legal notice below, and consult your lawyers if you are unsure.
Why is link a news.google.com URL and not the publisher's URL? Google publishes redirect links in its feeds and encrypts the destination inside the article token. The link opens the article in any browser. See Limitations for what resolvePublisherUrl can and cannot do.
How do I get more than 100 articles on a topic? Run several narrower queries (by keyword, by site:, or by a when:/after:/before: time window), or scrape several country editions, and pass them as multiple Start URLs in one run — you pay the start fee once.
Can I use this Actor from an AI agent or MCP client? Yes. Every row is self-describing (status plus error), inputs are plain strings, and results can be fetched via the dataset API or the Apify MCP server.
Which languages and countries work? Any edition Google News publishes. Set language to a two-letter code (en, de, es, fr, pt, ja, ...) and country to a two-letter code (US, GB, DE, IN, BR, ...). A pasted Start URL keeps the edition it already carries.
Why did I get fewer rows than maxItems? The feed contained fewer articles, or the run hit your Max total charge limit. Check the run log for "Stopping gracefully".
How do I run brand monitoring on a schedule? Put your brand names in queries, turn on onlyNew, set a monitorStoreName, and add a Schedule in Apify Console. The first run returns the current coverage; every later run returns only articles not returned before. Use a different monitorStoreName per watch list, and send new rows to Slack or a sheet with a webhook.
How many search terms can I paste? As many as you like, in queries. Each term is one request and returns up to about 100 articles; maxItems and your Max total charge bound the run.
Limitations
- Article text is opt-in and best effort. With Include article text off, only what the feed publishes is stored. With it on, publishers that block automated requests, subscriber-only articles, videos, live blogs and pages that need JavaScript come back without a billable body (
articleStatussays why). The extractor removes menus, ads and related links, but a short promo line can occasionally remain. - Google News caps each feed at roughly 100 articles, and there is no pagination. To get more, split the work: several narrower queries, several topic sections, several country editions, or a
when:operator per time window. SettingmaxItemsabove ~100 with one feed will simply return what the feed contains. - Links are Google News redirect URLs. Google encrypts the destination inside the article token, so the publisher URL is not present in the feed.
resolvePublisherUrldecodes it locally for Google's older link format only; for the format Google issues today it stays empty andlinkremains the Google News URL, which still resolves to the article in a browser. To get the publisher URL for every article, turn on Include article text. imageUrlis usually empty for search and topic feeds, because Google does not include media items in them.snippetoften repeats the headline and publisher in search and topic feeds; on "full coverage" items it lists the related headlines instead. That is what Google puts in the feed's description.- No historical archive. A feed returns what Google News currently ranks for that query or topic. For older coverage use search operators such as
after:2026-01-01 before:2026-02-01in the query. - Google News may change its feed format, in which case rows come back as
errorand the Actor is updated quickly (report it in the Issues tab).
Troubleshooting
| Symptom | Fix |
|---|---|
One not_found row and nothing else | The query matched no articles. Broaden it, drop a when: operator, or check the language/country edition. |
Fewer rows than maxItems | The feed contained fewer articles (see the ~100 cap), or the run hit your Max total charge. Look for "Stopping gracefully" in the log. |
error rows mentioning HTTP failures | Rare from Apify's datacenter IPs. Re-run, or enable Apify Proxy (datacenter group) in Proxy configuration. |
Many blocked article bodies | The publisher refuses automated requests. Exclude it with excludeSites, or keep those rows: their body is never charged. |
| Duplicate articles across scheduled runs | Turn on onlyNew, or deduplicate on guid, which is stable for a given article. |
| A pasted browser URL returns nothing | Make sure it is a Google News URL (news.google.com). The Actor rewrites /search, /topics/... and /publications/... to their feeds automatically. |
Privacy and responsible use
- Only publicly available Google News feed data is read; no login, no account, no access controls are circumvented.
- Without Include article text, only headline, snippet, link and metadata are stored. With it, the article's main text is stored as well.
- No author or byline fields are output, and author lines are removed from the article text. Names of people may still appear in a headline, snippet or article text, exactly as the publisher wrote them. E-mail addresses, phone numbers, social handles and personal profile links inside article text are replaced by
[email removed],[phone removed],[handle removed]and[profile link removed]. Social-media and video items are never opened. - Publisher and headline data is business information, not personal profiling data; use it for lawful purposes such as monitoring, research and analytics.
- You are responsible for how you use, store and republish the output.
Related Actors
- Google Ads Library & Transparency Scraper - use it to see what a brand in the news is running in ads, not just what is written about it.
- Pinterest Scraper - use it to track how a story or brand is being pinned and shared visually.
- Tech Stack & DMARC Checker - use it to check the legitimacy of a publisher's or source's own domain.
- Discord Server Stats - use it to see whether a story is also being discussed in a related community.
- Google Trends Scraper - use it to see whether a story's topic is rising in search, with the news articles behind each trend.
- Telegram Channel Scraper - use it to follow how the same story spreads in public Telegram channels.
Legal and data-protection notice
This Actor reads data that Google News publishes publicly in its RSS feeds. When Include article text is on, it also fetches each article's publicly served page from the publisher's site and stores its main text. It does not log in, does not get around paywalls and does not circumvent access controls; paywalled or blocked pages come back without a body. Article text is the publishers' copyrighted content: use it for analysis, search and summarisation under the publishers' terms, and do not republish it. The Actor does not extract private user data such as gender or precise location, and it has no author or byline fields. E-mail addresses, phone numbers, social media handles and profile links found in article text are replaced by markers such as [email removed] and [phone removed], and byline lines are dropped. However, your results can still contain personal data: names of people quoted or mentioned inside headlines, snippets and article text remain. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you are unsure whether your reason is legitimate, consult your lawyers. You are responsible for complying with Google's terms of service, with the publishers' terms, and with applicable law when using the extracted data.
This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Google LLC or any publisher whose articles appear in the output. All trademarks belong to their respective owners.