# Takealot Scraper: Products, Prices, Deals, Reviews & Sellers (`zaiq/takealot-scraper`) Actor

Scrape Takealot.com products by search term, category, deals or URL: prices, list prices, deals, ratings, review counts, stock and delivery estimates; optionally barcodes, sellers, category paths and eBucks prices. South Africa's biggest online store, as JSON.

- **URL**: https://apify.com/zaiq/takealot-scraper.md
- **Developed by:** [Zaiq](https://apify.com/zaiq) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 products

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

## Takealot Scraper: Products, Prices, Deals, Reviews & Sellers

Get products from Takealot.com, South Africa's largest online store, as structured data: prices, list prices, deals,
star ratings, review counts, stock and delivery estimates, and on request barcodes, sellers, category paths and eBucks
prices. Search by keyword, open any category, deals page or filtered listing, or give product links. Requests go
through South African home internet connections.

### What it does

- Searches like the site's search box, reads categories, the deals page, sellers' pages and any filtered listing
  (brand, price, availability filters in the link are kept), and single products by link or PLID number.
- Returns, for every product: price (and the price range when variants differ), list price, saving and deal labels,
  star rating and review count, stock status (in stock, or the lead time such as "Ships in 4 - 6 work days" and
  pre-order dates), warehouses (CPT, DBN, JHB), delivery estimate, brand, image and link.
- Read each product's page (optional): adds the barcode, the seller (Takealot itself or the marketplace seller and
  its ID), the full category path, eBucks and Discovery Miles prices, the product's attributes and description, at the
  same price per product.
- Deals only: returns just the products in the site's Featured Deals.
- Up to 36 products per request, so large runs are quick: 1,200 products in 26 seconds in testing.

### Who uses it

- **Sellers on Takealot** watching competitors' prices, deals and ratings, and which seller each product is sold by.
- **Brands** checking how their products are listed, priced and reviewed, and which sellers carry them.
- **Price comparison and deal sites** in South Africa.
- **Market researchers** measuring categories: prices, review counts and the share of marketplace sellers.

### Example

The search "instant coffee" with product pages read, on 4 October 2026 (10 products in 21 seconds):

| Product | Price | List price | Rating (reviews) | Seller | Barcode | eBucks |
|---|---|---|---|---|---|---|
| NESCAFÉ GOLD ESPRESSO Coffee Jar 200g | R149 | R209 | 4.9 (492) | Takealot | 7613036412704 | 1,490 |
| Nescafe Gold All'Italiana Instant Coffee 200g Jar | R149 | R209 | 4.9 (146) | Takealot | 8445290843708 | 1,490 |
| Douwe Egberts Pure Gold Instant Coffee - 400g | R380 | R389 | 4.8 (924) | Takealot | 8714599200322 | 3,800 |
| Douwe Egberts Mocha Kenya Style Instant Coffee | R239 | | 4.8 (516) | Takealot | 8711000276532 | 2,390 |
| Brothers Coffee Roastery Bugolobi Blend 1kg (product link) | R380 | | 4.7 (29) | Brothers Coffee | 0746747394872 | 3,800 |

Other test runs the same day:

- 20 everyday search terms, 60 products each, listings only: 1,200 products in 26 seconds, no failed or blocked
  requests.
- 360 products of one search ("shampoo", 2,904 on the site), paged without repeats.
- A filtered link (kettles, brand Russell Hobbs) with Deals only: the 5 Russell Hobbs kettles on deal.
- A PlayStation 5 sold by a marketplace seller: in stock false, "Ships in 4 - 6 work days", delivery 9 Oct - 14 Oct,
  orderable.

### Input

```json
{
  "searchTerms": ["coffee", "kettle"],
  "startUrls": [{ "url": "https://www.takealot.com/household-food-beverages/coffee-28666" }],
  "maxItemsPerSource": 100,
  "includeDetails": true,
  "specialsOnly": false
}
```

| Field | What it does |
|---|---|
| `searchTerms` | Words to search for. |
| `startUrls` | Search (`/all?qsearch=kettle`, filters kept), category (`/household-food-beverages/coffee-28666`), the deals page, a seller's page (`/seller/brothers-coffee?sellers=29892726`) or a product (`/.../PLID95798878`). A bare `PLID95798878` works too. |
| `maxItemsPerSource` | Products per search term or URL (default 100). A product link gives one. |
| `maxItems` | Products in total for the run; 0 means no total limit. |
| `includeDetails` | Also read each product's page (barcode, seller, category path, eBucks, attributes). |
| `specialsOnly` | Only products in Featured Deals. |
| `sort` | `relevance` (default), `price_low`, `price_high`, `rating` or `newest`. |
| `proxyConfiguration`, `maxConcurrency` | Advanced: South African residential connections by default; requests at once (default 8). |

### Output

One row per product. This row is from the example above (product page read, description shortened):

```json
{
  "retailer": "Takealot",
  "productId": "PLID99793762",
  "sku": "101321826",
  "barcode": "0746747394872",
  "name": "Brothers Coffee Roastery Bugolobi Blend 1kg",
  "brand": "Brothers Coffee",
  "size": "1 kg",
  "sizeValue": 1.0,
  "sizeUnit": "kg",
  "packCount": 1,
  "soldByWeight": null,
  "price": 380.0,
  "currency": "ZAR",
  "wasPrice": null,
  "promoPrice": null,
  "onSpecial": false,
  "savings": null,
  "unitPrice": 380.0,
  "unitPriceUnit": "kg",
  "loyaltyPrice": null,
  "loyaltyProgram": null,
  "loyaltyValidFrom": null,
  "loyaltyValidUntil": null,
  "promotions": [],
  "inStock": true,
  "stockStatus": "In stock",
  "stockQuantity": null,
  "category": "Household, Food & Beverages > Groceries > Tea, Coffee & Hot Drinks > Coffee > Coffee Beans",
  "categories": ["Household, Food & Beverages", "Groceries", "Tea, Coffee & Hot Drinks", "Coffee", "Coffee Beans"],
  "imageUrl": "https://media.takealot.com/covers_images/5ac2a2914f1348c0a88cf8fdf13627d9/s-zoom.file",
  "url": "https://www.takealot.com/brothers-coffee-roastery-bugolobi-blend-1kg/PLID99793762",
  "rating": 4.7,
  "reviewCount": 29,
  "seller": "Brothers Coffee",
  "deliveryEstimate": "Get it Tomorrow, 7am - 7pm",
  "store": null,
  "position": 1,
  "sourceType": "product",
  "sourceValue": "https://www.takealot.com/brothers-coffee-roastery-bugolobi-blend-1kg/PLID99793762",
  "scrapedAt": "2026-10-04T16:10:27Z",
  "orderable": true,
  "subtitle": "Coffee Beans",
  "warehouses": ["CPT", "JHB"],
  "skuId": 225464931,
  "sellerId": 29892726,
  "marketplaceListing": true,
  "rewardsPrices": [
    { "program": "eBucks", "amount": 3800, "text": "eB3,800" },
    { "program": "Discovery Miles", "amount": 3800, "text": "3,800" }
  ],
  "attributes": {
    "Brand": "Brothers Coffee",
    "Coffee Type": "Beans",
    "Coffee Country of Origin": "Brazil, Uganda",
    "Barcode": "0746747394872"
  },
  "description": "(Boo-go-lobi. It's a mouthful full but so is the taste!) Due to its versatility, ...",
  "detailsIncluded": true,
  "priceRange": null
}
```

- `wasPrice` is Takealot's list price when it is above the price; deal labels ("28% off", the promotion's name) are in
  `promotions`.
- `inStock` means in Takealot's own warehouses; otherwise `stockStatus` gives the lead time or pre-order date and
  `orderable` says whether it can still be bought.
- `seller`, `barcode`, `categories`, `rewardsPrices` and `attributes` come from product pages (Read each product's
  page). Barcodes are checked as valid EAN/UPC codes; sellers' own codes are left out of `barcode`.
- `unitPrice` (per kg, litre or item) is given for groceries, health, baby, pet and household products when product
  pages are read; for appliances and other goods a size in the name is a capacity, so no unit price is given.
- All prices are in rand, VAT included.

### Use it from code, automations and AI agents

- **API**: run it and get the results in one call: `POST https://api.apify.com/v2/acts/zaiq~takealot-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input as JSON. The API tab on this page has ready-made Python, JavaScript and cURL examples.
- **Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("zaiq/takealot-scraper").call(run_input={'searchTerms': ['coffee', 'kettle'], 'startUrls': [{'url': 'https://www.takealot.com/nescafe-gold-all-italiana-instant-coffee-200g-jar/PLID95798878'}], 'maxItemsPerSource': 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

- **No code**: connect it to Google Sheets, Zapier, Make or n8n from the Integrations tab, schedule runs in Apify Console, and get a webhook when a run finishes.
- **AI agents (MCP)**: add it as a tool to Claude, Cursor or any MCP client through Apify's MCP server: `https://mcp.apify.com?tools=zaiq/takealot-scraper`.

### Pricing

$3.00 per 1,000 products ($0.003 per product row), with or without product pages. Apify's platform usage is
included.

Each product row is one charged event. Failed, blocked and empty pages, retries and duplicates are free. Your spending
limit is respected: the run stops cleanly before going over it.

### Limits

- Takealot search lists at most a few thousand products per search; use categories and filtered links to reach more.
- Products that are completely unavailable drop out of Takealot's listings, so they do not appear in search results;
  a product link still returns them.
- Reviews' text is not included, only the star rating and the number of reviews.
- Use the data in line with Takealot's terms and South African law. This Actor is not affiliated with or endorsed by
  Takealot.

### FAQ

**Is reading product pages slower?** Yes: one more request per product. 50 products took 19 seconds in testing,
against a few seconds for 50 listings. The price per product is the same.

**Can I track one seller's products?** Yes. Put the seller's page (for example
https://www.takealot.com/seller/brothers-coffee?sellers=29892726) in the URLs: in testing it listed all 9 of that
seller's products. Read product pages to get `seller` and `sellerId` on every row of other listings.

**Can I keep a site filter, like a brand or price range?** Yes. Copy the link from takealot.com after choosing the
filters and put it in Category, search or product URLs.

# Actor input Schema

## `searchTerms` (type: `array`):

Words to search for, as you would type them on the site (for example milk, coffee, nappies). A barcode (EAN-13) also works.

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

Takealot pages: a search (https://www.takealot.com/all?qsearch=kettle, filters included), a category (https://www.takealot.com/household-food-beverages/coffee-28666), the deals page, a seller's page (https://www.takealot.com/seller/...?sellers=...) or a product (https://www.takealot.com/.../PLID95798878). A bare PLID number works too.

## `maxItemsPerSource` (type: `integer`):

Stop each search term or category after this many products. A product URL always gives one.

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

Stop the whole run after this many products. 0 means no total limit (each search term or URL still stops at its own maximum, and your spending limit always applies).

## `specialsOnly` (type: `boolean`):

Return only products the site marks as on promotion (a lower price, a member price or a multi-buy deal).

## `sort` (type: `string`):

The order the site lists products in. With a product limit, this decides which products you get.

## `includeDetails` (type: `boolean`):

Adds barcode, seller (Takealot or the marketplace seller), category path, eBucks and Discovery Miles prices, warehouses, attributes and description. One extra request per product, so slower; the price per product is the same.

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

By default every request goes through South African home (residential) internet connections, as a shopper in South Africa would browse.

## `maxConcurrency` (type: `integer`):

How many requests run at the same time. Kept low to stay polite to the site.

## Actor input object example

```json
{
  "searchTerms": [
    "coffee",
    "kettle"
  ],
  "startUrls": [
    {
      "url": "https://www.takealot.com/nescafe-gold-all-italiana-instant-coffee-200g-jar/PLID95798878"
    }
  ],
  "maxItemsPerSource": 20,
  "maxItems": 0,
  "specialsOnly": false,
  "sort": "relevance",
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ZA"
  },
  "maxConcurrency": 8
}
```

# Actor output Schema

## `products` (type: `string`):

Dataset with one row per product.

## `summary` (type: `string`):

Products per search term or URL, results the site reported, errors, requests and approximate traffic.

# 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 = {
    "searchTerms": [
        "coffee",
        "kettle"
    ],
    "startUrls": [
        {
            "url": "https://www.takealot.com/nescafe-gold-all-italiana-instant-coffee-200g-jar/PLID95798878"
        }
    ],
    "maxItemsPerSource": 20,
    "includeDetails": true,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "ZA"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaiq/takealot-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 = {
    "searchTerms": [
        "coffee",
        "kettle",
    ],
    "startUrls": [{ "url": "https://www.takealot.com/nescafe-gold-all-italiana-instant-coffee-200g-jar/PLID95798878" }],
    "maxItemsPerSource": 20,
    "includeDetails": True,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "ZA",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("zaiq/takealot-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 '{
  "searchTerms": [
    "coffee",
    "kettle"
  ],
  "startUrls": [
    {
      "url": "https://www.takealot.com/nescafe-gold-all-italiana-instant-coffee-200g-jar/PLID95798878"
    }
  ],
  "maxItemsPerSource": 20,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ZA"
  }
}' |
apify call zaiq/takealot-scraper --silent --output-dataset

```

## MCP server setup

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