# Google News Scraper – Enriched, Fast & Cheap (`epicscrapers/google-news-scraper`) Actor

Extract title, URL, source, publish date, and thumbnail image etc. Perfect for news monitoring, research, and media tracking workflows.

- **URL**: https://apify.com/epicscrapers/google-news-scraper.md
- **Developed by:** [Epic Scrapers](https://apify.com/epicscrapers) (community)
- **Categories:** News, Automation
- **Features:** Limited permissions
- **Stats:** 39 total users, 1 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Google News Scraper: search, topics and date ranges with real publisher links, at scale

Google News Scraper turns a Google News search or topic into a dataset of articles: headline, publisher, publisher URL, publication time and, optionally, the real article link and its preview image. It is built for media monitoring, brand and competitor tracking, news archives, market research, and news feeds for LLM and RAG pipelines.

- **Real publisher links, no browser.** Google News feeds link to `news.google.com/rss/articles/...` redirects. With `fetchArticleDetails` on, the Actor resolves them through Google's own link decoder, 10 articles at a time, so 100 links usually take a few seconds. Then it reads each article's `og:image`.
- **Past the 100-result limit.** One Google News search returns at most about 100 articles. With `maxItems` above 100, the Actor searches each day of your date range separately, newest day first, and stops as soon as it has enough.
- **Exact date ranges.** Dates go into the search itself (`after:` / `before:`), so a range like March 2025 returns March 2025 articles. Hour windows such as `1h` or `6h` use Google's `when:` operator.
- **Built for schedules.** Decoded links are remembered between runs in your own Apify account, so hourly and daily monitoring runs skip articles they have already resolved. Articles are de-duplicated within a run.
- **Every Google News language.** 84 country and language pairs, 8 built-in topics that follow the selected country, and any topic or section ID from a Google News URL.
- **Pay per article.** No subscription, no Google account, no API key, no proxy setup. Export to JSON, CSV, Excel or Google Sheets, or read the dataset through the API.

**Scope:** This Actor collects article metadata, not article text. To turn the resulting links into full article text as Markdown, use [Webpage to Markdown](https://apify.com/epicscrapers/webpage-to-markdown).

### What can you do with Google News Scraper?

| Goal                              | How                                                                                                                         |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| Monitor a brand or competitor     | Schedule the brand name hourly with `openEndedDateRange` `1h`, or daily with `1d`. Keep rows whose `guid` you haven't seen. |
| Build a news archive              | Set `dateFrom`, `dateTo` and `maxItems` above 100. The Actor collects day by day, up to about 100 articles per day.         |
| Track one publisher               | Search `site:reuters.com "interest rates"` and count rows per day.                                                          |
| Feed an LLM or RAG pipeline       | Turn on `fetchArticleDetails` and send each `link` to Webpage to Markdown for the article text.                             |
| Compare coverage across countries | Run the same `query` with `language` set to `US:en`, `GB:en`, `DE:de`, `FR:fr` and compare `source` lists and timing.       |
| Follow a topic or section         | Select `topics` such as `BUSINESS`, or paste a section ID such as Technology → Artificial intelligence into `topicsHashed`. |
| Build a media list                | Collect a few weeks of coverage on your niche and count articles per `source` and `sourceUrl`.                              |

### How it compares

| What you need                     | Google News Scraper                               | Google News RSS by hand   | Browser-based news scrapers |
| --------------------------------- | ------------------------------------------------- | ------------------------- | --------------------------- |
| Results per search                | Above 100, day by day                             | About 100                 | Usually about 100           |
| Past date ranges                  | Yes, `after:`/`before:` in every search           | If you know the operators | Varies                      |
| Publisher URL instead of redirect | Yes, a few seconds per 100 links, no browser      | No                        | Slow, opens every article   |
| Repeated runs                     | Remembers decoded links, schedules, API, webhooks | Manual                    | Yes                         |
| Price                             | Per article                                       | Free, your time           | Per result or per month     |

### Quick start

1. Click **Try for free** and sign in to Apify.
2. Enter a **Search query**, or select **Topics**.
3. Set **Max items** to `20` for a first run.
4. Click **Start**, then open the **Output** tab and export the data.

```json
{
    "query": "\"electric vehicles\" site:reuters.com",
    "language": "US:en",
    "openEndedDateRange": "7d",
    "maxItems": 20,
    "fetchArticleDetails": true
}
```

### Large and recurring runs

What we measured on Apify in October 2026, with the default 256 MB of memory unless noted:

| Run                                              | Time   |
| ------------------------------------------------ | ------ |
| 100 articles, no article details                 | ~3 s   |
| 100 articles with publisher links and images     | ~18 s  |
| 100 articles with details, links already decoded | ~4 s   |
| 500 articles with details, 7 days, 1 GB memory   | ~70 s  |
| 500 articles with details, 7 days, 256 MB memory | ~4 min |

Tips for heavy use:

- **Give large detail runs 1 GB of memory.** Link decoding and image lookups need CPU, and Apify gives more CPU to runs with more memory. Runs without `fetchArticleDetails` are fast at 256 MB.
- **Match the window to the schedule.** Every saved row is charged, including articles an earlier run already saved. An hourly schedule with `openEndedDateRange` `1h`, or a daily one with `1d`, keeps the overlap small. Use `guid` to drop the rest.
- **Backfill with day-by-day searches.** For a history, set `dateFrom`, `dateTo` and `maxItems` to the total you want. Each day returns up to about 100 articles, so busy queries get about 100 per day. To get more per day, split the query, for example by `site:`.
- **Cap the cost.** Set a maximum cost per run in the run options. The Actor works out how many articles fit, stops cleanly at the limit and keeps everything saved so far.
- **One query per run.** Combine keywords with `OR` (`"Acme Corp" OR "Acme Inc"`), or save one task per keyword and run them through the API or schedules.

#### The link cache

With `fetchArticleDetails` and `cacheDecodedLinks` on (the default), decoded publisher links are saved to a key-value store named `google-news-scraper-link-cache`. The store is in **your** Apify account, the one running the Actor, not the developer's. Later runs read it and decode only new articles. It holds the 20,000 most recently used links. To reset it, delete the store under **Storage → Key-value stores**, or turn `cacheDecodedLinks` off.

#### Call it from your code

Start a run and get the articles in one request with the [run-sync API](https://docs.apify.com/api/v2/act-run-sync-get-dataset-items-post):

```bash
curl -X POST "https://api.apify.com/v2/acts/epicscrapers~google-news-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query": "Acme Corp", "openEndedDateRange": "1d", "fetchArticleDetails": true}'
```

For runs longer than about 5 minutes, start the run asynchronously and use a webhook or poll the run. The dataset is also available through integrations such as Make, Zapier and n8n.

### Monitor Google News with scheduled runs

Run the same search on a schedule to build a news feed or a history of coverage.

#### 1. Save your input as a task

Open the Actor, set your input, then click **Save as a new task**. A task is a saved input you can run again with one click or on a schedule.

#### 2. Schedule the task

In Apify Console, go to **Schedules**, click **Create new**, choose how often to run, and add your task. See [Schedules](https://docs.apify.com/platform/schedules) and [How to create a schedule](https://help.apify.com/en/articles/7120817-how-to-create-a-schedule).

Watch how to schedule an Actor:

https://www.youtube.com/watch?v=1jI7WcVQmwM

Or schedule a saved task:

https://www.youtube.com/watch?v=GRFW_Loo2dk

Common schedules:

| Use case                 | `openEndedDateRange` | Frequency       | Cron expression |
| ------------------------ | -------------------- | --------------- | --------------- |
| Breaking news on a brand | `1h`                 | Hourly          | `0 * * * *`     |
| Daily brand monitoring   | `1d`                 | Daily           | `0 6 * * *`     |
| Topic feed               | Not used             | Every 3 hours   | `0 */3 * * *`   |
| Weekly coverage report   | `7d`                 | Weekly (Monday) | `0 6 * * 1`     |

#### 3. Send the results to a spreadsheet

Connect Google in the task's **Integrations** tab to save every run to Google Sheets or Google Drive automatically:

https://www.youtube.com/watch?v=IFTeKdj6ZGM

#### 4. Compare runs

- **New articles:** keep rows whose `guid` wasn't in earlier runs.
- **Coverage by publisher:** count rows per `source` over time.
- **Timing:** use `publishedAt` to see when a story breaks and who covers it first.

### Input reference

| Field                 | Type             | Default             | Effect                                                                                                                                               |
| --------------------- | ---------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `query`               | String           | `"AI breakthrough"` | Search text with optional operators. Leave empty to scrape only topics.                                                                              |
| `topics`              | Array of strings | `[]`                | `WORLD`, `NATION`, `BUSINESS`, `TECHNOLOGY`, `ENTERTAINMENT`, `SPORTS`, `SCIENCE`, `HEALTH`, in the selected language. Not combined with `query`.    |
| `topicsHashed`        | Array of strings | `[]`                | Topic IDs, `TOPIC_ID/sections/SECTION_ID`, or full `news.google.com/topics/...` URLs.                                                                |
| `language`            | String           | `"US:en"`           | Country and language pair, for example `GB:en`, `DE:de`, `FR:fr`, `JP:ja`.                                                                           |
| `maxItems`            | Integer          | Empty               | Maximum articles saved, newest first. Above 100, the search runs day by day. Empty saves everything one search returns (about 100) plus topics.      |
| `fetchArticleDetails` | Boolean          | `false`             | Replace Google News links with publisher URLs and add `image`.                                                                                       |
| `cacheDecodedLinks`   | Boolean          | `true`              | Remember decoded links in your account between runs. Only used with `fetchArticleDetails`.                                                           |
| `dateFrom` / `dateTo` | String           | Empty               | Search range as `YYYY-MM-DD`, both days included. Overrides `openEndedDateRange`. With only one set, the other defaults to 30 days earlier or today. |
| `openEndedDateRange`  | String           | `"60d"`             | Range up to now: `1h` or `6h` (exact hours), `7d`, `1y`. Used when both dates are empty.                                                             |
| `proxyConfiguration`  | Object           | Apify Proxy         | Proxy for Google requests. The Actor tries Google directly first and switches to this proxy if Google blocks or rate-limits the run.                 |

Dates apply to `query` searches only. Topic feeds return what Google News currently lists for the topic.

#### Search operators

| Operator      | Example                     | Finds                                  |
| ------------- | --------------------------- | -------------------------------------- |
| Exact phrase  | `"interest rates"`          | The words together, in this order      |
| Exclude       | `tesla -musk`               | Tesla articles without "musk"          |
| Either        | `"Acme Corp" OR "Acme Inc"` | Either name                            |
| One publisher | `site:reuters.com tariffs`  | Reuters articles only                  |
| Title only    | `intitle:layoffs`           | Articles with the word in the headline |
| URL           | `inurl:earnings`            | Articles with the word in the URL      |

Don't add `after:`, `before:` or `when:` yourself. The Actor adds them from the date fields.

### Ready-to-run examples

#### Hourly brand monitoring

```json
{
    "query": "\"Acme Corp\" OR \"Acme Inc\"",
    "openEndedDateRange": "1h",
    "fetchArticleDetails": true
}
```

Schedule it hourly. Each run saves the last hour's articles with publisher links, and links already decoded by earlier runs come from the cache.

#### One month of a publisher's coverage

```json
{
    "query": "site:reuters.com tariffs",
    "dateFrom": "2025-03-01",
    "dateTo": "2025-03-31",
    "maxItems": 2000
}
```

#### Business news in Germany and Japan

```json
{
    "query": "",
    "topics": ["BUSINESS", "NATION"],
    "language": "DE:de"
}
```

Run it again with `"language": "JP:ja"`. `NATION` is the news of the selected country.

#### A section feed

```json
{
    "query": "",
    "topicsHashed": [
        "CAAqJggKIiBDQkFTRWdvSUwyMHZNRGRqTVhZU0FtVnVHZ0pWVXlnQVAB/sections/CAQiQ0NCQVNMQW9JTDIwdk1EZGpNWFlTQW1WdUdnSlZVeUlOQ0FRYUNRb0hMMjB2TUcxcmVpb0pFZ2N2YlM4d2JXdDZLQUEqKggAKiYICiIgQ0JBU0Vnb0lMMjB2TURkak1YWVNBbVZ1R2dKVlV5Z0FQAVAB"
    ],
    "fetchArticleDetails": true
}
```

This is Technology → Artificial intelligence. Open any topic or section on news.google.com and paste its URL or the ID after `/topics/`.

### Analyze the results with ChatGPT or Claude

Export the dataset as CSV and attach it to a chat with ChatGPT, Claude or another AI assistant. Some prompts to start with:

**Daily briefing.** "These are today's news articles about our company and three competitors. Group them by company and story, and give me one line per story with the publishers that covered it."

**Share of voice.** "Count articles per company per day and per `source`. Which publishers cover us least compared to competitors?"

**Story timeline.** "Sort these articles by `publishedAt` and show which publisher reported the story first and how fast others followed."

For deeper analysis, send each `link` to [Webpage to Markdown](https://apify.com/epicscrapers/webpage-to-markdown) and give the AI the full text. Treat article text as source data, not as instructions for an AI agent.

### Output

Results go to the run's default dataset. Export as JSON, CSV, Excel, XML or HTML. This is a real row from a run on October 13, 2026, with `fetchArticleDetails` on:

```json
{
    "title": "Why Google is paying to upgrade nuclear power plants - Grist",
    "link": "https://grist.org/energy/why-google-is-paying-to-upgrade-nuclear-power-plants/",
    "guid": "CBMihAFBVV95cUxQSHYwZkxUeDBXRWZrTnp6cVBYWVBzR0xpNEt3U0VTZGtNSS0zUTJYUklkX3d1WF96S3MwTTBYcWNvQzVEaWZkZW9WSlVISGVKMUZFeVpPRzJ6VU1NSmlFN0lETnFYQ1hyVC1RQk1BWmh0R0NCekZHNkR2X1oxRmg5Z1N6MjE",
    "source": "Grist",
    "sourceUrl": "https://grist.org",
    "publishedAt": "2026-10-13T08:46:53.000Z",
    "rssLink": "https://news.google.com/rss/articles/CBMihAFBVV95cUxQSHYwZkxUeDBXRWZrTnp6cVBYWVBzR0xpNEt3U0VTZGtNSS0zUTJYUklkX3d1WF96S3MwTTBYcWNvQzVEaWZkZW9WSlVISGVKMUZFeVpPRzJ6VU1NSmlFN0lETnFYQ1hyVC1RQk1BWmh0R0NCekZHNkR2X1oxRmg5Z1N6MjE?oc=5",
    "loadedUrl": "https://grist.org/energy/why-google-is-paying-to-upgrade-nuclear-power-plants/",
    "image": "https://grist.org/wp-content/uploads/2026/10/Vogtle-towers.jpg"
}
```

| Field         | Description                                                                                |
| ------------- | ------------------------------------------------------------------------------------------ |
| `title`       | Headline as Google News shows it, usually ending with ` - Publisher`.                      |
| `link`        | Publisher URL with `fetchArticleDetails`, otherwise the Google News link.                  |
| `guid`        | Google News article ID. Stable across runs, so use it to de-duplicate.                     |
| `source`      | Publisher name.                                                                            |
| `sourceUrl`   | Publisher home page.                                                                       |
| `publishedAt` | Publication time, ISO 8601 in UTC.                                                         |
| `rssLink`     | The original Google News link.                                                             |
| `loadedUrl`   | Same as `link`. Only with `fetchArticleDetails`.                                           |
| `image`       | Article preview image from `og:image` or `twitter:image`. Only with `fetchArticleDetails`. |

#### Notes on fields

- Without `fetchArticleDetails`, `link` and `rssLink` are the same Google News link, and `loadedUrl` and `image` are missing.
- With it on, nearly every link resolves. If one can't, `link` and `loadedUrl` keep the Google News link and the log says how many.
- `image` is missing when the publisher page has no preview image or blocks automated requests. Some large publishers do. In our tests 60–85% of articles had an image.
- For older articles Google News gives only the day, not the time. Those rows have `publishedAt` at `07:00:00.000Z`.
- `source` and `sourceUrl` come from the feed and can be `null`.

### FAQ

#### How many results can I get?

One Google News search returns at most about 100 articles. Set `maxItems` above 100 with a date range and the Actor searches each day separately, so a month can return up to about 3,000. A day with more than 100 articles still returns about 100. Narrow the query, for example with `site:`, to get more.

#### Why did my run return fewer articles than `maxItems`?

Google News had no more articles for that query and date range. Widen the range or the query. When a run finds nothing it still succeeds, and the status message says so.

#### Do topics use the date range?

No. Topic feeds always return what Google News lists for the topic right now, usually 50–70 recent articles. Use `query` for dates.

#### Why is `image` missing for some articles?

Some publishers block automated requests or have no preview image. The publisher link is still resolved.

#### Do I need an API key or proxy?

No key, no Google account. The Actor tries Google directly first and switches to Apify Proxy if Google rate-limits the run.

#### Can I get the full article text?

Not from this Actor. Pass the `link` values to [Webpage to Markdown](https://apify.com/epicscrapers/webpage-to-markdown). For video content, [YouTube Transcript Scraper](https://apify.com/epicscrapers/youtube-transcript-scraper) returns transcripts you can combine with news in an LLM pipeline.

#### Is it legal to scrape Google News?

The Actor reads publicly available Google News feeds and article metadata. You are responsible for how you use the data, including Google's and publishers' terms and laws such as GDPR and copyright.

### Related Actors

- [Webpage to Markdown](https://apify.com/epicscrapers/webpage-to-markdown): turn article links into clean Markdown.
- [YouTube Transcript Scraper](https://apify.com/epicscrapers/youtube-transcript-scraper): transcripts for content and LLM pipelines.

### Cost

This Actor uses pay-per-event pricing. You pay per article saved, with no subscription. Compute and proxy are included.

| Apify plan     | Per article | Per 1,000 articles |
| -------------- | ----------- | ------------------ |
| Free           | $0.0015     | $1.50              |
| Starter and up | $0.001      | $1                 |

Publisher links and images (`fetchArticleDetails`) cost nothing extra.

Example runs on a paid plan:

| Run                                                        | Articles | Cost  |
| ---------------------------------------------------------- | -------- | ----- |
| One search                                                 | 100      | $0.10 |
| One month of a busy query, day by day                      | 3,000    | $3    |
| Hourly brand monitoring, ~10 new articles an hour, 30 days | 7,200    | $7.20 |
| Daily monitoring of 5 keywords, ~50 articles each, 30 days | 7,500    | $7.50 |

Set `maxItems` or a maximum cost per run to stay within a budget. The **Pricing** tab always shows the current prices.

### Support

Report problems or request features in the **Issues** tab. Include the run ID, the input and what you expected. We read every issue.

This Actor is not affiliated with or endorsed by Google LLC. "Google" and "Google News" are trademarks of Google LLC.

# Actor input Schema

## `query` (type: `string`):

Search text, as you would type it into Google News. Operators work: `site:reuters.com`, `intitle:`, `inurl:`, exact phrases in double quotes, `-` to exclude, `AND`, `OR`. Example: `"electric vehicles" site:reuters.com -tesla`. The date range below is added to the search automatically. Leave empty to scrape only topics.

## `topics` (type: `array`):

Google News topic feeds in the selected language and country. `NATION` is the news of the selected country. Topics are scraped separately from the search query, not combined with it, and always return what Google News currently lists (the date range does not apply).

## `topicsHashed` (type: `array`):

Topic or section feeds that are not in the list above. Paste the part of a Google News URL after `news.google.com/topics/`, or the whole URL. Sections work too: `TOPIC_ID/sections/SECTION_ID`. Example (Technology → Artificial intelligence): `CAAqJggKIiBDQkFTRWdvSUwyMHZNRGRqTVhZU0FtVnVHZ0pWVXlnQVAB/sections/CAQiQ0NCQVNMQW9JTDIwdk1EZGpNWFlTQW1WdUdnSlZVeUlOQ0FRYUNRb0hMMjB2TUcxcmVpb0pFZ2N2YlM4d2JXdDZLQUEqKggAKiYICiIgQ0JBU0Vnb0lMMjB2TURkak1YWVNBbVZ1R2dKVlV5Z0FQAVAB`.

## `language` (type: `string`):

Select your language and region pair.

## `maxItems` (type: `integer`):

Maximum number of articles to save, newest first. Google News returns at most about 100 articles per search. Above 100, the Actor searches each day of the date range separately, newest day first, and stops once it has enough. Leave empty to save everything one search returns (up to about 100 plus topic feeds).

## `fetchArticleDetails` (type: `boolean`):

Replace Google News redirect links with the publisher's article URL and add the article's preview image (`og:image`). Links are decoded through Google's own decoder, about 10 articles at a time, with no browser. Adds roughly 1 second per 10 articles.

## `cacheDecodedLinks` (type: `boolean`):

Save decoded publisher links in a key-value store named `google-news-scraper-link-cache` in your own Apify account, so later runs (for example scheduled monitoring) skip articles they already decoded. Only used with `Fetch article details`. The store keeps the 20,000 most recently used links; delete it in Storage → Key-value stores to reset.

## `dateFrom` (type: `string`):

First day to search (inclusive), as YYYY-MM-DD. Overrides `Open-ended date range`. If only `Date to` is set, the range starts 30 days before it.

## `dateTo` (type: `string`):

Last day to search (inclusive), as YYYY-MM-DD. Overrides `Open-ended date range`. If only `Date from` is set, the range ends today.

## `openEndedDateRange` (type: `string`):

Relative date range up to now: `1h` or `12h` for the last hours (exact, uses Google's `when:` operator), `7d` for the last 7 days, `1y` for the last year. Used when `Date from` and `Date to` are empty. Applies to the search query, not to topics.

## `proxyConfiguration` (type: `object`):

Use either automatic Apify proxies or your own.

## Actor input object example

```json
{
  "query": "AI breakthrough",
  "topics": [],
  "topicsHashed": [],
  "language": "US:en",
  "maxItems": 50,
  "fetchArticleDetails": false,
  "cacheDecodedLinks": true,
  "openEndedDateRange": "60d",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "topicsHashed": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("epicscrapers/google-news-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "topicsHashed": [] }

# Run the Actor and wait for it to finish
run = client.actor("epicscrapers/google-news-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "topicsHashed": []
}' |
apify call epicscrapers/google-news-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,epicscrapers/google-news-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GxtxtkTcmOgyxkAta/builds/l7x0jKqkLFwKb0rXQ/openapi.json
