How to use Google News Scraper
Step by step: in the Apify Store, over the API, from JavaScript or Python, in n8n, and from AI agents through MCP or LangChain.
$3.60 per 1,000 articles on the Free plan, down to $0.90 on higher plans (live Apify price on 2026-10-31).
1. In the Apify Store (no code)
- Open arcadium/google-news and sign in to Apify (a free account works).
- Fill in the input form. The fields below are the ones the example uses.
- Set a maximum cost per run in the run options if you want a hard cap.
- Start the run. Rows appear in the Output tab as they arrive.
- Export the dataset as JSON, CSV or Excel, or connect an integration.
| Input field | Type | Description |
|---|---|---|
queries | array | Google News search terms, e.g. ["openai", "electric cars"]. Google News operators work: "exact phrase", OR, -word, intitle:word. Each query gives up to maxArticlesPerQuery articles, newest and most relevant first. |
language | string | Edition language, e.g. en, de, fr, es, ja, pt-BR, zh-TW (default en). An edition id such as US:en or BR:pt-419 is accepted too and also sets the country. |
country | string | Edition country as a two-letter code, e.g. US, GB, DE, IN, BR (default US). Google News picks local outlets and ranking for it. |
maxArticlesPerQuery | integer | Articles per query, section, location or URL, 1 to 5,000 (default 100). One Google News page holds about 100; above that a search is split into one-day windows across the date range (default the last 30 days). |
Example input:
{
"queries": [
"artificial intelligence"
],
"language": "en",
"country": "US",
"maxArticlesPerQuery": 20
}
2. Over the Apify API
The synchronous endpoint runs the actor and returns its rows in one call (for runs up to about five minutes; use the asynchronous run endpoint for longer ones).
curl -X POST "https://api.apify.com/v2/acts/arcadium~google-news/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries":["artificial intelligence"],"language":"en","country":"US","maxArticlesPerQuery":20}'
3. From JavaScript
// npm install apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('arcadium/google-news').call({
"queries": [
"artificial intelligence"
],
"language": "en",
"country": "US",
"maxArticlesPerQuery": 20
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
4. From Python
# pip install apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("arcadium/google-news").call(run_input={
"queries": ["artificial intelligence"],
"language": "en",
"country": "US",
"maxArticlesPerQuery": 20,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
5. In n8n
Paste this node into a workflow (it is a plain HTTP Request node). Create a Header Auth credential with name Authorization and value Bearer <APIFY_TOKEN>; each returned row becomes one item for the next node.
{
"nodes": [
{
"name": "Run arcadium/google-news",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
0,
0
],
"parameters": {
"method": "POST",
"url": "https://api.apify.com/v2/acts/arcadium~google-news/run-sync-get-dataset-items",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\"queries\":[\"artificial intelligence\"],\"language\":\"en\",\"country\":\"US\",\"maxArticlesPerQuery\":20}",
"options": {
"timeout": 300000
}
}
}
],
"connections": {}
}
6. From an AI assistant (MCP)
Add Apify’s MCP server to Claude Desktop, Cursor, VS Code or any MCP client, limited to this actor:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=arcadium/google-news",
"headers": {
"Authorization": "Bearer <APIFY_TOKEN>"
}
}
}
}
More on the MCP page.
7. From LangChain
# pip install langchain-apify (reads APIFY_API_TOKEN from the environment)
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("arcadium/google-news")
rows = tool.invoke({"run_input": {
"queries": ["artificial intelligence"],
"language": "en",
"country": "US",
"maxArticlesPerQuery": 20,
}})
# or give `tool` to an agent: create_react_agent(llm, [tool])
Sample output
One row, from the example in the actor’s README. Long text is shortened and lists are cut to two items.
{
"rowType": "article",
"platform": "google-news",
"articleId": "CBMiggFBVV95cUxPYXI4MDQ5UDdXZDNuUUpwYkVwY3RYM05lZzhqcFhlb0NfeDVacEFfYkNQWkRuNDZPM05pRndYcjZ2QXBxeHA1ZnpaSVZjNEhXRnZvdkhTZTR3aFppbVlxUXJpeHRhSXRvV0R1VFRuUmhNe...",
"title": "Southwest Airlines beats estimates as fuel costs ease",
"publisher": "CNBC",
"publisherDomain": "cnbc.com",
"publisherUrl": "https://www.cnbc.com",
"url": "https://www.cnbc.com/2026/10/21/southwest-airlines-luv-3q-2026-earnings.html",
"urlDecoded": true,
"googleNewsUrl": "https://news.google.com/rss/articles/CBMiggFBVV95cUxPYXI4MDQ5UDdX...?oc=5",
"publishedAt": "2026-10-21T11:02:00.000Z",
"snippet": "Southwest Airlines reported third-quarter results that topped expectations ...",
"thumbnailUrl": "https://image.cnbcfm.com/api/v1/image/108444221-1792627087371.jpg",
"storyId": "3f9a1c0d52e8b7a4",
"isStoryLead": true,
"relatedCount": 4,
"relatedCoverage": [
{
"articleId": "CBMie0FVX3lxTE5aVW9GbzJYU2tyRUZaZXhuYVZLUzNKaURYMF96UUxGelZE",
"title": "Southwest earnings top forecasts",
"publisher": "Reuters",
"googleNewsUrl": "https://news.google.com/rss/articles/CBMie0FVX3lxTE5aVW9GbzJYU2tyRUZaZXhuYVZLUzNKaURYMF96UUxGelZE?oc=5"
}
],
"isPaywalled": false,
"textStatus": "extracted",
"text": "Southwest Airlines on Wednesday reported third-quarter earnings ...",
"wordCount": 812,
"pageLanguage": "en",
"source": "BUSINESS",
"sourceType": "section",
"position": 1,
"edition": "US:en",
"scrapedAt": "2026-10-22T08:00:00.000Z"
}
| Field | What it holds |
|---|---|
rowType | Kind of row. Filter on this first. Values: 'article': one news article (charged as article, or article-text when the text was extracted). 'error': a query or URL gave nothing; see code and message (free). |
platform | Always 'google-news'. |
articleId | Google News article id (the CBMi... part of the Google link). Stable; use it to deduplicate. |
title | Headline as Google News shows it, without the ' - Publisher' suffix. |
publisher | Publisher (news outlet) name, e.g. Reuters, BBC. |
publisherDomain | Publisher domain without www, e.g. reuters.com (from the article URL, else the outlet's home page). |
publisherUrl | Home page of the outlet as Google lists it, e.g. https://www.reuters.com. |
url | The publisher's own article URL, decoded from Google's redirect link. Null when decodeUrls is off or decoding failed. |
urlDecoded | True when url holds the decoded publisher URL. |
googleNewsUrl | Google's link to the article (news.google.com/rss/articles/...), redirects to the publisher in a browser. |
publishedAt | Publish time, ISO 8601 UTC, e.g. 2026-10-21T16:56:20.000Z. |
snippet | The article's own summary from its page (og:description), up to 400 characters. Null when the page was not read or blocked. |
thumbnailUrl | Lead image URL from the article page (og:image). Null when the page was not read or blocked. |
storyId | Id of the story this article belongs to (16 hex characters). Articles of different outlets on the same story share it. |
isStoryLead | True for the article that leads its story (the first one Google shows, or the first in a search). |
relatedCount | Number of other outlets' articles on the same story. |
relatedCoverage | Other outlets' articles on the same story: articleId, title, publisher, googleNewsUrl. Empty when includeRelated is off. |
isPaywalled | True when the article page declares itself paywalled (not free to read); null when the page was not read or was blocked. |
textStatus | Full-text outcome: extracted, paywalled (publisher marks it not free; text left out), blocked (page refused automated visits), too_short (no article text on the page, e.g. a video page), unavailable, or not_requested. |
text | Main article text, paragraphs separated by a blank line (includeArticleText). Bylines removed; emails and phone numbers replaced with [email] and [phone]. |
wordCount | Words in text; null without text. |
pageLanguage | Language the article page declares (html lang), e.g. en, de-DE. |
source | The query, section, location or URL this article came from. |
sourceType | Kind of source: search, top, section, topic, geo, story or publication. |
position | Rank of the article within its source (1 = first). |
edition | Google News edition id used, e.g. US:en, DE:de, BR:pt-419. |
scrapedAt | When the row was read (ISO 8601). |
input | Error rows: the query or URL that failed. |
code | Error rows: invalid_input, not_found, blocked, unavailable or no_match. |
message | Error rows: what went wrong, in plain words. |
Schedule it
In Apify Console, create a Task from your input and add a Schedule (for example daily). Each run writes a new dataset; integrations can push the rows to Google Sheets, Slack, a webhook or your database.