Krisha.kz Scraper — Kazakhstan Real Estate (Almaty, Astana) avatar

Krisha.kz Scraper — Kazakhstan Real Estate (Almaty, Astana)

Pricing

from $1.40 / 1,000 listings

Go to Apify Store
Krisha.kz Scraper — Kazakhstan Real Estate (Almaty, Astana)

Krisha.kz Scraper — Kazakhstan Real Estate (Almaty, Astana)

Krisha.kz listings for analysts, agencies and AI agents: apartments, houses, commercial, land for sale or rent in Almaty, Astana, Shymkent or all of Kazakhstan. Price, price per m², rooms, floor, photos, market summary. Monitoring mode: only new listings and price drops. No login.

Pricing

from $1.40 / 1,000 listings

Rating

0.0

(0)

Developer

Samat Makatov

Samat Makatov

Maintained by Community

Actor stats

2

Bookmarked

3

Total users

2

Monthly active users

3 days ago

Last modified

Share

Structured listings from krisha.kz, the #1 real-estate marketplace of Kazakhstan: apartments, houses, commercial property, land and garages — for sale or rent — in Almaty, Astana, Shymkent, any city, region or district. Every krisha.kz filter is available (price, area, floor, year built, building type, owner-only, new buildings, furniture, pets…), each item comes with price per m², seller type and publish date, and detail: true adds full description, all parameters, GPS coordinates and photos. Built for analysts, agencies, developers, banks and AI agents.

Two things in one actor that usually cost you separate tools: new-listing and price-drop alerts for a saved search on a schedule (onlyNew, trackPriceChanges), and a market summary (median price, ₸/m², breakdown by rooms and district, owner vs agency share) written after every run.

No browser, no API key — plain HTTP, cheap and fast. Big detail: true jobs can use the optional fast mode (turn on a proxy): listing pages are opened with up to 8 IPs at once — see Speed and pricing.

Use cases

  • New-listing alerts — save a search as a task, schedule it hourly with onlyNew: true: each run returns only listings you have not seen yet. Pipe them to Telegram, Slack, email or a CRM.
  • Price-drop tracking — add trackPriceChanges: true: known listings whose price moved come back with previousPrice, priceChange and priceChangePct.
  • Lead generation for agencies — ownerOnly: true + your district: fresh owner-posted apartments every hour, with phone-free contact through the listing URL.
  • Price monitoring / market reports — pull 1 000 listings of 2-room apartments in Almaty weekly; the SUMMARY record already has median price, median ₸/m² and a breakdown by rooms and district.
  • Investment screening — newBuildingOnly + mortgageAvailable + yearFrom: 2020, sorted cheapest, with detail: true for coordinates and all parameters.
  • Rental yield analysis — run once for prodazha and once for arenda on the same complex (complexId) and divide.
  • Commercial real estate sourcing — kommercheskaya-nedvizhimost with commercialUse: "warehouse", withTenants: true (income-producing assets).
  • Developer competitive intel — seller: "developer" items reveal which complexes are actively marketed, at what ₸/m².

Input

All fields are optional. Location and type fields mirror the krisha.kz URL: https://krisha.kz/{dealType}/{propertyType}/{city}/.

FieldTypeDefaultAllowed values / notes
dealTypestringprodazhaprodazha (sale), arenda (rent)
propertyTypestringkvartirykvartiry, doma-dachi, komnaty, kvartiry-posutochno, kvartiry-po-chasam, doma-dachi-posutochno, kommercheskaya-nedvizhimost, biznes**, prombazy, uchastkov, garazhi, zarubezhnoj-nedvizhimosti (* rent only, ** sale only). Exactly these values: Apify refuses any other value before the run starts.
citystring– (all Kazakhstan; the Console form is prefilled with almaty)Any slug from Reference → Locations (city, region or district). Russian names work too (Алматы, Бостандыкский р-н). Empty = all Kazakhstan.
complexIdinteger–Residential complex id (number in https://krisha.kz/complex/almaty/<id>).
roomsstring[][]"1", "2", "3", "4", "5+" (five and more; "5" means the same), and "6"…"10" for houses. Any other value fails the run with this list — it is never ignored (an ignored room filter would return every room count).
priceFrom / priceTointeger–Tenge. For arenda = monthly rent.
areaFrom / areaTointeger–Total area m² (commercial → premises area).
kitchenAreaFrom / kitchenAreaTointeger–Apartments.
floorFrom / floorTointeger–Apartments.
notFirstFloor / notLastFloorbooleanfalseApartments.
buildingFloorsFrom / buildingFloorsTointeger–Floors in the building.
yearFrom / yearTointeger–Year built.
buildingTypestring–brick, panel, monolith, other
bathroomstring–separate, combined, twoOrMore, none
ownerOnlybooleanfalseOnly owner-posted listings (das[who]=1).
fromAgentsOnlybooleanfalseOnly verified Krisha Agents.
hasPhotobooleanfalse
newBuildingOnlybooleanfalsePrimary market only.
mortgageAvailablebooleanfalse
notDormitorybooleanfalseExclude former dormitories.
exchangePossiblebooleanfalse
furniturestring–Rent only: full, partial, none
petsAllowed / kidsAllowedbooleanfalseRent only.
houseTypestring–Houses: detached, partOfHouse, dacha
wallMaterialstring–Houses: brick, monolith, wood, adobe, gasSilicate, aeratedConcrete, cinderBlock, foamBlock, thermoBlock, frameReed, framePanel, sip, concretePanel, shellRock, finBlock
renovationstring–Houses: fresh, decent, needsRepair, roughFinish, demolition, unfinished
heatingstring–Houses: central, gas, solidFuel, liquidFuel, electric, mixed, none
sewagestring–Houses: central, canConnect, septic, none
landAreaFrom / landAreaTointeger–Sotka (100 m²): houses, land, garages.
commercialUsestring–any, office, retail, warehouse, auto, catering, beauty, agriculture, hospitality, medical, education, entertainment
commercialLocationstring–businessCenter, residential, mall, market, standalone
withTenants / asBusinessbooleanfalseCommercial.
extraParamsobject{}Any other raw das[...] parameter copied from a krisha.kz URL, e.g. {"das[flat.phone]": "1"}. A key that does not start with das[ fails the run.
sortstringnewestnewest, cheapest, expensive. Note: paid "hot" listings are pinned to the top of every krisha.kz page regardless of sort — filter on hot: false if you need a strict order.
sinceHoursinteger–Keep only listings published in the last N hours (day precision). With sort: newest pagination stops at the first page that is entirely older.
maxItemsinteger401–5000. ~20 listings per page. With detail: true about 6.5 s per listing in a normal run: a 1-hour run holds about 500.
maxPagesinteger501–300 safety cap. Raise it together with maxItems (5000 items ≈ 250 pages).
detailbooleanfalseOpen every listing page: full description, all parameters, coordinates, photos, owner name/type, exact publish date. +1 request per listing, about 6.5 s each in a normal run (measured 2026-10-02).
includeViewsbooleanfalseAttach the site's view counter (1 batch request per 25 listings). Off by default: the counter endpoint (/ms/views/…) is disallowed by krisha.kz's robots.txt (Disallow: /ms/*); turn it on only if you accept that. Off = views: null.
proxyConfigurationobjectoffOff = the normal run. On = fast mode for detail: true: Apify Proxy → 8 IPs (group RESIDENTIAL) or 4 IPs (datacenter groups, whose IPs are shared) open listing pages at once, at the fast-mode price; your own proxy URLs (http://user:pass@host:port, one per IP, up to 10 at once) → as many IPs as URLs, at the normal price. Search pages are always read directly; without detail the proxy is not used. See Speed and pricing.
dedupebooleantrueDrop repeated ids (paid listings repeat in the "hot" block).
onlyNewbooleanfalseMonitoring: return only listings previous runs of the same search have not returned. See Monitoring.
trackPriceChangesbooleanfalseMonitoring: also return known listings whose price changed. Implies onlyNew.
monitorKeystring–Monitoring: name of the saved state. Empty = derived from the search filters.

Filters that do not apply to the chosen property type (e.g. furniture for a sale) are dropped with a warning in the log, in the run's status message and in SUMMARY.warnings — nothing is ignored silently. Fields with a fixed list of values (dealType, propertyType, sort, buildingType, bathroom, furniture, houseType, wallMaterial, renovation, heating, sewage, commercialUse, commercialLocation) take exactly the values above: Apify refuses any other value before the run starts.

Monitoring (scheduled runs)

Save your search as a task, switch on onlyNew and attach a schedule (Apify Console → Schedules, e.g. every hour). Every run then returns only what is new since the previous run.

{
"dealType": "prodazha", "propertyType": "kvartiry", "city": "almaty-bostandykskij",
"rooms": ["2"], "priceTo": 60000000,
"onlyNew": true, "trackPriceChanges": false,
"maxItems": 100, "maxPages": 20
}

Schedule: cron 0 * * * * (hourly) or 0 8 * * * (every morning), action = run the task above. Add an integration (Telegram, Slack, email, webhook, Make, Zapier, n8n) on the task to get the new rows pushed to you.

How it works:

  • First run returns everything it finds (up to maxItems) and saves it as the baseline — the log says first monitoring run — baseline of N listing(s) saved. It records at least 3 result pages even if maxItems is smaller, so the second run has a solid reference.
  • Next runs return only listings the monitor has not returned before, each with changeType: "new". With sort: newest paging stops once two pages in a row hold only already-known listings, so an hourly run usually reads 2–4 pages.
  • trackPriceChanges: true also returns known listings whose price changed (changeType: "price_changed", previousPrice, priceChange, priceChangePct). Price changes can be on any page, so these runs read up to maxPages pages — keep maxPages modest (10–30). Listings met there for the first time are added to tracking without being reported, unless their id shows they were published after the monitor last looked.
  • State lives in the named key-value store krisha-kz-monitor of your Apify account, one record per search (key = hash of the search URL, or your monitorKey). It keeps the last 20 000 listings (id → last price and date). A listing is remembered only once it is saved to your dataset, and the record is written after the saved batches and at the end: a run cut short by your spending limit or the timeout never marks the listings it did not save as seen (the next run returns them), and listings a run did save are not returned again, even if that run failed later.
  • Same search in two tasks shares one memory (the second task would see nothing new). Give each task its own monitorKey to keep them apart, or the same key to share on purpose. To start over, use a new monitorKey or delete the record in krisha-kz-monitor.
  • Cheaper runs — you pay per returned listing, and a monitoring run returns only new and repriced ones: an hourly monitor that finds 3 new listings costs $0.005 + 3 × $0.002 = $0.011 per run instead of paying for the whole result list every time.
  • Good to know — krisha.kz sorts "newest" by the last time a listing was raised, and sellers pay to raise old listings to the top. A raised listing the monitor has never seen counts as new (you have not seen it either), but gets recentlyPublished: false; listings actually published since the last run get recentlyPublished: true — filter on it if you only want brand-new supply. On broad searches (all of Almaty) most "new" rows are raised older listings; narrow searches are much quieter. The 3 paid "hot" listings pinned on top of page 1 rotate through the whole search; they count as new only when they were published after the monitor last looked. If maxItems is reached while new listings keep coming, the rest is left for the next run and the log says so — set maxItems above what you expect between two runs.

Reference

Locations (city)

Slugs come from krisha.kz's own region tree (/region/ajaxGetChildren/). Districts are only defined for Almaty, Astana and Shymkent. Any other town slug that appears in a krisha.kz URL (https://krisha.kz/prodazha/kvartiry/<slug>/) also works — an unknown slug yields a clear 404 error, never empty data.

Region / citySlugDistricts / main cities (slug)
Алматы (city)almatyАлатауский → almaty-alatauskij; Алмалинский → almaty-almalinskij; Ауэзовский → almaty-aujezovskij; Бостандыкский → almaty-bostandykskij; Жетысуский → almaty-zhetysuskij; Медеуский → almaty-medeuskij; Наурызбайский → almaty-nauryzbajskiy; Турксибский → almaty-turksibskij
Астана (city)astanaАлматы р-н → astana-almatinskij; Есильский → astana-esilskij; Нура → astana-nura; Байконур → r-n-bajkonur; Сарайшык → astana-saraishyk; Сарыарка → astana-saryarkinskij
Шымкент (city)shymkentАбайский → shymkent-abajskij; Аль-Фарабийский → shymkent-al-farabijskij; Енбекшинский → shymkent-enbekshinskij; Каратауский → karatauskij; Туран → shymkent-turan
Абай обл.abay-oblastСемей → semej
Акмолинская обл.akmolinskaja-oblastКокшетау → kokshetau; Щучинск → shhuchinsk; Степногорск → stepnogorsk
Актюбинская обл.aktjubinskaja-oblastАктобе → aktobe
Алматинская обл.almatinskaja-oblastБоралдай → boroldaj-burundaj; Каскелен → kaskelen; Конаев → konaev; Талгар → talgar
Атырауская обл.atyrauskaja-oblastАтырау → atyrau; Кульсары → kulsary
Восточно-Казахстанская обл.vostochno-kazahstanskaja-oblastРиддер → ridder; Усть-Каменогорск → ust-kamenogorsk
Жамбылская обл.zhambylskaja-oblastТараз → taraz; Жанатас → zhanatas; Шу → shu
Жетысу обл.jetisyskaya-oblastТалдыкорган → taldykorgan
Западно-Казахстанская обл.zapadno-kazahstanskaja-oblastАксай → aksaj; Уральск → uralsk
Карагандинская обл.karagandinskaja-oblastБалхаш → balhash; Караганда → karaganda; Темиртау → temirtau; Шахтинск → shahtinsk; Сарань → saran
Костанайская обл.kostanajskaja-oblastКостанай → kostanaj; Лисаковск → lisakovsk; Рудный → rudnyj
Кызылординская обл.kyzylordinskaja-oblastБайконур → bajkonur; Кызылорда → kyzylorda
Мангистауская обл.mangistauskaja-oblastАктау → aktau; Жанаозен → zhanaozen
Павлодарская обл.pavlodarskaja-oblastПавлодар → pavlodar; Экибастуз → ekibastuz; Аксу → aksu
Северо-Казахстанская обл.severo-kazahstanskaja-oblastПетропавловск → petropavlovsk
Туркестанская обл.juzhno-kazahstanskaja-oblastТуркестан → turkestan; Арысь → arys; Кентау → kentau
Улытау обл.ulitayskay-oblastЖезказган → zhezkazgan; Сатпаев → satpaev

Abroad (propertyType: zarubezhnoj-nedvizhimosti): gruzija, kipr, grecija, italija, rossija, kyrgyzstan, vetnam.

Property types

SlugMeaningSaleRent
kvartiryApartments✓✓
doma-dachiHouses & dachas✓✓
komnatyRooms–✓
kvartiry-posutochnoApartments, daily–✓
kvartiry-po-chasamApartments, hourly–✓
doma-dachi-posutochnoHouses, daily–✓
kommercheskaya-nedvizhimostCommercial property✓✓
biznesReady business✓–
prombazyIndustrial bases✓✓
uchastkovLand plots✓✓
garazhiGarages & parking✓✓
zarubezhnoj-nedvizhimostiProperty abroad✓✓

Filter → krisha.kz parameter map

Inputkrisha.kz das[...]Codes
roomsdas[live.rooms][]1,2,3,4, 5.100 (=5+)
priceFrom/Todas[price][from/to]₸
areaFrom/Todas[live.square] / das[com.square]m²
kitchenAreaFrom/Todas[live.square_k]m²
floorFrom/Todas[flat.floor]
notFirstFloor, notLastFloordas[floor_not_first], das[floor_not_last]1
buildingFloorsFrom/Todas[house.floor_num]
yearFrom/Todas[house.year]
buildingTypedas[flat.building]brick 1, panel 2, monolith 3, other 0
bathroomdas[flat.toilet]separate 1, combined 2, twoOrMore 3, none 4
ownerOnlydas[who]1
fromAgentsOnlydas[_sys.fromAgent]1
hasPhotodas[_sys.hasphoto]1
newBuildingOnlydas[novostroiki]1
mortgageAvailabledas[mortgage]1
notDormitorydas[flat.priv_dorm]2
exchangePossibledas[has_change]1
furnituredas[live.furniture]full 1, partial 2, none 3
petsAllowed, kidsAlloweddas[who_match][4], das[who_match][5]4, 5
houseTypedas[house.type_object]detached 1, partOfHouse 2, dacha 3
wallMaterialdas[house.building_opts]1–15 in the order listed above
renovationdas[house.renewal]1–6
heatingdas[cmtn.heating]central 1, gas 2, solidFuel 3, liquidFuel 4, electric 7, mixed 5, none 6
sewagedas[cmtn.sewage]central 1, canConnect 2, septic 3, none 4
landAreaFrom/Todas[land.square]sotka
commercialUsedas[com.use_case]any 1, office 2, retail 3, warehouse 4, auto 5, catering 6, beauty 7, agriculture 8, hospitality 9, medical 11, education 12, entertainment 13
commercialLocationdas[com.location]businessCenter 1, residential 2, mall 3, market 4, standalone 5
withTenants, asBusinessdas[com.is_tenants], das[estate.is_buss]1
complexIddas[map.complex]complex id
sortsort_bynewest = default (add_date-desc), cheapest price-asc, expensive price-desc

Examples

Daily market snapshot — 2-room apartments in Almaty under 45 M ₸

{ "dealType": "prodazha", "propertyType": "kvartiry", "city": "almaty", "rooms": ["2"], "priceTo": 45000000, "maxItems": 500 }

Agency lead-gen — new owner-posted rentals in Bostandyk district, checked hourly

{ "dealType": "arenda", "propertyType": "kvartiry", "city": "almaty-bostandykskij", "rooms": ["1", "2"], "priceTo": 400000, "ownerOnly": true, "furniture": "full", "sinceHours": 2, "detail": true, "maxItems": 100 }

Investor screen — new builds with mortgage, 2020+, monolith, not ground floor

{ "city": "astana", "newBuildingOnly": true, "mortgageAvailable": true, "yearFrom": 2020, "buildingType": "monolith", "notFirstFloor": true, "sort": "cheapest", "maxItems": 300 }

Commercial sourcing — warehouses with tenants in Almaty region

{ "propertyType": "kommercheskaya-nedvizhimost", "city": "almatinskaja-oblast", "commercialUse": "warehouse", "withTenants": true, "areaFrom": 500, "detail": true, "maxItems": 100 }

Houses — gas-heated detached houses with 6+ sotka near Almaty

{ "propertyType": "doma-dachi", "city": "kaskelen", "houseType": "detached", "heating": "gas", "landAreaFrom": 6, "priceTo": 90000000, "maxItems": 200 }

Output

One dataset item per listing. Example (trimmed, detail: false):

{
"id": "1015668341",
"title": "2-комнатная квартира · 45.2 м² · 5/5 этаж",
"url": "https://krisha.kz/a/show/1015668341",
"price": 35000000, "currency": "KZT", "priceText": "35 000 000 ₸", "pricePerM2": 774336,
"rooms": 2, "area": 45.2, "floor": 5, "floors": 5,
"address": "Бостандыкский р-н, Толеу Басенова", "district": "Бостандыкский р-н", "street": "Толеу Басенова", "cityName": "Алматы",
"complex": null, "yearBuilt": 1985, "buildingType": "кирпичный", "condition": "не новый, но аккуратный ремонт", "ceilingHeight": 2.6,
"description": "кирпичный дом, 1985 г.п., состояние: … ПРОДАЁТСЯ ЕВРОДВУШКА В БОСТАНДЫКСКОМ РАЙОНЕ! …",
"seller": "specialist", "sellerVerified": true, "hot": true, "photosCount": 12,
"image": "https://krisha-photos.kcdn.online/webp/cb/…/1-full.jpg",
"publishedAt": "2026-09-13", "views": null,
"city": "almaty", "dealType": "prodazha", "propertyType": "kvartiry", "searchTotal": 10429,
"fetchedAt": "2026-09-12T23:43:27.131Z"
}
FieldDescription
id, urlkrisha.kz listing id and canonical URL
titleListing title (rooms · area · floor)
price, currency, priceTextPrice in ₸ (monthly for rent); null when "price on request"
pricePerM2Price per m² as shown by krisha.kz (commercial cards), otherwise price / area, rounded
pricePeriodmonth, day or hour for rentals; null for sales
rooms, area, floor, floorsParsed from the title
address, district, street, cityNameAddress line split into district (… р-н) and street; city as shown on the card
complexResidential complex name when the listing belongs to one
yearBuilt, buildingType, condition, ceilingHeightParsed from the card summary (Russian values as on the site)
descriptionCard preview text (truncated by the site)
sellerowner, specialist (agent), company (agency), developer (new-building complex)
isDevelopertrue for new-building developer cards (seller: "developer"); their price is the starting price shown as "от …"
sellerVerifiedIdentity-verified badge
hotPinned in krisha's paid "hot" block at the top of page 1 (shown regardless of sort)
photosCount, imageNumber of photos and first photo URL
publishedAtPublish date YYYY-MM-DD in Kazakhstan time (UTC+5, as the site shows it; day precision from the card)
viewsSite view counter (only with includeViews: true; otherwise null)
city, dealType, propertyTypeEcho of the resolved search scope
searchTotalTotal number of listings krisha.kz reports for this search (market size)
fetchedAtISO timestamp
changeTypeMonitoring only: new or price_changed
previousPrice, priceChange, priceChangePctMonitoring only: last price the monitor saw, difference in ₸ (negative = cheaper) and in % (2 decimals); null for new listings
detailErrordetail: true only: why the listing page could not be read (the row keeps its card data); absent when the page was read
recentlyPublishedMonitoring only, new rows: true = published since the monitor's last complete run (its id is newer than every listing it knew), false = an older listing seen for the first time (raised by the seller or newly matching your filters); null on the first run and for price changes

The dataset has three views: Overview, Details (detail: true fields) and Monitoring: new & repriced (change type, price, previous price, Δ ₸, Δ %).

Market summary (SUMMARY record)

After every run the default key-value store gets a SUMMARY record (free — not a dataset item). It describes the listings returned by this run — in monitoring mode the new and repriced ones — and every statistic carries its sample size n (listings without a price or area are skipped, never counted as zero). The log prints a one-line version: Market: 30 listing(s) · median 54M ₸ (n=30, range 28.5M–351.7M) · median 995k ₸/m² (n=30) · owners 7% of 30.

{
"basis": "listings returned by this run",
"search": { "url": "https://krisha.kz/prodazha/kvartiry/almaty-bostandykskij/?das%5Blive.rooms%5D%5B%5D=2", "sort": "newest", "…": "…" },
"searchTotal": 4077, "pagesScanned": 2, "searchStoppedBy": "maxItems",
"delivered": 30, "stoppedBy": null, "status": "30 listing(s) saved of 4077 matching on krisha.kz.",
"listings": 30, "pricePeriod": null, "otherPeriodExcluded": 0,
"price": { "n": 30, "min": 28500000, "p25": 46000000, "median": 54000000, "mean": 68627913, "p75": 67625000, "max": 351713800 },
"pricePerM2": { "n": 30, "min": 692308, "p25": 866982, "median": 995400, "mean": 1062079, "p75": 1164479, "max": 2540000 },
"byRooms": [ { "rooms": "2", "count": 29, "medianPrice": 54000000, "nPrice": 29, "medianPricePerM2": 992647, "nPricePerM2": 29 } ],
"byDistrict": [ { "district": "Бостандыкский р-н", "count": 30, "medianPrice": 54000000, "nPrice": 30, "medianPricePerM2": 995400, "nPricePerM2": 30 } ],
"sellers": { "n": 30, "owner": 2, "agency": 25, "developer": 3, "ownerShare": 0.067, "agencyShare": 0.833, "developerShare": 0.1 },
"monitor": null
}
  • byDistrict groups by the card's district, or the city when there is none (top 50 groups). agency = agents + agencies; shares are over listings with a known seller type.
  • Rentals: pricePeriod is month / day / hour; if a search mixes periods, price statistics use the most common one and otherPeriodExcluded counts the rest.
  • searchStoppedBy — why paging ended: maxItems, maxPages, noMoreResults, sinceHours, alreadySeen (monitoring stop rule), pageError (a later search page failed; pageError says which — the run keeps what it saved), spendingLimit, timeout or aborted.
  • delivered — rows saved (and charged) by this run; stoppedBy — null, or limit / timeout / aborted when your spending limit, the run timeout or an abort cut the run short (the status message then starts with "Stopped at your spending limit: …" or "Stopped before the run timeout: …"); status — the final status message.
  • detail (with detail: true): { opened, failed, leftUnopened, stop, minutes } — leftUnopened listings were found but not opened (spending limit, timeout or a block) and were not saved or charged; wafRetries — how many times krisha.kz's firewall answered 403/429/468/5xx (each such answer is retried while attempts last); warnings — input notes (filters dropped for this property type, proxy notes).
  • droppedNotMatchingFilters: null, or how many cards krisha.kz showed that do not match your room / price / area filters and were dropped (never charged) — { dropped, developerCards, byFilter, examples }. krisha mixes new-building developer cards into the results regardless of the room filter.
  • In monitoring mode monitor holds { key, store, run, firstRun, trackPriceChanges, new, recentlyPublished, priceChanged, unchanged, trackedSilently, heldBack, tracked, settled } — heldBack > 0 means maxItems, the spending limit or the timeout cut the run short and the rest comes next run.

Detail mode

With detail: true each item additionally has: descriptionFull, parameters (object keyed by krisha field names: flat.balcony, flat.parking, flat.security, live.furniture, flat.facilities, who_match, …), lat, lon, mapUrl, addressParts ({city, district, street, house_num, corner_street}), photos[], ownerName, userType (owner / specialist / company / complex), complexId, isEstateVerified, and publishedAt from the listing page. Phone numbers are behind a click-to-reveal captcha on krisha.kz and are not collected.

Use it from code / agents

curl -X POST "https://api.apify.com/v2/acts/yadroo~krisha-kz/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"city":"almaty","rooms":["2"],"priceTo":45000000,"maxItems":50}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yadroo/krisha-kz').call({ city: 'astana', newBuildingOnly: true, maxItems: 100 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yadroo/krisha-kz").call(run_input={"dealType": "arenda", "city": "almaty-medeuskij", "ownerOnly": True, "sinceHours": 24})
items = client.dataset(run["defaultDatasetId"]).list_items().items

MCP: add https://mcp.apify.com to Claude / Cursor / any MCP client and call the yadroo/krisha-kz tool with the same JSON input.

Speed and pricing

Search pages are quick (~1 s each), so runs without detail are fast in every mode. With detail: true the run opens one listing page per row, 1.5 s after the previous one ended, plus the WAF's retries: about 6.5 s per listing (measured 2026-10-02; FAQ → Rate limits). Fast mode opens them with several IPs at once, each at that same pace. Pick the mode with the proxyConfiguration input:

ModeHow150 listings, detail: true500 listings, detail: truePrice per listing
Normal (default)proxy off≈ 17 min (measured)≈ 55 min (close to the 1-hour default timeout)$0.002
Fast, Apify Proxyproxy on → Apify Proxy, group RESIDENTIAL (8 IPs)≈ 3 min (measured)≈ 10 min (estimated)$0.0035
Fast, Apify Proxy datacenterproxy on → any other Apify Proxy group (4 IPs: datacenter IPs are shared)≈ 5 min (estimated)≈ 18 min (estimated)$0.0035
Fast, your proxiesproxy on → your proxy URLs, one per IPlike Apify Proxy with 8 or more URLs; one URL = normal speed$0.002

Measured in the Apify cloud on 2026-10-02 (builds 0.1.9–0.1.10) with 2-room apartments for sale in Almaty, sort: newest, detail: true: 150 listings in 16.6 min normally (≈ 6.5 s per listing, the WAF's retries included) and in 3.0–3.2 min in fast mode on RESIDENTIAL; every row had its detail fields.

  • One price per listing in each mode. A fast run on Apify Proxy charges the fast-mode listing event instead of the normal listing event, not on top of it; the extra $0.0015 pays for the proxy traffic (≈ 70 KB per listing, measured — the WAF's challenge answers add to it). With your own proxies the traffic is yours, so the normal price stays. Without detail the proxy is not used and the normal price applies. Run start: $0.005 in every mode.
  • Same pace per IP. Each IP opens its next listing page 1.5 s after the previous one ended, like a normal run; 8 IPs at once on RESIDENTIAL, 4 on datacenter groups (a small shared datacenter pool could otherwise hand two sessions the same IP). An IP the WAF keeps refusing (5 tries in a row) is replaced by a new one (up to 3 times per IP slot); a listing that fails on 3 IPs keeps its card data with detailError.
  • Which proxy. Apify Proxy group RESIDENTIAL worked in our tests. Your own proxies: http:// or https:// URLs (SOCKS is not supported), one URL per IP; a "rotating" gateway URL counts as one IP. SUMMARY.speed shows the mode, IPs used and the charged event.

Discounts: Bronze −10 %, Silver −20 %, Gold and above −30 % on the listing price (normal and fast); the start event ($0.005) is the same on every plan; platform usage and, in fast mode on Apify Proxy, the proxy traffic are included.

Spending limit: a run never costs more than your "Maximum cost per run": it stops at the limit and ends with "Stopped at your spending limit: N rows delivered". With detail: true it opens only as many listing pages as the limit pays for.

Typical runs (normal mode): 40 listings ≈ $0.085; 500-listing market snapshot ≈ $1.005. Monitoring pays only for new / repriced rows: an hourly onlyNew run with 3 new listings ≈ $0.011, a run with nothing new = $0.005. detail: true costs the same per item but takes about 6.5 s per listing longer; in monitoring mode only the new / repriced listings are opened. The SUMMARY record and the monitoring state are free.

Limits & FAQ

  • Rate limits — ~0.7 s between search pages and 1.5 s after each listing page. krisha.kz is behind a WAF that randomly answers 468 to a share of requests; the Actor retries each page up to 6 times with growing backoff, so detail mode takes about 6.5 s per listing (measured 2026-10-02; SUMMARY.wafRetries counts the retries). If a listing page still fails, the item is kept with detailError. If most listing pages fail (5 or more, over half of those tried), krisha.kz is blocking: the run stops opening pages, keeps every row it saved, ends SUCCEEDED and says so in the status; the listings it did not open are not saved or charged.
  • Freshness — data is read live from krisha.kz at run time; publishedAt on cards is day-precise and in Kazakhstan time ("сегодня" / "19 сен." are resolved against the Almaty calendar, so late-evening UTC runs date today's listings correctly). views (with includeViews) are live counters.
  • Filters on the results — krisha.kz injects new-building developer cards into search results that ignore the room filter (a 3-room card in a 2-room search). Every card is re-checked against rooms, priceFrom/priceTo and areaFrom/areaTo where the card shows the value; non-matching cards are dropped (not charged) and counted in the log and in SUMMARY.droppedNotMatchingFilters. A developer card's price is a starting price ("от …"), so only priceTo can rule it out.
  • Blocks / errors — a block or an unrecognized layout on the first search page fails the run with a clear message instead of returning empty items; a wrong location slug fails with 404. If a later search page fails, the run keeps what it saved, ends SUCCEEDED and names the page in the status and in SUMMARY.pageError.
  • Max items — 5000 per run (up to 300 pages; checked live: page 400 still returns fresh listings). With detail: true budget about 6.5 s per listing — the default run timeout is 1 hour, so a normal run holds about 500. Rows are saved as the run goes. With detail: true the run collects only as many listings as it can open before the timeout and says so in the status ("Only N of up to M listings were collected …"); near the timeout it stops starting new pages, keeps what it saved and ends SUCCEEDED with "Stopped before the run timeout: N rows saved" (listings found but not yet opened are not saved or charged). Split very large jobs by district or price range, or use fast mode (see Speed and pricing).
  • View counts — off by default (includeViews): krisha.kz's robots.txt disallows the counter endpoint /ms/*.
  • Phones — not extracted (captcha-protected on the site).
  • Roadmap — complex catalog mode (all listings inside a ЖК by name), map-bounds search.

Made by Yadroo. Sibling actors: kolesa-kz (cars), kaspi-kz-products (marketplace prices), hh-kz-vacancies (jobs), autoscout24-cars (EU cars).