# Kaspi Listings Scraper (`piotrv1001/kaspi-listings-scraper`) Actor

The Kaspi.kz Product Scraper extracts product listings from Kazakhstan's largest marketplace by keyword, category, or URL, capturing prices, ratings, stock, images, full specs, per-seller offers with delivery options, and customer reviews — ideal for price monitoring, repricing, and market research.

- **URL**: https://apify.com/piotrv1001/kaspi-listings-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 33 total users, 5 monthly users, 99.5% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 product listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🇰🇿 Kaspi.kz Product Scraper

Easily extract product data from [Kaspi.kz](https://kaspi.kz/shop) — Kazakhstan's largest e-commerce marketplace with millions of products across electronics, fashion, home goods, and more. The **Kaspi.kz Product Scraper** lets you collect structured product data for price monitoring, market research, and competitor analysis, with optional deep data: full specifications, per-seller offers, and customer reviews.

### ✨ Features

- 🔍 **Search & category scraping** — enter keywords (e.g. `iphone`) or paste Kaspi.kz category/search/product URLs.
- 🏷️ **Rich listing data** — title, brand, price (KZT), bonus-adjusted price, monthly installment, rating, review count, stock status, images, and category breadcrumb.
- 📋 **Product details** *(optional)* — full grouped specifications, description, and gallery images from each product page.
- 💰 **Seller offers** *(optional)* — the complete price ladder for each product: every marketplace seller with their price, rating, and delivery options. Perfect for price monitoring and repricing. Products with more than 64 sellers are paginated; `offersCollected` and `offersComplete` tell you whether every seller was captured.
- 🏪 **Merchant discovery** *(optional)* — one deduplicated row per seller found in the offers, enriched from the public seller profile: Kaspi Shop join date, logo, rounded sales indicator, 90-day rating, review count, and which of your scraped products listed the seller.
- ⭐ **Customer reviews** *(optional)* — up to 100 most popular reviews per product with pros/cons and the full rating histogram.
- 🏙️ **City-aware** — prices and stock on Kaspi.kz vary by city; choose Almaty, Astana, Shymkent, and more.
- ⚡ **Fast & efficient** — listing-only runs scrape hundreds of products per minute.

### 🛠️ How It Works

1. **Enter search queries** — e.g. `iphone`, `холодильник`, or any keyword, and/or paste Kaspi.kz category, search, or product URLs.
2. **Pick optional data** — toggle product details, seller offers, or reviews if you need deeper data (each adds a small per-product cost).
3. **Run the scraper** — get structured JSON results in minutes. Download as JSON, CSV, Excel, or HTML, or fetch via API.

### 📊 Sample Output Data

```json
[
    {
        "id": "145467625",
        "url": "https://kaspi.kz/shop/p/apple-iphone-17-pro-256gb-nanosim-esim-oranzhevyi-145467625/?c=750000000",
        "title": "Apple iPhone 17 Pro 256Gb NanoSIM+eSIM оранжевый",
        "image": "https://resources.cdn-kaspi.kz/img/m/p/p18/p96/64168413.png?format=preview-large",
        "brand": "Apple",
        "price": 754857,
        "priceFormatted": "754 857 ₸",
        "priceWithBonus": 732212,
        "monthlyInstallment": "31 453 ₸",
        "currency": "KZT",
        "rating": 4.9,
        "reviewsCount": 1529,
        "inStock": true,
        "category": ["Телефоны и гаджеты", "Смартфоны"],
        "images": ["https://resources.cdn-kaspi.kz/img/m/p/p18/p96/64168413.png?format=preview-large"],
        "city": "750000000",
        "offersCount": 58,
        "offers": [
            {
                "merchantId": "9439002",
                "merchantName": "SMART_STORE",
                "merchantRating": 4.9,
                "merchantReviewsCount": 18,
                "price": 754857,
                "kaspiDelivery": true,
                "deliveryOptions": { "TO_DOOR": { "deliveryCost": 995.0 } }
            }
        ],
        "reviews": [
            {
                "author": "Ануар",
                "date": "10.10.2025",
                "rating": 5,
                "text": "Отличный телефон, быстрая доставка."
            }
        ],
        "reviewsSummary": {
            "global": 4.9,
            "statistic": [{ "rate": 5, "count": 2833 }]
        }
    }
]
```

### 📋 Data Fields

| Field                               | Description                                                                 |
| ----------------------------------- | --------------------------------------------------------------------------- |
| `id`                                | Kaspi.kz product ID                                                         |
| `url`                               | Product page URL                                                            |
| `title`, `brand`                    | Product name and brand                                                      |
| `price`                             | Current price in KZT (integer)                                              |
| `priceWithBonus`                    | Price after Kaspi bonus deduction                                           |
| `monthlyInstallment`                | Monthly installment amount                                                  |
| `rating`, `reviewsCount`            | Average rating and number of reviews                                        |
| `inStock`                           | Stock availability                                                          |
| `category`                          | Category breadcrumb                                                         |
| `images`                            | Product image URLs                                                          |
| `description`, `specifications`     | Full description and grouped spec table *(with product details enabled)*    |
| `offers`, `offersCount`             | All seller offers with prices and delivery *(with seller offers enabled)*   |
| `reviews`, `reviewsSummary`         | Customer reviews and rating histogram *(with reviews enabled)*              |
| `offersCollected`, `offersComplete` | Sellers actually collected vs. `offersCount` *(with seller offers enabled)* |

#### Merchant rows *(with Discover merchants enabled)*

Merchant rows carry `recordType: "merchant"`; product rows are unchanged.

| Field                                                              | Description                                                                                       |
| ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
| `merchantId`, `merchantName`, `profileUrl`                         | Seller ID as Kaspi uses it (can be alphanumeric), name, and public profile link                   |
| `joinedAt`                                                         | When the seller joined Kaspi Shop — not a company registration date                               |
| `salesCountRounded`                                                | Kaspi's own rounded-down sales indicator (e.g. 2000, 10000) — not exact sales or revenue          |
| `rating`, `ratingWindowDays`, `reviewsCount`                       | Buyer rating over the last 90 days and review count                                               |
| `logoUrl`                                                          | Seller logo                                                                                       |
| `observedProductCount`, `observedProductIds`, `observedCategories` | Products in this run whose offers listed the seller — sample reach, not the seller's full catalog |
| `profileStatus`                                                    | `ok`, `not_found`, or `failed` (the seller is still listed when the profile could not be fetched) |

### 💰 How much does it cost to scrape Kaspi.kz?

You only pay for what you extract:

| Event                | Price      | What you get                                                          |
| -------------------- | ---------- | --------------------------------------------------------------------- |
| Product listing item | **$0.001** | One product from search/category results                              |
| Product detail       | **$0.004** | Full specs, description & gallery for one product                     |
| Seller offers        | **$0.004** | All seller offers for one product                                     |
| Product reviews      | **$0.004** | Up to 100 reviews for one product                                     |
| Merchant profile     | **$0.01**  | One unique seller with profile data (only when the profile was found) |

A tiny start fee of $0.00005 per GB of memory is charged once per run.

**Examples:** 1,000 products from search results ≈ **$1.00**. 100 products with full details, all seller offers, and reviews ≈ **$1.20**. 10 products with seller offers and merchant discovery finding 150 unique sellers ≈ **$1.55**.

### 💡 Tips

- Keep the optional toggles **off** for the cheapest and fastest runs — listing data already includes prices, ratings, and images.
- Enable **seller offers** for price monitoring — it returns every seller's price for each product, so you can track the buy-box and undercut competitors.
- Enable **Discover merchants** to build a seller list for a niche: search or paste a category, and get every seller behind those products once, with profile data. It turns on seller offers automatically.
- Use the **city** setting to compare prices across Kazakhstan's regions — run the scraper once per city.
- Use **Max items** to control run size and cost precisely.
- Schedule the scraper on Apify to track prices daily and feed the data into your own tools via the API.

### ❓ FAQ

**Is it legal to scrape Kaspi.kz?**
This scraper collects only publicly available product data. It does not collect personal data beyond public review author names. Always review the target website's terms of service and consult a lawyer for your specific use case.

**Which cities are supported?**
Almaty (default), Astana, Shymkent, Karaganda, Aktobe, and Ust-Kamenogorsk. Prices, stock, and delivery options are city-specific.

**Can I scrape an entire category?**
Yes — paste a category URL (e.g. `https://kaspi.kz/shop/c/smartphones/`) and set Max items. The scraper automatically partitions large categories to retrieve products beyond the site's pagination limits.

**Something not working?**
Open an issue in the **Issues** tab of the Actor — we respond quickly and also build custom solutions on request.

Start tracking Kazakhstan's biggest marketplace with the **Kaspi.kz Product Scraper** today! 🚀

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search for on Kaspi.kz, e.g. `iphone` or `холодильник`. Each query returns matching products with prices, ratings, and images.

## `startUrls` (type: `array`):

Kaspi.kz URLs to scrape — category pages (`https://kaspi.kz/shop/c/smartphones/`), search pages, or direct product pages (`https://kaspi.kz/shop/p/...`).

## `maxItems` (type: `integer`):

Maximum number of products to scrape across all queries and URLs.

## `scrapeProductDetails` (type: `boolean`):

Visit each product page to extract full specifications, description, and gallery images. Slower and costs more per item.

## `scrapeOffers` (type: `boolean`):

Collect all marketplace seller offers for each product — per-seller prices, seller ratings, and delivery options. Paginates past 64 sellers; `offersCollected` / `offersComplete` report coverage. Great for price monitoring.

## `scrapeReviews` (type: `boolean`):

Collect up to 100 most popular customer reviews per product, including the rating histogram.

## `scrapeMerchants` (type: `boolean`):

Also output one deduplicated row per seller found in the offers (`recordType: merchant`), enriched from the public seller profile: Kaspi Shop join date, logo, rounded sales indicator, 90-day rating and review count, plus which scraped products listed the seller. Turns on seller offers automatically. Product rows stay unchanged.

## `city` (type: `string`):

Kaspi.kz city — prices, stock, and delivery options vary by city.

## `proxyConfiguration` (type: `object`):

Proxy settings. Keep residential proxies enabled — the target site rate-limits datacenter IPs, so other proxy types will likely get blocked.

## Actor input object example

```json
{
  "searchQueries": [
    "iphone"
  ],
  "maxItems": 50,
  "scrapeProductDetails": false,
  "scrapeOffers": false,
  "scrapeReviews": false,
  "scrapeMerchants": false,
  "city": "750000000",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "iphone"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/kaspi-listings-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["iphone"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/kaspi-listings-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "iphone"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call piotrv1001/kaspi-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/kaspi-listings-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CBGjHHaIJElZlTbOq/builds/pu5ZTB9yuZSt5JNF7/openapi.json
