# News Search API — Headlines & Articles by Keyword (`highbrow_fame/news-search-api`) Actor

Keyword news search over Google News (thousands of sources) with date range, language, country, dedup, source, publish time and optional full-text extraction. Unofficial News Search API.

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

## Pricing

$0.50 / 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 API — Headlines & Articles by Keyword

Search the news by keyword across thousands of publishers at once — any language, any country, any date range — and get one clean list of articles: title, publisher, publish time, the publisher's real article URL and, when you ask for it, the full article text. One run, several queries, duplicates removed.

**Try it in 1 minute:** press **Start** with the prefilled input (one query, English, US). You get up to 100 recent articles with `title`, `url`, `source`, `publishedAt` in about 10–20 seconds. Turn on **Fetch full text** to add the article body as `text`. Price: $0.50 per 1,000 articles; searches that return nothing are free.

**Use it to:**

- Monitor a company, product, topic or crisis across the world's press — in several languages and countries from one input.
- Give an AI agent a news search tool that returns real article links and, optionally, the article text ready to summarise.
- Build a research corpus for a date range: `from` and `to` narrow the search to the days you care about.
- Track how a story spreads across countries by running the same query in `US`, `GB`, `DE`, `FR`, `IN` editions side by side.
- Replace a keyed news API with pay-per-article pricing and no monthly plan.

### How it works

For every combination of query × language × country the Actor reads Google News' public RSS search feed — the same feed any RSS reader can subscribe to — with your date range added as Google's `after:` / `before:` operators. Google's feeds carry redirect links, so the Actor decodes each one into the publisher's real URL (locally when the link allows it, otherwise through Google's own link-resolution endpoint). Articles found by more than one query, language or country are delivered once.

With **Fetch full text** on, the publisher's page is opened directly and its main text is extracted with Mozilla Readability (the engine behind Firefox's reader view). E-mail addresses and phone numbers in the text are removed. Pages that are paywalled, blocked or not HTML are still delivered as articles, with `text` null and a `textError` that says why.

No HTML of Google is scraped, no login, no cookies, no captcha solving. The first request goes out directly; the proxy is used only to try again after a network error or a refusal.

### Input

| Field | Required | What it does |
|---|---|---|
| `queries` | yes | Keywords, one per line. Google syntax works: `"exact phrase"`, `site:bbc.com`, `-word`. |
| `from`, `to` | no | `YYYY-MM-DD` date range (published on or after `from`, before `to`). |
| `languages` | no | Language codes, default `["en"]`. Each query runs once per language and country. |
| `countries` | no | Edition country codes, default `["US"]`. |
| `maxItems` | no | Articles per search, default 100 (Google's feed maximum). |
| `dedup` | no | Deliver each article once (default on). |
| `fetchFullText` | no | Add the article text and word count (default off). |
| `maxConcurrency`, `proxyConfiguration` | no | Speed and proxy; the defaults work. |

### Output

One record per article, plus one free record per search that gave nothing (`status` `NO_RESULTS`, `NOT_FOUND` or `FAILED` with an `error`).

| Field | What it is |
|---|---|
| `title` | headline, without the trailing publisher name |
| `url`, `urlDecoded` | the publisher's article URL, and whether decoding succeeded (`false`: `url` is still the Google link) |
| `googleNewsUrl` | the original news.google.com redirect link |
| `source`, `sourceUrl` | publisher name and website |
| `publishedAt` | ISO 8601 publish time |
| `snippet` | short description when the feed carries one (usually it does not) |
| `text`, `wordCount`, `textError` | with **Fetch full text**: the article body, its length, or why it could not be read |
| `query`, `language`, `country`, `position` | which search found it and where it stood |
| `input`, `status`, `error`, `scrapedAt` | what you gave; `OK` for a delivered article, otherwise why the search gave nothing |

#### Example

```json
{
  "input": "electric vehicles",
  "query": "electric vehicles",
  "language": "en",
  "country": "US",
  "position": 1,
  "title": "Researchers release open dataset for robot training",
  "url": "https://science.example.org/releases/2026/10/robot-dataset.html",
  "urlDecoded": true,
  "googleNewsUrl": "https://news.google.com/rss/articles/CBMiRUFVX3lxTFBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eg?oc=5",
  "source": "Science Daily Sample",
  "sourceUrl": "https://science.example.org",
  "publishedAt": "2026-10-18T22:03:00.000Z",
  "snippet": null,
  "text": "A team of researchers has released an open dataset meant to help train household robots on everyday tasks…",
  "wordCount": 131,
  "status": "OK",
  "scrapedAt": "2026-10-19T11:40:12.000Z"
}
```

### Pricing

You pay **per article delivered** — see the price on this page. Searches without results and failed fetches are free. Full-text extraction is included in the article price. Keep the bill predictable with **Max articles per query** or the run's **Maximum charge**.

### FAQ

**Is this an official API?** No, it's an unofficial API built on public pages — Google News' public RSS search feeds and the publishers' own article pages.

**How far back can I search?** Google News' search feeds reach back years for most queries, but return at most about 100 articles per feed. For a long period, run several date ranges (`from`/`to`) in separate searches — each one is its own feed of up to 100 articles.

**Why is `text` null for some articles?** The page was paywalled, blocked the fetch, was not HTML (a video, a PDF) or carries no readable article. The record still has the headline, source, date and link; `textError` says what happened. Articles whose Google link could not be decoded are not fetched.

**Does it include Bing News or GDELT?** Not yet — this version searches Google News, which covers tens of thousands of publishers. Tell us on the Issues tab if you need another engine.

**Can I run it on a schedule?** Yes: save your input as a task, schedule it hourly or daily with `from` set to yesterday, or plug it into Make, Zapier or n8n. It also works from the Apify API and from AI agents through the Apify MCP server.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

### Related Actors

- [RSS & Atom Feed Reader](https://apify.com/highbrow_fame/rss-feed-reader) — any feed or website as one clean list
- [AI Brand Monitor](https://apify.com/highbrow_fame/ai-search-visibility-tracker) — track your brand in ChatGPT and Perplexity answers
- [Hacker News Scraper](https://apify.com/highbrow_fame/hacker-news-stories) — stories, comments and search
- [Google News API](https://apify.com/highbrow_fame/google-news-api) — Google News headlines by keyword, topic and country
- [Article Extractor API](https://apify.com/highbrow_fame/article-extractor-api) — title, author, date and full text of any article

# Actor input Schema

## `queries` (type: `array`):

Keywords to search the news for, one per line. Google search syntax works: quotes for exact phrases, site:bbc.com for one publisher, -word to exclude a word.

## `from` (type: `string`):

Optional, YYYY-MM-DD: only articles published on or after this day.

## `to` (type: `string`):

Optional, YYYY-MM-DD: only articles published before this day.

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

Language codes to search in: en, de, fr, es, pt-BR, hi, ja, … Every query runs once per language and country.

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

Two-letter country codes of the news editions to search: US, GB, DE, FR, IN, BR, … Every query runs once per language and country.

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

Stops each query (per language and country) after this many articles. Google News returns at most about 100 per feed.

## `dedup` (type: `boolean`):

Deliver an article once even when several queries, languages or countries return it (same article URL or same headline).

## `fetchFullText` (type: `boolean`):

Open each article page and add its main text (Mozilla Readability) as `text` with a `wordCount`. Slower — one page fetch per article; paywalled or blocked pages give text null and a textError, and are still delivered.

## `maxConcurrency` (type: `integer`):

How many query/language/country searches to run at the same time.

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

Used only to try again after a network error or a refusal: the first try goes out directly.

## Actor input object example

```json
{
  "queries": [
    "electric vehicles"
  ],
  "languages": [
    "en"
  ],
  "countries": [
    "US"
  ],
  "maxItems": 100,
  "dedup": true,
  "fetchFullText": false,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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 = {
    "queries": [
        "electric vehicles"
    ],
    "languages": [
        "en"
    ],
    "countries": [
        "US"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/news-search-api").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 = {
    "queries": ["electric vehicles"],
    "languages": ["en"],
    "countries": ["US"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/news-search-api").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 '{
  "queries": [
    "electric vehicles"
  ],
  "languages": [
    "en"
  ],
  "countries": [
    "US"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/news-search-api --silent --output-dataset

```

## MCP server setup

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

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/ZldTGBiqBoD5tNVR1/builds/Lz6c3ThbDZ1nziG4A/openapi.json
