# Turkish News Scraper (`dodoflix/news-scraper`) Actor

Scrape Turkish news from Sozcu, Hurriyet, Haberturk, NTV and CNN Turk: titles, full text, dates, authors and categories. Fast HTTP scraper, no browser.

- **URL**: https://apify.com/dodoflix/news-scraper.md
- **Developed by:** [Doğukan Metan](https://apify.com/dodoflix) (community)
- **Categories:** News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.27 / 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

## Turkish News Scraper

Get news articles from **Sözcü, Hürriyet, Habertürk, NTV and CNN Türk** as clean JSON, CSV or Excel: title, summary, full text, publish time, author, category and image. It reads each outlet's official RSS feeds and article pages over plain HTTP, so it is fast and cheap. No proxy setup and no code needed, and the price already includes platform usage.

### What you can do with it

- **Media monitoring.** Track mentions of a brand, person, party or topic across five national outlets with `keywords`.
- **Research and datasets.** Collect full-text Turkish news by category and date for analysis, NLP or trend studies.
- **Alerts and feeds.** Schedule a run every few minutes with `latest` and send new articles to Slack, Sheets or a webhook.
- **Any article URL.** Paste article links from other sites that publish schema.org `NewsArticle` data and get the same fields.

### Quick start

Open the Input tab and press Start: the default input collects the latest articles from all five outlets. Or pick one of these:

**Economy news mentioning "enflasyon"**

```json
{
    "categories": ["ekonomi"],
    "keywords": ["enflasyon"],
    "maxItems": 100
}
```

**Sports headlines from two outlets, fast (no article pages)**

```json
{
    "sources": ["sozcu", "ntv"],
    "categories": ["spor"],
    "fullText": false
}
```

**Specific articles**

```json
{
    "sources": [],
    "startUrls": [{ "url": "https://www.sozcu.com.tr/brezilyada-secimi-lula-da-silva-kazandi-p372693" }]
}
```

### Input

| Field | What it does |
|---|---|
| `sources` | Outlets: `sozcu`, `hurriyet`, `haberturk`, `ntv`, `cnnturk`. All by default |
| `categories` | `latest` (default), `gundem`, `ekonomi`, `dunya`, `spor`, `magazin`, `teknoloji`, `saglik`. An outlet without a feed for a category is skipped |
| `startUrls` | Article URLs or RSS and Atom feed URLs, scraped in addition to the above. Use `"sources": []` to scrape only these |
| `keywords` | Keep articles that contain any of them. Ignores case and Turkish accents. Hürriyet and NTV are matched on the full text, Sözcü, Habertürk and CNN Türk on the title and summary their feeds carry |
| `fullText` | Open each article page for the complete text, author and keywords. On by default |
| `publishedAfter` | Skip articles older than this date (`YYYY-MM-DD`) |
| `maxItems`, `maxItemsPerFeed` | Limits for the whole run and for each feed |
| `maxRequestsPerMinute` | Request speed, 300 by default |
| `proxyConfiguration` | Optional. No proxy by default |

Feeds only hold the newest 20 to 100 articles of a category, so this is for fresh news, not for an archive. To build a history, schedule the Actor and keep the datasets.

### Output

```json
{
    "source": "sozcu",
    "sourceName": "Sözcü",
    "url": "https://www.sozcu.com.tr/brezilyada-secimi-lula-da-silva-kazandi-p372693",
    "title": "Brezilya'da seçimi Lula da Silva kazandı",
    "summary": "Brezilya'da devlet başkanlığı seçiminin ikinci turunda...",
    "content": "Full article text...",
    "publishedAt": "2026-10-26T01:25:00.000Z",
    "modifiedAt": "2026-10-26T01:30:00.000Z",
    "author": "Haber Merkezi",
    "category": "Dünya",
    "keywords": ["brezilya", "lula"],
    "imageUrl": "https://...",
    "wordCount": 193
}
```

Dates are ISO timestamps in UTC. Fields a site does not publish are `null` (Hürriyet's feed carries no author, and `wordCount` and `keywords` are only on pages that include them). The same article is never returned twice in one run.

### Pricing

You pay per result, and platform usage is included, so there are no extra charges. You only pay for articles you get, and you can cap spending on every run in the run options: the Actor stops cleanly when the cap is reached.

### FAQ

**Do I need a proxy?** No.

**Why is the text empty on some articles?** Video, gallery and live pages have no article body. The title and summary are still returned.

**How do I get only new articles?** Schedule the Actor with `latest` and `publishedAfter`, or keep the datasets and deduplicate on `url`.

**Can I use it from code?**

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('dodoflix/news-scraper').call({ categories: ['gundem'], maxItems: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

It also connects to Make, Zapier, Google Sheets, Slack and webhooks from the Integrations tab.

**Something broke or a field is missing.** Open an issue on the Issues tab with the input you used.

### Legal

This Actor reads public pages and the outlets' own RSS feeds. You are responsible for how you use the data, including copyright, the outlets' terms and robots.txt.

### Türkçe özet

Sözcü, Hürriyet, Habertürk, NTV ve CNN Türk haberlerini başlık, özet, tam metin, tarih, yazar ve kategoriyle JSON, CSV veya Excel olarak indirin. Anahtar kelime filtresi ve zamanlanmış çalıştırma desteklenir. Proxy ayarı gerekmez.

# Actor input Schema

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

Outlets to read. Their RSS feeds are fetched for the categories chosen below.

## `categories` (type: `array`):

Latest is each outlet's front-page or breaking-news feed. An outlet without a feed for a category is skipped (for example NTV has no magazin feed).

## `startUrls` (type: `array`):

Optional. Article URLs from any news site that publishes schema.org NewsArticle data, or RSS and Atom feed URLs.

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

Keep only articles that contain at least one of these words. Ignores case and Turkish accents, so 'ekonomi' also matches 'EKONOMİ'. Sözcü, Habertürk and CNN Türk feeds carry only the title and a summary, so for them the word must appear there.

## `fullText` (type: `boolean`):

Open each article page to get the complete text, author and keywords. Turn off for a faster run that returns only the feed title and summary.

## `publishedAfter` (type: `string`):

Skip articles published before this date (YYYY-MM-DD or a full ISO timestamp).

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

Stop the whole run after this many articles. Leave empty for no limit.

## `maxItemsPerFeed` (type: `integer`):

Articles taken from each feed. Feeds hold the newest 20 to 100 articles, so higher values add nothing.

## `maxRequestsPerMinute` (type: `integer`):

Request speed. Lower it if you see 429 or 503 errors in the log.

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

Optional. The outlets answer plain requests, so no proxy is used by default.

## Actor input object example

```json
{
  "sources": [
    "sozcu",
    "hurriyet",
    "haberturk",
    "ntv",
    "cnnturk"
  ],
  "categories": [
    "latest"
  ],
  "fullText": true,
  "maxItemsPerFeed": 50,
  "maxRequestsPerMinute": 300,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "sources": [
        "sozcu",
        "hurriyet",
        "haberturk",
        "ntv",
        "cnnturk"
    ],
    "categories": [
        "latest"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dodoflix/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 = {
    "sources": [
        "sozcu",
        "hurriyet",
        "haberturk",
        "ntv",
        "cnnturk",
    ],
    "categories": ["latest"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("dodoflix/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 '{
  "sources": [
    "sozcu",
    "hurriyet",
    "haberturk",
    "ntv",
    "cnnturk"
  ],
  "categories": [
    "latest"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call dodoflix/news-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dodoflix/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/ErHC26uFa5bvwBQu3/builds/vt5tY1II3lzXtNCxk/openapi.json
