Kaspi.kz Product Search Scraper — Prices, Sellers & Ratings avatar

Kaspi.kz Product Search Scraper — Prices, Sellers & Ratings

Pricing

from $0.70 / 1,000 result items

Go to Apify Store
Kaspi.kz Product Search Scraper — Prices, Sellers & Ratings

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

Samat Makatov

Maintained by Community

Actor stats

0

Bookmarked

15

Total users

5

Monthly active users

4 days ago

Last modified

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 with trackChanges + onlyChanges: you get only products whose price or number of sellers moved.
  • Seller repricing input — myMerchantId shows, for every product and city, your price, your rank among all sellers and how much cheaper the cheapest competitor is. With merchantId set 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 has region.
  • 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: true gives the full facet counts).
  • New-arrival alerts — sort: "newest" + sinceDays: 1 on a category, scheduled daily; maxPages sets how deep the run looks for them (see Limits).
  • Product content & specs — detail: true for 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.

FieldTypeDefaultAllowed values / notes
modestringsearchsearch, 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.
queriesstring[][]Extra search texts; merged with query.
categoriesstring[][]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).
productUrlsstring[][]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.
cityIdsstring[][]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.
myMerchantIdstring–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.
trackChangesbooleanfalseCompare with the previous run of the same monitorKey; adds changeType, previousPrice, priceChange, priceChangePct, previousOffersCount, offersCountChange, firstSeenAt, previousSeenAt.
monitorKeystringdefaultSeparate 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.
onlyChangesbooleanfalseWith trackChanges: skip unchanged products (they are not saved and not charged). The first run saves the baseline and outputs everything.
includeRemovedbooleantrueWith trackChanges: a removed row for products that disappeared — only when every search was read to its end and nothing failed.
maxTotalItemsinteger10000Cap on dataset rows (= charged rows) for the whole run, removed rows included. Unchanged products skipped by onlyChanges do not count.
maxConcurrencyinteger31–10 searches / product lookups at the same time. 6 is a good value for big multi-city runs (see Limits).
querystring–Free-text search as on kaspi.kz (Russian or English).
categorystring–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.
cityIdstring750000000kaspi city id, URL code (almaty, nur-sultan) or city name (Russian/English). See Reference → Cities.
brandstring[][]Manufacturer names as on kaspi.kz (Apple, Samsung). Several = OR. Server-side (:manufacturerName:).
merchantIdstring–Only products of this merchant (:allMerchants:). Ids appear in offers[].merchantId.
facetsobject–Any other kaspi facet `{code: value
priceFrom / priceTointeger–Tenge, client-side. With sort: cheapest / expensive paging stops early.
minRatingnumber–0–5, client-side.
minReviewsinteger–Client-side.
officialPartnerOnlybooleanfalseBest offer from an official brand partner (client-side).
sinceDaysinteger–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.
sortstringrelevancerelevance, newest, cheapest, expensive, rating, or the legacy values priceAsc, priceDesc. Any other value is refused by Apify before the run starts.
maxItemsinteger501–1000 per search (query × category × city). kaspi returns 12 products per request.
maxPagesinteger1001–200 safety cap (matters when client-side filters reject most products).
includeOffersbooleanfalse+1 request/product: offersCount, minOfferPrice, maxOfferPrice, cheapest offers[], deliveryFacets.
offersLimitinteger51–50 offers kept per product.
includeReviewsSummarybooleanfalse+1 request/product: rating distribution, positive/negative/with-photo counts, 3 latest reviews.
detailbooleanfalse+1 page/product: specifications, specificationGroups, description, breadcrumbs, gallery size, discount.
saveFacetsbooleanfalseSave total, sort options, every facet with counts and the category tree to key-value store record SEARCH_FACETS.
dedupebooleantrueOne 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.
fieldsstring[][]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).
proxyobjectApify RESIDENTIAL, country KZRequired 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)

PresetCities
@top-10Almaty, Astana, Shymkent, Karaganda, Aktobe, Taraz, Pavlodar, Oskemen, Semey, Atyrau
@regional-centers20: 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)
@allAll 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:

CodeRegionCodeRegion
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:

CityidURL code
Алматы (Almaty)750000000almaty
Астана (Astana)710000000nur-sultan
Шымкент (Shymkent)511010000shymkent
Караганда (Karaganda)351010000karaganda
Актобе (Aktobe)151010000aktobe
Тараз (Taraz)311010000taraz
Павлодар (Pavlodar)551010000pavlodar
Усть-Каменогорск (Ust-Kamenogorsk)631010000ust-kamenogorsk
Семей (Semey)632810000semey
Атырау (Atyrau)231010000atyrau
Костанай (Kostanai)391010000kostanai
Кызылорда (Kyzylorda)431010000kyzylorda
Уральск (Uralsk)271010000uralsk
Петропавловск (Petropavlovsk)591010000petropavlovsk
Актау (Aktau)471010000aktau
Туркестан (Turkestan)512610000turkestan
Кокшетау (Kokshetau)111010000kokshetau
Талдыкорган (Taldykorgan)191010000taldykorgan
Экибастуз (Ekibastuz)552210000ekibastuz
Темиртау (Temirtau)352410000temirtau
Конаев (Капшагай) (Kapshagay)191610000kapshagay
Жезказган (Zhezkazgan)351810000zhezkazgan

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 codeTitleSub-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)

Valuekaspi.kz sortMeaning
relevance(none)Popular (site default)
newestcreated-descNewest first
cheapestprice-ascCheapest first
expensiveprice-descMost expensive first
ratingratingHighest rating
priceAscprice-ascCheapest first (alias)
priceDescprice-descMost 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
}
FieldDescription
id, url, title, brandkaspi product id, product URL (with city), title, manufacturer
price, salePrice, priceMinusBonus, bonusKzt, currencyBest price in ₸ for the city, sale price, price after Kaspi bonus, bonus amount
creditMonthlyPrice, installmentMonths, loanAvailableKaspi installment / credit terms
rating, reviewsCountAverage rating 0–5 and number of reviews
categoryPath, categoryCode, categoryIdCategory breadcrumb (Russian), code, id
createdAtWhen the product card first appeared on kaspi.kz
deliveryDurationFastest delivery option of the best offer (see Reference)
isBrandOfficialPartner, hasVariants, stickersOfficial partner flag, colour/size variants, promo stickers
bestMerchantId, majorMerchantsMerchant behind the shown price; large merchants selling it
image, images, unitPreview images, unit of sale
position, searchTotalRank in the result list; total products matching the search (market size)
cityId, cityName, region, query, category, fetchedAtEcho of the search scope (region of the city) and fetch timestamp
availablefalse when a product from productUrls is not sold / not delivered in that city (price fields are then null)
offersCount, minOfferPrice, maxOfferPrice, fastestDeliveryDays, offers[], deliveryFacetsWith 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, myDeliveryDaysWith 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, previousSeenAtWith 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, aiGeneratedDescriptionWith detail
offersError, reviewsError, detailErrorPresent 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
unavailableReasonProducts 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 ApifyClient
client = 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). A Retry-After from 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.failedAttempts counts 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 with maxConcurrency), 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 maxConcurrency 3, 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 maxTotalItems rows per run. About 2 000 of them fit the default 1-hour timeout at maxConcurrency 3 (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; maxConcurrency 6 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 removed only 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 or maxTotalItems; a search cut by maxItems would 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. Use productUrls for exact SKU monitoring. The history is bounded: a product × city not seen for 90 days is dropped from it, and above 20 000 entries per monitorKey (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 in CHANGES.prunedFromHistory); a dropped product that comes back is reported as new. Searches capped by maxItems never 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-desc returns the recently listed products in shuffled order: measured on Tires (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. So sinceDays never stops at the first old pages when the order is shuffled (the log says when it is); it reads until maxItems or maxPages, whichever comes first. Give a big category enough pages — 15 pages ≈ 180 products ≈ 1 minute — and maxItems keeps 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 query and no category, priceFrom > priceTo, fields without a single known column, cityIds that 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-list mode or sort value is refused by Apify before the run starts, with the list of allowed values.
  • detail mode keeps what it has: if kaspi starts refusing product pages mid-run, the products are still saved (with detailError) 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 with detail and 11 s without, at the default 3 parallel requests.
  • Freshness — live data at run time; prices differ by city and change during the day.
  • myMerchantId shows 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 the my* columns are empty for those rows while sellersCount, cheapestPrice and cheapestMerchantName still 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. Add merchantId with 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).