# Eksi Sozluk Scraper (`dodoflix/eksisozluk-scraper`) Actor

Scrape Eksi Sozluk entries, topics, authors, search results, channels and DEBE. Fast HTTP scraper, no browser.

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

## Pricing

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

## Ekşi Sözlük Scraper

Get entries, topics, authors, search results and daily best-of lists from [Ekşi Sözlük](https://eksisozluk.com) as clean JSON, CSV or Excel. Runs on plain HTTP, so it is fast and cheap. No proxy setup and no code needed: it comes configured with a Turkish residential proxy, and the price already includes platform usage.

### What you can do with it

- **Monitor a brand, product or person.** Search a keyword, or pull every entry from a topic, and track what people write over time.
- **Follow what Turkey is talking about.** Scrape today's popular topics (gündem), the best entries of yesterday (DEBE), or any channel such as spor, siyaset, teknoloji or sinema.
- **Study an author.** Get a profile (entry, follower and following counts) plus their latest, most favorited or favorited entries.
- **Research a topic.** Order entries by "nice" (şükela), by popularity or by date, and filter search by author and date range.

### Quick start

Open the Input tab, paste a topic URL and press Start. Or pick one of these:

**All entries of a topic, most liked first**

```json
{
    "startUrls": [{ "url": "https://eksisozluk.com/linux--32084" }],
    "sort": "nice",
    "maxEntriesPerTopic": 200
}
```

**Search a keyword and scrape the matching topics**

```json
{
    "searchQueries": ["yapay zeka"],
    "searchFrom": "2025-01-01",
    "maxListItems": 20,
    "maxEntriesPerTopic": 50
}
```

**An author's profile and most favorited entries**

```json
{
    "authors": ["ssg"],
    "authorContent": "mostFavorited",
    "maxEntriesPerAuthor": 100
}
```

**Yesterday's best entries and today's popular topics**

```json
{
    "includeDebe": true,
    "includePopular": true,
    "maxListItems": 50
}
```

### Input

| Field | What it does |
|---|---|
| `startUrls` | Any Ekşi Sözlük URL: a topic, a single entry (`/entry/1683`), an author (`/biri/nick`) or a list. `?a=nice` and `?day=2024-05-01` filters in the URL are respected |
| `searchQueries` | Keywords. The matching topics are scraped |
| `searchAuthor` | Only entries by this author. Works alone or with keywords |
| `searchSort` | Order of matching topics: most entries, newest, alphabetical |
| `searchFrom`, `searchTo`, `searchNiceOnly` | Date range and nice-only filter for search |
| `authors`, `authorContent` | Usernames or profile URLs, and which entries to collect |
| `channels` | Channel names such as `spor`, `siyaset`, `teknoloji` |
| `includePopular`, `includeDebe` | Today's popular topics, yesterday's best entries |
| `sort` | Entry order inside topics: site default, nice, nice of the day, popular |
| `topicsOnly` | List topics (title, URL, entry count) without scraping their entries |
| `maxItems` | Stop the whole run after this many results |
| `maxEntriesPerTopic`, `maxEntriesPerAuthor`, `maxListItems` | Per-source limits |
| `maxRequestsPerMinute` | Request speed, 150 by default |
| `proxyConfiguration` | Defaults to Turkish residential proxy. Leave as is |

### Output

Every result has a `type`: `entry`, `topic` or `author`. Download the dataset as JSON, CSV, Excel, XML or HTML, or read it through the API.

**Entry**

```json
{
    "type": "entry",
    "entryId": "110958932",
    "url": "https://eksisozluk.com/entry/110958932",
    "topic": "linux",
    "topicId": "32084",
    "topicUrl": "https://eksisozluk.com/linux--32084",
    "author": "gcd",
    "authorId": "891400",
    "authorUrl": "https://eksisozluk.com/biri/gcd",
    "authorAvatar": null,
    "favoriteCount": 116,
    "commentCount": 0,
    "date": "01.08.2020 05:15",
    "createdAt": "2020-08-01T02:15:00.000Z",
    "editedAt": null,
    "content": "entry text...",
    "links": ["https://example.com"],
    "references": ["linux"]
}
```

**Topic** (with `topicsOnly`): `title`, `url`, `entryCount`, `entryCountLabel`, `source`.
**Author**: `nick`, `url`, `entryCount`, `followerCount`, `followingCount`, `badges`.

Dates come in two forms: the site's own `date` text, and `createdAt` / `editedAt` as ISO timestamps in UTC (converted from Istanbul time, including the daylight saving time Turkey used before 2016). Counts are real numbers, not strings.

### Pricing

You pay per result: **$0.60 per 1,000 results**, and less on higher Apify plans (down to $0.55). Platform usage and proxy are included, so there are no extra charges. For example, 10,000 entries cost about $6. You only pay for results you get, and a run that finds nothing costs almost nothing.

You can cap spending on every run in the run options. The Actor stops cleanly when the cap is reached.

### Why this Actor

- **Works out of the box.** The site only answers from Turkish IPs. This Actor already uses a Turkish proxy, so you do not need to bring one.
- **More than search.** Authors, channels, popular topics and DEBE, not only keywords.
- **Data you can use directly.** ISO dates, numeric counts, extracted links, no HTML clean-up.
- **Predictable cost.** One price per result with usage included.

### FAQ

**Do I need a proxy?** No. It is set up for you.

**How fast is it?** Up to about 1,500 entries per minute by default. The site returns errors above roughly 5 requests per second from one IP, so the default is kept safely under that.

**Can it scrape private or logged-in content?** No. Only pages anyone can open without signing in.

**Why did I get fewer results than I set?** The topic had fewer entries, the filter matched fewer, or `maxItems` ended the run first.

**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/eksisozluk-scraper').call({
    startUrls: [{ url: 'https://eksisozluk.com/linux--32084' }],
    maxItems: 100,
});
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 collects public pages and usernames. You are responsible for how you use the data, including KVKK/GDPR and the site's terms and robots.txt.

### Türkçe özet

Ekşi Sözlük başlıklarını, entry'lerini, yazar profillerini ve arama sonuçlarını JSON, CSV veya Excel olarak indirin. Proxy ayarı gerekmez: Türkiye IP'si varsayılan olarak kullanılır ve fiyata dahildir.

# Actor input Schema

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

Any Eksi Sozluk URL: a topic (https://eksisozluk.com/linux--32084, add ?a=nice or ?day=2024-05-01 to filter), a single entry (/entry/1683), an author (/biri/nick) or a list (/basliklar/gundem).

## `searchQueries` (type: `array`):

Keywords to search topics for. The matching topics are then scraped.

## `searchAuthor` (type: `string`):

Only entries by this author in the topics found. Works alone or with search queries.

## `searchSort` (type: `string`):

How the matching topics are ordered.

## `searchFrom` (type: `string`):

Only topics with entries since this date (YYYY-MM-DD).

## `searchTo` (type: `string`):

Only topics with entries until this date (YYYY-MM-DD).

## `searchNiceOnly` (type: `boolean`):

Match only topics with 'sukela' (nice) entries.

## `authors` (type: `array`):

Usernames or profile URLs. Outputs the profile and the entries chosen below.

## `authorContent` (type: `string`):

Which entries to scrape for each author.

## `channels` (type: `array`):

Channel names such as spor, siyaset, teknoloji, sinema, ekonomi.

## `includePopular` (type: `boolean`):

Scrape today's popular topics.

## `includeDebe` (type: `boolean`):

Scrape yesterday's best entries.

## `sort` (type: `string`):

Overrides the ?a= setting of topic URLs. Default is the site's own order.

## `topicsOnly` (type: `boolean`):

For lists, search and channels: output the topics (title, URL, entry count) and skip their entries.

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

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

## `maxEntriesPerTopic` (type: `integer`):

Stop paginating a topic after this many entries.

## `maxEntriesPerAuthor` (type: `integer`):

Entries to collect for each author.

## `maxListItems` (type: `integer`):

Topics (or entries for DEBE) taken from each search, channel or list source.

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

The site returns 503 above roughly 5 requests per second from one IP. Raise this only if you see no 503s.

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

The site blocks datacenter IPs (403), so the default is Apify residential proxy in Turkey. Without a proxy it only works from a home or office connection.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://eksisozluk.com/linux--32084"
    }
  ],
  "searchSort": "Count",
  "searchNiceOnly": false,
  "authorContent": "latest",
  "includePopular": false,
  "includeDebe": false,
  "sort": "default",
  "topicsOnly": false,
  "maxEntriesPerTopic": 100,
  "maxEntriesPerAuthor": 100,
  "maxListItems": 10,
  "maxRequestsPerMinute": 150,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "TR"
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://eksisozluk.com/linux--32084"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "TR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dodoflix/eksisozluk-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 = {
    "startUrls": [{ "url": "https://eksisozluk.com/linux--32084" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "TR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("dodoflix/eksisozluk-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 '{
  "startUrls": [
    {
      "url": "https://eksisozluk.com/linux--32084"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "TR"
  }
}' |
apify call dodoflix/eksisozluk-scraper --silent --output-dataset

```

## MCP server setup

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