Krisha.kz Scraper — Kazakhstan Real Estate (Almaty, Astana)
Pricing
from $1.40 / 1,000 listings
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
Maintained by CommunityActor stats
2
Bookmarked
3
Total users
2
Monthly active users
3 days ago
Last modified
Categories
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 withpreviousPrice,priceChangeandpriceChangePct. - 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
SUMMARYrecord already has median price, median ₸/m² and a breakdown by rooms and district. - Investment screening —
newBuildingOnly+mortgageAvailable+yearFrom: 2020, sortedcheapest, withdetail: truefor coordinates and all parameters. - Rental yield analysis — run once for
prodazhaand once forarendaon the same complex (complexId) and divide. - Commercial real estate sourcing —
kommercheskaya-nedvizhimostwithcommercialUse: "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}/.
| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
dealType | string | prodazha | prodazha (sale), arenda (rent) |
propertyType | string | kvartiry | kvartiry, 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. |
city | string | – (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. |
complexId | integer | – | Residential complex id (number in https://krisha.kz/complex/almaty/<id>). |
rooms | string[] | [] | "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 / priceTo | integer | – | Tenge. For arenda = monthly rent. |
areaFrom / areaTo | integer | – | Total area m² (commercial → premises area). |
kitchenAreaFrom / kitchenAreaTo | integer | – | Apartments. |
floorFrom / floorTo | integer | – | Apartments. |
notFirstFloor / notLastFloor | boolean | false | Apartments. |
buildingFloorsFrom / buildingFloorsTo | integer | – | Floors in the building. |
yearFrom / yearTo | integer | – | Year built. |
buildingType | string | – | brick, panel, monolith, other |
bathroom | string | – | separate, combined, twoOrMore, none |
ownerOnly | boolean | false | Only owner-posted listings (das[who]=1). |
fromAgentsOnly | boolean | false | Only verified Krisha Agents. |
hasPhoto | boolean | false | |
newBuildingOnly | boolean | false | Primary market only. |
mortgageAvailable | boolean | false | |
notDormitory | boolean | false | Exclude former dormitories. |
exchangePossible | boolean | false | |
furniture | string | – | Rent only: full, partial, none |
petsAllowed / kidsAllowed | boolean | false | Rent only. |
houseType | string | – | Houses: detached, partOfHouse, dacha |
wallMaterial | string | – | Houses: brick, monolith, wood, adobe, gasSilicate, aeratedConcrete, cinderBlock, foamBlock, thermoBlock, frameReed, framePanel, sip, concretePanel, shellRock, finBlock |
renovation | string | – | Houses: fresh, decent, needsRepair, roughFinish, demolition, unfinished |
heating | string | – | Houses: central, gas, solidFuel, liquidFuel, electric, mixed, none |
sewage | string | – | Houses: central, canConnect, septic, none |
landAreaFrom / landAreaTo | integer | – | Sotka (100 m²): houses, land, garages. |
commercialUse | string | – | any, office, retail, warehouse, auto, catering, beauty, agriculture, hospitality, medical, education, entertainment |
commercialLocation | string | – | businessCenter, residential, mall, market, standalone |
withTenants / asBusiness | boolean | false | Commercial. |
extraParams | object | {} | 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. |
sort | string | newest | newest, 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. |
sinceHours | integer | – | Keep only listings published in the last N hours (day precision). With sort: newest pagination stops at the first page that is entirely older. |
maxItems | integer | 40 | 1–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. |
maxPages | integer | 50 | 1–300 safety cap. Raise it together with maxItems (5000 items ≈ 250 pages). |
detail | boolean | false | Open 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). |
includeViews | boolean | false | Attach 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. |
proxyConfiguration | object | off | Off = 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. |
dedupe | boolean | true | Drop repeated ids (paid listings repeat in the "hot" block). |
onlyNew | boolean | false | Monitoring: return only listings previous runs of the same search have not returned. See Monitoring. |
trackPriceChanges | boolean | false | Monitoring: also return known listings whose price changed. Implies onlyNew. |
monitorKey | string | – | 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 saysfirst monitoring run — baseline of N listing(s) saved. It records at least 3 result pages even ifmaxItemsis smaller, so the second run has a solid reference. - Next runs return only listings the monitor has not returned before, each with
changeType: "new". Withsort: newestpaging stops once two pages in a row hold only already-known listings, so an hourly run usually reads 2–4 pages. trackPriceChanges: truealso returns known listings whose price changed (changeType: "price_changed",previousPrice,priceChange,priceChangePct). Price changes can be on any page, so these runs read up tomaxPagespages — keepmaxPagesmodest (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-monitorof your Apify account, one record per search (key = hash of the search URL, or yourmonitorKey). 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
monitorKeyto keep them apart, or the same key to share on purpose. To start over, use a newmonitorKeyor delete the record inkrisha-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 getrecentlyPublished: 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. IfmaxItemsis reached while new listings keep coming, the rest is left for the next run and the log says so — setmaxItemsabove 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 / city | Slug | Districts / 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
| Slug | Meaning | Sale | Rent |
|---|---|---|---|
kvartiry | Apartments | ✓ | ✓ |
doma-dachi | Houses & dachas | ✓ | ✓ |
komnaty | Rooms | – | ✓ |
kvartiry-posutochno | Apartments, daily | – | ✓ |
kvartiry-po-chasam | Apartments, hourly | – | ✓ |
doma-dachi-posutochno | Houses, daily | – | ✓ |
kommercheskaya-nedvizhimost | Commercial property | ✓ | ✓ |
biznes | Ready business | ✓ | – |
prombazy | Industrial bases | ✓ | ✓ |
uchastkov | Land plots | ✓ | ✓ |
garazhi | Garages & parking | ✓ | ✓ |
zarubezhnoj-nedvizhimosti | Property abroad | ✓ | ✓ |
Filter → krisha.kz parameter map
| Input | krisha.kz das[...] | Codes |
|---|---|---|
rooms | das[live.rooms][] | 1,2,3,4, 5.100 (=5+) |
priceFrom/To | das[price][from/to] | ₸ |
areaFrom/To | das[live.square] / das[com.square] | m² |
kitchenAreaFrom/To | das[live.square_k] | m² |
floorFrom/To | das[flat.floor] | |
notFirstFloor, notLastFloor | das[floor_not_first], das[floor_not_last] | 1 |
buildingFloorsFrom/To | das[house.floor_num] | |
yearFrom/To | das[house.year] | |
buildingType | das[flat.building] | brick 1, panel 2, monolith 3, other 0 |
bathroom | das[flat.toilet] | separate 1, combined 2, twoOrMore 3, none 4 |
ownerOnly | das[who] | 1 |
fromAgentsOnly | das[_sys.fromAgent] | 1 |
hasPhoto | das[_sys.hasphoto] | 1 |
newBuildingOnly | das[novostroiki] | 1 |
mortgageAvailable | das[mortgage] | 1 |
notDormitory | das[flat.priv_dorm] | 2 |
exchangePossible | das[has_change] | 1 |
furniture | das[live.furniture] | full 1, partial 2, none 3 |
petsAllowed, kidsAllowed | das[who_match][4], das[who_match][5] | 4, 5 |
houseType | das[house.type_object] | detached 1, partOfHouse 2, dacha 3 |
wallMaterial | das[house.building_opts] | 1–15 in the order listed above |
renovation | das[house.renewal] | 1–6 |
heating | das[cmtn.heating] | central 1, gas 2, solidFuel 3, liquidFuel 4, electric 7, mixed 5, none 6 |
sewage | das[cmtn.sewage] | central 1, canConnect 2, septic 3, none 4 |
landAreaFrom/To | das[land.square] | sotka |
commercialUse | das[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 |
commercialLocation | das[com.location] | businessCenter 1, residential 2, mall 3, market 4, standalone 5 |
withTenants, asBusiness | das[com.is_tenants], das[estate.is_buss] | 1 |
complexId | das[map.complex] | complex id |
sort | sort_by | newest = 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"}
| Field | Description |
|---|---|
id, url | krisha.kz listing id and canonical URL |
title | Listing title (rooms · area · floor) |
price, currency, priceText | Price in ₸ (monthly for rent); null when "price on request" |
pricePerM2 | Price per m² as shown by krisha.kz (commercial cards), otherwise price / area, rounded |
pricePeriod | month, day or hour for rentals; null for sales |
rooms, area, floor, floors | Parsed from the title |
address, district, street, cityName | Address line split into district (… р-н) and street; city as shown on the card |
complex | Residential complex name when the listing belongs to one |
yearBuilt, buildingType, condition, ceilingHeight | Parsed from the card summary (Russian values as on the site) |
description | Card preview text (truncated by the site) |
seller | owner, specialist (agent), company (agency), developer (new-building complex) |
isDeveloper | true for new-building developer cards (seller: "developer"); their price is the starting price shown as "от …" |
sellerVerified | Identity-verified badge |
hot | Pinned in krisha's paid "hot" block at the top of page 1 (shown regardless of sort) |
photosCount, image | Number of photos and first photo URL |
publishedAt | Publish date YYYY-MM-DD in Kazakhstan time (UTC+5, as the site shows it; day precision from the card) |
views | Site view counter (only with includeViews: true; otherwise null) |
city, dealType, propertyType | Echo of the resolved search scope |
searchTotal | Total number of listings krisha.kz reports for this search (market size) |
fetchedAt | ISO timestamp |
changeType | Monitoring only: new or price_changed |
previousPrice, priceChange, priceChangePct | Monitoring only: last price the monitor saw, difference in ₸ (negative = cheaper) and in % (2 decimals); null for new listings |
detailError | detail: true only: why the listing page could not be read (the row keeps its card data); absent when the page was read |
recentlyPublished | Monitoring 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}
byDistrictgroups 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:
pricePeriodismonth/day/hour; if a search mixes periods, price statistics use the most common one andotherPeriodExcludedcounts the rest. searchStoppedBy— why paging ended:maxItems,maxPages,noMoreResults,sinceHours,alreadySeen(monitoring stop rule),pageError(a later search page failed;pageErrorsays which — the run keeps what it saved),spendingLimit,timeoutoraborted.delivered— rows saved (and charged) by this run;stoppedBy—null, orlimit/timeout/abortedwhen 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(withdetail: true):{ opened, failed, leftUnopened, stop, minutes }—leftUnopenedlistings 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
monitorholds{ key, store, run, firstRun, trackPriceChanges, new, recentlyPublished, priceChanged, unchanged, trackedSilently, heldBack, tracked, settled }—heldBack> 0 meansmaxItems, 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 ApifyClientclient = 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:
| Mode | How | 150 listings, detail: true | 500 listings, detail: true | Price per listing |
|---|---|---|---|---|
| Normal (default) | proxy off | ≈ 17 min (measured) | ≈ 55 min (close to the 1-hour default timeout) | $0.002 |
| Fast, Apify Proxy | proxy on → Apify Proxy, group RESIDENTIAL (8 IPs) | ≈ 3 min (measured) | ≈ 10 min (estimated) | $0.0035 |
| Fast, Apify Proxy datacenter | proxy on → any other Apify Proxy group (4 IPs: datacenter IPs are shared) | ≈ 5 min (estimated) | ≈ 18 min (estimated) | $0.0035 |
| Fast, your proxies | proxy on → your proxy URLs, one per IP | like 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
detailthe 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://orhttps://URLs (SOCKS is not supported), one URL per IP; a "rotating" gateway URL counts as one IP.SUMMARY.speedshows 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
468to 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.wafRetriescounts the retries). If a listing page still fails, the item is kept withdetailError. 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;
publishedAton 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(withincludeViews) 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/priceToandareaFrom/areaTowhere the card shows the value; non-matching cards are dropped (not charged) and counted in the log and inSUMMARY.droppedNotMatchingFilters. A developer card's price is a starting price ("от …"), so onlypriceTocan 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 inSUMMARY.pageError. - Max items — 5000 per run (up to 300 pages; checked live: page 400 still returns fresh listings). With
detail: truebudget 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. Withdetail: truethe 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).