# Indian News Watcher (`vivpm99/indian-news-watcher`) Actor

Get the latest news from across India in every major language, with a mood score on each story. Covers English, Hindi, and regional press. Filter by language, source, keyword, and date, skip repeats, and pull full text when needed. Pay per article. Ready for sheets, apps, and AI tools.

- **URL**: https://apify.com/vivpm99/indian-news-watcher.md
- **Developed by:** [VIVEK P M](https://apify.com/vivpm99) (community)
- **Categories:** News, AI, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.75 / 1,000 article with mood scores

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Indian News Watcher

Pull recent news from named Indian publications across **English, Hindi, Kannada and Tamil**, and get back a clean list of articles — each with its source, language, date, link, summary, and a **cross-language mood score** (positive / negative / neutral).

Most news scrapers just wrap Google News in English. This one covers named Indian sites in multiple languages and — the part that sets it apart — scores the mood of each article **in its own language**, including Hindi and Kannada, where simple English sentiment tools fail.

**Who uses it:** teams and builders who need Indian news data at scale — brand and topic monitoring across languages, regional-sentiment dashboards, media research, and feeding pre-labelled multilingual news into an LLM or analytics pipeline.

### What it does

- Reads each publication's **RSS feed** (stable, rarely breaks) — not fragile page scraping — so upkeep stays near zero.
- Filters by language, source, keyword, and date range.
- Removes duplicate stories (the same headline often runs on many sites).
- Optionally fetches the **full article text**.
- Optionally adds a **mood score** in any language, powered by Google Gemini.
- Returns one clean row per article.

### Sources covered (v1)

| Language | Publications |
|----------|--------------|
| English  | Times of India, The Hindu, NDTV, Hindustan Times, The Indian Express, Livemint |
| Hindi    | NDTV India, Amar Ujala, Dainik Bhaskar |
| Kannada  | Vijaya Karnataka, Prajavani, OneIndia Kannada |
| Tamil    | OneIndia Tamil |

> **Need another language or source?** Telugu, Bengali, Marathi, Malayalam, or a specific publication — [message me](https://apify.com/vivpm99) and I'll add it. This list grows based on what users actually ask for.

### Input

| Field | Meaning |
|-------|---------|
| `languages` | Which languages to include (default: English, Hindi, Kannada) |
| `sources` | Optional — limit to specific publications |
| `keywords` | Optional — keep only articles matching these words |
| `dateFrom` / `dateTo` | Optional — date range |
| `maxItems` | Cap on articles returned (also caps cost); default 200 |
| `includeBody` | Fetch full article text (default off) |
| `moodScore` | Add a mood score (default **on**) |
| `aiApiKey` | Optional — run the mood score on your own Gemini key |

#### Example

```json
{
  "languages": ["Kannada", "Hindi"],
  "keywords": ["ಬೆಂಗಳೂರು", "मुंबई"],
  "maxItems": 50,
  "moodScore": true
}
````

Returns up to 50 recent Kannada/Hindi articles mentioning those terms, each like:

```json
{
  "title": "ಬೆಂಗಳೂರಿನಲ್ಲಿ ಹೊಸ ಮೆಟ್ರೋ ಮಾರ್ಗ ಉದ್ಘಾಟನೆ",
  "link": "https://kannada.oneindia.com/...",
  "source": "OneIndia Kannada",
  "language": "Kannada",
  "category": "top",
  "publishedAt": "2026-07-01T09:15:00.000Z",
  "summary": "...",
  "mood": "positive",
  "moodReason": "New metro line opens, benefiting commuters"
}
```

### The mood score, and its cost

The mood score is the reason to pick this over a generic news scraper. It runs on **Google Gemini 2.5 Flash-Lite**, which handles Indian languages well and costs a fraction of a cent per article (only the title and summary are sent). It is **on by default and works out of the box** — no setup. If a model call fails it retries and falls back automatically; if it still can't score an article, that article is returned with an empty mood rather than failing the run.

Heavy users can plug in their **own Gemini key** via `aiApiKey` to run mood scoring on their own account.

### Pricing

Pay per article returned. Runs with the mood score enabled are priced slightly higher to cover the AI cost; article-only runs are cheaper.

### Notes on fair use

This tool returns headlines, short summaries, links and dates — the same data publications put in their public RSS feeds. The optional full-text feature is for your own reading and analysis; don't republish full articles as your own.

### Keywords

Indian news API, Hindi news scraper, Kannada news feed, regional Indian news monitor, India news sentiment, multilingual news API, Tamil news scraper, India news mood score.

***

### Running / developing

- **Mood key:** set `GEMINI_API_KEY` as an actor secret (Apify Console → Actor → Environment variables) so the built-in scorer works for all users.
- **Local mood test:** `GEMINI_API_KEY=... node src/mood.js` runs a live English/Hindi/Kannada check; without the key it still checks the fail-soft path.
- **Local feed test:** `node rss-test.mjs` confirms every source feed still loads.
- **Local full run:** `apify run` (needs `apify-cli`). Charging events used: `article` (mood off) and `article-with-mood` (mood on) — define these in the Console pay-per-event pricing.

# Actor input Schema

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

Which languages to include. Leave empty for all.

## `sources` (type: `array`):

Limit to specific publications. Leave empty for all sources in the chosen languages.

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

Keep only articles whose title or summary contains one of these words.

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

Only articles published on or after this date.

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

Only articles published on or before this date.

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

Cap on how many articles to return (also caps AI cost per run).

## `includeBody` (type: `boolean`):

Fetch the main body text of each article. Slower, and may fail on some sites. Off by default.

## `moodScore` (type: `boolean`):

Tag each article positive / negative / neutral, in every language. On by default.

## `aiApiKey` (type: `string`):

Advanced: run the mood score on your own Google Gemini key instead of ours. Leave blank to use the built-in scorer.

## Actor input object example

```json
{
  "languages": [
    "English",
    "Hindi",
    "Kannada"
  ],
  "maxItems": 200,
  "includeBody": false,
  "moodScore": true
}
```

# Actor output Schema

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

Recent Indian news articles with source, language, date, summary and a cross-language mood score.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("vivpm99/indian-news-watcher").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("vivpm99/indian-news-watcher").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call vivpm99/indian-news-watcher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=vivpm99/indian-news-watcher",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Indian News Watcher",
        "description": "Get the latest news from across India in every major language, with a mood score on each story. Covers English, Hindi, and regional press. Filter by language, source, keyword, and date, skip repeats, and pull full text when needed. Pay per article. Ready for sheets, apps, and AI tools.",
        "version": "1.0",
        "x-build-id": "doeHlhlr8cAb2eDK1"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/vivpm99~indian-news-watcher/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-vivpm99-indian-news-watcher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/vivpm99~indian-news-watcher/runs": {
            "post": {
                "operationId": "runs-sync-vivpm99-indian-news-watcher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/vivpm99~indian-news-watcher/run-sync": {
            "post": {
                "operationId": "run-sync-vivpm99-indian-news-watcher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "languages": {
                        "title": "Languages",
                        "type": "array",
                        "description": "Which languages to include. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "English",
                                "Hindi",
                                "Kannada",
                                "Tamil"
                            ]
                        },
                        "default": [
                            "English",
                            "Hindi",
                            "Kannada"
                        ]
                    },
                    "sources": {
                        "title": "Sources (optional)",
                        "type": "array",
                        "description": "Limit to specific publications. Leave empty for all sources in the chosen languages.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Times of India",
                                "The Hindu",
                                "NDTV",
                                "Hindustan Times",
                                "The Indian Express",
                                "Livemint",
                                "NDTV India (Hindi)",
                                "Amar Ujala",
                                "Dainik Bhaskar",
                                "Vijaya Karnataka",
                                "Prajavani",
                                "OneIndia Kannada",
                                "OneIndia Tamil"
                            ]
                        }
                    },
                    "keywords": {
                        "title": "Keywords (optional)",
                        "type": "array",
                        "description": "Keep only articles whose title or summary contains one of these words.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "dateFrom": {
                        "title": "Date from (optional)",
                        "type": "string",
                        "description": "Only articles published on or after this date."
                    },
                    "dateTo": {
                        "title": "Date to (optional)",
                        "type": "string",
                        "description": "Only articles published on or before this date."
                    },
                    "maxItems": {
                        "title": "Max articles",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on how many articles to return (also caps AI cost per run).",
                        "default": 200
                    },
                    "includeBody": {
                        "title": "Include full article text",
                        "type": "boolean",
                        "description": "Fetch the main body text of each article. Slower, and may fail on some sites. Off by default.",
                        "default": false
                    },
                    "moodScore": {
                        "title": "Add mood score",
                        "type": "boolean",
                        "description": "Tag each article positive / negative / neutral, in every language. On by default.",
                        "default": true
                    },
                    "aiApiKey": {
                        "title": "Your Gemini API key (optional)",
                        "type": "string",
                        "description": "Advanced: run the mood score on your own Google Gemini key instead of ours. Leave blank to use the built-in scorer."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
