Google News monitoring agent skill for Claude Code and agents
This skill collects Google News results and can extract article text through an Apify Actor. Choose it when an agent needs topic monitoring, publisher links or structured news records filtered by edition and publication date.
The skill pairs instructions and a runner script with the Google News Keyword & Full-Text Article Scraper Actor. It supports keyword searches, topics, news URLs, public feeds and direct article URLs, with optional publisher-page extraction.
Install
Copy the folder
google-news-keyword-and-full-text-article-scraperfrom GitHub, or save the three files below into it.Place it in
~/.claude/skills/google-news-keyword-and-full-text-article-scraper/for Claude Code, or~/.agents/skills/google-news-keyword-and-full-text-article-scraper/for Codex and other skill-aware agents.Export
APIFY_TOKEN, start the agent and ask for the job in plain words; the description tells the agent when to use the skill.Or let the skills CLI place the Actor's SKILL.md for your agent:
npx skills add https://recipeforagents.com --skill google-news-keyword-and-full-text-article-scraper(the SKILL.md only; the runner script comes from the GitHub folder).
SKILL.mdgoogle-news-keyword-and-full-text-article-scraper/SKILL.md
---
name: google-news-keyword-and-full-text-article-scraper
description: "Search Google News by keyword with real resolved article links, headlines, sources, and dates, plus optional full article text and image extraction, filterable by date, language, and publisher. Output fields: title, source, domain, publishedAt, url and more, as JSON rows. Use it for requests like \"Google News keyword scraper\", or a CSV/JSON export of public Google News data."
---
# Google News Keyword & Full-Text Article Scraper
Search Google News by keyword with real resolved article links, headlines, sources, and dates, plus optional full article text and image extraction, filterable by date, language, and publisher.
- Actor: https://apify.com/nimbryxo-studio/google-news-keyword-and-full-text-article-scraper (ID `nimbryxo-studio~google-news-keyword-and-full-text-article-scraper`)
- n8n workflow for the same Actor: https://github.com/bolvein-firex/scraping-n8n-workflows/blob/main/docs/google-news-keyword-and-full-text-article-scraper.md
- Example input: `references/example-input.json`
- Input schema: `references/input-schema.json`
- Output fields: `references/output-fields.json`
Short video breakdown:
- [Your SEO news brief, without twenty-five tab checks](https://www.youtube.com/shorts/Bjy20zqqfI0)
## When to use
Use this skill when the user wants:
- Google News keyword scraper
- a repeatable export of public Google News data as CSV or JSON
Do not use it for private, login-protected or paywalled data.
## What it returns
One JSON row per result. Columns from the Actor's dataset schema:
- `title`: Title
- `source`: Source
- `domain`: Domain
- `publishedAt`: Published
- `url`: URL
- `fullTextStatus`: Status
All 11 declared fields: `references/output-fields.json`.
## Inputs
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `mode` | string | yes | keyword | What to scrape. Each mode reads its own list field below. |
| `queries` | array | no | [] | One or more keyword queries. Google operators such as site:, intitle: and OR are supported. Results are deduplicated across queries. |
| `topics` | array | no | [] | Topic names (WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH), TOP for top stories, Google News topic hashes/section URLs, or topic URLs. |
| `newsUrls` | array | no | [] | Google News search URLs, topic URLs, RSS search/topic URLs, or RSS/Atom feed URLs to convert into a feed. |
| `rssUrls` | array | no | [] | Any public RSS or Atom feed. Google News links inside the feed are resolved to publisher URLs automatically. |
| `articleUrls` | array | no | [] | Publisher article URLs or Google News article URLs. Every page is fetched and full text is extracted, with a per-record status when a publisher blocks or paywalls it. |
| `language` | string | no | en | Language of the Google News edition. Combined with country in the edition token (for example US:en, DE:de, JP:ja). |
| `country` | string | no | US | Country edition for Google News. The actor always pins the edition so results do not change with the machine's IP. |
| `dateRange` | string | no | any | Recency window. Every item is post-filtered by its real publication time, so items newer than the window never leak. 'custom' uses startDate/endDate. |
| `startDate` | string | no | | Custom range start (YYYY-MM-DD, inclusive). Also used when dateRange=custom. |
| `endDate` | string | no | | Custom range end (YYYY-MM-DD, inclusive). Items published after the end are dropped client-side. |
| `maxResultsPerQuery` | integer | no | 20 | Maximum records taken from each Google News feed request (1-100, Google's own cap is about 100). |
| `maxItems` | integer | no | 500 | Hard cap on unique records emitted by the run (1-5000). |
| `extractFullText` | boolean | no | false | Fetch each publisher page and extract its article body, description, author, and image. Default off for fast metadata-only runs. The articleUrls mode always extracts. |
2 more optional fields on the Actor's Input tab.
Example (`references/example-input.json`):
```json
{
"queries": [
"artificial intelligence"
],
"maxResultsPerQuery": 3,
"maxItems": 25,
"mode": "keyword"
}
```
The input passes the Actor's input schema (checked at every publish). First run: `maxItems` = 25, small enough for the 300-second sync wait; raise it once the rows look right.
## Run it
Set `APIFY_TOKEN`, then call the synchronous endpoint for small and medium runs (it waits up to 300 seconds):
```bash
curl -s -X POST "https://api.apify.com/v2/acts/nimbryxo-studio~google-news-keyword-and-full-text-article-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d @references/example-input.json > output.json
```
Or with Node 18+: `node scripts/run.mjs [input.json]`.
For large runs, start an async run and read its dataset when it finishes:
```bash
RUN=$(curl -s -X POST "https://api.apify.com/v2/acts/nimbryxo-studio~google-news-keyword-and-full-text-article-scraper/runs" \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d @references/example-input.json)
RUN_ID=$(echo "$RUN" | jq -r '.data.id'); DATASET=$(echo "$RUN" | jq -r '.data.defaultDatasetId')
curl -s "https://api.apify.com/v2/actor-runs/$RUN_ID?waitForFinish=60" -H "Authorization: Bearer $APIFY_TOKEN" | jq -r '.data.status'
curl -s "https://api.apify.com/v2/datasets/$DATASET/items?format=json" -H "Authorization: Bearer $APIFY_TOKEN" > output.json
```
## Cost and limits
- Apify bills the Actor's usage on your account; the Actor's Pricing tab shows the current price.
- Keep the limit in the input small for a first run.
## Guardrails
- Public data only. Do not pass cookies, sessions or private account data.
- Do not use the output for spam, harassment or unlawful discrimination.
- Check the target site's terms and local law before running at scale.
Checked against the Agent Skills format and the Actor's input schema: 15 of 15 checks pass
- SKILL.md starts with YAML front matter
- name is 1-64 lowercase letters, digits and single hyphens
- name matches the skill folder name
- description is present, at most 1024 characters and has no angle brackets
- front matter uses only spec fields
- compatibility is at most 500 characters
- body has instructions
- field descriptions end on whole sentences
- no credential values are embedded
- the token is read from APIFY_TOKEN
- Example input: all 1 required input field is present
- Example input: every input key exists in the published input schema
- Example input: every value has the type the schema declares
- Example input: every choice field uses one of its published options
- Example input: numbers respect the published minimum and maximum
Runner scriptgoogle-news-keyword-and-full-text-article-scraper/scripts/run.mjs
// Minimal runner: node scripts/run.mjs [input.json | '{"json": "input"}']
// Needs Node 18+ and APIFY_TOKEN. Without an argument it uses references/example-input.json.
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const token = process.env.APIFY_TOKEN;
if (!token) {
console.error('Set APIFY_TOKEN');
process.exit(1);
}
const actorId = process.env.ACTOR_ID || "nimbryxo-studio~google-news-keyword-and-full-text-article-scraper";
const here = path.dirname(fileURLToPath(import.meta.url));
const arg = process.argv[2];
const raw = !arg
? fs.readFileSync(path.join(here, '..', 'references', 'example-input.json'), 'utf8')
: (arg.trim().startsWith('{') ? arg : fs.readFileSync(arg, 'utf8'));
const input = JSON.parse(raw);
const res = await fetch(`https://api.apify.com/v2/acts/${actorId}/run-sync-get-dataset-items`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
body: JSON.stringify(input)
});
if (!res.ok) {
console.error(`HTTP ${res.status}: ${(await res.text()).slice(0, 500)}`);
process.exit(1);
}
console.log(JSON.stringify(await res.json(), null, 2));
Example inputgoogle-news-keyword-and-full-text-article-scraper/references/example-input.json
{
"queries": [
"artificial intelligence"
],
"maxResultsPerQuery": 3,
"maxItems": 25,
"mode": "keyword"
} Using it
- Keep SKILL.md, scripts/run.mjs, references/example-input.json, references/input-schema.json and references/output-fields.json together in that folder.
- Make Node available and set APIFY_TOKEN in the agent's environment. Confirm that scripts/run.mjs references the token and the intended Actor endpoint, with no credentials embedded in the files.
- Ask the agent to load the skill and review references/example-input.json for the intended queries and mode. When ready to collect data, invoke node scripts/run.mjs from the skill folder.
Prefer MCP? The Google News Keyword & Full-Text Article Scraper page has configs for eight clients and a shorter, API-only SKILL.md.
Questions
Does every result contain article text?
extractFullText is disabled by default for feed results, while articleUrls mode always attempts extraction. Publisher restrictions and the maxFullText cap can still leave a record without fullText.
Can queries target a publisher?
queries supports Google operators such as site:, intitle: and OR. Review source, domain and url in the output to confirm the publisher matches the request.
How are publication dates handled?
The Actor filters records against their publication time using the requested date window. Topic feeds are filtered after download because they ignore server-side date filters.
Can it read feeds and direct article links?
Use rss mode with rssUrls for public RSS or Atom feeds, or articleUrls mode with articleUrls for direct article extraction. Google News links inside supported feeds are resolved to publisher URLs where possible.
Sources
- scraping-skills repository
- Agent Skills specification, checked 2026-11-10