Emlakjet API

Turkish property listings, with the price as a number and the office named

Emlakjet is one of Turkey's large property portals, and this API turns its listings into JSON.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a Emlakjet endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
E
/emlakjet/v1

5 active endpoints, on 1 and 2 credit tiers.

  • POST/emlakjet/v1/search
  • POST/emlakjet/v1/detail
  • POST/emlakjet/v1/similar
  • POST/emlakjet/v1/locations
  • POST/emlakjet/v1/agencies

What Emlakjet endpoints does ReefAPI ship?

5 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

5 endpoints

search

2 cr

Search emlakjet.com property listings anywhere in Turkey.

required
—
optional
trade_type, property_type, location, page, sort, include_pii, price_min, price_max, area_min, area_max, rooms, bath_count, heating, listed_within, seller_type

detail

1 cr

The full record for one emlakjet listing, by its listing number or URL.

required
listing_id
optional
include_pii

similar

1 cr

The listings emlakjet itself considers comparable to a given one.

required
listing_id
optional
include_pii

locations

1 cr

The location tree emlakjet searches by.

required
—
optional
city, district

agencies

1 cr

The emlakjet estate-office and consultant directory.

required
—
optional
kind, location, page, include_pii

Every parameter, every allowed value →

Emlakjet API

4 of 5 endpoints, ready to run

View docs ↗

Flats for sale in a province or district, filtered by price, m² and room layout

2 credits0 required · 5 optional
POST/emlakjet/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the Emlakjet API works

Emlakjet is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 438 engines.

02
Call
POST /emlakjet/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Price per m² for 3+1 flats in one Istanbul district

The question a Turkish property desk actually asks: what is a three-bedroom flat worth per square metre in this district right now, and which offices are selling them. Four calls, and every number comes from the portal rather than from an average.

01locations { city: "istanbul" }
POSTlocations { city: "istanbul" }

Read the district slugs. Kadıköy comes back as istanbul-kadikoy — the slug search expects, with the Turkish letters already folded.

02search { trade_type: "sale", location: "istanbul-kadikoy", rooms: ["3+1"], sort: "unit_price_asc" }
POSTsearch { trade_type: "sale", location: "istanbul-kadikoy", rooms: ["3+1"], sort: "unit_price_asc" }

total is the portal's own count for the district, and every row carries price.amount as an integer and area_m2 as gross square metres. Divide one by the other and you have the per-m² figure for each listing, not a district average.

03detail { listing_id: <the cheapest per m²> }
POSTdetail { listing_id: <the cheapest per m²> }

Confirm the outlier before you trust it: the detail record returns net m² next to gross, the building age, the deed status and the price history with the date of every change — which is how you tell a genuine bargain from a flat that has been re-listed three times.

04agencies { kind: "offices", location: "istanbul" }
POSTagencies { kind: "offices", location: "istanbul" }

Name the counterparties. Each office comes back with its current listing count, its last-three-month count, years on the platform and median sale price.

A per-m² distribution for one district built from individual listings rather than a published index, each row traceable to a live listing, with the price history behind the cheapest and the offices behind the supply.

request
curl -X POST https://api.reefapi.com/emlakjet/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"trade_type":"sale","property_type":"residential","location":"istanbul","price_min":2000000,"price_max":6000000,"rooms":["2+1","3+1"]}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "emlakjet",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

Reading an Emlakjet listing row

Turkish property listings use conventions that do not map one-to-one onto other markets. These are the ones that decide whether your parser is right, each checked against live responses on 2026-10-06.

FieldWhat it actually holds
roomsThe Turkish layout notation: "2+1" means two bedrooms plus one living room, so a 2+1 is a three-room flat. "studyo" / 1+0 is a studio. It is a LABEL, not a number — do not parse it as an integer. Empty on land and commercial rows, where the portal publishes no room count.
area_m2Gross floor area (brüt) in square metres, as an integer. The detail record also returns net_area_m2, read from the portal's own "119 m² / 100 m²" display line; net is always the smaller of the two. Turkish listings are advertised on the gross figure, so compare gross with gross.
price.amountThe asking price as an integer in the currency of price.currency, which is TRY on Turkish listings. For a rental it is the monthly rent; for a daily rental it is the nightly rate — the same field, so read trade_type before you compare numbers.
price.price_per_m2Only filled where the portal itself computed it — measured on about one row in ten. It is null, never zero, on the rest. Divide price.amount by area_m2 yourself if you need it on every row.
seller.type"corporate" for an estate office, "personal" for the owner advertising directly (sahibinden), "contractor" for the developer. Measured in Istanbul for sale: 24 562 corporate against 480 personal. seller.name is the office name and is empty on personal rows, because the portal does not publish a private individual's name.
locationFour nested levels: city (il, province), district (ilçe), locality (semt) and town (mahalle, neighbourhood), each with the exact slug the search endpoint takes, plus latitude and longitude on every row. The slug is hierarchical — "istanbul-kadikoy" for a district, "istanbul-silivri-selimpasa-mahallesi" for a neighbourhood.
total vs max_pagestotal is the portal's own count for the query and reflects real stock. max_pages is how deep you may read: fifty pages of thirty, so 1 500 rows per query, and it shrinks when the query is narrower. Both are returned, and page_clamped tells you when a page you asked for was above the ceiling.

Turkish place names carry dotted and dotless i (İstanbul, Kadıköy, Iğdır), and in most programming languages a plain lower-case does not fold İ to i. You can pass either the slug or the Turkish name — the folding is done for you — but if you build slugs yourself, fold the Turkish letters explicitly first.

What this covers, and where it stops

Measured on 2026-10-06 by calling the endpoints and comparing the answers, including the measurements that go against us.

Market

Turkey only, all 81 provinces, down to neighbourhood (mahalle) level. Prices in Turkish lira.

Deal types

For sale, for rent, daily rent, and business transfer (devren, commercial only). Rent is a monthly figure, daily rent a nightly one, in the same price field — read trade_type before comparing.

Property types

All housing, or narrowed to apartment, villa, detached house, residence, summer house, commercial, land, whole building, tourism facility or timeshare.

Filters that bite

Each checked against the portal's own unfiltered count in the same minute. Istanbul for sale, 25 149 unfiltered: price floor 5m leaves 17 201, price ceiling 2m leaves 1 090, 150 m² floor leaves 6 130, 2+1 leaves 11 686, two bathrooms leaves 7 775, posted-in-7-days leaves 2 014, owner-advertised leaves 480.

Depth per query

1 500 listings — fifty pages of thirty, which is the portal's ceiling, returned to you as max_pages. A page beyond it is clamped and flagged rather than silently serving page one again. Cover a province by splitting on district or price band.

No keyword search

The portal ignores free text on this surface — a real word and a nonsense word returned the identical count and the identical first thirty listings — so no keyword parameter is published. Match on the detail endpoint's description instead.

Fields the source leaves blank

Price per m² arrives on about one row in ten, because the portal computes it only sometimes; it is null, never zero. Room count and floor are absent on land and commercial rows. Seller name is empty on owner-advertised rows, where no private name is published.

Identity

Listing ids are stable integers and round-trip unchanged from search to detail — twelve checked across five provinces, with the same id, the same type, the same price and the same gross m² both times.

Contact details

Withheld by default. The office switchboard, the consultant's mobile, their name and the licence document number are returned only on explicit request; the office name is always included.

What people build with Emlakjet

The jobs this data is most often used for.

5

endpoints

1/2

credits per call

01

Track asking prices per m² by Istanbul, Ankara or Izmir district, using the numeric price and gross m² on every row

02

Build a comparables set for a valuation: search a neighbourhood with a price and m² band, then pull the detail record's price history for each candidate

03

Watch new supply daily with the last-24-hours filter and alert on listings that undercut a district's going rate

04

Measure who holds the stock in a province from the estate-office directory — current listings, last-three-month listings, years on the platform and median sale price

What Emlakjet data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 438 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/emlakjet/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"trade_type":"sale","property_type":"residential","location":"istanbul","price_min":2000000,"price_max":6000000,"rooms":["2+1","3+1"]}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/emlakjet/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "trade_type": "sale",
  "property_type": "residential",
  "location": "istanbul",
  "price_min": 2000000,
  "price_max": 6000000,
  "rooms": [
    "2+1",
    "3+1"
  ]
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Emlakjet.

Get a free key →
Can I search Emlakjet by keyword, like "sea view" or "havuzlu"?▾

No, and we would rather say so than ship a parameter that does nothing. The portal's own free-text key is ignored on the surface this API reads: the same query with a real word and with nonsense both returned the identical unfiltered count and the identical first thirty listings. So this API publishes no keyword parameter. Selection is by location plus structured filters — price band, gross m², room layout, bathrooms, heating, posting window, seller type — and you can match on free text yourself against the detail endpoint's description, which is returned with the markup stripped.

How many listings can I actually read for one query?▾

Up to 1 500: fifty pages of thirty, which is the portal's own ceiling and is returned to you as max_pages. Asking for a page beyond it does not fail and does not repeat the last page — the portal quietly serves page one again — so this API clamps the page, reports the real page it read and sets page_clamped, which means a paging loop terminates instead of re-reading page one forever. To cover a whole province, split the query: by district from the locations endpoint, or by price band. total keeps telling you the real size of the market behind the query even when it is larger than 1 500.

What does "2+1" mean, and can I filter by it?▾

It is the Turkish way of counting rooms: bedrooms plus living rooms. A 2+1 has two bedrooms and one living room, so three rooms in total; a 3+1 has four. "studyo" is a studio, written 1+0. You can filter by one or several layouts in a single call and they are OR-ed together — measured in Istanbul for sale, 2+1 alone leaves 11 686 of 25 149, and 2+1 together with 3+1 leaves 17 950. The same notation comes back on every row in the rooms field, as a label rather than a number.

Does the price filter work in lira, and is the currency fixed?▾

Yes to both. Prices are integers in Turkish lira and price.currency is TRY on Turkish listings; price.amount_try is the same figure, which matters only for the rare listing a seller priced in another currency. The price band bites on the portal's own count: against an unfiltered 25 149 for Istanbul for sale, a 5 000 000 lira floor leaves 17 201, a 2 000 000 ceiling leaves 1 090, and a 2-to-4-million band leaves 4 376. Sorting cheapest-first really reorders — the first four prices measured were 125 000, 310 000, 350 000 and 350 000.

Can I tell owner listings apart from agency listings?▾

Yes, in both directions. Seller type is a filter and it is also returned on every row, so you can either ask only for owner-advertised stock or read the mix. Measured in Istanbul for sale in one run: 24 562 from estate offices, 480 directly from owners, 25 149 in total. On agency rows you get the office name, and the estate-office directory endpoint then tells you how much stock that office holds, how long it has been on the platform and its median sale price.

Are contact phone numbers returned?▾

Not by default. The portal publishes the office switchboard on listing rows and, on the detail page, the consultant's mobile, their name and a licence document number. All of that is withheld unless you explicitly ask for it, and the estate office's NAME — a business identity, and the part you normally need — is always returned without it.

What does the detail endpoint add over a search row?▾

The free-text description with the HTML stripped, the complete photo set, the price history with the date of each change, net m² alongside gross, bathroom count, building age, how many floors the building has, heating system, parking, usage status, deed status, credit eligibility, whether it is inside a gated complex, lift, furnishing, whether swap is accepted, fibre and the portal's deed verification flag, plus the estate office with how many years it has been a member. Measured across twelve listings in five provinces, twenty-seven of those thirty-two fields were filled on all twelve; the ones that were not — deed status, lift, parking, credit eligibility — are fields the advertiser left blank, and they come back null rather than guessed.

How do I find the right location slug?▾

Call the locations endpoint. With no parameters it returns all 81 provinces with their slugs; with a province it returns that province's districts; with a province and a district it returns that district's neighbourhoods and sub-localities. Every row carries the slug the search endpoint expects and the numeric id the portal uses internally. You can also pass a plain Turkish name to search — "İzmir", "Kadıköy" — and it is folded to the slug for you.

What is the Emlakjet API?▾

Emlakjet API is a ReefAPI endpoint group for turkish property for sale and to rent, with the estate office behind each listing. It returns live JSON through POST requests under /emlakjet/v1.

Is the Emlakjet API free to try?▾

Yes. ReefAPI starts with 1,000 free credits, no card required. Emlakjet calls use the same shared credit balance as every other ReefAPI engine.

Do I need an Emlakjet login or account?▾

No login to Emlakjet is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Emlakjet data?▾

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Emlakjet API use?▾

Emlakjet actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call Emlakjet from an AI assistant or MCP client?▾

Yes. Connect ReefAPI once through MCP and your assistant can call emlakjet actions with the same key, credit pool and JSON envelope used by normal REST requests.

21 Real Estate APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Emlakjet, you are one call away from the rest of the category — no second contract, no second integration.

Already paying for something else?Emlakjet vs Bright Data

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 437 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-06.