Arcadium Data Scrapers
Home / Guides / Google News Scraper

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)

  1. Open arcadium/google-news and sign in to Apify (a free account works).
  2. Fill in the input form. The fields below are the ones the example uses.
  3. Set a maximum cost per run in the run options if you want a hard cap.
  4. Start the run. Rows appear in the Output tab as they arrive.
  5. Export the dataset as JSON, CSV or Excel, or connect an integration.
Input fieldTypeDescription
queriesarrayGoogle 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.
languagestringEdition 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.
countrystringEdition country as a two-letter code, e.g. US, GB, DE, IN, BR (default US). Google News picks local outlets and ranking for it.
maxArticlesPerQueryintegerArticles 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"
}
FieldWhat it holds
rowTypeKind 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).
platformAlways 'google-news'.
articleIdGoogle News article id (the CBMi... part of the Google link). Stable; use it to deduplicate.
titleHeadline as Google News shows it, without the ' - Publisher' suffix.
publisherPublisher (news outlet) name, e.g. Reuters, BBC.
publisherDomainPublisher domain without www, e.g. reuters.com (from the article URL, else the outlet's home page).
publisherUrlHome page of the outlet as Google lists it, e.g. https://www.reuters.com.
urlThe publisher's own article URL, decoded from Google's redirect link. Null when decodeUrls is off or decoding failed.
urlDecodedTrue when url holds the decoded publisher URL.
googleNewsUrlGoogle's link to the article (news.google.com/rss/articles/...), redirects to the publisher in a browser.
publishedAtPublish time, ISO 8601 UTC, e.g. 2026-10-21T16:56:20.000Z.
snippetThe article's own summary from its page (og:description), up to 400 characters. Null when the page was not read or blocked.
thumbnailUrlLead image URL from the article page (og:image). Null when the page was not read or blocked.
storyIdId of the story this article belongs to (16 hex characters). Articles of different outlets on the same story share it.
isStoryLeadTrue for the article that leads its story (the first one Google shows, or the first in a search).
relatedCountNumber of other outlets' articles on the same story.
relatedCoverageOther outlets' articles on the same story: articleId, title, publisher, googleNewsUrl. Empty when includeRelated is off.
isPaywalledTrue when the article page declares itself paywalled (not free to read); null when the page was not read or was blocked.
textStatusFull-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.
textMain article text, paragraphs separated by a blank line (includeArticleText). Bylines removed; emails and phone numbers replaced with [email] and [phone].
wordCountWords in text; null without text.
pageLanguageLanguage the article page declares (html lang), e.g. en, de-DE.
sourceThe query, section, location or URL this article came from.
sourceTypeKind of source: search, top, section, topic, geo, story or publication.
positionRank of the article within its source (1 = first).
editionGoogle News edition id used, e.g. US:en, DE:de, BR:pt-419.
scrapedAtWhen the row was read (ISO 8601).
inputError rows: the query or URL that failed.
codeError rows: invalid_input, not_found, blocked, unavailable or no_match.
messageError 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.