# Sahibinden Listings Scraper · Turkish classifieds · $1/1K (`mlg14/sahibinden-scraper`) Actor

Scrape Sahibinden listings for second-hand price research, spare parts and machinery sourcing, and classifieds monitoring. Search by category URL, city or keyword; get titles, categories, cities and photo URLs. No real-estate or vehicle listings. $1/1K listings.

- **URL**: https://apify.com/mlg14/sahibinden-scraper.md
- **Developed by:** [MLG Data](https://apify.com/mlg14) (community)
- **Categories:** Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 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.

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

## Sahibinden Listings Scraper

Scrape Sahibinden.com listings by category, city or keyword and export listing IDs, titles, categories, cities and full photo galleries to CSV, JSON or Excel. This is a Sahibinden API alternative for the second-hand shopping, spare parts, animals, machinery, jobs and private lesson sections, built on the sitemap data Sahibinden itself publishes.

Read the Limits section before you buy results: this actor does not return prices, descriptions, real-estate listings or vehicle listings, because the public data source behind it does not contain them.

### What data can you extract from Sahibinden?

Each result is one listing taken from the public image sitemap. All fields are flat and use camelCase.

| Field | Description | Example |
|---|---|---|
| listingId | Numeric Sahibinden listing ID | 1344633882 |
| url | Direct link to the listing | https://www.sahibinden.com/ilan/hayvanlar-alemi-kumes-hayvanlari-guvercin-sari-portakal-1344633882/detay |
| title | Title written by the seller | sarı portakal |
| category | Top-level category, in English | Animals |
| categorySlug | Full category path as it appears in the URL | hayvanlar-alemi-kumes-hayvanlari-guvercin |
| city | City of the listing | İstanbul |
| country | Always Türkiye | Türkiye |
| image | First photo URL | https://image5.sahibinden.com/photos/63/38/82/1344633882vz0.jpg |
| images | All photo URLs of the listing | list of URLs |
| imageCount | Number of photos | 10 |
| sourceUrl | The input URL or keyword that matched the listing | https://www.sahibinden.com/hayvanlar-alemi/istanbul |

Fields that are never filled, because the source does not publish them: price, currency, description, district, seller type, listing date and listing attributes. They are not in the output at all, so you never receive empty placeholder columns.

### How to scrape Sahibinden

1. Paste one or more Sahibinden category or search URLs into **Category or search URLs**, for example `https://www.sahibinden.com/cep-telefonu`. You can also type words into **Keywords**.
2. Set **Maximum listings** to the number of results you want. The limit is split fairly between your inputs.
3. Optionally raise **Sitemap files to scan** if a narrow search returns fewer results than you expect.
4. Click Start, then download the dataset as JSON, CSV, Excel, XML or HTML.

The actor reads the words in each URL path (or in the `query_text` parameter of search URLs) and returns listings whose URL, title, category or city contain all of those words. Turkish letters are optional: `istanbul` matches İstanbul.

### Input

| Name | Type | Default | Description |
|---|---|---|---|
| startUrls | array of strings | cep-telefonu and hayvanlar-alemi/istanbul | Sahibinden category or search URLs. Words in the path or in query_text select listings. |
| keywords | array of strings | empty | Extra searches. All words in one entry must match. |
| maxItems | integer | 100 | Maximum listings across all inputs. 0 means no cap. |
| maxShards | integer | 12 | Sitemap files to scan, 1 to 170. Each holds about 2,800 recent listings. |
| proxyConfiguration | object | Apify Proxy | Proxy settings. Turkish residential proxy is used automatically when needed. |

Example input:

```json
{
  "startUrls": [
    "https://www.sahibinden.com/cep-telefonu",
    "https://www.sahibinden.com/hayvanlar-alemi/istanbul"
  ],
  "keywords": ["iphone 12"],
  "maxItems": 200,
  "maxShards": 12
}
```

### Output example

A real item from a test run (photo list shortened):

```json
{
  "listingId": "1344633882",
  "url": "https://www.sahibinden.com/ilan/hayvanlar-alemi-kumes-hayvanlari-guvercin-sari-portakal-1344633882/detay",
  "title": "sarı portakal",
  "category": "Animals",
  "categorySlug": "hayvanlar-alemi-kumes-hayvanlari-guvercin",
  "city": "İstanbul",
  "country": "Türkiye",
  "image": "https://image5.sahibinden.com/photos/63/38/82/1344633882vz0.jpg",
  "images": [
    "https://image5.sahibinden.com/photos/63/38/82/1344633882vz0.jpg",
    "https://image5.sahibinden.com/photos/63/38/82/1344633882jo3.jpg"
  ],
  "imageCount": 10,
  "sourceUrl": "https://www.sahibinden.com/hayvanlar-alemi/istanbul"
}
```

### Which Sahibinden categories are covered?

In the sitemap data we inspected, listings fall into these top-level categories. The `category` field uses the English label, and `categorySlug` keeps the original Turkish path so you can filter precisely.

| category value | URL prefix in categorySlug | What it contains |
|---|---|---|
| Second-hand & New Shopping | ikinci-el-ve-sifir-alisveris | Phones, computers, home goods, clothing, hobby items, collectibles, building supplies |
| Spare Parts, Accessories & Tuning | yedek-parca-aksesuar-donanim-tuning | Car parts, tyres and rims, accessories, tuning equipment |
| Animals | hayvanlar-alemi | Poultry, small and large livestock, pets, aquarium items, pet accessories |
| Industrial & Heavy Machinery | is-makineleri-sanayi | Construction machines, industrial equipment |
| Jobs | is-ilanlari | Job advertisements |
| Private Lessons | ozel-ders-verenler | Tutoring and lesson offers |
| Home Help | yardimci-arayanlar | Home help wanted |

In one sitemap file of 2,814 listings, about 66 percent were second-hand shopping, 26 percent spare parts, 5 percent animals and 3 percent machinery, so shopping and parts searches fill quickly while jobs, lessons and home help are rare. Treat these shares as a snapshot, because they change between files and days.

### How matching works

Every input is turned into a list of lowercase words without Turkish accents. The URL `https://www.sahibinden.com/hayvanlar-alemi/istanbul` becomes `hayvanlar`, `alemi`, `istanbul`. A listing is returned when every word appears in its URL slug, its title or its city. This is why a city name placed in the path works as a filter, and why a keyword such as `iphone 12` finds titles that mention both words.

Short words of two characters or fewer are ignored, as are navigation words such as `kategori` and `arama`. If an input contains no usable words, for example a bare homepage URL, it is skipped and the run continues with your other inputs.

When several inputs are given, the cap in **Maximum listings** is divided between them so that a broad input cannot crowd out a narrow one. A listing that matches more than one input is credited to the first matching input and returned only once.

### Practical examples

- One city, one category: `https://www.sahibinden.com/yedek-parca-aksesuar-donanim-tuning/ankara` returns recent spare-parts ads from Ankara.
- Brand watch: put `bmw` and `opel corsa` in Keywords to track parts listings that mention those names.
- Market sizing: set Maximum listings to 0, raise Sitemap files to scan to 170 and group the result by `category` and `city` to see the distribution of the whole recent inventory. This downloads the full image sitemap, so expect hundreds of megabytes of proxy traffic.
- Photo collection: keep only items where `imageCount` is 5 or more to get listings with complete galleries.

### Data quality notes

Titles are written by sellers, so they contain typos, phone-number-like text, capital letters and promotional words. Cities use the Turkish spelling from the sitemap, for example İstanbul, İzmir and Tekirdağ. Photo URLs point to Sahibinden's image servers and can stop working when a listing is removed. Listing IDs are unique and increase over time, so a higher ID usually means a newer ad, which is a convenient way to detect new listings between two scheduled runs.

### Use cases

- Market monitoring: count how many new listings appear per category and city each day, for example phones in Istanbul or used machinery in Konya.
- Supply research for resellers: see which product types and cities have the most fresh inventory before you decide what to source.
- Image datasets: collect complete photo galleries of second-hand goods by category for classification or visual search research, respecting the rights of the photographers.
- Lead lists of listing URLs: build a link list of a niche (for example spare parts for one car brand) and review the listings manually or in your own tools.
- Category and geography analytics: compare the share of listings per top-level category and per city over time by scheduling the actor.
- Content moderation and brand protection: search for your brand name in listing titles and review the matching ads.

### How much does it cost to scrape Sahibinden?

The actor uses pay-per-result pricing, and Apify platform usage is included in the price. The Store page shows the current rate per 1,000 results. The examples below use an illustrative rate of 2.00 USD per 1,000 results; multiply by the real rate you see.

- 100 listings: 0.20 USD
- 1,000 listings: 2.00 USD
- 5,000 listings: 10.00 USD

Cost is driven by results, not by how many sitemap files are scanned. A test run that scanned 8 sitemap files and returned 60 listings finished in about 20 seconds.

### Tips for best results

- Use specific words. `cep-telefonu` is broad; `iphone 12` in Keywords is narrow.
- Add a city to a category URL (`/hayvanlar-alemi/istanbul`) to restrict the results to that city.
- Rare searches need more sitemap files. If you get fewer results than your limit, raise `maxShards`. Each file adds a few MB of proxy traffic and a few seconds.
- Run the actor on a schedule to build up a history, because the sitemap contains the most recent listings, not the whole archive.
- Deduplication is automatic: a listing is returned once even when several of your inputs match it.
- Keep `maxItems` realistic. The data source holds a rolling window of recent listings, not every ad ever posted.

### Limits

Be aware of these before you start.

- No prices. Sahibinden does not publish prices in any file reachable without a browser session, and listing pages are protected by Cloudflare, which returned 403 in our tests even through a browser and a Turkish residential proxy.
- No real estate and no vehicles. The listing sitemaps contain shopping, spare parts, animals, machinery, jobs and private lessons, but no real-estate or car listings. A URL such as `/satilik-daire/istanbul` will therefore return nothing.
- No description, seller type, district, date or attributes, for the same reason.
- Titles come from the photo caption in the sitemap. If a listing has no caption, the title is rebuilt from the URL.
- The data is a rolling set of recent listings. Old or deleted ads may be absent, and listings can disappear between runs.
- Matching is word-based. A category URL is converted into words, so uncommon category slugs may match fewer listings than the website shows.
- Phone numbers and other personal contact data are never collected.

### Use with AI agents (MCP)

Add this actor to any MCP client (Claude, Cursor, VS Code, n8n...) with one URL:

`https://mcp.apify.com?tools=mlg14/sahibinden-scraper`

The actor returns one flat record per listing (ID, title, category, city, photo URLs, listing URL). It does not return prices, real-estate or vehicle ads. Set `maxItems` to keep results bounded.

**Prompt 1:** "Find 30 recent iPhone listings on Sahibinden."

```json
{
  "startUrls": [
    "https://www.sahibinden.com/cep-telefonu"
  ],
  "keywords": [
    "iphone"
  ],
  "maxItems": 30,
  "maxShards": 8
}
```

**Prompt 2:** "List 30 animal listings in Istanbul on Sahibinden."

```json
{
  "startUrls": [
    "https://www.sahibinden.com/hayvanlar-alemi/istanbul"
  ],
  "maxItems": 30,
  "maxShards": 8
}
```

**Prompt 3:** "Search Sahibinden for forklift listings and return 30 of them."

```json
{
  "keywords": [
    "forklift"
  ],
  "maxItems": 30,
  "maxShards": 8
}
```

### FAQ

**Is it legal to scrape Sahibinden?**
The actor only reads sitemap files that Sahibinden publishes for search engines and returns public listing information. You remain responsible for complying with Sahibinden's terms, copyright on photos and data-protection law such as KVKK and GDPR. Do not use the data to contact or profile private individuals.

**Do I need proxies?**
The actor handles this for you. It starts with a normal connection and switches to a Turkish residential proxy if the site blocks the request.

**How fast is it?**
Each sitemap file takes a few seconds. A typical run of 100 to 500 listings finishes in under a minute.

**Can I schedule it or monitor changes?**
Yes. Use Apify schedules to run it hourly or daily and compare listing IDs between runs to find new ads.

**Can I export to Google Sheets or Excel?**
Yes. The dataset downloads as CSV, Excel and JSON, and the Google Sheets integration can append each run.

**What if a field is empty?**
Only city, image and category can be missing for a few listings. Fields that the source never provides, such as price, are not part of the output.

**Why are there no real-estate or car listings?**
Sahibinden does not include them in its public listing sitemaps, and the website pages that show them are not reachable. If that changes, fields will be added.

**Can I get the listing price some other way?**
Not from this actor. Open the `url` of a listing in your browser to see the price, or combine the exported IDs with your own manual review.

### Integrations

Run the actor from the Apify API, with webhooks when a run finishes, or from Zapier, Make and n8n. Send results to Google Sheets, Airtable, Slack or your own database, and use Apify schedules for recurring monitoring.

### Support

Open an issue on the Issues tab; we reply within 24h and add fields on request.

# Actor input Schema

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

Sahibinden category or search URLs. Example: https://www.sahibinden.com/cep-telefonu or https://www.sahibinden.com/kelime-ile-arama?query_text=iphone. Words in the path or query_text, plus city names like istanbul, select listings. Use one URL per category; real-estate and vehicle URLs return nothing.

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

Extra search words, one search per entry; all words must appear in the listing title, category or city. Example: \["iphone 12", "forklift"]. Use with or instead of startUrls; Turkish characters are optional.

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

Maximum listings across all searches. Example: 100. Set 0 for no cap; use 20-100 for tests and agent calls to keep runs short.

## `maxShards` (type: `integer`):

Number of listing files to scan; each holds about 2,800 recent listings. Example: 8. Use 4-8 for quick runs and raise it to find rare matches; each file adds a few MB of proxy traffic.

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

Proxy settings for fetching public listing files; a Turkish residential proxy is used automatically when needed.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.sahibinden.com/cep-telefonu",
    "https://www.sahibinden.com/hayvanlar-alemi/istanbul"
  ],
  "maxItems": 100,
  "maxShards": 12,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped items in the default dataset.

# 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": [
        "https://www.sahibinden.com/cep-telefonu",
        "https://www.sahibinden.com/hayvanlar-alemi/istanbul"
    ],
    "maxItems": 100,
    "maxShards": 12
};

// Run the Actor and wait for it to finish
const run = await client.actor("mlg14/sahibinden-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": [
        "https://www.sahibinden.com/cep-telefonu",
        "https://www.sahibinden.com/hayvanlar-alemi/istanbul",
    ],
    "maxItems": 100,
    "maxShards": 12,
}

# Run the Actor and wait for it to finish
run = client.actor("mlg14/sahibinden-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": [
    "https://www.sahibinden.com/cep-telefonu",
    "https://www.sahibinden.com/hayvanlar-alemi/istanbul"
  ],
  "maxItems": 100,
  "maxShards": 12
}' |
apify call mlg14/sahibinden-scraper --silent --output-dataset

```

## MCP server setup

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