# Emlakjet Istanbul Real Estate Listings (`zinin/emlakjet-istanbul`) Actor

Pull live apartment/housing listings straight from Emlakjet.com for Istanbul — one of Turkey's biggest real-estate classifieds portals — by deal type (sale/rent) and property type. No login, no browser, no proxies.

- **URL**: https://apify.com/zinin/emlakjet-istanbul.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 listing founds

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

## Emlakjet Istanbul Real Estate Listings

Pull live apartment and housing listings straight from Emlakjet.com — one of
Turkey's biggest real-estate classifieds portals — for Istanbul (city-wide or
any district), filtered by deal type (sale/rent) and property type. No login,
no API key, no browser needed on your side.

### What you get

- Title, price (with currency), room count, floor area, neighborhood/district,
  floor, up to 5 photos and the direct listing URL for every ad found.
- Filter by sale (`satilik`) or rent (`kiralik`), by apartment (`daire`) or
  the broader housing category (`konut`), and by Istanbul city-wide search or
  any specific district.
- Runs on Apify: schedule it, monitor it, call it from the API, export to
  JSON/CSV/Excel or push straight into your own pipeline.

### How to run it

1. Click **Try for free** — no card needed on the free plan.
2. Pick **Deal type** (sale or rent) and **Property type**.
3. Optionally set **City / district slug** (defaults to all of Istanbul).
4. Hit **Start** and pull the results from the dataset (UI, API or webhook).

### Pricing

Pay-per-event: **$0.005 per run start + $0.002 per result**. No monthly seat, no minimum. 100 listings found cost about $0.21 (the one-time start fee plus 100 result rows). Rows where the source returned nothing (an unrecognized
location, a query with zero matching listings, or a request that failed) are
returned for transparency but are **never** charged for.

### Input

| Field | Required | What it does |
|---|---|---|
| `deal_type` | yes | `satilik` (for sale) or `kiralik` (for rent). |
| `property_type` | yes | `daire` (apartment) or `konut` (residential/housing — a broader Emlakjet category that overlaps with, but isn't identical to, `daire`). |
| `city` | no | Emlakjet.com location slug — `istanbul` (default, whole city) or an Istanbul district like `istanbul-kadikoy`. |
| `max_items` | no | Total row cap for this run (default 100, max 1500 — Emlakjet's own pagination depth limit). |
| `max_pages` | no | How many result pages to walk before stopping (default 3, max 50 — Emlakjet itself won't show more). |

```json
{
    "deal_type": "satilik",
    "property_type": "daire",
    "city": "istanbul",
    "max_items": 5,
    "max_pages": 1
}
```

### Output

Real row from a live run (2026-07-31):

```json
{
    "deal_type_requested": "satilik",
    "property_type_requested": "daire",
    "city_requested": "istanbul",
    "found": true,
    "url": "https://www.emlakjet.com/ilan/31-deniz-manzarali-masrafsiz-satilik-daire-19653884",
    "title": "3+1 Deniz Manzaralı Masrafsız Satılık Daire",
    "price": 4950000,
    "currency": "TRY",
    "deal_type": "sale",
    "property_type": "Satılık Daire",
    "rooms": 4,
    "area_sqm": 105,
    "location": "Derviş Ali Mahallesi, Fatih",
    "lat": null,
    "lng": null,
    "posted_date": "2026-07-27",
    "description": null,
    "images": [
        "https://imaj.emlakjet.com/listing/19653884/D6E66217DCFB76A863DB8A135947D4D219653884.jpg",
        "https://imaj.emlakjet.com/listing/19653884/FBB5C01B737612A60BBDE1E71A456FCF19653884.jpg",
        "https://imaj.emlakjet.com/listing/19653884/F1CFCCC7D198D194ECDD546928DC0CB719653884.jpg",
        "https://imaj.emlakjet.com/listing/19653884/927369159EE32CDDD42773F05D55454A19653884.jpg",
        "https://imaj.emlakjet.com/listing/19653884/0EE55F00F84AE1B3DC537944A97EF8A519653884.jpg"
    ],
    "source_portal": "emlakjet",
    "scraped_at": "2026-07-31T14:19:11.804Z",
    "partial": true,
    "partial_reason": "stopped after 1 page(s), 5 item(s) collected — reached this run's own max_pages/max_items limit before the source confirmed (via confirmedEnd) that there is nothing more; there may be additional matching listings beyond what was collected",
    "rooms_raw": "3+1",
    "floor_raw": "Çatı Dubleks"
}
```

| Field | Meaning |
|---|---|
| `found` | `true` for a real listing row, `false` for a not-found/error row. |
| `price` | Listing price as a number, in `currency` (always `TRY` for a found row). |
| `deal_type` | `sale` or `rent`, read off the listing's own label — not just echoed from your request. |
| `property_type` | The listing's own category label as Emlakjet shows it (e.g. `"Satılık Daire"`, `"Kiralık Konut"`). |
| `rooms` | Turkish "bedrooms+salon" room count, summed into one number (e.g. `"3+1"` → `4`). `null` when the source's format can't be summed (studio listings, an open-ended "6+" bucket, or a missing value) — never guessed as `0`. |
| `rooms_raw` | The source's original room-count string as shown on the listing (e.g. `"3+1"`), so you can apply your own convention if you don't want ours. |
| `area_sqm` | Floor area in square meters. |
| `location` | Neighborhood and district, as shown on the listing. |
| `floor_raw` | Floor as the source states it — not always a plain number (`"8. Kat"`, `"Yüksek giriş"` = elevated ground floor, `"Çatı Dubleks"` = rooftop duplex). |
| `description` | Always `null` — Emlakjet's listing pages carry no text description in the data this Actor reads. |
| `lat` / `lng` | Not available on list pages — always `null`. |
| `images` | Up to 5 photos shown on the listing. |
| `partial` | `true` when this run stopped (hit its own `max_pages`/`max_items` limit) before the source itself confirmed there was nothing more to page through — `false`/absent when the source's own end-of-results signal was reached first. |
| `partial_reason` | Set alongside `partial: true` — a human-readable note on why this run stopped short (e.g. page/item cap reached), so a row that may not reflect the full matching set is never silently indistinguishable from a complete one. |

A not-found row (unrecognized location or category — Emlakjet returns a clean
HTTP 404 for these, with no in-between "understood you, zero matches" state):

```json
{
    "deal_type": "satilik",
    "property_type": "daire",
    "city": "not-a-real-location-9999",
    "found": false,
    "error": "http 404",
    "scraped_at": "2026-07-31T14:19:16.259Z"
}
```

### API

Start a run with a bearer token and the same input shown above:

```bash
curl -sS -X POST 'https://api.apify.com/v2/acts/zinin~emlakjet-istanbul/runs?waitForFinish=60' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"deal_type":"satilik","property_type":"daire","city":"istanbul","max_items":5,"max_pages":1}'
```

Read Dataset rows using the returned `defaultDatasetId`:

```bash
curl -sS "https://api.apify.com/v2/datasets/$DEFAULT_DATASET_ID/items?clean=true&format=json" \
  -H "Authorization: Bearer $APIFY_TOKEN"
```

### MCP

For an Apify MCP client exposing the standard `call-actor` tool, send this exact payload:

```json
{
  "name": "call-actor",
  "arguments": {
    "actor": "zinin/emlakjet-istanbul",
    "input": {
      "deal_type": "satilik",
      "property_type": "daire",
      "city": "istanbul",
      "max_items": 5,
      "max_pages": 1
    }
  }
}
```

### Other tools we built

### Related Actors

Fill the gap this Actor's own FAQ names, or compare Istanbul against other emerging real-estate markets on the same account.

| Actor | Use it when |
|---|---|
| [Structured Data Extractor](https://apify.com/zinin/structured-extract) | You need the full description, phone number (if published) or exact coordinates — this Actor's own FAQ says list-page data doesn't carry those; run it on each row's `url`. |
| [URL to Markdown Converter](https://apify.com/zinin/url-to-markdown) | Same detail-page gap, but you want clean Markdown from `url` for an LLM to summarize the Turkish listing text rather than structured JSON. |
| [PropertyFinder.ae UAE Real Estate Listings](https://apify.com/zinin/propertyfinder-gulf) | You're comparing entry prices for the same buyer profile across Istanbul and the Gulf, not just within Turkey — same input shape, same account. |

### FAQ / Limitations

**Does this need an Emlakjet.com account or API key?** No — it reads the same
public search pages a visitor sees, no login.

**What this is NOT.** This does not fetch the seller's phone number, the full
listing description, or exact coordinates from the listing's own detail page
— only what's exposed on the search-results list. It does not guarantee every
listing on Emlakjet is returned: Emlakjet itself caps how many pages of a
single search you can page through (50), regardless of how large the category
actually is.

Found a bug or need a custom variant (a different Turkish city, extra
fields)? Open an issue on the Actor page.

### Machine use

The Actor is callable through the Apify API, SDK, and Apify MCP server. The input and Dataset row are the machine-facing contract; a `found:false` row (unrecognized location/category, or a failed request) is never billed, so an agent can safely branch on `found` before touching `price` or `rooms` on the same row.

# Actor input Schema

## `deal_type` (type: `string`):

Sale (satilik) or rent (kiralik) listings.

## `property_type` (type: `string`):

daire (apartment) or konut (residential/housing — a broader Emlakjet category that overlaps with, but is not identical to, daire).

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

Emlakjet.com location slug. "istanbul" for the whole city, or an Istanbul district like "istanbul-kadikoy".

## `max_items` (type: `integer`):

Maximum number of listing rows to return in this run.

## `max_pages` (type: `integer`):

How many result pages to walk before stopping. Emlakjet.com itself caps browsable depth at 50 pages per search (verified live), regardless of total inventory.

## Actor input object example

```json
{
  "deal_type": "satilik",
  "property_type": "daire",
  "city": "istanbul",
  "max_items": 5,
  "max_pages": 1
}
```

# Actor output Schema

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

API URL for the default dataset items produced by this run.

# 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 = {
    "deal_type": "satilik",
    "property_type": "daire",
    "city": "istanbul",
    "max_items": 5,
    "max_pages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/emlakjet-istanbul").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 = {
    "deal_type": "satilik",
    "property_type": "daire",
    "city": "istanbul",
    "max_items": 5,
    "max_pages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("zinin/emlakjet-istanbul").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "deal_type": "satilik",
  "property_type": "daire",
  "city": "istanbul",
  "max_items": 5,
  "max_pages": 1
}' |
apify call zinin/emlakjet-istanbul --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=zinin/emlakjet-istanbul",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/4tIaFx0UKATKdJaxA/builds/UyJ22ubn7l8rRYxNc/openapi.json
