# sahibinden Property Scraper - Listings, Photos & Seller Details (`abotapi/sahibinden-property-scraper`) Actor

Scrape Turkish property listings from sahibinden: price, full attribute table (area, rooms, building age, floor, heating, dues, deed status and more), map coordinates, photo gallery, seller/store details and contact phone. Search by category, location and price, or paste search and listing URLs.

- **URL**: https://apify.com/abotapi/sahibinden-property-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 6 total users, 1 monthly users, 80.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 listing 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## sahibinden Property Scraper

Collect Turkish property listings from sahibinden in clean, structured JSON. Search by category, location and price, or paste search and listing URLs. Every record carries the price, the full attribute table, map coordinates, the photo gallery, seller and store details, and the contact phone.

### What it does

This scraper turns sahibinden property pages into a tidy dataset you can open in a spreadsheet, push to a database, or pipe into your own tools. It covers homes for sale and for rent, land, and commercial properties. Each listing is returned as one row with dozens of fields, so you do not have to copy anything by hand.

You can run it two ways:

- **Search by filters** picks a category (for sale or for rent, plus the property type), a location, an optional keyword, a price range, a minimum room count and a sort order, then walks the result pages for you.
- **Direct URLs** takes sahibinden search-result pages or individual listing pages that you already have and scrapes exactly those.

### Input

| Field | Description |
| --- | --- |
| Start mode | "Search by filters" or "Direct URLs". |
| sahibinden URLs | URL mode only. Search pages or listing pages, one per line. |
| Listing type | For sale (satilik) or for rent (kiralik). |
| Property type | Residential, apartment, villa, detached house, land, commercial, office or shop. |
| Location | City, district or neighborhood name. Leave empty for the whole country. |
| Keyword | Optional free-text term to narrow results. |
| Minimum price / Maximum price | Price range in the listing currency. |
| Minimum rooms | Smallest room count to include. |
| Sort by | Newest, oldest, price or area order. |
| Include listing details | Adds the full attribute table, coordinates, photos, seller details, phone and description to each listing. |
| Max items | How many listings to collect. Default 20. Set 0 for unlimited. |
| Max pages | Safety cap on result pages to walk. |
| Proxy configuration | Residential connections from Turkey are required for this source. |
| MCP connectors | Optionally send results into Notion, Linear, Airtable or Apify. |

#### Example input

```json
{
  "mode": "search",
  "listingType": "satilik",
  "propertyType": "konut",
  "location": "istanbul",
  "minPrice": 1000000,
  "maxPrice": 3000000,
  "sortBy": "price_asc",
  "fetchDetails": true,
  "maxItems": 20,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "TR" }
}
```

### Output

One record per listing. With "Include listing details" on, each record carries the full attribute table, coordinates, gallery, seller block and contact phone. Sample data below is illustrative.

```json
{
  "id": "1000000000",
  "title": "Sample 2+1 apartment in a gated complex",
  "url": "https://www.sahibinden.com/ilan/sample-listing-1000000000/detay",
  "price": 2095000,
  "currency": "TRY",
  "propertyType": "Satilik Daire",
  "areaGross": "110",
  "areaNet": "100",
  "rooms": "2+1",
  "buildingAge": "5",
  "floor": "6",
  "floorCount": "13",
  "heating": "Combi (natural gas)",
  "bathrooms": "1",
  "balcony": "Yes",
  "elevator": "Yes",
  "parking": "Open and closed parking",
  "furnished": "No",
  "creditEligible": "Yes",
  "deedStatus": "Floor ownership",
  "fromWho": "From an agency",
  "swap": "Yes",
  "latitude": 41.02,
  "longitude": 28.65,
  "district": "Sample District",
  "neighborhood": "Sample Neighborhood",
  "categoryPath": ["Emlak", "Konut", "Satilik", "Satilik Daire"],
  "sellerType": "store",
  "sellerName": "Agent Name",
  "storeName": "Sample Realty",
  "storeUrl": "https://samplerealty.sahibinden.com",
  "phoneMobile": "5000000000",
  "phoneNumbers": [{ "label": "Cep", "number": "5000000000" }],
  "imageCount": 24,
  "images": ["https://example.com/photo-1.jpg"],
  "description": "Spacious apartment close to transport and shops.",
  "attributes": { "Oda Sayisi": "2+1", "Isitma": "Kombi (Dogalgaz)" }
}
```

### Plan Requirement

This Actor runs on any Apify plan. It uses Apify Residential connections from Turkey, which are available on paid plans; choose Residential with country Turkey in the proxy field. Pay only for what you collect under the per-event pricing shown on the Actor page.

### Send results into your apps (MCP connectors)

You can optionally forward each result into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in the MCP connectors field. The connector receives a short, readable summary per item (title plus key fields); the complete record always stays in the dataset.

Supported connectors:

- Notion (https://mcp.notion.com/mcp)
- Linear (https://mcp.linear.app/sse)
- Airtable (https://mcp.airtable.com/mcp)
- Apify (https://mcp.apify.com)

### FAQ

**Which countries can I scrape from?** This source serves Turkey-based connections, so pick Apify Residential with country Turkey. Other choices return no results.

**Can I scrape a single listing?** Yes. Switch to Direct URLs mode and paste the listing page link.

**How do I control cost?** Set Max items to the number of listings you need, and turn off Include listing details if you only need the basic fields. Detail enrichment is billed once per listing only when it is enabled.

**Will I get phone numbers?** When a listing exposes a contact phone, it is returned in the phoneMobile and phoneNumbers fields.

# Actor input Schema

## `mode` (type: `string`):

How to choose listings. 'Search by filters' builds a search from category, location and price filters. 'Direct URLs' takes sahibinden search-result or listing URLs you already have.

## `urls` (type: `array`):

URL mode only. Paste sahibinden search-result page URLs or individual listing URLs (https://www.sahibinden.com/ilan/...-12345/detay), one per line.

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

Search mode only. For sale (satilik) or for rent (kiralik).

## `propertyType` (type: `string`):

Search mode only. The kind of property to search for.

## `location` (type: `string`):

Search mode only. City, district or neighborhood name (e.g. 'Istanbul', 'Kadikoy', 'Besiktas'). Leave empty to search the whole country.

## `keyword` (type: `string`):

Search mode only. Optional free-text keyword to narrow results within the chosen category.

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

Search mode only. Lowest price (in the listing currency) to include.

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

Search mode only. Highest price (in the listing currency) to include.

## `minRooms` (type: `integer`):

Search mode only. Minimum number of rooms (the digit before the '+1', e.g. 2 matches '2+1' and larger).

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

Search mode only. Result ordering.

## `fetchDetails` (type: `boolean`):

Adds the full attribute table, map coordinates, photo gallery, seller/store details, contact phones and description to each listing. Turn off for a listing-only run.

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

Maximum number of listings to collect. Default 20. Set 0 for unlimited.

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

Safety cap on how many result pages to walk (about 20 listings per page).

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

Turkey-based residential IPs only. NOTE: the Apify Residential Turkey pool is currently flagged by this site (returns 0 items). For reliable results pick “Custom proxies” and paste a clean Turkish-ISP residential proxy URL (sticky session), e.g. a Turkey residential pool from a premium provider.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, and the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "urls": [
    "https://www.sahibinden.com/satilik-daire/istanbul"
  ],
  "listingType": "satilik",
  "propertyType": "konut",
  "location": "istanbul",
  "sortBy": "date_desc",
  "fetchDetails": true,
  "maxItems": 20,
  "maxPages": 5000,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "TR"
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (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 = {
    "urls": [
        "https://www.sahibinden.com/satilik-daire/istanbul"
    ],
    "location": "istanbul",
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "TR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/sahibinden-property-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 = {
    "urls": ["https://www.sahibinden.com/satilik-daire/istanbul"],
    "location": "istanbul",
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "TR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/sahibinden-property-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 '{
  "urls": [
    "https://www.sahibinden.com/satilik-daire/istanbul"
  ],
  "location": "istanbul",
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "TR"
  }
}' |
apify call abotapi/sahibinden-property-scraper --silent --output-dataset

```

## MCP server setup

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