# Takealot Scraper — South Africa Product Prices & Stock (`logiover/takealot-south-africa-scraper`) Actor

Scrape Takealot.co.za, South Africa's largest online store. Extract price, previous price, saving percentage, star rating and full review distribution, stock status, import flag, delivery estimate, distribution centre, promotion badges and images. Search or browse by department. No API key.

- **URL**: https://apify.com/logiover/takealot-south-africa-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

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/platform/actors/running/actors-in-store#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

## Takealot Scraper — South Africa Product Prices, Stock & Ratings

South Africa's biggest online store, in rows: price, was-price and saving, star rating with the full review split, stock status, import flag, delivery estimate and warehouse.

### What does the Takealot Scraper do?

This Actor collects live product data from **Takealot.co.za**, South Africa's dominant e-commerce platform. It reads Takealot's own search endpoint, so each row carries what the site's front end renders: the current price and the price range across variants, the previous price and the saving percentage, the star rating together with the count of one-star and five-star reviews, stock status, whether the item is imported, the delivery estimate and which distribution centre it ships from.

One detail governs the crawl. Takealot's pagination is a **cursor**, not an offset: `start=` and `page=` are accepted and then ignored, so an offset-based scraper silently collects page one over and over. This Actor follows the cursor the API returns, which is why deep runs keep producing genuinely new products instead of repeating the first 36.

### Who is it for?

- **Brands and distributors** monitoring how retailers price their products in South Africa.
- **Competitive-pricing teams** tracking Takealot before setting their own shelf prices.
- **Marketplace sellers** researching demand, ratings and price bands before listing.
- **Retail analysts** measuring discount depth and stock availability across categories.
- **Consumer researchers** studying what South Africans buy and how they rate it.

### Use cases

- Track a product range's price and saving percentage daily and catch promotions the day they start.
- Rank a category by review count to find what actually sells rather than what is merely listed.
- Watch stock status and delivery estimates to detect supply problems before competitors do.
- Separate imported stock from local using the import flag, which drives lead times and duties.
- Build a ratings benchmark: the one-star to five-star split says more than the average alone.
- Feed an AI agent live South African retail prices for shopping and comparison answers.

### Why use this Takealot Scraper?

- **Cursor pagination handled correctly** — deep runs return new products instead of silently repeating page one.
- **Full review distribution**, not just the average: five-star and one-star counts on every row.
- **Stock, delivery and warehouse fields** that say when a buyer would actually receive the item.
- **Search or browse** — a keyword, or a whole department by slug.
- **Keyless and login-free** — nothing to register, nothing to rotate.
- **Price range across variants** so a "from R 3,798" listing is not mistaken for a single price.

### What data can you extract?

One row per product. Anything the source left blank comes back as `null`.

| Field | Type | Description |
|---|---|---|
| `productId` | number | Takealot internal product identifier |
| `plid` | number | PLID, the ID that appears in the product URL |
| `tsin` | number | TSIN, Takealot's stock identifier |
| `url` | string | Direct link to the product page |
| `title` | string | Product title |
| `subtitle` | string | Short descriptive subtitle |
| `brand` | string | Brand where Takealot recorded one |
| `price` | number | Current price in ZAR; the lowest option where variants differ |
| `priceMax` | number | Highest option price where the listing covers variants |
| `listingPrice` | number | Previous or list price before discount |
| `savingPercent` | number | Saving percentage as advertised |
| `prettyPrice` | string | Price exactly as displayed, e.g. "From R 3,798" |
| `starRating` | number | Average rating out of 5 |
| `reviewCount` | number | Number of reviews |
| `fiveStarCount` | number | Number of five-star ratings |
| `oneStarCount` | number | Number of one-star ratings |
| `stockStatus` | string | Stock label, e.g. In stock |
| `inStock` | boolean | Whether it is currently in stock |
| `isImported` | boolean | Ships from outside South Africa |
| `isPreorder` | boolean | Available for pre-order only |
| `deliveryEstimate` | string | Delivery estimate as shown to a shopper |
| `distributionCentres` | string | Warehouses the item ships from, e.g. JHB, CPT |
| `badges` | string | Promotion badges such as "24% off" |
| `hasMoreColours` | boolean | Other colourways exist |
| `imageCount` | number | Number of photos |
| `imageUrl` | string | Main product photo |
| `scrapedAt` | string | When this row was collected |

#### Sample output

```json
{
  "productId": 240645218,
  "plid": 94928735,
  "tsin": 95760710,
  "url": "https://www.takealot.com/student-education-laptop-14-6gb-ram-1-1-ghz-windows-10-128gb-ssd/PLID94928735",
  "title": "Student Education Laptop 14\" 6GB RAM 1.1 GHz Windows 10 128GB SSD Notebook",
  "subtitle": "Compact 14\" student laptop - Celeron N3350, 6GB RAM, 128GB SSD",
  "brand": null,
  "price": 3798,
  "priceMax": 3799,
  "listingPrice": null,
  "savingPercent": 24,
  "prettyPrice": "From R 3,798",
  "starRating": 4.3,
  "reviewCount": 135,
  "fiveStarCount": 94,
  "oneStarCount": 11,
  "stockStatus": "In stock",
  "inStock": true,
  "isImported": false,
  "isPreorder": false,
  "deliveryEstimate": "Get it Today, 1pm - 7pm",
  "distributionCentres": "JHB",
  "badges": "24% off",
  "hasMoreColours": false,
  "imageCount": 5,
  "imageUrl": "https://media.takealot.com/covers_images/676a643ff0564222b4e08e132460b064/s-zoom.file",
  "scrapedAt": "2026-08-15T07:50:47.743Z"
}
```

### How to use the Takealot Scraper

#### Option A — a keyword search

Enter a search term such as `laptop`, `air fryer` or a brand name, choose a sort order and set a result limit. Relevance mirrors what a shopper sees; price sorting is better for building a price ladder.

#### Option B — a whole department

Leave the search term empty and set a department slug — `computers-tablets`, `tvs-audio`, `home-kitchen`, `beauty`, `sport`, `toys`, `cellphones`. Department browsing reaches a much larger pool than a single keyword.

#### Option C — a daily price monitor

Pick the terms or departments you compete in, schedule the Actor daily and diff `price`, `savingPercent` and `stockStatus` between runs.

### Input parameters

| Input | Type | Description |
|---|---|---|
| `searchTerm` | string | What to search for on Takealot, e.g. laptop, air fryer, nike. Leave empty if you are browsing a department instead. Default: `"laptop"`. |
| `departmentSlug` | string | Optional. Browse a whole department instead of searching, e.g. computers-tablets, tvs-audio, home-kitchen, beauty, sport, toys, cellphones. Take it from the Takealot URL after /all?filter=Department: |
| `sortBy` | string | Order the results before collecting them. Default: `"Relevance"`. |
| `maxResults` | integer | Stop after this many products. Each request returns about 36. Default: `500`. |
| `proxyConfiguration` | object | Takealot serves South African exits. Residential proxy pinned to South Africa is used automatically. |

### Tips for best results

- Use a department slug rather than a keyword when you want depth: a keyword search typically caps in the low thousands, a department reaches well beyond it.
- `price` is the lowest variant price. When `priceMax` is filled, the listing covers several options and `prettyPrice` will read "From R …".
- `savingPercent` only appears while a promotion is running, so an empty column across a whole run means the category simply is not on sale.
- Sort by `NewestArrivals` to track what a category is adding rather than what it already has.
- `distributionCentres` is worth keeping: an item shipping only from Cape Town behaves very differently for a Johannesburg buyer.

### Integrations

Connect this Actor to Make, Zapier, n8n, Slack, Google Sheets, GitHub, Airtable or any HTTP endpoint through Apify integrations. Every finished run can push its dataset straight into your warehouse, or fire a webhook so a downstream job starts the moment the data lands.

### API usage

Run the Actor from your own code with the Apify API. Datasets can be exported as JSON, CSV, Excel, XML, RSS or HTML, and every run is available through the [Apify API reference](https://docs.apify.com/api/v2).

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~takealot-south-africa-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input": {"searchTerm": "laptop", "departmentSlug": "", "sortBy": "Relevance", "maxResults": 1000, "proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "ZA"}}}'
```

Python, JavaScript, PHP and CLI clients are documented under [Apify API clients](https://docs.apify.com/api/client).

### Use with AI agents (MCP)

This Actor is callable from any MCP-compatible client — Claude, Cursor, VS Code or your own agent — through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). An agent can call it to answer live questions about South African retail prices, stock levels and product ratings instead of guessing from stale training data.

### FAQ

#### Do I need a Takealot account or API key?

No. The Actor reads public product data with no login and no key.

#### Why does an offset-based scraper break on Takealot?

Because `start=` and `page=` are accepted and then ignored — the response comes back identical every time. Takealot paginates with a cursor, which this Actor follows, so deep runs return genuinely new products.

#### How many products can one run return?

A common keyword matches one to two thousand; a department reaches five thousand and more. The practical limit is the result cap you set.

#### What currency are prices in?

South African rand (ZAR), as published.

#### What is the difference between PLID and TSIN?

PLID identifies the product listing and appears in the URL. TSIN identifies the stockable item behind it. Both are included so you can join against other Takealot data.

#### Why is `brand` sometimes empty?

Takealot does not record a brand for every listing, particularly for unbranded or generic imports.

#### Why did my run return zero products?

Usually a department slug that does not exist. Take it from the Takealot URL, and check the spelling of hyphens.

#### Does it collect seller names for marketplace items?

No. Takealot's search response does not expose the marketplace seller, so that field is not claimed here rather than filled with a guess.

#### Can I export to CSV or Excel?

Yes. Every run's dataset exports as JSON, CSV, Excel, XML, RSS or HTML from the Storage tab, the API, or automatically through an integration.

#### How fresh is the data?

Every run reads the site live at that moment, so the data is as fresh as the site itself. Schedule the Actor hourly, daily or weekly to build a time series.

#### How often is the Actor updated?

It is monitored and fixed when the site changes its markup or its endpoints. Report anything that looks wrong through the Issues tab and it gets picked up.

### Is it legal to scrape Takealot?

This Actor collects only publicly available information — the same pages any visitor can open without logging in. It does not bypass a login, and it does not touch private or personal accounts. Public data collection is legal in most jurisdictions, but how you *use* the data is your responsibility: if any record contains personal data, GDPR and comparable laws still apply, and you need a lawful basis for processing it. When in doubt, take legal advice. See Apify's [ethical web scraping](https://blog.apify.com/what-is-ethical-web-scraping-and-how-do-you-do-it/) guide.

### Related scrapers

- [Property24 Scraper](https://apify.com/logiover/property24-scraper) — South African property listings.
- [Jumia Scraper](https://apify.com/logiover/jumia-scraper) — African e-commerce prices.
- [Konga Scraper](https://apify.com/logiover/konga-scraper) — Nigerian e-commerce.
- [Amazon Product Scraper](https://apify.com/logiover/amazon-product-scraper) — Amazon prices and ratings.
- [Onliner Scraper](https://apify.com/logiover/onliner-belarus-product-scraper) — Belarusian price comparison.

# Actor input Schema

## `searchTerm` (type: `string`):

What to search for on Takealot, e.g. laptop, air fryer, nike. Leave empty if you are browsing a department instead.

## `departmentSlug` (type: `string`):

Optional. Browse a whole department instead of searching, e.g. computers-tablets, tvs-audio, home-kitchen, beauty, sport, toys, cellphones. Take it from the Takealot URL after /all?filter=Department:

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

Order the results before collecting them.

## `maxResults` (type: `integer`):

Stop after this many products. Each request returns about 36.

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

Takealot serves South African exits. Residential proxy pinned to South Africa is used automatically.

## Actor input object example

```json
{
  "searchTerm": "laptop",
  "departmentSlug": "computers-tablets",
  "sortBy": "Relevance",
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ZA"
  }
}
```

# Actor output Schema

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

Every record collected in this run. Open the Dataset tab to browse, filter or export as JSON, CSV or Excel.

# 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 = {
    "searchTerm": "laptop",
    "sortBy": "Relevance",
    "maxResults": 500,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "ZA"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/takealot-south-africa-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 = {
    "searchTerm": "laptop",
    "sortBy": "Relevance",
    "maxResults": 500,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "ZA",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/takealot-south-africa-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 '{
  "searchTerm": "laptop",
  "sortBy": "Relevance",
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ZA"
  }
}' |
apify call logiover/takealot-south-africa-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/takealot-south-africa-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/GIclAehAHpSS4BRWh/builds/aU8w9HwhbaXHDle5J/openapi.json
