# Kaspi.kz Price Drop Monitor & Scraper - Kazakhstan (`neverempty/kaspi-price-drop-monitor`) Actor

Schedule it hourly/daily and get only new products, price drops and price rises from Kaspi.kz, with the old price. Search by keyword, category, brand or seller in any of 17 cities: price, old price, discount, rating, reviews and seller in KZT. Export JSON, CSV or Excel.

- **URL**: https://apify.com/neverempty/kaspi-price-drop-monitor.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** E-commerce, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 product returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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?

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 Price Drop Monitor & Scraper - Kazakhstan

**Schedule it hourly/daily → get only new listings & price drops from Kaspi.kz.** For sellers, resellers, brands and deal hunters in Kazakhstan: type a product name (or paste a Kaspi search, category or product URL), pick a city, and every run returns each product's price in KZT, old price and discount (when Kaspi shows them), rating, reviews, seller ID and delivery. Turn on watch mode and later runs return only what changed since the last run, with the previous price and the change in %.

- Search by keyword in Russian or English, or paste a Kaspi category or search URL with your filters set
- Prices for the city you pick: Almaty, Astana, Shymkent and 14 more cities
- Filter by brand, seller ID and price range in tenge
- Watch exact products by pasting their Kaspi product URLs
- Seller ID for every product, plus the price after Kaspi bonus and the monthly installment
- Each product once per run, even when two searches overlap
- Export to JSON, CSV or Excel, or send rows to Google Sheets, Slack or a webhook with Apify integrations

### What you get

| Field | Example |
|---|---|
| `productId`, `url` | `179052550`, link to the Kaspi product page for your city |
| `title`, `brand` | `Аэрогриль SHANBEN SHANBEN 6 л черный`, `SHANBEN` |
| `price`, `priceBeforeDiscount`, `discountPercent` | `42999`, `52777`, `19` (price in tenge; old price and discount when Kaspi shows them) |
| `priceAfterBonus`, `monthlyInstallment` | Price after Kaspi bonus (when Kaspi shows one), and the monthly payment, for example `3584` |
| `rating`, `reviewCount` | `5`, `13` |
| `inStock`, `delivery` | `true`, `TOMORROW` (stock and delivery time in your city) |
| `sellerId`, `sellerName`, `sellerRating` | `30467950`: ID of the seller Kaspi shows first for the product; name and rating when Kaspi shows them in the list |
| `officialBrandPartner` | `true` when the seller is an official partner of the brand |
| `category`, `categoryCode`, `listedAt` | Kaspi category path, its code, and when the product was listed |
| `city`, `currency` | `Almaty`, always `KZT` |
| `imageUrl` | Product image |
| `changeType`, `previousPrice`, `priceChange`, `priceChangePercent`, `comparedOn`, `previousInStock`, `previousSeenAt`, `removedReason` | Watch mode: what changed since the last run, and the price it is compared with |

### How to use it

1. Type one or more product names in **Products to search**, for example `аэрогриль`, `iphone 15` or `пылесос dyson`. You can also paste the URL of a Kaspi search or category page (`kaspi.kz/shop/c/...`) with your filters set, or the URL of a product page (`kaspi.kz/shop/p/...`).
2. Pick a **City**. If you like, add **Brands**, **Seller IDs** or a price range.
3. Set **Max products per search** and run. Leave everything empty to run the example: 24 air fryers (`аэрогриль`) in Almaty.

To keep track of prices, turn on **Watch mode** and add a schedule (hourly or daily). See [Monitoring on a schedule](#monitoring-on-a-schedule).

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Product names, Kaspi search or category URLs, or product URLs. Run up to 50 searches and 300 product URLs at once. |
| `city` | One of 17 cities. Kaspi shows a different best price, seller and delivery in each city. |
| `brand` | Brands as spelled on Kaspi, for example `Ninja`, `Tefal`, `Samsung`. |
| `sellerId` | Seller IDs: the number in the seller's page link on Kaspi, or the `sellerId` column of an earlier run. |
| `minPrice`, `maxPrice` | Price range in KZT. |
| `sortBy` | Popular (Kaspi default), newest, price low/high or top rated. |
| `maxResultsPerSearch` | Products per search (default 100, up to 3,000). |
| `monitoringMode` | Watch mode for schedules. |
| `minChangePercent` | Report a price move only when it reaches this % (default 1). |
| `includeUnchanged` | Also return products that did not move. |
| `watchName`, `resetMonitoringState` | Keep separate memories for two watches of the same search, or start over. |

#### Example input

```json
{
    "searchQueries": ["пылесос dyson", "https://kaspi.kz/shop/c/smartphones/"],
    "city": "astana",
    "brand": ["Dyson", "Samsung"],
    "maxResultsPerSearch": 200,
    "monitoringMode": true,
    "minChangePercent": 5
}
```

### Output

A product row from a real run (product URL, Almaty):

```json
{
    "status": "ok",
    "productId": 179052550,
    "url": "https://kaspi.kz/shop/p/shanben-chernyi-179052550/?c=750000000",
    "title": "Аэрогриль SHANBEN SHANBEN 6 л черный",
    "brand": "SHANBEN",
    "price": 42999,
    "priceBeforeDiscount": 52777,
    "discountPercent": 19,
    "priceAfterBonus": null,
    "monthlyInstallment": 3584,
    "rating": 5,
    "reviewCount": 13,
    "inStock": true,
    "delivery": "TOMORROW",
    "sellerName": null,
    "sellerRating": null,
    "sellerId": "30467950",
    "officialBrandPartner": false,
    "category": "Бытовая техника > Мелкая техника для кухни > Печи и грили > Аэрогрили",
    "categoryCode": "Air fryers",
    "listedAt": "2026-10-02T16:31:28.872Z",
    "imageUrl": "https://resources.cdn-kaspi.kz/img/m/p/ped/p33/186013049.jpg?format=preview-large",
    "city": "Almaty",
    "currency": "KZT",
    "searchQuery": "product 179052550",
    "scrapedAt": "2026-10-28T23:04:01.112Z"
}
```

In watch mode each row also carries `changeType` and, for a price move, `previousPrice`, `priceChange`, `priceChangePercent` and `comparedOn`.

Every row has a `status`. Product rows are `ok`. When a search finds nothing, a product is gone, or a search stops early, you get one free row that says so (`no-results`, `not-found`, `incomplete`, `blocked`, `unreadable`, `bad-input`), so you can see how the run went.

### Monitoring on a schedule

Turn on **Watch mode**, then click **Schedule** on the Actor page and pick hourly or daily.

- **First run:** returns the products it finds, each with `changeType: "new"`, and remembers their prices.
- **Every later run:** returns only
  - `new` - products that just appeared in your search, or came back after leaving it
  - `price_drop` - cheaper than last time, with `previousPrice`, `priceChange` and `priceChangePercent`
  - `price_up` - pricier than last time
  - `removed` - the product left your search for two runs in a row (`removedReason: "left-search"`). Reported when the whole search fits in Max products and covers all prices.
- **Quiet run:** one free `no-change` row confirms the run worked.

Small moves add up: with `minChangePercent: 5`, a product that drops 2% a day is reported on the third day, compared with the price it was last reported at.

In watch mode, a search sorted by popular or top rated is read newest first, so every run compares the same products. To watch the cheapest or priciest products of a big search, sort by price.

Each search and city is tracked separately. To watch the same search twice with different settings, give each task its own `watchName`. To start over, run once with `resetMonitoringState`.

### Pricing

You pay per product row, plus a small start fee per run:

| Event | Price |
|---|---|
| Product row (`ok`) | $2.49 per 1,000 rows (less on higher Apify plans) |
| Run start | $0.003 |

Status rows (`no-change`, `no-results`, `not-found`, `incomplete` and the others) are free. In watch mode you pay only for the rows that changed, so a daily watch of 200 products where 10 moved costs about $0.03 per run. The first watch run returns every product as `new`, so it bills all of them (200 products = about $0.50 + $0.003).

### FAQ

**How do I get an alert when a product drops in price on Kaspi.kz?**
Turn on Watch mode, type the product name or paste its product URL, pick your city, set `minChangePercent` (for example 5) and schedule the Actor daily. Each run returns only the products that got cheaper or pricier, with the old price. Connect the run to Slack, email or a webhook with Apify integrations to get the alert.

**Can I track a competitor's prices on Kaspi?**
Yes. Put the seller's ID in `sellerId`, add a product name or a category URL, and turn on Watch mode. Each run returns the products of that seller that changed price.

**Can I track a whole category or brand?**
Yes. Paste the Kaspi category URL (for example `https://kaspi.kz/shop/c/smartphones/`) and, if you like, add `brand`. Set `maxResultsPerSearch` high enough to cover the products you want.

**Can I watch exact products?**
Yes. Paste the Kaspi product URLs, one per line. Each run returns those exact products for your city.

**Can I catch new products when they appear on Kaspi?**
Yes. On an hourly or daily schedule in watch mode, every product that appears in your search for the first time (within Max products) comes back with `changeType: "new"`. Sort by newest to watch the latest listings of a big search.

**What currency are the prices in?**
Kazakhstani tenge. Every row carries `currency: "KZT"` and the city the price is for.

**Can I export to Excel or Google Sheets?**
Yes. Download the dataset as CSV or Excel, or use the Google Sheets integration.

### Good to know

- Unofficial and not affiliated with Kaspi.kz.
- 100 products take about 2 minutes and 1,000 products about 15 minutes.
- Up to 3,000 products are read for one search. For larger searches, split by brand, price range or category; the run adds an `incomplete` row when a search hits that limit.
- Prices are those shown on Kaspi.kz for the chosen city at the time of the run. `priceBeforeDiscount` and `discountPercent` are `null` when Kaspi shows no old price for the product.
- Watch mode compares the price. A change in stock alone is not reported, but every watch row carries `inStock` and `previousInStock`.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

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

One per line: a product name as you would type it on Kaspi.kz, in Russian or English (аэрогриль, iphone 15, пылесос dyson), the URL of a Kaspi search or category page with your filters already set, or the URL of a product page (kaspi.kz/shop/p/…) to watch that exact product. Up to 50 searches and 300 product URLs per run. Leave it empty to run the example: 24 air fryers (аэрогриль) in Almaty.

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

Kaspi shows a different best price, seller and delivery in each city. Prices, stock and links are read for this city.

## `monitoringMode` (type: `boolean`):

Schedule it hourly/daily → get only new listings & price drops. The first run returns the current products marked new and remembers their prices. Each later run returns only products that are new to the search (changeType new), cheaper than last time (price_drop) or pricier (price_up) with the previous price and the change in %, or have left the search (removed). A run with no changes returns one free row that says so.

## `brand` (type: `array`):

Only products from these brands, spelled as on Kaspi.kz, for example Ninja, Tefal, Samsung. Empty = all brands.

## `sellerId` (type: `array`):

Only products sold by these sellers. Use the number in the seller's page link on Kaspi.kz, or the sellerId column of an earlier run, for example 30293385. Empty = all sellers.

## `minPrice` (type: `number`):

Only products priced at least this much in tenge. Empty = no minimum.

## `maxPrice` (type: `number`):

Only products priced at most this much in tenge. Empty = no maximum. In watch mode, a product that moves out of the price range is not reported as removed.

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

The order Kaspi lists the results in. With a maximum per search set, it decides which products you get. When every product of a search is wanted, or in watch mode, popular and top rated are read newest first, so none are skipped and every watch run covers the same products.

## `maxResultsPerSearch` (type: `integer`):

How many products to return for each search (in watch mode: how many products to watch). Empty = 100. At most 3,000 per search; split larger searches by brand, price range or category. Each product is returned once per run, even if two searches overlap.

## `minChangePercent` (type: `number`):

Report a price drop or rise only when the price moved at least this much since it was last reported, for example 5 for 5%. Small moves add up: a product that drops 1% a day is reported once the total reaches this.

## `includeUnchanged` (type: `boolean`):

Return every watched product on every run, with changeType unchanged for those that did not move. Off = only changes (cheaper runs).

## `watchName` (type: `string`):

Optional. Give each scheduled task its own name so two watches of the same search keep separate memories.

## `resetMonitoringState` (type: `boolean`):

Forget what this watch has already returned. The next run behaves like a first run.

## Actor input object example

```json
{
  "searchQueries": [
    "аэрогриль"
  ],
  "city": "almaty",
  "monitoringMode": false,
  "sortBy": "relevance",
  "maxResultsPerSearch": 24,
  "minChangePercent": 1,
  "includeUnchanged": false,
  "resetMonitoringState": false
}
```

# Actor output Schema

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

One row per Kaspi.kz product: product ID, link, title, brand, price, old price and discount in KZT, price after bonus, monthly installment, rating, review count, stock, delivery, best seller with its ID and rating, category, city and the image. Watch mode marks rows new, price_drop, price_up or removed with the previous price and the change in %. A search with no results, nothing changed, a refused request or a run that hit its maximum charge comes back as a free row that says why.

# 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": [
        "аэрогриль"
    ],
    "maxResultsPerSearch": 24
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/kaspi-price-drop-monitor").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": ["аэрогриль"],
    "maxResultsPerSearch": 24,
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/kaspi-price-drop-monitor").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": [
    "аэрогриль"
  ],
  "maxResultsPerSearch": 24
}' |
apify call neverempty/kaspi-price-drop-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/kaspi-price-drop-monitor"
        }
    }
}
```

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/btAXNsO2laf3T2UKR/builds/fedopWarISkyUoYJh/openapi.json
