# Emlakjet API scraper — Turkey real-estate listings: for-sale, for-rent, daily-rent and business-transfer property across all 81 Turkish provinces, with structured filters (price TRY, gross m², room layout 1+1/2+1/3+1, bathrooms, heating, posting date, seller type, sort) and every listing carrying price, room count, area, floor, province/district/neighbourhood with coordinates, publication and update dates and the estate office behind it — plus a full per-listing detail record (description, all photos, price history, heating, deed status, credit eligibility, building age), similar-listing lookup, an il/ilçe/mahalle location resolver and the estate-office and consultant directory. No API key and no account required.

> Search emlakjet.com property listings anywhere in Turkey. Pick the deal type (sale, rent, daily rent, transfer), the property type and a location — a province, district or neighbourhood — then narrow with price, gross m², room layout, bathrooms, heating, how recently it was posted and who is advertising. Every filter here was measured against the source's own unfiltered count. Each result carries the asking price as a number, the room layout, area in m², the floor, the full province/district/neighbourhood breakdown with latitude and longitude, the posting and update timestamps, badges, every photo and the estate office. `total` is emlakjet's own count for the query; emlakjet serves at most 50 pages of 30 for any one query, so narrow the query to reach deeper stock.
> ReefAPI engine `emlakjet` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/emlakjet/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/emlakjet/v1/search — 2 credits
Search emlakjet.com property listings anywhere in Turkey. Pick the deal type (sale, rent, daily rent, transfer), the property type and a location — a province, district or neighbourhood — then narrow with price, gross m², room layout, bathrooms, heating, how recently it was posted and who is advertising. Every filter here was measured against the source's own unfiltered count. Each result carries the asking price as a number, the room layout, area in m², the floor, the full province/district/neighbourhood breakdown with latitude and longitude, the posting and update timestamps, badges, every photo and the estate office. `total` is emlakjet's own count for the query; emlakjet serves at most 50 pages of 30 for any one query, so narrow the query to reach deeper stock.

**Parameters:**
- `trade_type` (enum, optional, default "sale") — Whether the listings are for sale, for rent, for daily rental, or a business transfer. [one of: sale, rent, daily_rent, transfer]
- `property_type` (enum, optional, default "residential") — The kind of property. 'residential' covers every home type; the narrower values restrict the search to that one type. [one of: residential, apartment, villa, detached_house, residence, summer_house, commercial, land, building, tourism, timeshare]
- `location` (string, optional) — Where to search — an emlakjet location slug or the plain Turkish place name. A province ('istanbul', 'İzmir', 'Ankara'), a district ('istanbul-kadikoy', 'ankara-cankaya') or a neighbourhood ('istanbul-silivri-selimpasa-mahallesi'). Turkish letters are folded for you, so 'Kadıköy' and 'kadikoy' behave the same. Use the `locations` action to list the exact slugs. Omit it to search all of Turkey.
- `sort` (enum, optional) — Result ordering. Default is emlakjet's own relevance order. [one of: newest, oldest, price_asc, price_desc, area_asc, area_desc, unit_price_asc, unit_price_desc, price_reduced]
- `page` (integer, optional, default 1) — Result page, 30 listings per page. emlakjet serves at most 50 pages (1500 listings) for any one query and silently re-serves page 1 above that, so a page past the ceiling is clamped and reported back in `page_clamped`. Narrow the query (district, price band) to reach deeper stock.
- `include_pii` (boolean, optional, default false) — Include the contact details emlakjet publishes on the page: the office phone number, the named consultant, their WhatsApp mobile and the licence document number. Off by default — the agency NAME is always returned without it.
- `price_min` (integer, optional) — Lowest asking price in Turkish lira (TRY). Measured to bite: Istanbul for-sale 25 149 listings drops to 17 201 at price_min=5 000 000.
- `price_max` (integer, optional) — Highest asking price in Turkish lira (TRY). Measured to bite: the same 25 149 drops to 1 090 at price_max=2 000 000.
- `area_min` (integer, optional) — Smallest gross floor area in m². Measured: area_min=150 cuts Istanbul for-sale from 25 149 to 6 130.
- `area_max` (integer, optional) — Largest gross floor area in m². Measured: area_max=60 leaves 773.
- `rooms` (array, optional) — Room layouts in the Turkish '<rooms>+<living rooms>' notation — 'studio', '1+1', '2+1', '3+1', '4+1', '5+1', '1.5+1', '2+0', up to '10+'. Several may be given; they are OR-ed. Measured: ['2+1'] leaves 11 686 of 25 149 in Istanbul.
- `bath_count` (array, optional) — Number of bathrooms (1, 2, 3 ...). Several may be given. Measured: [2] leaves 7 775 of 25 149.
- `heating` (array, optional) — Heating system: combi_gas, central_gas, underfloor, central_metered, floor_heater, gas_stove, air_conditioner, none. Measured: ['combi_gas'] leaves 19 121 of 25 149.
- `listed_within` (enum, optional) — Keep only listings published inside this window. Measured: '7d' leaves 2 004 of 25 149 in Istanbul. [one of: 24h, 3d, 7d, 15d, 30d]
- `seller_type` (enum, optional) — Who is advertising. Needs a location. Measured in Istanbul for-sale: agency 24 556, owner 480, of a 25 149 total. [one of: agency, owner, builder]

**Returns:** results[]{listing_id, url, title, trade_type, category, estate_type, price{amount, currency, amount_try, price_per_m2, previous_amount, discount_rate_pct, is_opportunity}, rooms, area_m2, floor, location{summary, city{id,name,slug}, district, town, locality, latitude, longitude}, seller{id, name, type, logo_url}, badges[], has_video, has_virtual_tour, image_count, images[], created_at, first_published_at, updated_at} + total + count + page + page_size + max_pages + page_clamped + has_more + query{category_slug, location_slug, seller_segment, filters[]} + warnings[]

**Example request body:**
```json
{
  "trade_type": "sale",
  "property_type": "residential",
  "location": "istanbul",
  "price_min": 2000000,
  "price_max": 6000000,
  "rooms": [
    "2+1",
    "3+1"
  ]
}
```

### POST https://api.reefapi.com/emlakjet/v1/detail — 1 credit
The full record for one emlakjet listing, by its listing number or URL. Adds everything the search card does not carry: the free-text description with the markup stripped, the complete photo set, the price history with the date of each change, gross AND net m² read from the source's own display string, building age, floor and building height, heating, parking, deed status, credit eligibility, whether it is inside a gated complex, furnishing, lift, fibre, deed verification, and the estate office with its membership length.

**Parameters:**
- `listing_id` (string, required) — An emlakjet listing number (the 'İlan Numarası' on the page, e.g. 19945815) or the full listing URL / /ilan/<slug>-<id> path — the `url` or `listing_id` of a search result.
- `include_pii` (boolean, optional, default false) — Include the contact details emlakjet publishes on the page: the office phone number, the named consultant, their WhatsApp mobile and the licence document number. Off by default — the agency NAME is always returned without it.

**Returns:** listing{listing_id, url, title, description, trade_type, category, price{...}, price_history[]{amount, currency, changed_at}, rooms, bath_count, floor, building_floors, building_age, area_m2, gross_area_m2, net_area_m2, heating, parking, usage_status, deed_status, credit_eligible, in_complex, elevator, furnished, swap_accepted, dues, has_fiber, deed_verified, attributes{}, quick_infos{}, location{...}, seller{id, name, type, business_name, membership_years, profile_url}, badges[], images[], created_at, updated_at}

**Example request body:**
```json
{
  "listing_id": "19945815"
}
```

### POST https://api.reefapi.com/emlakjet/v1/similar — 1 credit
The listings emlakjet itself considers comparable to a given one — the cheap comparables surface for a valuation or a 'more like this' feed. Returns the same core fields as a search row (price, rooms, area, location, estate office) for each comparable.

**Parameters:**
- `listing_id` (string, required) — An emlakjet listing number (the 'İlan Numarası' on the page, e.g. 19945815) or the full listing URL / /ilan/<slug>-<id> path — the `url` or `listing_id` of a search result.
- `include_pii` (boolean, optional, default false) — Include the contact details emlakjet publishes on the page: the office phone number, the named consultant, their WhatsApp mobile and the licence document number. Off by default — the agency NAME is always returned without it.

**Returns:** results[]{listing_id, url, title, trade_type, category, estate_type, price{amount, currency, previous_amount}, rooms, floor, location{summary, city, district, town, locality}, seller{id, name, type}, badges[], cover_image, first_published_at} + count + source_listing_id

**Example request body:**
```json
{
  "listing_id": "19945815"
}
```

### POST https://api.reefapi.com/emlakjet/v1/locations — 1 credit
The location tree emlakjet searches by: all 81 Turkish provinces, the districts of one province, or the neighbourhoods (mahalle) and sub-localities of one district — each with the exact slug the `search` action expects and the numeric id emlakjet uses internally. Call it with no parameters for the provinces, with `city` for its districts, with `city` + `district` for its neighbourhoods.

**Parameters:**
- `city` (string, optional) — A province slug, Turkish name or numeric id ('istanbul', 'İzmir', 34). With this set the action returns that province's districts.
- `district` (string, optional) — A district slug, name or numeric id ('istanbul-kadikoy', 1622). Needs `city` unless a numeric district id is given. Returns that district's neighbourhoods.

**Returns:** results[]{id, name, slug, type, parent_id, children[]{id, name, slug, type}} + level + count + resolved{city, district}

**Example request body:**
```json
{
  "city": "istanbul"
}
```

### POST https://api.reefapi.com/emlakjet/v1/agencies — 1 credit
The emlakjet estate-office and consultant directory — who is actually selling property in a given province, how much stock each one holds now and in the last three months, how long they have been on the platform, their experience in years and their median sale price. Pick `kind` to switch between offices (emlak ofisleri) and individual consultants (danışmanlar).

**Parameters:**
- `kind` (enum, optional, default "offices") — Whether to list estate offices or individual consultants. [one of: offices, agents]
- `location` (string, optional) — Restrict to one province — a slug or the Turkish name. Measured: Istanbul holds 1 948 of the 10 756 estate offices.
- `page` (integer, optional, default 1) — Directory page, 20 rows per page, at most 50 pages.
- `include_pii` (boolean, optional, default false) — Include the contact details emlakjet publishes on the page: the office phone number, the named consultant, their WhatsApp mobile and the licence document number. Off by default — the agency NAME is always returned without it.

**Returns:** results[]{id, name, slug, type, url, logo_url, city, district, listing_count, listing_count_last_3m, listing_count_last_1m, opportunity_count, membership_years, experience_years, languages[], median_sale_price, avg_marketing_days, office_name, full_name} + total + count + page + page_size + max_pages + page_clamped + has_more

**Example request body:**
```json
{
  "kind": "offices",
  "location": "istanbul"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=emlakjet
- Human docs page: https://reefapi.com/docs/emlakjet
- Overview page: https://reefapi.com/emlakjet-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
