Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the takealot API page →
E-commerce & Marketplaces

takealot API & Scraper

The takealot API turns South Africa's largest online marketplace into clean JSON, in eight actions: search, category/products, product/detail, product/offers, product/reviews, deals, deals/products and search/suggest.

8 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

A search or category page returns 36 products per call with the product id (PLID), title, brand, image, the price in rand (or the price range for products that come in several colours or sizes), takealot's list price kept apart, rating with review count and star distribution, stock status with the Cape Town, Johannesburg and Durban warehouses, and the delivery estimate. It filters by brand, price, rating, in-stock, warehouse and condition, sorts by relevance, price, rating or newest, and pages with a cursor. product/detail returns the full record: description, highlights, gallery, barcode where takealot publishes a valid one, model and warranty, the buy-box price, the cheapest and dearest offer, eBucks and Discovery Miles points, availability, the seller (takealot itself or a marketplace seller with its rating), both buy-box offers and every other offer, the breadcrumb, the specification table, colour and size variants and any running promotion. Verification on 2026-09-15 covered 12 products across phones, air fryers, toys, beauty, books and sport: price, list price, title, stock and whether takealot or a marketplace seller sells the item matched a second record inside takealot's own product data every time (12 of 12 on price, list price and title; 11 of 11 on stock and seller type). No takealot account, no browser - one ReefAPI key and the standard { ok, data, meta, error } envelope.

Reference

takealot shows two offers in the buy box, and a 'List price' that is not a sale

A takealot product page preselects one offer, usually the fastest delivery, and places a second 'Best Price' offer beside it that is often cheaper. The page also prints a List price above the selling price, which reads like a discount but is takealot's reference figure, not a price the item recently sold for. This engine returns the preselected offer as price, the cheapest offer as price_min, and the list price separately as list_price.

Productprice (preselected offer)price_min (cheapest offer)list_price (reference)
6L Digital Roaster Air FryerR 480R 465R 1,399
2L Cordless Stainless Steel KettleR 189R 169 (ships in days)null - same as price
Apple AirPods 4 (sold by takealot)R 2,299R 2,299R 2,799
Apple iPhone 12 Mini 64GB (Pristine Like New)R 4,299R 4,299R 8,999

In the 12-product check, 10 products printed a list price. The kettle row shows why the cheapest offer is its own field: the cheaper offer was not in stock and would ship in several days, while the preselected one was in stock. eBucks and Discovery Miles figures are the same price in points and are returned as reward_prices, never as a discount.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/takealot/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "air fryer"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "takealot",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1192.6,
    "record_count": 36,
    "bytes": 135898,
    "cache_hit": false,
    "country": "za",
    "pagination": {
      "cursor": null,
      "next_cursor": "WzE5Ljc2MjY0Niw5NTgwMTAwMV0",
      "has_more": true,
      "page_size": 36,
      "total": 778
    }
  },
  "data": {
    "results": [
      {
        "plid": "PLID93227833",
        "product_id": 93227833,
        "tsin": 93738450,
        "offer_sku": 225073869,
        "title": "6L Digital Roaster Air Fryer with Paper Liners",
        "subtitle": "Fry, Roast, and Bake all your favourite foods using up to 80% less fat",
        "brand": null,
        "authors": null,
        "url": "https://www.takealot.com/6l-digital-roaster-air-fryer-with-paper-liners/PLID93227833",
        "image": "https://media.takealot.com/covers_images/055772c8fe06464e8258d4af33a67132/s-zoom.file",
        "image_count": 16,
        "price": 465,
        "price_max": 480,
        "price_is_range": true,
        "currency": "ZAR",
        "list_price": null,
        "list_price_discount_percent": null,
        "saving_text": "76%",
        "saving_badge": "76% off",
        "promotion_id": null,
        "rating": 4.5,
        "review_count": 3365,
        "rating_scale": 5,
        "rating_distribution": {
          "1": 196,
          "2": 74,
          "3": 171,
          "4": 479,
          "5": 2445
        },
        "in_stock": true,
        "availability": "in_stock",
        "stock_status": "In stock",
        "is_leadtime": false,
        "is_imported": false,
        "warehouses": [
          "JHB"
        ],
        "delivery_estimate": "Get it Tomorrow, 7am - 7pm",
        "delivery_type": "next_day",
        "is_preorder": false,
        "variant_selection_required": true,
        "has_more_colours": true,
        "free_delivery_with_takealotmore": true
      },
      {
        "plid": "PLID98945485",
        "product_id": 98945485,
        "tsin": 100366962,
        "offer_sku": 224000182,
        "title": "Russell Hobbs Digital 9L Air Fryer - RHAF09S",
        "subtitle": "Smart pause function",
        "brand": "Russell Hobbs",
        "authors": null,
        "url": "https://www.takealot.com/russell-hobbs-digital-9l-air-fryer-rhaf09s/PLID98945485",
        "image": "https://media.takealot.com/covers_images/5c8058bc304740c2a9cb18919b56228a/s-zoom.file",
        "image_count": 5,
        "price": 1099,
        "price_max": null,
        "price_is_range": false,
        "currency": "ZAR",
        "list_price": 1499,
        "list_price_discount_percent": 26.7,
        "saving_text": "26%",
        "saving_badge": "26% off",
        "promotion_id": 124724,
        "rating": 4.8,
        "review_count": 2089,
        "rating_scale": 5,
        "rating_distribution": {
          "1": 44,
          "2": 12,
          "3": 20,
          "4": 153,
          "5": 1860
        },
        "in_stock": true,
        "availability": "in_stock",
        "stock_status": "In stock",
        "is_leadtime": false,
        "is_imported": false,
        "warehouses": [
          "CPT",
          "DBN",
          "JHB"
        ],
        "delivery_estimate": "Get it Tomorrow, 7am - 7pm",
        "delivery_type": "next_day",
        "is_preorder": false,
        "variant_selection_required": false,
        "has_more_colours": false,
        "free_delivery_with_takealotmore": true
      },
      {
        "plid": "PLID95783797",
        "product_id": 95783797,
        "tsin": 96757145,
        "offer_sku": 219486412,
        "title": "Philips 1000 Series NA130/00 6.2L Analog Airfryer - Black",
        "subtitle": "6.2L Analog Airfryer with RapidAir Technology and Timer",
        "brand": "Philips",
        "authors": null,
        "url": "https://www.takealot.com/philips-1000-series-na130-00-6-2l-analog-airfryer-black/PLID95783797",
        "image": "https://media.takealot.com/covers_images/4edcf12336a74b72849e911291b95451/s-zoom.file",
        "image_count": 5,
        "price": 759,
        "price_max": null,
        "price_is_range": false,
        "currency": "ZAR",
        "list_price": 1599,
        "list_price_discount_percent": 52.5,
        "saving_text": "52%",
        "saving_badge": "52% off",
        "promotion_id": 131155,
        "rating": 4.8,
        "review_count": 1248,
        "rating_scale": 5,
        "rating_distribution": {
          "1": 6,
          "2": 3,
          "3": 16,
          "4": 139,
          "5": 1084
        },
        "in_stock": true,
        "availability": "in_stock",
        "stock_status": "In stock",
        "is_leadtime": false,
        "is_imported": false,
        "warehouses": [
          "CPT",
          "DBN",
          "JHB"
        ],
        "delivery_estimate": "Get it Tomorrow, 7am - 7pm",
        "delivery_type": "next_day",
        "is_preorder": false,
        "variant_selection_required": false,
        "has_more_colours": false,
        "free_delivery_with_takealotmore": true
      }
    ],
    "count": 36,
    "total_results": 778,
    "total_is_approximate": false,
    "total_results_capped": false,
    "next_cursor": "WzE5Ljc2MjY0Niw5NTgwMTAwMV0",
    "sort_applied": "Relevance",
    "filters_applied": null,
    "currency": "ZAR",
    "country": "za",
    "duplicate_rows_dropped": 0,
    "fallback_results_dropped": 0,
    "keyword_matches_on_page": 36,
    "query": "air fryer",
    "has_more": true
  }
}
Actions

What the takealot API does

ActionDescriptionConcrete use caseKey params
searchSearch takealot.com by keyword: product id (PLID), title, brand, image, the price (or the price range for variant products), takealot's list price kept apart, rating with review count and star distribution, stock status with the Cape Town / Johannesburg / Durban warehouses and the delivery estimate. Filter by brand, price, rating, in-stock, warehouse and condition; sort by relevance, price, rating or newest; page with a cursor.Pricing teams call search to search takealot.com by keyword.query, country, cursor, sort, brand, ...
category/productsBrowse one takealot department or category (slug path or category URL) with the same product rows, filters, sorts and cursor paging as `search`.Marketplace operators call category/products to get browse one takealot department or category (slug path or category URL) with the same product….category, country, cursor, sort, brand, ...
product/detailThe full takealot product record by PLID or URL: title, subtitle, brand, description, highlights, gallery, barcode (when published and valid), model, warranty, the preselected buy-box price with takealot's list price kept apart, the cheapest and dearest offer, reward points, availability with warehouses and delivery estimate, the seller (takealot or a marketplace seller with its rating), both buy-box offers and every other offer, rating with star distribution, breadcrumbs and category paths, the specification table, colour and size variants (pick one with `colour` / `size`) and running promotions.Catalog enrichment teams call product/detail to get the full takealot product record by PLID or URL.product_id, country, colour, size, max_rotations
product/offersEvery offer on one takealot product, cheapest first: both buy-box offers (the preselected 'Fastest Delivery' one and the 'Best Price' one) plus every other seller, each with price, condition, seller id, type (takealot or marketplace), name and rating where takealot publishes them, stock status, warehouses and delivery estimate.Retail analysts call product/offers to get every offer on one takealot product, cheapest first.product_id, country, colour, size, max_rotations
product/reviewsCustomer reviews of one takealot product, 10 per page: star rating, title, text, date, the reviewer's display name, helpful votes, how long after purchase it was written and the variant bought. Sort by most helpful or newest; filter by star rating.Pricing teams call product/reviews to get customer reviews of one takealot product, 10 per page.product_id, country, page, sort, rating, ...
dealsEvery promotion running on takealot right now: promotion id, name, start and end, and a link. Use `deals/products` with a promotion id for the discounted products.Marketplace operators call deals to get every promotion running on takealot right now.country, max_rotations
deals/productsThe products in one takealot promotion, with the same rows, filters, sorts and cursor paging as `search`.Catalog enrichment teams call deals/products to get the products in one takealot promotion, with the same rows, filters, sorts and cursor paging….promotion_id, country, cursor, sort, brand, ...
search/suggesttakealot's search-box suggestions for what a shopper has typed so far.Retail analysts call search/suggest to get takealot's search-box suggestions for what a shopper has typed so far..query, country, max_rotations
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/takealot/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"air fryer"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.takealot.search with {"query":"air fryer"}.
Use cases

Who uses this API and why

  • South African price-monitoring teams track the preselected price, the cheapest offer and the list price per product id every day.
  • Marketplace sellers call product/offers to see every competing offer on a product, whether takealot itself sells it, and which warehouses hold stock.
  • Brands and agencies pull product/reviews sorted by newest or filtered by star rating to follow what South African shoppers say.
  • Deal sites list takealot's running promotions with deals and fetch the products in each one with deals/products.
FAQ

Questions developers ask before integrating

Which country and currency does the takealot API cover?

South Africa only, because takealot has one storefront. Every price comes back in rand (ZAR) as a number. country accepts za; any other value returns INVALID_PARAM rather than silently falling back.

Is the price the price a shopper pays?

price is the offer takealot preselects on the product page. takealot often shows a second, cheaper 'Best Price' offer beside it, so price_min carries the cheapest offer on the page and buybox_is_cheapest says whether they are the same. On 12 products checked on 2026-09-15, price matched takealot's own recorded selling price 12 of 12 times.

What is list_price, and is it a discount?

It is the 'List price' takealot prints above the selling price. It is a reference figure, not proof the item recently sold for that amount, so it is kept apart from price and returned only when it is higher. list_price_discount_percent is computed from the two for convenience. 10 of 12 verified products carried one.

Does the API tell me whether takealot or a marketplace seller sells the item?

Yes. seller.seller_type is takealot or marketplace, and sold_by_takealot is true when takealot sells from its own stock. Marketplace sellers come with their store name and rating where takealot publishes them. Every offer in offers[] carries the same fields, so you can see who else sells the product and for how much.

How are colours and sizes handled?

Some takealot products need a colour or size choice before they have a price and stock. For those, product/detail returns variant_selection_required true, availability select_variant and takealot's 'from' price, plus the list of variants with which ones are available. Pass colour or size to get that variant's offer, seller and stock. On search rows such products print a price range: price is the lowest and price_max the highest.

What does in stock mean here?

in_stock is true only when takealot says In stock. Items that ship later ('Ships in 5 - 7 work days') come back as availability ships_in_days with the status text kept, and warehouses lists which of Cape Town (CPT), Johannesburg (JHB) and Durban (DBN) hold the stock. takealot does not publish stock quantities.

How do I page through search results?

takealot pages with a cursor. Each response returns next_cursor; pass it as cursor to get the next 36 products. has_more is false when there is nothing after the page.

What does takealot NOT publish?

Stock quantities. The seller name of the second buy-box offer (its seller id is returned). A barcode on many products (7 of 12 verified had a valid one). A brand on many marketplace listings and on books (5 of 12). Sponsored results are not part of takealot's search results in this API, so there is nothing to flag.

What is the takealot API?

takealot API is a ReefAPI endpoint group for south africa's biggest marketplace: products, rand prices, every seller's offer and reviews. It returns live JSON through POST requests under /takealot/v1.

Is the takealot API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. takealot calls use the same shared credit balance as every other ReefAPI engine.

Do I need a takealot login or account?

No login to takealot is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the takealot data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the takealot API use?

takealot actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call takealot from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call takealot actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / takealot

takealot

South Africa's biggest marketplace: products, rand prices, every seller's offer and reviews.

base /takealot/v18 endpoints
post/takealot/v1/category/products1 credit

Browse one takealot department or category (slug path or category URL) with the same product rows, filters, sorts and cursor paging as `search`.

ParameterAllowed / rangeDescription
categoryrequiredtakealot category path or URL, e.g. 'cellular-gps' (a department), 'cellular-gps/cellphones-26249' or https://www.takealot.com/home-kitchen/air-fryers-25752. Product breadcrumbs return these slugs.
country = zaoptionalzatakealot sells in South Africa only; prices are in rand (ZAR).
cursoroptionalNext page. Pass the `next_cursor` of the previous response; omit for page 1. takealot pages by cursor only (36 products per page).
sort = relevanceoptionalrelevance · price_asc · price_desc · rating · newestOrder of results. Only takealot's own orderings are accepted.
brandoptionalBrand name exactly as takealot lists it (every row returns `brand`; `facets` lists the brands on a query).
price_minoptional0–Lowest price in rand.
price_maxoptional0–Highest price in rand.
min_ratingoptional1–4Only products rated at least this many stars (1-4, takealot's own buckets).
in_stock = falseoptionaltrue: only products takealot shows as in stock (not 'ships in N days').
warehouseoptionalcpt · jhb · dbnOnly products in stock at this takealot warehouse (takealot's own filter).
conditionoptionalnew · refurbishedProduct condition as takealot classifies it.
include_facets = falseoptionaltrue: also return takealot's filter panel (brands, price bands, warehouses, conditions, attributes with counts) and related searches.
max_rotations = 3optional1–5Advanced: how many times to retry a difficult request (1-5).
Try in playground →
post/takealot/v1/product/detail1 credit

The full takealot product record by PLID or URL: title, subtitle, brand, description, highlights, gallery, barcode (when published and valid), model, warranty, the preselected buy-box price with takealot's list price kept apart, the cheapest and dearest offer, reward points, availability with warehouses and delivery estimate, the seller (takealot or a marketplace seller with its rating), both buy-box offers and every other offer, rating with star distribution, breadcrumbs and category paths, the specification table, colour and size variants (pick one with `colour` / `size`) and running promotions.

ParameterAllowed / rangeDescription
product_idrequiredtakealot product id: 'PLID93227833', '93227833' or a product URL.
country = zaoptionalzatakealot sells in South Africa only; prices are in rand (ZAR).
colouroptionalPick a colour variant (exactly as in `variants[].options[].value`).
sizeoptionalPick a size variant (exactly as in `variants[].options[].value`).
max_rotations = 3optional1–5Advanced: how many times to retry a difficult request (1-5).
Try in playground →
post/takealot/v1/product/offers1 credit

Every offer on one takealot product, cheapest first: both buy-box offers (the preselected 'Fastest Delivery' one and the 'Best Price' one) plus every other seller, each with price, condition, seller id, type (takealot or marketplace), name and rating where takealot publishes them, stock status, warehouses and delivery estimate.

ParameterAllowed / rangeDescription
product_idrequiredtakealot product id: 'PLID93227833', '93227833' or a product URL.
country = zaoptionalzatakealot sells in South Africa only; prices are in rand (ZAR).
colouroptionalPick a colour variant (exactly as in `variants[].options[].value`).
sizeoptionalPick a size variant (exactly as in `variants[].options[].value`).
max_rotations = 3optional1–5Advanced: how many times to retry a difficult request (1-5).
Try in playground →
post/takealot/v1/product/reviews1 credit

Customer reviews of one takealot product, 10 per page: star rating, title, text, date, the reviewer's display name, helpful votes, how long after purchase it was written and the variant bought. Sort by most helpful or newest; filter by star rating.

ParameterAllowed / rangeDescription
product_idrequiredtakealot product id: 'PLID93227833', '93227833' or a product URL.
country = zaoptionalzatakealot sells in South Africa only; prices are in rand (ZAR).
page = 1optional1–500Review page, 1-based (10 reviews per page).
sort = most_helpfuloptionalmost_helpful · newestReview order.
ratingoptional1–5Only reviews with exactly this many stars.
max_rotations = 3optional1–5Advanced: how many times to retry a difficult request (1-5).
Try in playground →
post/takealot/v1/deals1 credit

Every promotion running on takealot right now: promotion id, name, start and end, and a link. Use `deals/products` with a promotion id for the discounted products.

ParameterAllowed / rangeDescription
country = zaoptionalzatakealot sells in South Africa only; prices are in rand (ZAR).
max_rotations = 3optional1–5Advanced: how many times to retry a difficult request (1-5).
Try in playground →
post/takealot/v1/deals/products1 credit

The products in one takealot promotion, with the same rows, filters, sorts and cursor paging as `search`.

ParameterAllowed / rangeDescription
promotion_idrequiredA takealot promotion id — `deals` returns every running one.
country = zaoptionalzatakealot sells in South Africa only; prices are in rand (ZAR).
cursoroptionalNext page. Pass the `next_cursor` of the previous response; omit for page 1. takealot pages by cursor only (36 products per page).
sort = relevanceoptionalrelevance · price_asc · price_desc · rating · newestOrder of results. Only takealot's own orderings are accepted.
brandoptionalBrand name exactly as takealot lists it (every row returns `brand`; `facets` lists the brands on a query).
price_minoptional0–Lowest price in rand.
price_maxoptional0–Highest price in rand.
min_ratingoptional1–4Only products rated at least this many stars (1-4, takealot's own buckets).
in_stock = falseoptionaltrue: only products takealot shows as in stock (not 'ships in N days').
warehouseoptionalcpt · jhb · dbnOnly products in stock at this takealot warehouse (takealot's own filter).
conditionoptionalnew · refurbishedProduct condition as takealot classifies it.
include_facets = falseoptionaltrue: also return takealot's filter panel (brands, price bands, warehouses, conditions, attributes with counts) and related searches.
max_rotations = 3optional1–5Advanced: how many times to retry a difficult request (1-5).
Try in playground →
post/takealot/v1/search/suggest1 credit

takealot's search-box suggestions for what a shopper has typed so far.

ParameterAllowed / rangeDescription
queryrequiredWhat the shopper has typed so far.
country = zaoptionalzatakealot sells in South Africa only; prices are in rand (ZAR).
max_rotations = 3optional1–5Advanced: how many times to retry a difficult request (1-5).
Try in playground →