DEV Community

Cover image for How to Scrape Krisha.kz Listings in Kazakhstan Without a Paid API
Tim Zinin
Tim Zinin

Posted on Originally published at apify.com

How to Scrape Krisha.kz Listings in Kazakhstan Without a Paid API

The problem

Krisha.kz is Kazakhstan's biggest real-estate classifieds portal. Tracking apartments and houses for sale or rent in Almaty, Astana or Shymkent means watching its search pages constantly — for market monitoring, inventory feeds, or price research.

The manual version is the usual classifieds slog: open each city page, flip through results, copy titles, prices, room counts, areas and links into a spreadsheet — then repeat for every city and deal type you care about. Krisha.kz offers no public API, and a home-grown scraper has to handle its search structure, pagination and Russian-language listing cards on its own.

What the actor does

The Krisha.kz Kazakhstan Real Estate Listings actor pulls live apartment and house listings from Krisha.kz search-result pages — no login, no API key, no browser or proxies. Per the README:

  • Multiple searches in one run: each query is a deal:type:city triple (sale:apartment:almaty, rent:house:astana), where the city is a Krisha.kz slug such as almaty, astana or shymkent. Results from all queries are combined into one result set with configurable parallelism and pagination caps (max_items total, max_pages per query).
  • Structured rows from the list-view cards: title, numeric price with currency (KZT), deal type, property type, room count, floor area in square meters, district/street location text, short description, preview photo URL, direct listing URL, a per-row found indicator and a scrape timestamp.

Two honesty details worth knowing: rooms is null for studios because krisha.kz never prints a room count for them (the actor never invents 0), and posted_date resolves to an ISO timestamp only when the card's relative date stamp carries enough information — a bare day+month with no year stays null rather than guessed. Coordinates and the full photo gallery are not available on list pages and are not fabricated. Unrecognized cities produce explicit found: false rows, not errors.

Because the actor runs on Apify, the same multi-city input can be scheduled to re-run daily from the console, and every run's dataset exports as CSV, JSON or Excel or pulls through the API — the standard backbone for price-watch spreadsheets and new-listing alerts across Almaty, Astana and Shymkent.

Example: input and output

{
  "queries": ["sale:apartment:almaty"],
  "max_items": 5,
  "max_pages": 1,
  "maxConcurrency": 5
}
Enter fullscreen mode Exit fullscreen mode

A real row from a local verification run on 2026-07-30, quoted from the README (description truncated):

{
  "query": "sale:apartment:almaty",
  "found": true,
  "url": "https://krisha.kz/a/show/760760728",
  "title": "4-комнатная квартира · 186.58 м²",
  "price": 465517100,
  "currency": "KZT",
  "deal_type": "sale",
  "property_type": "apartment",
  "rooms": 4,
  "area_sqm": 186.58,
  "location": "Бостандыкский р-н, мкр Мирас, Саина 1а/1",
  "posted_date": null,
  "description": "жил. комплекс 1st by BI, 3 этажа, 2026 г.п., потолки 3.4м., санузел 2 с/у и более",
  "images": ["https://krisha-photos.kcdn.online/webp/5a/5a3bc160-2897-46e6-865b-72b70f8d63e6/3-full.jpg"],
  "source_portal": "krisha-kz",
  "scraped_at": "2026-07-30T10:31:25.132Z"
}
Enter fullscreen mode Exit fullscreen mode

A query Krisha.kz does not recognize as a distinct city returns an explicit free row instead of an error, as in the README's example:

{
  "query": "sale:apartment:not-a-real-city-9999",
  "found": false,
  "note": "krisha.kz does not recognize city \"not-a-real-city-9999\" as a distinct location for this search (it did not answer with a page scoped to that city) — treated as zero results, not an error.",
  "scraped_at": "2026-07-30T06:51:30.449Z"
}
Enter fullscreen mode Exit fullscreen mode

Like every actor in this series, it runs on Apify: schedule it, monitor it, call it from the API, and export the dataset to JSON, CSV or Excel or push it straight into your own pipeline.

Pricing and the free limit

Pay-per-event: $0.005 per run start plus $0.002 per delivered result. Not-found and failed queries are never charged. A run delivering 100 listings costs $0.005 + 100 × $0.002 = $0.205. Apify's free plan gives $5 of usage credits per month, so $5 covers about 24 such runs — roughly 2,400 listings.

Try it

Add one deal:type:city query per search, hit Start, and pull the combined dataset: Krisha.kz Kazakhstan Real Estate Listings

For AI agents and MCP

A standard Apify actor: JSON in, structured JSON dataset rows out, callable from the Apify API, the JavaScript/Python clients, or the hosted Apify MCP server the README documents. An agent can fan out multiple city queries in one input, branch on found, and rely on honest nulls — studios, missing dates and list-page-only fields are never silently filled.

Top comments (0)