# Google News Scraper (`sfoln/google-news-search`)

Search Google News by keyword, brand or topic: one row per article with title, URL, publisher, snippet, image and an ISO publish time, by country, language and time range. $4 per 1,000 result pages of up to 10 articles.

- Family: SEO & search
- Categories: News, SEO tools, AI
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: Google News Scraper (sfoln/google-news-search)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/google-news-search.json
- MCP: https://mcp.apify.com?tools=sfoln/google-news-search
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~google-news-search/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~google-news-search/runs

Google News Scraper searches Google News for any keyword, brand or topic and returns one clean row per article: title, URL, publisher, domain, snippet, thumbnail and an ISO publishedAt timestamp. Google only shows relative dates like "2 hours ago", so we resolve them against the run time and keep the original string too. Built for media monitoring, PR tracking, market intelligence and AI agents that need fresh news.

## Price per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| Google News results page (`google-news-query`) | $0.004 | $4 / 1,000 | Charged once per Google News results page of up to 10 articles (one upstream credit). |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
curl -X POST "https://api.apify.com/v2/actors/sfoln~google-news-search/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries":["artificial intelligence"]}'
```

MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/google-news-search"
    }
  }
}
```

Example prompt: Get the latest Google News articles about "artificial intelligence" from the past day in the US and summarize the main stories.

## Input

Enter news search queries (one per line). For every query the Actor writes one row per article plus one `query_summary` row.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `queries` (required) | array | — | News queries: Keywords, company names or topics to search in Google News, one per line. Accounts on the Apify free plan can process up to 10 queries per run. |
| `country` | string | `"us"` | Country (gl): Two-letter country code that decides the news edition, e.g. us, gb, de, in. |
| `language` | string | `"en"` | Language (hl): Language code, e.g. en, de, es. Publish dates are only parsed into publishedAt for English date strings. |
| `timeRange` | string | `"any"` | Time range: Only return articles published within this period. One of `"any"`, `"hour"`, `"day"`, `"week"`, `"month"`, `"year"`. |
| `resultsPerQuery` | integer | `10` | Articles per query: How many articles to fetch per query, rounded up to a multiple of 10. Each page of 10 articles is one google-news-query event. |
| `page` | integer | `1` | Start page: Result page to start from (1 = newest/most relevant). |
| `maxQueries` | integer | `1000` | Max queries: Safety cap on the number of queries processed in this run. |
| `concurrency` | integer | `5` | Concurrency: How many queries run in parallel. |
| `includeRaw` | boolean | `false` | Include raw upstream response: Attach the unmodified upstream pages to each query_summary row. |

Example input:

```json
{
  "queries": [
    "artificial intelligence"
  ]
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | Input |
| `query` | string | Query |
| `resultType` | string | Result type: article \| query_summary (one per query, not charged itself) |
| `rank` | integer | null | Rank: Overall position: (page − 1) × 10 + the article's place on its page. |
| `position` | integer | null | Position on page |
| `page` | integer | null | Page |
| `title` | string | null | Title |
| `url` | string | null | URL |
| `domain` | string | null | Domain: Publisher host without www., derived from url. |
| `publisher` | string | null | Publisher: Publisher name as shown by Google News. |
| `date` | string | null | Date (raw): Date string as shown by Google, e.g. "2 hours ago". |
| `publishedAt` | string | null | Published at: ISO timestamp parsed from `date` (relative dates resolved against the run time). |
| `publishedAtIsEstimate` | boolean | null | Published at is estimate: true when computed from a relative date like "3 weeks ago" or from a date shown without a year ("Oct 5"). |
| `snippet` | string | null | Snippet |
| `imageUrl` | string | null | Image URL: Thumbnail served by Google. |
| `totalArticles` | integer | null | Articles: query_summary: articles written for the query. |
| `pagesFetched` | integer | null | Pages fetched |
| `creditsUsed` | number | null | Credits used: query_summary: upstream credits the query used. |
| `creditsCharged` | number | null | Credits charged: query_summary: google-news-query events charged for the query, before any of its rows was written (equal to creditsUsed unless the maximum cost per run was reached). |
| `publishers` | array | Publishers: query_summary: distinct publishers. |
| `newestPublishedAt` | string | null | Newest article |
| `oldestPublishedAt` | string | null | Oldest article |
| `country` | string | null | Country: query_summary: country edition (Google gl). |
| `language` | string | null | Language: query_summary: language (Google hl). |
| `timeRange` | string | null | Time range: query_summary: Google tbs filter used (e.g. qdr:d), or null for any time. |
| `status` | string | Status: ok \| not_found \| error \| skipped_budget \| skipped_free_plan |
| `charged` | boolean | Charged: true on an article row covered by the google-news-query charge of its results page; the query_summary row is never charged itself (see creditsCharged). |
| `chargedEvent` | string | Charged event |
| `chargedCount` | integer | Events charged: Events actually charged when the charge came back short of the requested count (present only then; a warning explains it). |
| `source` | string | Data source: Always serper (Google via a third-party SERP API). |
| `fetchedAt` | string | Fetched at |

Example record:

```json
{
  "input": "apify",
  "query": "apify",
  "resultType": "article",
  "rank": 1,
  "position": 1,
  "page": 1,
  "title": "Apify raises funding to expand web data platform",
  "url": "https://techcrunch.com/2026/10/13/apify-funding/",
  "domain": "techcrunch.com",
  "publisher": "TechCrunch",
  "date": "2 hours ago",
  "publishedAt": "2026-10-14T10:00:00.000Z",
  "publishedAtIsEstimate": true,
  "snippet": "Prague-based Apify, which runs a marketplace of web scrapers…",
  "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=…",
  "status": "ok",
  "charged": true,
  "chargedEvent": "google-news-query",
  "source": "serper",
  "fetchedAt": "2026-10-14T12:00:00.000Z"
}
```

## Related

- [Google Search Results Scraper](https://www.sfoln.com/actors/google-search-results.md) (`sfoln/google-search-results`)
- [Brand Monitoring – X, Reddit, News & Bluesky](https://www.sfoln.com/actors/brand-mentions-monitor.md) (`sfoln/brand-mentions-monitor`)
- [Google Scholar Scraper](https://www.sfoln.com/actors/google-scholar-search.md) (`sfoln/google-scholar-search`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
