# Sahibinden Real Estate Listings Scraper (`memo23/sahibinden-real-estate-listings-scraper`) Actor

Sahibinden real estate scraper — prices, rooms, sizes, GPS, photos, seller info, and phone numbers from sahibinden.com. All 81 Turkish cities, sale/rent/daily, residential to land. Cloudflare-bypassed via Unblocker, 25+ fields per listing, phone deobfuscation. JSON or CSV out.

- **URL**: https://apify.com/memo23/sahibinden-real-estate-listings-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.99 / 1,000 listings

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 Real Estate Listings Scraper

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/sahibinden/logo.png" width="120" alt="Sahibinden Real Estate Listings Scraper"></p>

Scrape real estate listings from **sahibinden.com** — Turkey's largest classifieds platform — with prices, rooms, sizes, GPS coordinates, photos, seller info, and phone numbers. Covers all 81 Turkish provinces across sale, rent, and daily rental listings.

| Input | Row(s) emitted |
|---|---|
| City + listing type (e.g. Istanbul, Sale) | One row per listing, 25+ fields |
| Start URL (e.g. `sahibinden.com/satilik-daire/istanbul`) | One row per listing, 25+ fields |
| Filters (price, rooms, district, sort) | Filtered listings, one row each |

> Apify Unblocker clears Cloudflare. No login required for search results. No browser, no CAPTCHA solver.

### Why Use This Scraper

- **No login required** — Apify Unblocker clears sahibinden's Cloudflare bot management so search results load without session cookies.
- **Phone numbers included** — extracts seller phone numbers from listing detail pages (opt-in add-on; owner listings only, agents hide phones).
- **All 81 cities** — every Turkish province, with Istanbul split into European and Asian sides.
- **Sale, rent, and daily rentals** — three listing types across residential, commercial, land, and whole-building categories.
- **25+ fields per listing** — price, rooms, gross/net size, building age, floor, heating, bathroom count, furnished, deed status, GPS, and the full attribute map from the detail page.
- **Unlimited pagination** — walks every result page until listings run out or your cap is hit.

### Overview

Sahibinden.com is Turkey's dominant property classifieds site, sitting behind Cloudflare bot management. This actor routes through Apify Unblocker to clear Cloudflare, fetches search result pages, parses listing rows with cheerio, and optionally fetches each detail page for full attributes and seller phone numbers. Phone numbers are CSS-obfuscated on the page; the actor deobfuscates them from the embedded script blocks.

### Supported Inputs

- **Listing type**: Sale, Rent, Daily Rental
- **Property category**: Residential, Commercial, Land, Building
- **City**: all 81 Turkish provinces (Istanbul split European/Asian)
- **Districts**: one or more district names within a city
- **Price range**: min/max with currency (TRY, USD, EUR, GBP)
- **Rooms**: Turkish format (1+0, 1+1, 2+1, 3+1, etc.)
- **Sort**: Newest, Oldest, Price Low/High, Smart Sort
- **Start URLs**: one or more sahibinden search URLs to scrape directly
- **Session cookies**: optional, for authenticated features (see FAQ)
- **Max results** and **max pages** caps

### Use Cases

- Property research across Turkey with detailed attributes (price, area, building age, deed status).
- Lead generation by extracting seller phone numbers and agency profiles.
- Market analysis comparing room counts, sizes, and price ranges.
- Monitoring specific districts or property types over time.

### How It Works

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/sahibinden/how-it-works-sahibinden.png" width="720" alt="How the Sahibinden scraper works"></p>

1. You pick a listing type, city, and optional filters (price, rooms, districts), or provide start URLs.
2. The actor builds search URLs on `www.sahibinden.com` and fetches them through Apify Unblocker.
3. Unblocker clears Cloudflare; the search page returns ~20 listings per page.
4. The cheerio parser extracts listing ID, title, price, rooms, area, location, date, and thumbnail from each row.
5. The actor walks pages until results run out or your cap is hit.
6. When phone extraction is on, each listing's detail page is fetched for 25 full attributes, GPS coordinates, and seller phone numbers.
7. Results land in the Apify dataset, ready to export as JSON or CSV.

### Input Configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `listingType` | select | `Sale` | `Sale`, `Rent`, or `Daily Rental` |
| `propertyCategory` | select | `Residential` | `Residential`, `Commercial`, `Land`, or `Building` |
| `city` | select | `Istanbul` | One of 81 Turkish provinces |
| `district` | array | `[]` | District names within the chosen city |
| `sortBy` | select | `Newest` | `Newest`, `Oldest`, `PriceLow`, `PriceHigh`, `Smart` |
| `extractPhoneNumbers` | boolean | `false` | Fetch detail pages for full attributes + phone numbers |
| `maxResults` | integer | `100` | Cap on total listings scraped |
| `minPrice` / `maxPrice` | integer | — | Price range filter |
| `currency` | select | `TRY` | `TRY`, `USD`, `EUR`, `GBP` |
| `rooms` | array | `[]` | Room counts in Turkish format (e.g. `2+1`, `3+1`) |
| `maxPages` | integer | — | Cap on pages fetched |
| `startUrls` | array | `[]` | Direct sahibinden search URLs to scrape instead of building from filters |
| `sessionCookies` | string | — | Optional sahibinden login cookies (`name=value; name2=value2`) for authenticated features |
| `proxy` | object | `{ useApifyProxy: true, apifyProxyGroups: ["UNBLOCKER"] }` | Proxy configuration; Unblocker is required for Cloudflare |

#### Example input

```json
{
  "listingType": "Sale",
  "propertyCategory": "Residential",
  "city": "Istanbul",
  "maxResults": 50,
  "extractPhoneNumbers": true,
  "sortBy": "Newest"
}
```

### Output Overview

Each row is one sahibinden listing. Search-only rows (phone extraction off) carry title, price, rooms, size, location, date, and thumbnail. Detail rows (phone extraction on) add 25 attributes, GPS, seller info, and phone numbers.

### Output Samples

```jsonc
{
  "listingId": "1345942624",
  "url": "https://www.sahibinden.com/1345942624",
  "title": "SAHİBİNDEN MEYDANA YÜRÜME MESAFESİNDE 2+1 BAHÇE KATI",
  "price": 1399999,
  "currency": "TRY",
  "rooms": "2+1",
  "size": "100",
  "netSize": "95",
  "buildingAge": "6-10 arası",
  "floor": "Bahçe Katı",
  "totalFloors": null,
  "heating": "Kombi (Doğalgaz)",
  "bathroomCount": "1",
  "furnished": false,
  "city": "İstanbul",
  "district": "Esenyurt",
  "neighborhood": null,
  "address": "Barış Mah. Sakarya Cad. No : 2/9",
  "latitude": 41.008749,
  "longitude": 28.657104,
  "imageUrl": "https://i0.shbdn.com/photos/59/42/24/lthmb_1345942624x1k.jpg",
  "sellerName": null,
  "sellerId": null,
  "sellerProfileUrl": null,
  "isOwner": true,
  "phoneNumbers": ["05354584255"],
  "listingDate": "17 Ekim 2026",
  "attributes": {
    "İlan No": "1345942624",
    "Emlak Tipi": "Satılık Daire",
    "m² (Brüt)": "100",
    "m² (Net)": "95",
    "Oda Sayısı": "2+1",
    "Bina Yaşı": "6-10 arası",
    "Isıtma": "Kombi (Doğalgaz)",
    "Eşyalı": "Hayır",
    "Kullanım Durumu": "Boş",
    "Krediye Uygun": "Evet",
    "Kimden": "Sahibinden"
  },
  "scrapedAt": "2026-10-17T16:46:54.059Z"
}
```

### Key Output Fields

| Field | Description |
|---|---|
| `listingId` | Sahibinden classified ID |
| `price` / `currency` | Numeric price + currency code |
| `rooms` | Turkish format (e.g. `2+1` = 2 bedrooms + 1 living room) |
| `size` / `netSize` | Gross and net area in m² |
| `buildingAge` / `floor` / `totalFloors` | Building age, floor, total floors |
| `heating` / `bathroomCount` / `furnished` | Heating type, bathroom count, furnished flag |
| `city` / `district` / `neighborhood` / `address` | Location hierarchy |
| `latitude` / `longitude` | GPS coordinates (detail page only) |
| `imageUrl` | Listing thumbnail URL |
| `sellerName` / `sellerId` / `isOwner` | Seller info and owner-vs-agent flag |
| `phoneNumbers` | Extracted phone numbers (owner listings only; agents hide phones) |
| `attributes` | Full key-value map of all 25 detail-page attributes |
| `listingDate` | Listing date (Turkish format) |

### Pricing

| Event | When | Price |
|---|---|---|
| Actor Start | Run starts (per GB memory) | $0.005 |
| Listing | One listing pushed to dataset | $0.00699 |
| Phone number | A phone number extracted from a detail page | $0.00499 |

### What makes this richer than the competition

| Capability | Competitor actors | This actor |
|---|---|---|
| Cloudflare bypass | Most use Playwright (slow, fragile) | Apify Unblocker (fast, no browser) |
| Login required | Some require your session cookies | Not required for search results |
| Fields per listing | 10-15 typical | 25+ from detail page |
| Phone extraction | Often missing or broken | CSS deobfuscation from script blocks |
| GPS coordinates | Rare | From detail page data attributes |
| Pagination | Often capped at 20 | Unlimited until cap or results end |

### Notes & limitations

- **Speed**: Unblocker takes ~30s per search page and ~60s per detail page. A 100-listing run with phone extraction takes ~10 minutes. Without phone extraction, search-only is much faster.
- **Phone numbers**: only "Sahibinden" (owner) listings expose phones. Agency listings hide phone numbers on sahibinden — this is a site-side restriction, not an actor limitation.
- **Session cookies**: optional. The actor works without them for search results. Cookies unlock authenticated features (favorites, saved searches) but are not needed for standard scraping.
- **Currency**: prices are returned in the listing's original currency. Use the `currency` input to filter by a specific currency.

### FAQ

**Do I need to log in to sahibinden?**
No. Apify Unblocker clears Cloudflare and the search page returns listings without login. Session cookies are optional.

**Why are phone numbers empty for some listings?**
Sahibinden hides phone numbers for agency listings. Only "Sahibinden" (owner-direct) listings expose phones. This is a site-side restriction.

**Why is the run slow?**
Unblocker solves Cloudflare per request, which takes ~30-60s each. This is the tradeoff for not using a fragile browser-based approach.

**Can I scrape without phone extraction?**
Yes. Set `extractPhoneNumbers: false` (default) and you get search-row data only — much faster, no detail page fetches.

**What's the difference between `size` and `netSize`?**
`size` is gross (brüt) area, `netSize` is net (net) area, both in m². Both come from the detail page.

### Support

For bugs, feature requests, or help, open an issue on the actor's Apify Store page or contact the maintainer.

### Additional Services

Need a custom filter, a specific province deep-scan, or integration with your CRM? Custom work available — reach out via the Apify Store.

### Explore More Scrapers

- [Zillow Scraper](https://apify.com/memo23/zillow-cheerio-scraper) — US real estate
- [PropertyFinder Leads Scraper](https://apify.com/memo23/propertyfinder-leads-scraper) — UAE/Gulf real estate
- [ForRent Scraper](https://apify.com/memo23/forrent-com-scraper) — US rentals

### 🤖 For AI Agents & LLM Apps

This actor scrapes sahibinden.com Turkish real estate listings via Apify Unblocker (Cloudflare bypass). No login required.

**Minimal tested input:**

```json
{ "listingType": "Sale", "city": "Istanbul", "maxResults": 10 }
```

**Flat output fields per row:** `listingId`, `url`, `title`, `price`, `currency`, `rooms`, `size`, `netSize`, `buildingAge`, `floor`, `totalFloors`, `heating`, `bathroomCount`, `furnished`, `city`, `district`, `neighborhood`, `address`, `latitude`, `longitude`, `imageUrl`, `sellerName`, `sellerId`, `sellerProfileUrl`, `isOwner`, `phoneNumbers` (array), `listingDate`, `attributes` (object), `scrapedAt`.

**Billing:** $0.005 start + $0.00699/listing + $0.00499/phone (only when `extractPhoneNumbers: true` and a phone is found).

**Behaviors:** `extractPhoneNumbers: false` returns search-row data only (fast). `startUrls` overrides filter-based URL building. `sessionCookies` is optional (Unblocker handles Cloudflare without login).

### ⚠️ Disclaimer

Sahibinden and the sahibinden.com brand are trademarks of Sahibinden Bilgi Teknolojileri Pazarlama ve Ticaret A.Ş. This actor is not affiliated with, endorsed by, or sponsored by Sahibinden. It is an independent tool that accesses publicly available web pages. Users are responsible for complying with sahibinden's Terms of Service and all applicable laws when using this actor.

### SEO Keywords

sahibinden scraper, sahibinden real estate scraper, sahibinden listings, turkey property scraper, istanbul real estate, sahibinden phone numbers, sahibinden rent, sahibinden sale, turkish classifieds scraper, property listings turkey, sahibinden api, sahibinden data extraction, real estate leads turkey, sahibinden apartments, sahibinden daire

# Actor input Schema

## `listingType` (type: `string`):

Sale (Satilik) = properties for purchase. Rent (Kiralik) = monthly rentals. Daily Rental (Gunluk Kiralik) = short-term vacation stays.

## `propertyCategory` (type: `string`):

Residential = apartments, villas, houses. Commercial = offices, shops, warehouses. Land = plots and parcels. Building = whole buildings.

## `city` (type: `string`):

Filter by Turkish city. Leave empty for all cities. Istanbul has 3 options: Istanbul (all), Istanbul (European), Istanbul (Asian).

## `district` (type: `array`):

Narrow to one or more districts within the selected city. Enter district names (e.g. Bodrum, Marmaris). Multiple districts are combined (any match). Leave empty for the whole city.

## `sortBy` (type: `string`):

Sort order for search results.

## `extractPhoneNumbers` (type: `boolean`):

Extract seller phone numbers (mobile, home, work) for each listing. Add-on pricing applies per phone number extracted.

## `maxResults` (type: `integer`):

Maximum number of listings to return. Set to 0 for unlimited.

## `minPrice` (type: `integer`):

Minimum listing price in the selected currency.

## `maxPrice` (type: `integer`):

Maximum listing price in the selected currency.

## `currency` (type: `string`):

Currency for min/max price filters. Only applies when a price range is set.

## `rooms` (type: `array`):

Filter by room count. Turkish format: 3+1 means 3 rooms + 1 living room. Select multiple to include all.

## `maxPages` (type: `integer`):

Maximum number of search-result pages to fetch. Each page yields ~20-50 listings. Leave empty for no limit (walk until results run out or maxResults is hit).

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

One or more sahibinden.com search URLs to scrape directly (e.g. https://www.sahibinden.com/satilik-daire/istanbul-kadikoy). Overrides the city/district/category filters when provided.

## `sessionCookies` (type: `string`):

Sahibinden requires login to view search results. Paste your browser session cookies here (from DevTools > Application > Cookies on www.sahibinden.com). Format: 'name=value; name2=value2'. Without valid cookies, the actor cannot retrieve listings.

## `proxy` (type: `object`):

Must use Apify Unblocker or residential proxies — sahibinden.com is behind Cloudflare bot management. Direct datacenter requests are blocked.

## Actor input object example

```json
{
  "listingType": "Sale",
  "propertyCategory": "Residential",
  "city": "Istanbul",
  "sortBy": "Newest",
  "extractPhoneNumbers": true,
  "maxResults": 100,
  "currency": "TRY",
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/sahibinden-real-estate-listings-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 = { "proxy": { "useApifyProxy": True } }

# Run the Actor and wait for it to finish
run = client.actor("memo23/sahibinden-real-estate-listings-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 '{
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call memo23/sahibinden-real-estate-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/sahibinden-real-estate-listings-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/uVVoFg7NVvqmEQdWE/builds/c9LgNSK2kgouxmmmJ/openapi.json
