# Kaspi Scraper — Prices, Offers, Reviews & Specs (`crawloop/kaspi-scraper`) Actor

Scrape Kaspi.kz products: KZT prices, Kaspi bonus, installments, seller offers, specs, ratings and reviews. City-aware Kaspi API alternative — JSON via Python, Node.js, MCP.

- **URL**: https://apify.com/crawloop/kaspi-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.55 / 1,000 product listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Kaspi Scraper — Prices, Offers, Reviews & Specs

> **Disclaimer:** Unofficial tool developed independently. Not affiliated with, sponsored by, or endorsed by Kaspi.kz JSC. Kaspi and related trademarks belong to their respective owners. Data is read from publicly accessible shop pages and catalog APIs. Provided for informational and research use; you must comply with Kaspi terms and applicable law.

**Kaspi scraper** for Kazakhstan’s #1 marketplace (Kaspi Магазин). Pull keyword search, category pages, merchant shops, or product URLs into JSON/CSV via Apify. Each row can include KZT price, Kaspi bonus price, installment / credit, rating, review count, stock, delivery speed, images, full specifications, the seller price ladder, and customer reviews. Fast HTTP path (no heavy browser) with optional **KZ residential proxy**. Use it as a **Kaspi API alternative** from **Python**, **Node.js**, cURL, or **MCP** / AI assistants.

**Best for:** Kaspi price monitoring, repricing, competitor offers, and Kazakhstan e-commerce research.

> **Crawloop marketplace suite** — retail and classified scrapers.

| Kaspi Scraper ◄── you are here | [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper) | [Mercado Libre Scraper](https://apify.com/crawloop/mercado-libre-listings-scraper) | [Etsy Scraper](https://apify.com/crawloop/etsy-scraper) | [Kleinanzeigen Scraper](https://apify.com/crawloop/kleinanzeigen-scraper) |
| :--- | :--- | :--- | :--- | :--- |
| Kaspi.kz prices, offers, reviews | Amazon search listings | LATAM marketplace | Etsy listings | Germany classifieds |

### When to use this Actor

- **Kaspi search scraping** — Keywords in Russian, Kazakh, or English (`iphone`, `холодильник`, `қыздырғыш`)
- **Category inventory** — Paste `/shop/c/smartphones/` (or any public category URL)
- **Product detail enrichment** — Specs table, description, gallery, color/memory variants
- **Seller offers / buy-box** — Every merchant price, rating, and delivery option for a SKU
- **Review mining** — Public comments, photos, and the rating histogram
- **Merchant catalog** — All public listings for a Kaspi shop ID
- **Multi-city pricing** — Almaty vs Astana vs Shymkent in one run (prices and stock differ)

### When not to use this Actor

- **Merchant Cabinet / partner API** — No login, orders, or private seller dashboards
- **Kaspi Pay, Gold, or bank accounts** — Shop catalog only
- **Personal contacts** — No phone, email, or inbox harvesting (review author names are public)

### Key features

- **Keywords + URLs + IDs** — Mix search terms, category/product/merchant URLs, and numeric product IDs
- **City-aware** — Kaspi prices, bonus, stock and delivery are per `cityId` (Almaty default)
- **Stable JSON APIs** — Listing, offers, and reviews come from Kaspi catalog endpoints (not brittle CSS)
- **Optional deep fields** — Toggle specs, seller offers, and reviews so listing-only runs stay fast
- **Variants** — Color / memory matrix from the product configurator when details are on
- **MCP / AI ready** — Call from Claude, Cursor, and other tools via Apify MCP

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `searchQueries` | Array | — | Keywords (RU / KK / EN) |
| `startUrls` | Array | — | Product, category, search, or merchant URLs |
| `productIds` | Array | — | Numeric Kaspi product IDs |
| `merchantIds` | Array | — | Merchant shop IDs |
| `city` | String | `750000000` | City ID (Almaty, Astana, Shymkent, …) |
| `cities` | Array | — | Extra city IDs for a multi-city run |
| `sortBy` | String | `relevance` | `relevance`, `price`, `rating` |
| `scrapeProductDetails` | Boolean | `false` | Specs, description, gallery, variants |
| `scrapeOffers` | Boolean | `false` | Full seller offer ladder |
| `scrapeReviews` | Boolean | `false` | Public reviews + histogram |
| `maxReviewsPerProduct` | Integer | `50` | Review cap per product |
| `maxOffersPerProduct` | Integer | `64` | Offer cap per product |
| `maxItems` | Integer | `50` | Maximum product rows |
| `maxPagesPerQuery` | Integer | `20` | 12 products per page; `0` = until empty |
| `requestDelayMs` | Integer | `250` | Delay between HTTP requests |
| `proxyConfiguration` | Object | Residential KZ | Apify Proxy — **KZ residential recommended** |

#### Input example

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

Category + product URLs:

```json
{
  "startUrls": [
    { "url": "https://kaspi.kz/shop/c/smartphones/" },
    { "url": "https://kaspi.kz/shop/p/apple-iphone-17-pro-256gb-nanosim-esim-oranzhevyi-145467625/?c=750000000" }
  ],
  "city": "750000000",
  "maxItems": 30,
  "scrapeOffers": true
}
```

### Output

| Field | Description |
| :--- | :--- |
| `id`, `configSku`, `url` | Kaspi product ID and canonical URL |
| `title`, `brand` | Name and brand |
| `price`, `priceFormatted`, `priceWithBonus` | KZT cash price and bonus price |
| `creditMonthlyPrice`, `monthlyInstallment` | Credit / installment |
| `rating`, `reviewsCount` | Stars and review volume |
| `inStock`, `stock`, `deliveryDuration` | Availability in the selected city |
| `category`, `categoryCodes`, `images` | Breadcrumb, codes, gallery |
| `description`, `specifications`, `specs` | Details mode — text + grouped + flat map |
| `variants` | Sibling color / memory product IDs |
| `offers`, `offersCount` | Per-seller price, rating, delivery options |
| `reviews`, `reviewsSummary` | Comments and rating histogram |
| `cityId`, `cityName`, `scrapedAt` | City context and timestamp |

#### Output example

```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 оранжевый",
  "brand": "Apple",
  "price": 709806,
  "priceFormatted": "709 806 ₸",
  "priceWithBonus": 688512,
  "creditMonthlyPrice": 29576,
  "monthlyInstallment": "29 576 ₸",
  "currency": "KZT",
  "rating": 4.9,
  "reviewsCount": 1974,
  "inStock": true,
  "deliveryDuration": "EXPRESS",
  "category": ["Телефоны и гаджеты", "Смартфоны"],
  "cityId": "750000000",
  "cityName": "Алматы",
  "offersCount": 58,
  "offers": [
    {
      "merchantId": "964027",
      "merchantName": "Dora",
      "merchantRating": 4.9,
      "price": 709790,
      "kaspiDelivery": true,
      "deliveryType": "EXPRESS"
    }
  ]
}
```

### Use cases

- **Price monitoring / repricing** — Track Kaspi SKUs daily across Almaty, Astana, Shymkent
- **Buy-box intelligence** — Who is cheapest, who has Kaspi Delivery / express
- **Catalog research** — Brand, specs, variants, and installment terms for a category
- **Review analysis** — Rating histogram plus public comment text (RU / KK)
- **Merchant watch** — Scrape a competitor shop ID for assortment and prices

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/kaspi-scraper').call({
  searchQueries: ['iphone'],
  city: '750000000',
  maxItems: 50,
  scrapeOffers: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("crawloop/kaspi-scraper").call(run_input={
    "searchQueries": ["iphone"],
    "city": "750000000",
    "maxItems": 50,
    "scrapeProductDetails": True,
    "scrapeOffers": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item["url"])
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~kaspi-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["iphone"],"city":"750000000","maxItems":20}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call this Actor by its Store ID `crawloop/kaspi-scraper`.

Example prompts:

- "Run Kaspi Scraper for iphone in Almaty, enable seller offers, and return the 20 cheapest rows as JSON"
- "Scrape Kaspi.kz smartphones category with specs and summarize median KZT price by brand"
- "Chain Kaspi Scraper then [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper) to compare iPhone prices KZ vs Amazon"

### Suite next step

After Kaspi catalog data, run [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper) or [Mercado Libre Scraper](https://apify.com/crawloop/mercado-libre-listings-scraper) for cross-border retail comps, or [Etsy Scraper](https://apify.com/crawloop/etsy-scraper) for another marketplace channel.

### FAQ

**Why do prices change by city?** Kaspi stock, bonus, and delivery are city-specific. Set `city` (or `cities`) to the market you care about. Default is Almaty (`750000000`).

**Is this a Kaspi.kz API?** Unofficial. It reads the same public catalog JSON the shop website uses. The official partner API is for merchants managing their own listings, not marketplace-wide scrape.

**Listing-only vs details?** Listing rows already include price, bonus, installment, rating, images, and stock. Turn on `scrapeProductDetails`, `scrapeOffers`, and/or `scrapeReviews` for the deep fields.

**Do I need a proxy?** From many networks Kaspi JSON works without one. On Apify, **KZ residential** is the reliable default — datacenter IPs get 403/429 bursts.

**Pagination?** Search and category pages return 12 products. The Actor walks `page=0,1,…` until empty, `maxPagesPerQuery`, or `maxItems`.

**Personal data?** Only public product and review fields a logged-out visitor can see. Review author names are on the product page; order IDs are not stored.

### Related Actors

- [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper)
- [Mercado Libre Scraper](https://apify.com/crawloop/mercado-libre-listings-scraper)
- [Etsy Scraper](https://apify.com/crawloop/etsy-scraper)
- [Kleinanzeigen Scraper](https://apify.com/crawloop/kleinanzeigen-scraper)
- [Marktplaats Scraper](https://apify.com/crawloop/marktplaats-scraper)

# Actor input Schema

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

Keywords to search on Kaspi.kz (Russian, Kazakh, or English), e.g. iphone, холодильник, қыздырғыш.

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

Kaspi.kz URLs: product pages (/shop/p/…), category pages (/shop/c/smartphones/), search pages, or merchant shops (/shop/info/merchant/{id}/).

## `productIds` (type: `array`):

Kaspi numeric product IDs (the digits at the end of /shop/p/…-145467625/).

## `merchantIds` (type: `array`):

Kaspi merchant / shop IDs — scrape that seller's public catalog.

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

City for prices, Kaspi bonus, stock and delivery. Ignored when Cities is set.

## `cities` (type: `array`):

Optional extra city IDs for one run (same product can appear once per city — prices differ). Leave empty to use City.

## `sortBy` (type: `string`):

Search / category sort order.

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

Open each product page for grouped specifications, description, gallery and color/memory variants. Slower, richer rows.

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

Collect the full seller price ladder: merchant name, rating, price, Kaspi delivery, pickup / door / express / postomat.

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

Collect public product reviews (author, date, rating, text, photos) plus the rating histogram.

## `maxReviewsPerProduct` (type: `integer`):

Cap on reviews when Customer reviews is on.

## `maxOffersPerProduct` (type: `integer`):

Cap on seller offers when Seller offers is on.

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

Maximum product rows across all queries, URLs and cities.

## `maxPagesPerQuery` (type: `integer`):

Kaspi returns 12 products per page. 0 = paginate until empty or Max products.

## `requestDelayMs` (type: `integer`):

Politeness delay between HTTP requests.

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

Residential proxy in Kazakhstan (KZ) is recommended. Datacenter IPs are often rate-limited.

## Actor input object example

```json
{
  "searchQueries": [
    "iphone"
  ],
  "startUrls": [],
  "city": "750000000",
  "sortBy": "relevance",
  "scrapeProductDetails": false,
  "scrapeOffers": false,
  "scrapeReviews": false,
  "maxReviewsPerProduct": 50,
  "maxOffersPerProduct": 64,
  "maxItems": 50,
  "maxPagesPerQuery": 20,
  "requestDelayMs": 250,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KZ"
  }
}
```

# Actor output Schema

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

Default dataset items — one Kaspi product (per city) per row.

# 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"
    ],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "KZ"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/kaspi-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"],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "KZ",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/kaspi-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"
  ],
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KZ"
  }
}' |
apify call crawloop/kaspi-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/kaspi-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/1uthYGgtkTaxhXcG6/builds/UebhlvtwmHWUYrHcB/openapi.json
