Kaspi.kz Product Search Scraper — Prices, Sellers & Ratings
Pricing
from $0.70 / 1,000 result items
Kaspi.kz Product Search Scraper — Prices, Sellers & Ratings
Kaspi.kz marketplace products for price monitoring, assortment research and AI agents: search or browse any category in 320 cities, filter by brand, merchant, price and rating. Price, installment, rating, reviews, merchant offers with min/max price, optional specs.
Pricing
from $0.70 / 1,000 result items
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
15
Total users
5
Monthly active users
4 days ago
Last modified
Categories
Share
Structured product data from kaspi.kz, Kazakhstan's largest marketplace: search by text or browse any of 1 700+ catalogue categories in any of 320 cities, filter by brand, merchant, price, rating and freshness, and get price, bonus, installment terms, rating and review counts for every product. Optional add-ons return the merchant offers (how many sellers, min/max price, cheapest sellers with rating and delivery speed), the rating breakdown with latest reviews, and the full specification table from the product page. Built for price monitoring, assortment and competitor research, sellers entering Kaspi, and AI shopping agents.
One run can cover a whole market: several queries and categories × many cities (presets for the 10 biggest cities, all 20 regional centres, a whole region or all 320 cities); a list of your own product links checked in every city; your shop's position among all sellers (rank, gap to the cheapest competitor); and change tracking between scheduled runs (new, cheaper, pricier, out of stock, removed) so a daily schedule outputs only what changed.
Uses the site's own JSON endpoints — no browser, no API key. kaspi.kz blocks datacenter IPs, so on the Apify platform the run goes through Apify residential proxy (Kazakhstan), which is on by default.
Need it tailored to your workflow? Missing a field, a filter, another source or a different output format? Open an issue and describe what you need — we read every request and adapt the actor.
Нужна доработка под вашу задачу? Не хватает поля, фильтра или другого формата выгрузки — откройте тикет и опишите, что нужно: читаем каждый запрос и дорабатываем актор.
Use cases
- Price monitoring of your SKUs — paste product links into
productUrls, pick cities, schedule daily withtrackChanges+onlyChanges: you get only products whose price or number of sellers moved. - Seller repricing input —
myMerchantIdshows, for every product and city, your price, your rank among all sellers and how much cheaper the cheapest competitor is. WithmerchantIdset to the same id it covers your whole storefront. - Regional price comparison — one query in
cityIds: ["@regional-centers"]→ the same products in 20 cities with price, delivery speed and sellers per city; every row hasregion. - Price monitoring by search — track the cheapest offer and number of sellers every day (
queries/categories+brand,includeOffers: true). - Competitor / merchant intelligence — list everything a given merchant sells (
merchantId) with prices and ratings. - Assortment research before entering Kaspi — browse a category sorted by rating, see how many products, reviews and sellers each niche has (
saveFacets: truegives the full facet counts). - New-arrival alerts —
sort: "newest"+sinceDays: 1on a category, scheduled daily;maxPagessets how deep the run looks for them (see Limits). - Product content & specs —
detail: truefor the specification table, description and breadcrumbs (catalogue enrichment, AI agents).
Input
Search needs at least one of query / queries / category / categories; product monitoring needs productUrls. All other fields are optional.
| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
mode | string | search | search, products (the productUrls in every city), cities / categories (reference lists, no scraping; query filters them). With only productUrls filled the run switches to products by itself. Any other value is refused by Apify before the run starts. |
queries | string[] | [] | Extra search texts; merged with query. |
categories | string[] | [] | Extra category codes; merged with category. Every query × category × city is one search (up to 20 000 per run; about 2 000 fit the default 1-hour timeout, see Limits). |
productUrls | string[] | [] | kaspi product links or numeric ids. One row per product × city: city price, availability (available), rating, sellers with includeOffers. Products not sold in a city come back with available: false. Any link to the product works, a tab of it too (…-113137790/reviews/?c=750000000); the ?c= city in a link is not used — cityIds decides the cities. |
cityIds | string[] | [] | Several cities: ids, codes, names, or presets @top-10, @regional-centers, @region:<code>, @all (see Reference → Regions). Overrides cityId. Presets ignore case, spaces, _ and - (@Regional Centres, @top 10, @region-35). If no value names a city, the run stops at once with an input error. |
myMerchantId | string | – | Your merchant id → myPrice, myRank, sellersCount, cheapestCompetitorPrice, cheapestMerchantName, priceGapToCheapest, priceGapPct, isCheapest, myDeliveryDays per product and city. The id is the offers[].merchantId value kaspi.kz shows — a number (234005) or a word (Gadgetcity); case and spaces do not matter. Products you do not sell keep the competitor columns and leave the my* ones empty. |
trackChanges | boolean | false | Compare with the previous run of the same monitorKey; adds changeType, previousPrice, priceChange, priceChangePct, previousOffersCount, offersCountChange, firstSeenAt, previousSeenAt. |
monitorKey | string | default | Separate history per monitor (stored in your account as key-value store kaspi-monitor-<key>). The actor may only read stores it created itself: if a store of that name was made another way, the history is kept in kaspi-monitor-<key>-2 and the status says so. |
onlyChanges | boolean | false | With trackChanges: skip unchanged products (they are not saved and not charged). The first run saves the baseline and outputs everything. |
includeRemoved | boolean | true | With trackChanges: a removed row for products that disappeared — only when every search was read to its end and nothing failed. |
maxTotalItems | integer | 10000 | Cap on dataset rows (= charged rows) for the whole run, removed rows included. Unchanged products skipped by onlyChanges do not count. |
maxConcurrency | integer | 3 | 1–10 searches / product lookups at the same time. 6 is a good value for big multi-city runs (see Limits). |
query | string | – | Free-text search as on kaspi.kz (Russian or English). |
category | string | – | Category code or Russian title, e.g. Smartphones, Notebooks, TVs, Tires, Шины. See Reference → Categories. A near miss (Smartfones, Notebook) is corrected to the closest known code — the correction appears in the log and in the run status message. Codes we do not know are passed through with a warning. |
cityId | string | 750000000 | kaspi city id, URL code (almaty, nur-sultan) or city name (Russian/English). See Reference → Cities. |
brand | string[] | [] | Manufacturer names as on kaspi.kz (Apple, Samsung). Several = OR. Server-side (:manufacturerName:). |
merchantId | string | – | Only products of this merchant (:allMerchants:). Ids appear in offers[].merchantId. |
facets | object | – | Any other kaspi facet `{code: value |
priceFrom / priceTo | integer | – | Tenge, client-side. With sort: cheapest / expensive paging stops early. |
minRating | number | – | 0–5, client-side. |
minReviews | integer | – | Client-side. |
officialPartnerOnly | boolean | false | Best offer from an official brand partner (client-side). |
sinceDays | integer | – | Products first listed within N days (createdAt, client-side). Best with sort: newest. kaspi's "newest" order is often shuffled (see Limits): when it is, the scan reads maxPages pages and keeps every fresh product it finds, so maxPages decides how deep the run digs. |
sort | string | relevance | relevance, newest, cheapest, expensive, rating, or the legacy values priceAsc, priceDesc. Any other value is refused by Apify before the run starts. |
maxItems | integer | 50 | 1–1000 per search (query × category × city). kaspi returns 12 products per request. |
maxPages | integer | 100 | 1–200 safety cap (matters when client-side filters reject most products). |
includeOffers | boolean | false | +1 request/product: offersCount, minOfferPrice, maxOfferPrice, cheapest offers[], deliveryFacets. |
offersLimit | integer | 5 | 1–50 offers kept per product. |
includeReviewsSummary | boolean | false | +1 request/product: rating distribution, positive/negative/with-photo counts, 3 latest reviews. |
detail | boolean | false | +1 page/product: specifications, specificationGroups, description, breadcrumbs, gallery size, discount. |
saveFacets | boolean | false | Save total, sort options, every facet with counts and the category tree to key-value store record SEARCH_FACETS. |
dedupe | boolean | true | One row per product × city: skip products repeated across pages and found again by another query or category in the same city. false keeps every search's own row. |
fields | string[] | [] | Keep only these columns, in this order (empty = all), e.g. ["title", "price", "cityName", "url"]. id and cityId (plus changeType with trackChanges) are always kept and come first unless you list them; mode cities always keeps id, categories keeps code. Case, spaces and _ do not matter; a near miss with one candidate (pric) is read as it and an unknown name is ignored — both are named in the run status and SUMMARY. If none of the names exists, the run fails with the list of valid names (see Output). |
proxy | object | Apify RESIDENTIAL, country KZ | Required on the Apify platform — kaspi.kz blocks datacenter IPs. With an Apify datacenter group or no proxy, kaspi.kz's first refusal moves the run to the residential proxy (country KZ) and the status says so; your own proxyUrls are always kept. |
Server-side vs client-side: kaspi's search API accepts category, brand, merchant and facet filters, but not arbitrary price/rating ranges — those are applied after download and the log tells you so. Nothing is silently ignored: unknown categories and cities produce warnings, and if kaspi applies a different category than requested the run warns.
Reference
Run {"mode": "cities"} or {"mode": "categories"} to get these lists as a dataset (CSV/Excel/JSON) — every city with its region, every category with its parent and catalogue URL. cities returns all 320 rows, categories the 20 roots; add query to keep the rows where a word of any field starts with that text ({"mode": "categories", "query": "tires"} → every tyre category; "шины" → the tyre categories with «Шины» in the Russian title, not «Стиральные машины»). The complete lists are always saved, free of charge, to key-value store records CITIES and CATEGORIES.
Regions and city presets (cityIds)
| Preset | Cities |
|---|---|
@top-10 | Almaty, Astana, Shymkent, Karaganda, Aktobe, Taraz, Pavlodar, Oskemen, Semey, Atyrau |
@regional-centers | 20: Astana, Almaty, Shymkent + Kokshetau, Aktobe, Taldykorgan, Atyrau, Oral, Taraz, Karaganda, Zhezkazgan, Kostanay, Kyzylorda, Aktau, Turkestan, Pavlodar, Petropavl, Oskemen, Semey, Konaev |
@region:<code> | Every kaspi city of one region (codes below) |
@all | All 320 cities (combine with a small maxItems) |
Every row carries region. kaspi city ids are KATO codes, whose first two digits name the region in the pre-2022 division, so Zhetysu is inside 19, Ulytau inside 35 and Abai inside 63:
| Code | Region | Code | Region |
|---|---|---|---|
71 | Астана (city) | 35 | Карагандинская обл. и Улытау |
75 | Алматы (city) | 39 | Костанайская обл. |
79 | Шымкент (city) | 43 | Кызылординская обл. |
11 | Акмолинская обл. | 47 | Мангистауская обл. |
15 | Актюбинская обл. | 51 | Туркестанская обл. |
19 | Алматинская обл. и Жетысу | 55 | Павлодарская обл. |
23 | Атырауская обл. | 59 | Северо-Казахстанская обл. |
27 | Западно-Казахстанская обл. | 63 | Восточно-Казахстанская обл. и Абай |
31 | Жамбылская обл. |
Cities (cityId, cityIds)
Prices, stock and delivery differ by city. The most common ones:
| City | id | URL code |
|---|---|---|
| Алматы (Almaty) | 750000000 | almaty |
| Астана (Astana) | 710000000 | nur-sultan |
| Шымкент (Shymkent) | 511010000 | shymkent |
| Караганда (Karaganda) | 351010000 | karaganda |
| Актобе (Aktobe) | 151010000 | aktobe |
| Тараз (Taraz) | 311010000 | taraz |
| Павлодар (Pavlodar) | 551010000 | pavlodar |
| Усть-Каменогорск (Ust-Kamenogorsk) | 631010000 | ust-kamenogorsk |
| Семей (Semey) | 632810000 | semey |
| Атырау (Atyrau) | 231010000 | atyrau |
| Костанай (Kostanai) | 391010000 | kostanai |
| Кызылорда (Kyzylorda) | 431010000 | kyzylorda |
| Уральск (Uralsk) | 271010000 | uralsk |
| Петропавловск (Petropavlovsk) | 591010000 | petropavlovsk |
| Актау (Aktau) | 471010000 | aktau |
| Туркестан (Turkestan) | 512610000 | turkestan |
| Кокшетау (Kokshetau) | 111010000 | kokshetau |
| Талдыкорган (Taldykorgan) | 191010000 | taldykorgan |
| Экибастуз (Ekibastuz) | 552210000 | ekibastuz |
| Темиртау (Temirtau) | 352410000 | temirtau |
| Конаев (Капшагай) (Kapshagay) | 191610000 | kapshagay |
| Жезказган (Zhezkazgan) | 351810000 | zhezkazgan |
Categories (category)
20 root categories and 1732 sub-categories are built in (level 2 and 3 of the kaspi.kz catalogue). Codes are case-insensitive; Russian titles work too. Any code from a catalogue URL https://kaspi.kz/shop/c/<code>/ can be passed.
| Root code | Title | Sub-category codes (examples) |
|---|---|---|
Smartphones and gadgets | Телефоны и гаджеты | Phone accessories, Phone cases, Smartphones screen protection, Phone holders, Wireless chargers, Cables and adapters, Power banks, Cases for chargers and cables, Cooling systems for smartphones, Smartphone displays, Cell phone batteries, Stickers for phones, Smart lenses for smartphones, Magnifying screens for smartphones, … (49 total) |
Computers | Компьютеры | Peripherals, Mice, Other peripherals, Keyboards, Computer cables and adapters, Mouse pads, USB Flash drives, Monitors, Memory cards, UPS, Storage devices, Webcams, Controllers for streaming, Notebooks and accessories, … (83 total) |
Home equipment | Бытовая техника | Kitchen appliances, Stoves and grills, Mixers blenders and choppers, Other kitchen appliances, Kettles, Making desserts, Coffee machines and coffee makers, Food processors and grinders, Table stoves, Accessories for small kitchen appliances, Pumps for water, Multicooker and cooking equipment, Juicers, Toasters, … (68 total) |
TV_Audio | ТВ, Аудио, Видео | Headphones, Audio, Portable audio, Professional audio, Headphone accessories, Home Audio and Hi-Fi, Cables and connectivity, Smart speakers, Microphone and speaker accessories, Photo_Video, Batteries and accumulators, Tripods, Ring lights, Studio light, … (91 total) |
Car goods | Автотовары | Replacement parts, Engine, Autoeletrics, Car chassis, Car body parts, Car filters, Cooling system, Brake system, Transmission, Car interior parts, Steering, Fuel supply system, Car exhaust system, Air Intake Systems, … (121 total) |
Beauty care | Красота и здоровье | Skin care, Creams, Makeup removers, Cotton pads and stems, Lotions, Facial masks, Makeup remover, Lip care products, Scrubs and peelings, Patches, Cosmetic tweezers, Matting napkins, Hair care, Hair accessories, … (145 total) |
Child goods | Детские товары | Toys, Educational toys, Stuffed toys, Toy sets, Construction, Play vehicles, Dolls and accessories, Stress relief toys, Play mats for kids, Toy weapons and blasters, Remote control toys and accessories, Toy figures, Outdoor games, Toy robots and transformers, … (57 total) |
Pharmacy | Аптека | Medications, Cold and flu, Stomach intestines liver, Inflammation and infections, Cardiovascular system, Obstetrics and gynecology, Antimicrobial drugs, Healing creams, Allergy, Boost immunity, Neurology, Vision, Disinfectants, Endocrinology, … (117 total) |
Furniture | Мебель | Bedroom, Wardrobes, Beds, Bedroom mattresses, Bedroom sets, Bedroom dressers, Camping cots, Nightstands, Dressing tables, Living room, Sofas, Coffee tables, TV stands, Poufs, … (72 total) |
Construction and repair | Строительство, ремонт | Power tools, Tooling equipment, Electrical tools, Measurement tools, Electric and gasoline saws, Spray guns, Tool storage, Welding equipment, Electric soldering irons and accessories, Nail and staple guns, Power tool sets, Pneumatic tools, Radio components, Plumbing, … (112 total) |
Sports and outdoors | Спорт, туризм | Camping and hiking, Hiking, Camping, Camping lanterns and accessories, Tents and awnings, Camping knives and multitools, Camping burners heaters, Backpacks and bags, Optics, Metal detectors and accessories, Chargers for tourism, Fitness, Hand strengtheners, Fitness equipments, … (155 total) |
Pet goods | Товары для животных | Cat goods, Wet cat food, Dry cat food, Toys for cats, Cat snacks, Cat scratching pads, Hygiene and care for animals, Cat litter, Shampoos and conditioners for animals, Pet underpads, Pet odour eliminators, Animal repellent sprays, Poop bags for pets, Pet serums and oils, … (100 total) |
Leisure | Досуг, книги | Hobbies and crafts, Painting goods, Crafting goods, Modelling goods, Goods for sewing and embroidery, Scrapbooking goods, Knitting goods, Collecting and modeling, Decoupage goods, Books, Schoolbooks and study guides, Kids books, Fiction, Self-help literature, … (65 total) |
Home | Товары для дома и дачи | Household goods, Home paper products, Cleaning tools, Bathroom and toilet accessories, Clothing care, Packaging materials, Shoes care, Accessories for kitchen sinks, Household bags, Household ropes, Lighters, Kitchenware, Kitchen accessories, Utensils for cooking, … (81 total) |
Fashion | Одежда | Women fashion, Women underwear, Women t-shirts, Women leisurewear, Women outerwear, Women cardigans, Women suits and sport suits, Women pants, Women blouses and shirts, Women dresses, Women tanks and camis, Women skirts, Women sport suits, Women swimwear, … (98 total) |
Shoes | Обувь | Women shoes, Women trainers, Women fashion slippers, Women flip flops, Women dress shoes, Women knee boots, Women boots, Women sandals, Women ballet pumps, Women moccasins, Women mules, Women ankle boots, Women safety shoes, Women dance shoes, … (67 total) |
Fashion accessories | Аксессуары | Travel gear, Fashion handbags, Backpacks, Travel duffels, Wallets, Suitcases, Travel accessories, Passport holders, Suitcase covers, Hats and scarves, Fashion hats and caps, Fashion scarves, Fashion gloves and mittens, Watches, … (37 total) |
Jewelry and Bijouterie | Украшения | Earrings bijouterie and jewelry, Imitation earrings, Earrings, Rings bijouterie and jewelry, Rings, Imitation rings, Bracelets bijouterie and jewelry, Bracelets, Imitation bracelets, Necklaces bijouterie and jewelry, Necklaces, Imitation necklaces, Jewelry and bijouterie sets, Jewelry sets, … (43 total) |
Gifts and party supplies | Подарки, товары для праздников | New year decor, Electric string lights, New Year trees, Tree ornaments, New year decorations, Tinsel rain, Illuminated decorations, Hooks and accessories for garlands, New Year wreaths, Fir needle decorations, Artificial snow, Fireworks, Holiday decorations, Party balloons, … (57 total) |
Office and school supplies | Канцелярские товары | Paper products, Exercise notebooks, Office paper, Paper notebooks, Envelope mailers, Memo sheets, Account books and journals, Posters, Drawing and copying paper, Document forms, Calendars, Flipchart pads, Writing Supplies, Pens and pen supplies, … (114 total) |
Sort (sort)
| Value | kaspi.kz sort | Meaning |
|---|---|---|
relevance | (none) | Popular (site default) |
newest | created-desc | Newest first |
cheapest | price-asc | Cheapest first |
expensive | price-desc | Most expensive first |
rating | rating | Highest rating |
priceAsc | price-asc | Cheapest first (alias) |
priceDesc | price-desc | Most expensive first (alias) |
Delivery speed (deliveryDuration, offers[].deliveryDuration)
EXPRESS, TODAY, TOMORROW, TILL_2_DAYS, TILL_5_DAYS, TILL_7_DAYS, OTHER
Examples
Your products in every regional centre, only what changed since yesterday (schedule daily)
{ "productUrls": ["https://kaspi.kz/shop/p/apple-iphone-15-128gb-nanosim-esim-chernyi-113137790/", "176684789"], "cityIds": ["@regional-centers"], "includeOffers": true, "trackChanges": true, "monitorKey": "my-skus", "onlyChanges": true }
My shop vs competitors — rank and gap to the cheapest seller for my whole storefront in Almaty and Astana
{ "category": "Smartphones and gadgets", "merchantId": "234005", "myMerchantId": "234005", "cityIds": ["almaty", "astana"], "maxItems": 200 }
Regional price comparison — three models in the 10 biggest cities
{ "queries": ["iphone 16 128", "galaxy s25", "redmi note 14"], "category": "Smartphones", "cityIds": ["@top-10"], "sort": "cheapest", "maxItems": 5 }
Reference lists — all tyre categories, all cities of Karaganda region
{ "mode": "categories", "query": "tires" }
{ "mode": "cities", "query": "Караганд" }
Daily price monitor — iPhone 17 Pro in Almaty with sellers
{ "query": "iphone 17 pro", "category": "Smartphones", "brand": ["Apple"], "cityId": "almaty", "sort": "cheapest", "includeOffers": true, "offersLimit": 10, "maxItems": 30 }
Niche research — best-rated robot vacuums with review breakdown
{ "query": "робот пылесос", "sort": "rating", "minReviews": 50, "includeReviewsSummary": true, "saveFacets": true, "maxItems": 100 }
Competitor catalogue — everything one merchant sells in Astana
{ "category": "Smartphones and gadgets", "merchantId": "441010", "cityId": "710000000", "maxItems": 500 }
New arrivals alert — tyres added in the last 3 days
{ "category": "Tires", "sort": "newest", "sinceDays": 3, "maxItems": 60, "maxPages": 15 }
New products are scattered over kaspi's "newest" pages, so maxPages decides how deep the run digs (≈ 2–5 s per page): 15 pages ≈ 1 minute.
Catalogue enrichment — Samsung smartphones from 100 000 ₸ with full specs
{ "category": "Smartphones", "brand": ["Samsung"], "priceFrom": 100000, "sort": "cheapest", "detail": true, "maxItems": 50 }
Output
One dataset item per product (per product × city in multi-city runs). Rows are saved as each search page or product lookup is done, a few seconds apart, so rows of different searches and cities can interleave — sort by cityId, query and position when you need a fixed order. fields keeps only the columns you list. Every run also writes key-value store record SUMMARY (rows delivered, why the run stopped, failed or skipped searches, filter counts, input notes, requests and failed attempts by reason). Dataset views: Overview, Merchant offers, Ratings, Price changes, My seller position, Reference. Example (trimmed; includeOffers, includeReviewsSummary and detail on; real run, Astana):
{"id": "169791776","title": "Samsung Galaxy A07 6 ГБ/128 ГБ черный + сетевое зарядное устройство Samsung EP-T2510NBEGRU","brand": "Samsung","url": "https://kaspi.kz/shop/p/samsung-galaxy-a07-6-gb-128-gb-chernyi-setevoe-zarjadnoe-ustroistvo-samsung-ep-t2510n…-169791776/?c=710000000","price": 104990, "salePrice": 104990, "priceMinusBonus": 101841, "bonusKzt": 3149, "currency": "KZT","creditMonthlyPrice": 8750, "installmentMonths": 12, "loanAvailable": true,"rating": 5, "reviewsCount": 12,"categoryPath": ["Телефоны и гаджеты", "Смартфоны"], "categoryCode": "Smartphones","createdAt": "2026-06-20T09:24:57.359Z", "deliveryDuration": "TODAY", "isBrandOfficialPartner": false,"bestMerchantId": "10637013", "image": "https://resources.cdn-kaspi.kz/img/m/p/p38/pe1/152760318.jpg?format=preview-large","position": 31, "searchTotal": 907, "cityId": "710000000", "cityName": "Астана", "category": "Smartphones","fetchedAt": "2026-09-13T08:11:53.744Z","offersCount": 3, "minOfferPrice": 104990, "maxOfferPrice": 115000,"offers": [{ "merchantId": "10637013", "merchantName": "iNOVА", "price": 104990, "merchantRating": 4.9, "merchantReviews": 237, "deliveryDuration": "TILL_2_DAYS", "kaspiDelivery": true }],"ratingDistribution": { "1": 0, "2": 0, "3": 0, "4": 0, "5": 21 }, "reviewsTotal": 21, "reviewsNegative": 0, "reviewsWithPhotos": 7,"latestReviews": [{ "date": "06.09.2026", "rating": 5, "text": "Телефон уақытылы жеткізілді…" }],"specifications": { "4G (LTE)": "да", "Операционная система": "Android 15", "Тип SIM-карты": "dual nano SIM" },"breadcrumbs": ["Kaspi Магазин", "Телефоны и гаджеты", "Смартфоны"], "maxQuantity": 3}
| Field | Description |
|---|---|
id, url, title, brand | kaspi product id, product URL (with city), title, manufacturer |
price, salePrice, priceMinusBonus, bonusKzt, currency | Best price in ₸ for the city, sale price, price after Kaspi bonus, bonus amount |
creditMonthlyPrice, installmentMonths, loanAvailable | Kaspi installment / credit terms |
rating, reviewsCount | Average rating 0–5 and number of reviews |
categoryPath, categoryCode, categoryId | Category breadcrumb (Russian), code, id |
createdAt | When the product card first appeared on kaspi.kz |
deliveryDuration | Fastest delivery option of the best offer (see Reference) |
isBrandOfficialPartner, hasVariants, stickers | Official partner flag, colour/size variants, promo stickers |
bestMerchantId, majorMerchants | Merchant behind the shown price; large merchants selling it |
image, images, unit | Preview images, unit of sale |
position, searchTotal | Rank in the result list; total products matching the search (market size) |
cityId, cityName, region, query, category, fetchedAt | Echo of the search scope (region of the city) and fetch timestamp |
available | false when a product from productUrls is not sold / not delivered in that city (price fields are then null) |
offersCount, minOfferPrice, maxOfferPrice, fastestDeliveryDays, offers[], deliveryFacets | With includeOffers — sellers, spread, fastest delivery, cheapest offers (merchant id/name, price, rating, reviews, delivery speed/date, deliveryDays, deliveryCost, freeDeliveryFrom, postomat) |
myPrice, myRank, sellersCount, cheapestPrice, cheapestMerchantName, cheapestCompetitorPrice, priceGapToCheapest, priceGapPct, isCheapest, myDeliveryDays | With myMerchantId — your position among all sellers in that city (ties share a rank; nulls when you do not sell the product) |
changeType, previousPrice, priceChange, priceChangePct, previousOffersCount, offersCountChange, firstSeenAt, previousSeenAt | With trackChanges — changeType is new, priceUp, priceDown, unchanged, outOfStock, backInStock or removed; the run summary is in key-value store record CHANGES |
ratingGlobal, ratingDistribution, reviewsTotal, reviewsWithComments, reviewsPositive, reviewsNegative, reviewsWithPhotos, latestReviews[] | With includeReviewsSummary |
specifications, specificationGroups, description, breadcrumbs, galleryCount, discount, priceBeforeDiscount, maxQuantity, aiGeneratedDescription | With detail |
offersError, reviewsError, detailError | Present only when that add-on request failed for the product, or was not made because the run was stopping (spending limit, run timeout) — the item is still saved |
unavailableReason | Products mode: why a product is available: false in that city |
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~kaspi-kz-products/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"query":"iphone 17 pro","cityId":"almaty","sort":"cheapest","maxItems":20}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/kaspi-kz-products').call({ category: 'Tires', sort: 'newest', sinceDays: 3 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/kaspi-kz-products").call(run_input={"query": "робот пылесос", "includeOffers": True, "maxItems": 50})items = client.dataset(run["defaultDatasetId"]).list_items().items
MCP: add https://mcp.apify.com to Claude / Cursor / any MCP client and call the yadroo/kaspi-kz-products tool with the same JSON input.
Pricing
Pay per event: $0.02 per run start + $0.002 per dataset row on the Free plan; Bronze $0.0019, Silver and above $0.0018 per row (from 5 November 2026; until then $0.005 per start + $0.001 per row, Bronze $0.0009, Silver $0.0008, Gold and above $0.0007). The start event is the same on every plan. Platform usage and the residential proxy traffic are included in the price.
Every dataset row counts as one result: a product (one per city in multi-city runs), a products-mode row with available: false for a product that is not sold in a city, a removed row of change tracking, and a city or category row of the reference modes. Unchanged products skipped by onlyChanges are not saved and not charged; the full reference lists in key-value store records CITIES and CATEGORIES are free.
Typical runs (Free plan, from 5 November 2026): 50 products ≈ $0.12; 500-product category snapshot ≈ $1.02; a monitoring run with onlyChanges that finds 3 changed products ≈ $0.026. includeOffers, includeReviewsSummary and detail do not change the per-row price but add one request per product each, so the run takes longer.
Your maximum cost per run is respected: the run stops reading when the rows on their way would exceed it, keeps every row already saved and ends with the status "Stopped at your spending limit: N rows delivered".
Limits & FAQ
- Proxy — kaspi.kz rejects datacenter IPs: measured 21.10.2026, Apify's datacenter proxy and a run without proxy got 429 on all 6 attempts. Keep the default residential proxy (country KZ); a run set to datacenter or no proxy switches to it at kaspi.kz's first refusal (once, named in the status and
SUMMARY.proxySwitched). With your own proxy URLs (proxyUrls) the requests rotate over all of them and are never replaced. - Retries — a request that fails for a temporary reason (a network or proxy error, a timeout, 403, 429, 5xx, or a non-JSON / challenge page) is asked again through another IP: up to 6 attempts with growing pauses (2, 4, 8, 16, 30 s, each up to 25 % shorter at random; about 45–60 s in all, never past the run timeout), so a short hiccup of kaspi.kz or the proxy pool does not fail the run. A 404 is an answer and is not asked again; another 4xx and a proxy 407 get one more attempt, and so do a 403 or a challenge page when the run uses no proxy (every request leaves from the same IP; your own
proxyUrls, even one URL, get the full retries). ARetry-Afterfrom kaspi.kz is honoured. If kaspi.kz has not answered the run yet and 3 requests in a row fail every attempt, kaspi.kz or the proxy is down rather than blipping: new requests wait for the ones still in flight and one last check 30 s later (two attempts) — any answer and the run goes on as usual; none, and the remaining requests are not sent, so the run fails instead of retrying every search: after about 2.5 minutes when kaspi.kz or the proxy refuses at once, about 6 when every attempt hangs until its 30 s timeout. A run whose timeout comes first fails too if kaspi.kz answered none of its requests. Once kaspi.kz has answered, every request keeps its full retries. Each retry is one log line with its reason;SUMMARY→requests.failedAttemptscounts failed attempts by reason (403,429,5xx,network,timeout,nonJson,otherHttp,proxyAuth). If every attempt of a search fails, that search fails with the reason instead of returning empty data; if every search of the run fails (or is still being retried when the run timeout comes) and the run read nothing, the run fails and its status names the cause, e.g. "kaspi.kz or the proxy refused every attempt (network ×6 in 52 s; …) — temporary, please re-run", or "Input error: …" for a wrong category code. Offers or review summaries that kaspi.kz keeps rejecting (another 4xx) are skipped for the rest of the run after 5 failures, like product pages. - Request pace and robots.txt — product, offer and review data come from kaspi.kz's JSON endpoints under
/yml/, which its robots.txt does not disallow. The same robots.txt asks for 10 s between requests (Crawl-delay: 10); this actor does not keep that delay — it runs 3 requests at a time by default (up to 10 withmaxConcurrency), each through a rotating residential IP, with short pauses between pages and the retry backoff above. - Rate limits (measured 23.09.2026 through Apify residential proxy, KZ) — the proxy, not kaspi, is the bottleneck (~4 s per request). One product in all 320 cities: 468 s at
maxConcurrency3, 2.8 % of requests retried. 112 cities: 72 s at 6 (no retries), 59 s at 10 (5 % retried). Search in all 320 cities at 6: 339 s. 1 080 products with sellers (1 223 requests) at 6: 17 min, 3.5 % retried. No 403 blocks in any test. Under load kaspi occasionally answers without the product card, so a product-mode miss is re-checked after 2 s before it is reported as not sold (unavailableReason). - Depth — up to 1000 products per search (12 per page), up to 20 000 searches or product × city lookups and
maxTotalItemsrows per run. About 2 000 of them fit the default 1-hour timeout atmaxConcurrency3 (twice as many at 6): a bigger input runs anyway, saves rows as it goes and stops before the timeout (below), and the log warns at the start. Split large categories by brand or sub-category. - Long runs and the timeout — rows are saved as they are read, not at the end. Near the run timeout the actor stops starting new requests (15 % of the timeout before it, at most 90 s), saves what it has read and ends SUCCEEDED with "Stopped before the run timeout: N rows saved"; raise the timeout or split the job for the rest. At the default 3 parallel requests one hour holds roughly 2 000 product × city lookups (about half that with
includeOffers) or 10 000 search rows;maxConcurrency6 is about twice as fast. - Batches are fault-tolerant — searches run 3 at a time by default; if one city or category fails (e.g. an unknown code), the others are still saved, the status message says how many failed and the reasons are in key-value store record
ERRORS. The run fails only when every search failed and nothing was saved. - Change tracking is honest — a product is reported
removedonly when every search in the run was read to its end, nothing failed and the run was not cut short by your spending limit, the timeout ormaxTotalItems; a search cut bymaxItemswould otherwise make products look removed. The history remembers only rows that were saved: a change that did not fit under your spending limit is reported again by the next run. UseproductUrlsfor exact SKU monitoring. The history is bounded: a product × city not seen for 90 days is dropped from it, and above 20 000 entries permonitorKey(per 256 MB of run memory: 40 000 at 512 MB) the least recently seen go first (each drop is counted in the status and inCHANGES.prunedFromHistory); a dropped product that comes back is reported asnew. Searches capped bymaxItemsnever report removals, so without that bound their history only grew — measured 21.10.2026, 80 000 entries killed a 256 MB run (out of memory) and 40 000 took 234 MB of it. - Price and rating filters are client-side (kaspi's API does not support ranges); combine with the matching sort so paging stops early. When client-side filters drop products, the run status message says how many and why — a run that ends with 0 products always explains itself.
- "Newest" is not sorted by date — kaspi's
created-descreturns the recently listed products in shuffled order: measured onTires(44 335 products, 27.09.2026) all 15 pages held the same age spread and the five products younger than 3 days sat at positions 35, 79, 81, 133 and 136. SosinceDaysnever stops at the first old pages when the order is shuffled (the log says when it is); it reads untilmaxItemsormaxPages, whichever comes first. Give a big category enough pages — 15 pages ≈ 180 products ≈ 1 minute — andmaxItemskeeps the cost down; on a search that really comes back newest-first the scan still stops as soon as the window is behind it. - Errors are readable — invalid input (no
queryand nocategory,priceFrom>priceTo,fieldswithout a single known column,cityIdsthat name no city, more than 20 000 searches or lookups) and a blocked proxy end the run with the reason in the run's status message, not just in the log. An off-listmodeorsortvalue is refused by Apify before the run starts, with the list of allowed values. detailmode keeps what it has: if kaspi starts refusing product pages mid-run, the products are still saved (withdetailError) instead of failing the whole run. A product page is about 80 KB against about 1 KB of search data per product (measured 02.10.2026), so detail runs are slower: 30 smartphones took 74 s withdetailand 11 s without, at the default 3 parallel requests.- Freshness — live data at run time; prices differ by city and change during the day.
myMerchantIdshows your assortment as it is — a search returns every product that matches, including the ones your shop does not sell (bundles, Dual-SIM variants, colours you dropped), so themy*columns are empty for those rows whilesellersCount,cheapestPriceandcheapestMerchantNamestill describe the market. The status message says how many of the rows you sell, and a run where your id matches no offer at all warns that the id may be mistyped. AddmerchantIdwith the same id to list only your own storefront.- Phone numbers of merchants are not published by kaspi.kz and are not collected.
- Reviews and specs are fetched once per product in multi-city runs (they do not depend on the city); prices, sellers and delivery are per city.
Made by Yadroo. Sibling actors: krisha-kz (real estate), kolesa-kz (cars), hh-kz-vacancies (jobs), autoscout24-cars (EU cars).