Willhaben.at Scraper - Listings, Prices, Sellers & 40+ Fields
Pricing
from $1.80 / 1,000 product records
Willhaben.at Scraper - Listings, Prices, Sellers & 40+ Fields
From $1/1K. Scrape Willhaben.at listings into clean JSON with 40+ structured fields, including prices, GPS coordinates, photos, dates, seller details and category-specific attributes. Search with filters or paste any Willhaben URL.
Pricing
from $1.80 / 1,000 product records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Takealot Scraper: Products, Prices and Daily Deals for South Africa
Takealot Scraper turns Takealot, South Africa's largest online marketplace, into clean structured data. Search by keyword or paste takealot.com links to pull products with prices, was-price savings, regional stock, star ratings and real written reviews, plus a Daily Deals monitor built for tracking price drops on a schedule. It reads through the storefront's own JSON interface, so the output is structured data, not scraped HTML. Export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Two ways to find products. Search by one or more keywords, or paste any takealot.com link: a product page, a search, a department page or the Daily Deals page.
- Full pricing detail. Offer price range, pretty price text, was-price, saving percent and currency come straight from the storefront's own data, not guessed from a rendered page.
- A Daily Deals monitor built in. Track the Featured, Bundle or TakealotMORE deal surfaces and get only the price drops and stock changes on each scheduled run.
- Regional stock and ratings on every record. Distribution-centre availability, star rating, review count and the full 1 to 5 star breakdown.
- Full detail on demand. Switch on product detail fetching for the spec sheet, rich description, category chain, variant options, loyalty prices and offer detail, plus real written reviews.
- Built for schedules. Incremental mode returns only new and changed products on recurring runs, and a run that hits a connection problem fails loudly instead of returning an empty dataset.
- Resume a large pull without paying twice. Point at a previous run or dataset ID and already-collected products are skipped.
Use Cases
- Price and deal tracking: monitor the Daily Deals surface on a schedule and get an alert-ready feed of price drops and stock changes.
- Competitive pricing research: track a category, brand or keyword's price range, saving percent and regional stock over time.
- Product catalog building: collect spec sheets, descriptions, variant options and images for a set of products.
- Customer sentiment analysis: pull written reviews and rating distributions to spot trends per product or brand.
- Marketplace monitoring: watch how a brand's listings change: new products, price moves and stock-outs.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
kind | "product" |
recordId | "PLID00000000" |
url | "https://www.takealot.com/sample-gadget-name/PLID00000000" |
title | "Sample Gadget 100 (Fictional Model)" |
brand | "Example Brand" |
price | 1299 |
priceMax | 1499 |
prettyPrice | "From R 1,299" |
listingPrice | 1699 |
savingPercent | 23.0 |
currency | "ZAR" |
starRating | 4.4 |
reviewCount | 89 |
ratingDistribution | {"star5": 50, "star4": 20, "star3": 10, "star2": 5, "star1": 4} |
inStock / stockStatus | true / "In stock" |
distributionCentres | ["CPT", "JHB"] |
isDeal | true |
isPreorder / addToCartAvailable | false / true |
badges | ["Sale", "Preferred Seller"] |
imageUrl / imageCount | image link / 6 |
shippingMessage | "Free delivery" |
changeType | "NEW" (also "UPDATED", "UNCHANGED", "REAPPEARED", "EXPIRED") |
changedFields | ["price", "stockStatus"] (incremental mode only) |
With Fetch product details on, each record also carries descriptionHtml / descriptionText, specs (the spec sheet as name and value pairs), boxContents, warranty, categoriesPath, variantsOptions, loyaltyPrices (eBucks and Discovery Miles offers), offerDetail and detailImages. With Fetch written reviews also on, records add reviewsList (rating, text, author, date, upvotes) and reviewsFetched.
About the offer list: Takealot merges its marketplace sellers into one buybox, so the interface exposes an offer price range (price and priceMax, plus the buybox offerDetail when the store populates it) rather than a per-seller listing table. That is a property of the store, not of this actor.
How to Use
- Pick a mode: keyword search, or paste takealot.com links.
- In search mode, add one or more keywords and optionally narrow with the filters (brand, price range, minimum rating, in-stock region, deal type). In URL mode, paste product, search, department or Daily Deals links.
- Turn on Fetch product details (and Fetch written reviews) if you need the spec sheet, description or review bodies. These add a per-product surcharge, see Plan Requirement.
- Set Max items to control run size and cost, then click Start.
Keyword search:
{"mode": "search","queries": ["running shoes"],"maxItems": 20}
Filtered search (brand, price, rating, region):
{"mode": "search","queries": ["blender"],"brand": "Example Brand","minPrice": 500,"maxPrice": 2000,"minRating": "4","inStockRegion": "cpt","maxItems": 30}
Daily Deals monitor (no keyword needed):
{"mode": "search","dealType": "Featured Deals","incrementalMode": true,"maxItems": 0}
The Featured Deals surface is very large (thousands of products), so a run over it stops at the per-keyword page bound described below. Narrow it with a keyword, brand, price range or region if you also want EXPIRED rows.
Paste links (product, search, or Daily Deals page):
{"mode": "url","urls": ["https://www.takealot.com/deals?start=1"],"fetchDetails": true,"maxItems": 50}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/takealot-com-scraper").call(run_input={"mode": "search", "queries": ["running shoes"]})for product in client.dataset(run["defaultDatasetId"]).iterate_items():print(product["title"], product["price"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/takealot-com-scraper').call({ mode: 'search', queries: ['running shoes'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Limits that stop a run
Max items is the main cap. It defaults to 20; set it to 0 for no item limit. When a run has several keywords or links, Max items is split evenly between them, so one keyword returning fewer results than expected is not a failure, another keyword simply had less budget left to spend.
Max pages per keyword defaults to 0. Even then, a built-in safety bound of 100 pages (about 3,600 products) per keyword or link still applies, so a very broad keyword or the full Daily Deals surface stops there rather than when results run out. Set Max pages yourself to go lower or higher. A run stopped by either cap is not a complete scan, so it never produces EXPIRED rows.
Resume and recurring updates
- Resume from a previous run (
resumeFromRunId): paste a run or dataset ID to continue a large pull without collecting products already gathered there. - Incremental mode (
incrementalMode) is for scheduled runs over the same keyword, link or filter setup. Each product is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that scanned the whole scope end to end, and only withemitExpiredon).stateKeynames or shares the stored state; leave it empty to let the actor derive one automatically from the search, link and filter settings. With incremental mode off, output is exactly as before.
Resume and incremental mode solve two different problems: Resume continues one interrupted run so you never pay for the same products twice. Incremental mode is for running the same search again and again (for example daily) and getting back only what changed.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each product becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the
mcpConnectorsinput field. (If the picker is empty, you have not authorized a connector yet.) - For Notion, also set
notionParentPageUrlto the page where items should be created. maxNotifyListingscaps how many products are written to each connector per run; it never affects the dataset.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keyword search) or url (paste takealot.com links). |
queries | array | (none; prefilled ["laptop"]) | Search mode: one or more keywords, each walked as its own search. |
sort | string | Relevance | Relevance, Price Descending, Price Ascending, Rating Descending, or ReleaseDate Descending. |
urls | array | (none; prefilled with the Daily Deals link) | URL mode: takealot.com pages to read, one per line. |
brand | string | (none) | Search mode: only products of this brand, exact site spelling. |
minPrice | integer | (none) | Search mode: only products priced at or above this many rand. |
maxPrice | integer | (none) | Search mode: only products priced at or below this many rand. |
minRating | string | (none) | Search mode: only products rated 1 to 4 stars and up. |
inStockRegion | string | (none) | Search mode: only products in stock at cpt, dbn or jhb. |
dealType | string | (none) | Search mode: Featured Deals, Bundle Deals, or TakealotMORE Deals. Works with or without a keyword. |
fetchDetails | boolean | true | Read each product's own page for the spec sheet, description, category chain, variants, loyalty prices and offer detail. Adds a per-product surcharge. |
fetchReviews | boolean | false | With fetchDetails on, also read each product's written reviews. |
maxReviewsPerProduct | integer | 5 | Cap on written reviews collected per product when fetchReviews is on. |
maxItems | integer | 20 | Stop after this many product records (0 = no item limit). |
maxPages | integer | 0 | Upper bound on pages walked per keyword or link. 0 uses the built-in bound of 100 pages (about 3,600 products). |
resumeFromRunId | string | (none) | Continue one interrupted run without returning products already collected there. |
incrementalMode | boolean | false | Turn on for daily or recurring monitoring: later runs return only new, changed and reappeared products. |
stateKey | string | (none) | Name a monitoring campaign to keep its state stable, or deliberately share state across runs. |
emitUnchanged | boolean | false | Also return (and bill) products that have not changed since the last run. |
emitExpired | boolean | false | Also return (and bill) products that were present before but are no longer found. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on products exported to each connector per run. |
proxyConfiguration | object | Apify Proxy | Connection settings for this run. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"kind": "product","recordId": "PLID00000000","plid": 0,"url": "https://www.takealot.com/sample-gadget-name/PLID00000000","title": "Sample Gadget 100 (Fictional Model)","brand": "Example Brand","price": 1299,"priceMax": 1499,"prettyPrice": "From R 1,299","listingPrice": 1699,"savingPercent": 23.0,"currency": "ZAR","starRating": 4.4,"reviewCount": 89,"ratingDistribution": {"star5": 50, "star4": 20, "star3": 10, "star2": 5, "star1": 4},"inStock": true,"stockStatus": "In stock","distributionCentres": ["CPT", "JHB"],"isDeal": true,"isPreorder": false,"addToCartAvailable": true,"badges": ["Sale", "Preferred Seller"],"imageUrl": "https://example.com/sample-image.jpg","shippingMessage": "Free delivery","changeType": "NEW","changedFields": []}
Plan Requirement
You pay per product record returned, plus a per-product surcharge only when Fetch product details is switched on. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
The default connection setting works out of the box: the actor keeps a dedicated high-reliability connection pool of its own as the primary path, and your own selection under Connection is tried alongside it. Keep the default; changing the proxy group is not needed for large or frequent runs.
FAQ
How much does it cost?
You pay per product record returned, with the detail surcharge billed only when you switch on Fetch product details. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape Takealot?
This actor collects only publicly available product listings. You are responsible for how you use it: follow Takealot's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product prices and stock levels are generally facts, but titles, images and descriptions may be subject to third-party rights.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental changes for scheduled runs. Each run then returns only new, updated and reappeared products, and unchanged ones are not billed unless you turn on emitUnchanged. This is the shape behind the Daily Deals price-drop monitor.
What is the difference between Resume and Incremental mode?
This is the most common mix-up. Resume continues one specific interrupted run so it never re-collects products it already gathered. Incremental mode is for running the same search again and again, for example daily, and getting back only what changed since the last time. Use Resume for a one-off large pull that got cut off; use incremental mode for ongoing monitoring.
Why did my run fail instead of returning an empty dataset?
If a keyword or link genuinely has no results, the run succeeds with an empty dataset. If the store's connection refused every request instead, the run stops with a clear message so "no products found" is never confused with "nothing could be read". Run it again in a few minutes. If only some keywords or links could be read, you still get what was found.
Why don't I see a price for every individual seller?
Takealot merges its marketplace sellers into one buybox rather than listing sellers side by side, so this actor reports the offer price range Takealot itself exposes, not a per-seller table. That is a property of the store.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
π More scrapers you might like
Pair this actor with these related scrapers from the same team:
| π Willhaben.at Scraper From $1/1K. Scrape Willhaben.at listings into clean JSON with 40+ structured fields... | π Ozon.ru Scraper Extract structured product data from Ozon.ru, Russiaβs largest marketplace. Search by... |
| π§© Walmart Scraper Scrape Walmart.com by keyword, URL, or item ID. Extract prices, was-prices, sellers... | π§© Jumia Marketplace Scraper Scrape Jumia, Africa's largest marketplace: products with local prices, discounts... |
| π§© Mercado Livre Brazil Scrape Mercado Livre Brazil by keyword or URL. Filter by category, brand, price... | π Amazon Australia Product & Reviews Scraper Scrape Amazon Australia (amazon.com.au) products and customer reviews. Search by keyword... |
π Browse all abotapi scrapers
π¬ Support & custom scrapers
- π Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- π οΈ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- β Enjoying it? A quick review on the actor page helps other users find it.