# News Scraper — Global News Search by Keyword, No API Key (`actor-forge/news-search`) Actor

Search news articles from the last 72 hours worldwide by keyword, source domain, country, language or theme, using the GDELT Project's open 15-minute feeds. Each article: URL, title, source, time, tone, themes, locations, organisations and image. No API key. $1.20 per 1,000 articles.

- **URL**: https://apify.com/actor-forge/news-search.md
- **Developed by:** [ActorForge](https://apify.com/actor-forge) (community)
- **Categories:** News, Marketing, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 articles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## News Search - Global News by Keyword, Google News Alternative

Search news articles from the last 72 hours worldwide by keyword, source domain, country, language or theme, using the GDELT Project's open 15-minute feeds. Each article: URL, title, source, time, tone, themes, locations, organisations and image. No API key. $1.20 per 1,000 articles.

**A news search API for the whole world's news, without Google News scraping or an API key.** Give it keywords (a company, a product, a topic, a person in the news) and it returns matching **news articles from the last 1 to 72 hours**, newest first: article URL, **page title**, source domain, the time the article was seen (15-minute resolution), language, **tone and sentiment**, GDELT themes, **locations and countries mentioned**, **organisations**, lead image and which keywords matched. Filter by **source domain** (e.g. only reuters.com and bbc.co.uk, or exclude sites), **country mentioned**, **language** (English plus about 65 translated languages: German, French, Spanish, Chinese, Arabic, Russian, Japanese and more), GDELT **theme** and **sentiment**. Switch on **monitor mode** for scheduled runs and each run returns only articles newer than the last one, which makes it a cheap **news monitoring and brand mention** feed. Use it for media monitoring, PR and brand tracking, market and competitor news, financial news signals, news datasets for AI agents and RAG pipelines, and as a **Google News alternative** that works from any server. Chain it with Website to Markdown when you need the full article text. The data comes from the open **GDELT Project** 15-minute GKG files, which GDELT licenses for unlimited commercial use with attribution; every row carries a `source` credit. **$1.20 per 1,000 articles**, with no compute bill on top. Runs that find nothing return a free status row instead of failing.

### What data does it return?

Every run outputs clean, schema-validated rows like these:

| publishedAt | title | sourceDomain | language | sentiment | tone | countries | matchedKeywords |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 2026-10-23T10:00:00.000Z | OpenAI partners with Poland's NASK to strengthen AI safety | thenews.com.pk | en | positive | 2.68 | United Kingdom, Poland | artificial intelligence |
| 2026-10-23T10:00:00.000Z | World shares are mixed after Wall Street's AI-related losses, while oil prices jump | union-bulletin.com | en | negative | -3.55 | Australia, France, Japan, United Kingdom, … | Nvidia |
| 2026-10-23T08:30:00.000Z | Ohne Lenkrad und Pedale: Teslas neues Robotaxi soll noch 2026 in den Verkauf starten | az-online.de | de | neutral | 0.98 | Germany | Tesla |

### How much does it cost?

Transparent pay-per-event pricing — you only pay for what you get, and the
actor **always respects your run budget**: set a maximum total charge and it
stops cleanly at the cap instead of overrunning.

| Event | Price | Charged | Worked example |
| --- | --- | --- | --- |
| `article` | $0.0012 | per news article row | 500 articles about your brand = $0.60 |
| `apify-actor-start` | $0.00005 | per run per GB of memory (platform start fee) | One run at 1 GB = $0.00005 |

### Input options

| Field | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `keywords` | array | no | — | Words or phrases to find, e.g. "artificial intelligence", "Tesla" or "interest rates". Matched as whole words, case-insensitive, in the article title, its URL, the organisations GDELT extracted and the names mentioned in the article (not the full article text). Leave empty to get all articles that pass the other filters. |
| `keywordMatch` | string | no | `"any"` | Any: an article matching at least one keyword is returned. All: every keyword must match. |
| `excludeKeywords` | array | no | — | Drop articles that mention any of these words or phrases (same matching as keywords). |
| `lookbackHours` | integer | no | `24` | How far back to search, from the newest GDELT batch: 1 to 72 hours. The translated (non-English) feed is searched over at most 24 hours. Newest articles come first. |
| `maxArticles` | integer | no | `100` | Stop after this many articles (newest first). Each article is one charged row. |
| `feed` | string | no | `"english"` | English: English-language news worldwide. Translated: news in about 65 other languages (titles stay in the original language; organisations and themes are in English). All: both. A non-English language filter switches to the translated feed automatically. |
| `languages` | array | no | — | Only articles in these languages, as ISO codes like en, de, fr, es, zh, ar (two- or three-letter). Empty = all languages in the chosen feed. |
| `countries` | array | no | — | Only articles that mention a place in one of these countries, by English country name, e.g. "Germany", "United States", "United Kingdom", "India". Case-insensitive. |
| `sourceDomains` | array | no | — | Only articles from these news sites, e.g. bbc.co.uk, reuters.com, lemonde.fr. Subdomains are included. |
| `excludeSourceDomains` | array | no | — | Drop articles from these sites (subdomains included). |
| `themes` | array | no | — | Only articles tagged with one of these GDELT GKG themes. A full code (ECON_STOCKMARKET) or a prefix ending at an underscore boundary (ECON, TAX_FNCACT, WB\_). See the GDELT GKG theme list. |
| `sentiment` | string | no | `"any"` | Only articles with this overall tone. GDELT tone ≥ 1.5 is positive, ≤ −1.5 negative, otherwise neutral. |
| `requireTitle` | boolean | no | `true` | Skip the rare articles for which GDELT recorded no page title. |
| `includePeople` | boolean | no | `false` | Add the names of people GDELT found in each article (mostly public figures). Off by default; not intended for profiling individuals. |
| `newSinceLastRun` | boolean | no | `false` | For scheduled runs: skip GDELT batches already scanned by an earlier run with the same filters, so each run returns only newer articles. State is kept in a key-value store named news-search-state in your account. |

### Limits & honest notes

- Data: the GDELT Project's open GKG 2.1 files (https://www.gdeltproject.org/), published every 15 minutes and licensed for unlimited use with attribution. Every row has source "GDELT Project (https://www.gdeltproject.org/)"; please keep that credit when you republish the data. Not affiliated with GDELT or Google.
- Keywords match whole words in the title, the URL, the organisations GDELT extracted and the names mentioned in the article. They are not matched against the full article text, so recall is lower than a full-text search engine. Use several related keywords (e.g. "artificial intelligence" and "AI") for better coverage.
- publishedAt is the 15-minute GDELT batch in which the article was first seen (usually within 15 minutes of publication), not the publisher's own timestamp. publishedAtPrecision says so on every row.
- Window: up to 72 hours back for English-language news, up to 24 hours for the translated feed (about 65 languages; titles stay in the original language). GDELT sometimes skips or delays a batch; those are reported as missing in the run summary and skipped.
- Coverage is what GDELT monitors: tens of thousands of news sites worldwide, roughly 1,000 English and 3,000 translated articles per 15 minutes. There is no "top stories" ranking: results are newest first.
- No article bodies. Chain Website to Markdown on the URLs if you need full text.
- Countries are matched by English country name in GDELT's location data ("Germany", "United Kingdom"); the locations field also gives GDELT's FIPS country codes and coordinates.
- People names are off by default. Switching on includePeople adds names of people mentioned (mostly public figures); do not use them to profile individuals.
- Respects your run budget: set a maximum total charge and the run stops cleanly at the cap, with nothing charged twice. A run with no matches returns one free status row explaining why.

### Related ActorForge actors

- [Website to Markdown](https://apify.com/actor-forge/website-to-markdown) — full article text for the URLs found here
- [RSS Feed Reader](https://apify.com/actor-forge/rss-feed-reader) — follow specific news sites' own feeds

### Changelog

- **2026-10-23** — Initial release: keyword news search over GDELT's 15-minute GKG files (English and translated feeds), filters for language, country, source domain, theme and sentiment, URL de-duplication, monitor mode, free status rows.

***

*Built and maintained by **ActorForge**. Reliability first: every actor in the
portfolio is monitored by an automated nightly self-test, and breakages are
typically fixed the same day.*

# Actor input Schema

## `keywords` (type: `array`):

Words or phrases to find, e.g. "artificial intelligence", "Tesla" or "interest rates". Matched as whole words, case-insensitive, in the article title, its URL, the organisations GDELT extracted and the names mentioned in the article (not the full article text). Leave empty to get all articles that pass the other filters.

## `keywordMatch` (type: `string`):

Any: an article matching at least one keyword is returned. All: every keyword must match.

## `excludeKeywords` (type: `array`):

Drop articles that mention any of these words or phrases (same matching as keywords).

## `lookbackHours` (type: `integer`):

How far back to search, from the newest GDELT batch: 1 to 72 hours. The translated (non-English) feed is searched over at most 24 hours. Newest articles come first.

## `maxArticles` (type: `integer`):

Stop after this many articles (newest first). Each article is one charged row.

## `feed` (type: `string`):

English: English-language news worldwide. Translated: news in about 65 other languages (titles stay in the original language; organisations and themes are in English). All: both. A non-English language filter switches to the translated feed automatically.

## `languages` (type: `array`):

Only articles in these languages, as ISO codes like en, de, fr, es, zh, ar (two- or three-letter). Empty = all languages in the chosen feed.

## `countries` (type: `array`):

Only articles that mention a place in one of these countries, by English country name, e.g. "Germany", "United States", "United Kingdom", "India". Case-insensitive.

## `sourceDomains` (type: `array`):

Only articles from these news sites, e.g. bbc.co.uk, reuters.com, lemonde.fr. Subdomains are included.

## `excludeSourceDomains` (type: `array`):

Drop articles from these sites (subdomains included).

## `themes` (type: `array`):

Only articles tagged with one of these GDELT GKG themes. A full code (ECON_STOCKMARKET) or a prefix ending at an underscore boundary (ECON, TAX_FNCACT, WB\_). See the GDELT GKG theme list.

## `sentiment` (type: `string`):

Only articles with this overall tone. GDELT tone ≥ 1.5 is positive, ≤ −1.5 negative, otherwise neutral.

## `requireTitle` (type: `boolean`):

Skip the rare articles for which GDELT recorded no page title.

## `includePeople` (type: `boolean`):

Add the names of people GDELT found in each article (mostly public figures). Off by default; not intended for profiling individuals.

## `newSinceLastRun` (type: `boolean`):

For scheduled runs: skip GDELT batches already scanned by an earlier run with the same filters, so each run returns only newer articles. State is kept in a key-value store named news-search-state in your account.

## Actor input object example

```json
{
  "keywords": [
    "artificial intelligence"
  ],
  "keywordMatch": "any",
  "lookbackHours": 1,
  "maxArticles": 20,
  "feed": "english",
  "sentiment": "any",
  "requireTitle": true,
  "includePeople": false,
  "newSinceLastRun": false
}
```

# Actor output Schema

## `articles` (type: `string`):

One row per news article: URL, title, source domain, time seen, language, tone/sentiment, themes, locations, organisations, image and matched keywords. Data: GDELT Project.

## `summary` (type: `string`):

Articles delivered and scanned, GDELT batch files scanned or missing, the time window covered and billing.

# 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 = {
    "keywords": [
        "artificial intelligence"
    ],
    "lookbackHours": 1,
    "maxArticles": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("actor-forge/news-search").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 = {
    "keywords": ["artificial intelligence"],
    "lookbackHours": 1,
    "maxArticles": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("actor-forge/news-search").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 '{
  "keywords": [
    "artificial intelligence"
  ],
  "lookbackHours": 1,
  "maxArticles": 20
}' |
apify call actor-forge/news-search --silent --output-dataset

```

## MCP server setup

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

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/vLBzg0BS7HeO5XEKc/builds/mbxlsBd53KLandk3r/openapi.json
