Kogan.com Scraper - Products, Prices, Stock & Reviews avatar

Kogan.com Scraper - Products, Prices, Stock & Reviews

Pricing

from $1.00 / 1,000 product scrapeds

Go to Apify Store
Kogan.com Scraper - Products, Prices, Stock & Reviews

Kogan.com Scraper - Products, Prices, Stock & Reviews

Scrape Kogan.com products with full details and customer reviews. Search by keyword or paste category/search URLs across the AU, NZ and US stores. Returns price, stock, brand, GTIN, images, ratings, and review text.

Pricing

from $1.00 / 1,000 product scrapeds

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

2 days ago

Last modified

Share

Kogan.com Scraper: Products, Prices & Reviews

Kogan.com Scraper turns Kogan.com into a clean product data feed across the Australia, New Zealand and United States stores. Search by keyword with brand, price and sort filters, browse Kogan's own Hot Deals, Clearance or Smart Savers grids, or paste category and search URLs directly. Every product comes back as one flat record with price, stock, brand, GTIN, images, category, average rating and, optionally, full customer review text, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

Why This Scraper?

  • Three regional stores in one actor. Australia (kogan.com/au), New Zealand (/nz) and United States (/us), each with its own currency and catalogue.
  • Two ways to find products. Search by keyword with brand, price-range and sort filters, or paste your own Kogan category and search URLs.
  • Kogan's own deals grids. Browse Hot Deals, Clearance or Smart Savers as a dedicated search target alongside (or instead of) a keyword.
  • Genuine markdown detection. originalPrice, discountPercent and isOnSpecial are filled only when Kogan itself shows a Was, SRP, Don't Pay or RRP reference price next to the current price, never fabricated.
  • Full product detail and reviews on demand. Description, images, category, condition and rating come from the product page; review text, star rating, author and date come from the reviews feed, with a per-product cap you control.
  • Built for recurring monitoring. Incremental mode returns only new and changed products on repeat runs, and a run that could not reach the site fails loudly instead of quietly returning an empty dataset. Read the limits under "Resume and recurring updates" before tracking several keywords or URLs in one run.
  • No double billing on Resume. Paste a previous run or dataset ID and products already collected there are skipped rather than returned or billed again (see the Resume limits below).

Use Cases

  • Price trackers and deal hunters: watch Hot Deals, Clearance and Smart Savers for markdowns, then alert on a genuine price drop.
  • Comparison shopping sites: pull price, brand, stock and rating across the AU, NZ and US stores to power a comparison listing.
  • Brand and reseller monitoring: track how a specific brand's products are priced, stocked and reviewed on Kogan over time.
  • Customer sentiment analysis: collect review text, star ratings and reviewer type to gauge how buyers feel about specific products.
  • Catalogue and stock monitoring: schedule recurring runs that surface new listings, price changes and delistings without re-collecting everything each time.

Data You Get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
store"au" (also "nz", "us")
url"https://www.kogan.com/au/buy/sample-product-slug-000000/"
title"Sample 55 inch 4K Smart TV"
brand"Kogan"
sku"ABC-000000"
gtin"0000000000000"
price499
priceMax549
originalPrice / originalPriceLabel699 / "Was" (null when Kogan shows no reference price)
discountAmount / discountPercent200 / 28.6
isOnSpecialtrue
specialsCategory"clearance" (when found via a specials grid, else null)
currency"AUD"
availability"InStock"
category / condition"TVs" / "New" (when details are fetched)
description"Full product description text appears here when details are fetched."
image / images"https://assets.kogan.com/images/sample/000000/1-000000.jpg" / array of gallery images
averageRating / ratingCount4.8 / 166
productId"000000000"
reviewCount5 (number of reviews collected in reviews, up to your per-product cap; not the site's total)
reviewsarray of { author, stars, comment, reviewDate, ... } (when reviews are fetched)
position3 (rank on the results page; excluded from change detection)
searchMode"search" (also "url")
changeType / changedFields / firstSeenAt / lastSeenAtIncremental mode only, see "Resume and recurring updates" below

How to Use

  1. Pick a mode: search (keyword and filters, or a specials grid) or url (paste links).
  2. Fill in the fields for that mode: keywords or URLs, the store region, and any brand, price or sort filters.
  3. Turn on product details and reviews if you need them, and set Max products to control run size and cost.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.

Search by keyword:

{
"mode": "search",
"queries": ["air fryer"],
"store": "au",
"maxItems": 50
}

Search with brand, price and sort filters:

{
"mode": "search",
"queries": ["tv"],
"store": "au",
"brand": "Kogan",
"minPrice": 200,
"maxPrice": 800,
"sortBy": "price_asc",
"maxItems": 100
}

Products with full details and reviews:

{
"mode": "search",
"queries": ["headphones"],
"store": "au",
"fetchDetails": true,
"fetchReviews": true,
"maxReviewsPerProduct": 20,
"maxItems": 30
}

Scrape pasted URLs:

{
"mode": "url",
"urls": [
"https://www.kogan.com/au/shop/?q=laptop",
"https://www.kogan.com/au/c/smart-tvs/"
],
"maxItems": 60
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/kogan-com-scraper").call(run_input={"mode": "search", "queries": ["air fryer"], "store": "au"})
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/kogan-com-scraper').call({ mode: 'search', queries: ['air fryer'], store: 'au' });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Pagination and page caps

Each keyword, pasted URL or specials category is walked page by page, always starting from its first page, until one of these happens: Max products is reached, a page comes back empty or cannot be read, a page holds only products the run has already collected, or the store's own reported result total has been reached. Max pages per search is an optional extra cap on top of those; leave it at 0 to let a target walk as far as it naturally goes. With several keywords (or a keyword plus a specials category), Max products is split evenly between them: maxItems: 50 over two keywords returns up to 25 from each.

Known limitation: overlapping targets end early. "Already collected" is checked against everything collected so far in the whole run, not just the current keyword or URL. So if a later keyword's or URL's page contains only products that an earlier one already returned, that later target stops right there, and its deeper pages are silently skipped with no error. Example: you search tv and then smart tv; if every product on page 1 of smart tv was already returned by tv, the actor never reads page 2 of smart tv, even if it holds products tv never showed. The first target in a run is never affected. If your keywords or URLs overlap and you need every product, run each one as its own run (or its own scheduled task).

Resume and recurring updates

Two distinct features:

  • Resume from a previous run (resumeFromRunId) is for ONE specific interrupted run: paste its run or dataset ID and products already collected there are skipped, so you don't pay twice. Limitation: a resumed run does not pick up at the page where the earlier run stopped. Every keyword or URL is walked again from its first page, and the "page holds only already-collected products" stop above applies. So if the earlier run already collected a whole first page of a search, the resumed run stops on that page and returns few or no new products (it can even finish with "No products matched"). Resume only reaches deeper pages when the earlier run did not collect every product on the first page, for example when a small Max products cut it short. To extend a large pull, run the search again without Resume.
  • Incremental mode (incrementalMode) is for scheduling this actor daily or weekly against the SAME search or URLs and getting only what changed. The first run returns everything as NEW; later runs return NEW and UPDATED (with changedFields) by default, plus changeType, changedFields, firstSeenAt and lastSeenAt on every row. REAPPEARED is returned for a product that a previous run had marked EXPIRED, so it only happens once emitExpired has been on. Turn on emitUnchanged or emitExpired only if you also want those rows back (they are billed like any other row).

State is tracked per set of keywords or URLs, store, brand, price range, sort, specials category, and detail and review settings, so two differently configured runs never share a baseline. Use stateKey to name a campaign explicitly, or leave it empty and the actor derives a stable key automatically. maxItems, maxPages and the proxy configuration are excluded from that key, so raising a cap or changing the connection never starts a fresh baseline.

EXPIRED rows are produced only when emitExpired is on and the run was not stopped by the Max products cap or the Max pages cap, and Resume was not used; otherwise the previous state for those products is kept as is.

Known limitation: false EXPIRED rows. The actor counts a walk as complete whenever it stops for any reason other than those caps, including the two early stops described above: a later keyword or URL whose page holds only products an earlier one already returned, and a results page that fails to load. Neither is told apart from a real end of results, so products the run simply did not reach can be marked EXPIRED (and billed) while they are still listed. Example: you track tv and smart tv together and a product appears only on page 2 of smart tv. On a later run, page 1 of smart tv holds only products tv already returned, so the walk stops there and that product comes back as EXPIRED although nothing on Kogan changed. A results page that fails to load part-way through a walk has the same effect on every product past it, even with a single keyword, and a keyword whose first page fails to load on a run where other keywords succeed has all of its products marked EXPIRED. A product marked EXPIRED this way returns as REAPPEARED the next time a run reaches it. If you rely on EXPIRED, track one keyword, URL or specials category per run (each gets its own saved state automatically), and treat an EXPIRED row as "not seen this run" rather than proof of delisting.

A product's rank on the results page is excluded from change detection, since Kogan's own promoted items can reshuffle every other card's position between fetches independent of any real product change. If a product's detail page or reviews genuinely fail to fetch on a given run, that gap is carried forward from the last known value for comparison purposes only, so a transient fetch failure never reads as a mass update; the dataset row itself always shows exactly what that run fetched. The incremental baseline stores a compact snapshot per product; the review text array is left out of that snapshot to keep it small, while reviewCount (a single number) stays in the comparison, so a change in the number of reviews collected is still detected. Because reviewCount counts only the reviews collected, new reviews on a product that already has more than Max reviews per product do not register as a change; set it to 0 if review volume matters to you.

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 product, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify, Settings, API & Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

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

ParameterTypeDefaultDescription
modestringsearchsearch for keyword and filters, url for pasted links.
queriesarray(none; prefilled with ["headphones"])Keywords to search (search mode). Each is searched separately.
storestringauStore region: au, nz or us.
brandstring(none)Limit to one brand, e.g. Kogan or Samsung (search mode). Type it however you like, the actor normalizes the spelling for you. Confirmed for single-word brand names; multi-word brands are not confirmed to narrow, so search those by keyword instead.
sortBystringrelevancerelevance, price_asc, price_desc, newest or rating. Kogan inserts some promoted items regardless of sort.
specialsCategorystring(none)Browse hot-deals, clearance or smart-savers as an extra search target (search mode).
urlsarray(none; prefilled with a sample search URL)Category or search URLs to scrape (url mode). Each URL is walked from its first page.
minPriceinteger(none)Keep products priced at or above this amount. Applies in both modes.
maxPriceinteger(none)Keep products priced at or below this amount. Applies in both modes.
fetchDetailsbooleantrueOpen each product page for full description, all images, category, condition and rating. Adds one request per product.
fetchReviewsbooleanfalseAlso collect customer reviews for each product. Adds requests per product.
maxReviewsPerProductinteger20Cap on reviews collected per product when reviews are on. Use 0 for all available reviews.
maxItemsinteger6Maximum number of products to return across the whole run, split evenly between keywords and the specials category. Use 0 for unlimited.
maxPagesinteger0Optional safety cap on result pages walked per keyword, URL or specials category. Use 0 to walk every page.
resumeFromRunIdstring(none)ID of a previous run of this actor (or a dataset ID). Products already in that dataset are skipped, so this run returns only new products.
incrementalModebooleanfalseTurn on for daily or recurring monitoring of the same search.
stateKeystring(none)Name a monitoring campaign, or leave empty to derive one automatically from the search scope.
emitUnchangedbooleanfalseAlso return (and bill) products unchanged since the last run, marked UNCHANGED.
emitExpiredbooleanfalseAlso return (and bill) products no longer found, marked EXPIRED, only after a complete scan.
proxyobjectApify Proxy, residential, AUConnection settings. The actor currently always connects through Apify Proxy's residential group in the store's country, whatever is set here.
mcpConnectorsarray(none)Optional: send a summary of each product to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"store": "au",
"url": "https://www.kogan.com/au/buy/sample-product-slug-000000/",
"title": "Sample 55 inch 4K Smart TV",
"brand": "Kogan",
"sku": "ABC-000000",
"gtin": "0000000000000",
"price": 499,
"priceMax": 549,
"originalPrice": 699,
"originalPriceLabel": "Was",
"discountAmount": 200,
"discountPercent": 28.6,
"isOnSpecial": true,
"specialsCategory": "clearance",
"currency": "AUD",
"availability": "InStock",
"category": "TVs",
"condition": "New",
"description": "Full product description text appears here when details are fetched.",
"image": "https://assets.kogan.com/images/sample/000000/1-000000.jpg",
"images": ["https://assets.kogan.com/images/sample/000000/1-000000.jpg"],
"averageRating": 4.8,
"ratingCount": 166,
"productId": "000000000",
"position": 3,
"searchMode": "search",
"reviewCount": 1,
"reviews": [
{
"reviewId": 0,
"author": "Sample Reviewer",
"rating": 10,
"stars": 5,
"comment": "Great value for the price.",
"reviewerType": "kogan",
"reviewDate": "2026-01-01T00:00:00",
"isK1Member": null,
"helpfulCount": 0
}
]
}

Plan Requirement

The actor connects through Apify Proxy's residential group in the store's country (in URL mode, the store of the first URL), so your Apify account needs residential proxy access. Without it, the run fails with a connection message instead of returning an empty dataset.

FAQ

How much does it cost?

You pay per product returned, plus a detail-page charge per returned product when Fetch product details or Fetch customer reviews is on (reviews need the product page to find the review feed), and a per-review charge when reviews are on. The Pricing tab shows the current rates. Use Max products to cap the cost of any run.

This actor collects only publicly available product data. You are responsible for how you use it: follow Kogan's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product images, descriptions and reviews 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 mode. Each run then returns only new and updated products (plus reappeared ones once Emit expired has been on), and unchanged ones are not billed unless you ask for them.

What is the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues one specific interrupted run from a pasted run or dataset ID; it is a one-off delta, and it restarts each search from its first page (see its limitation above). Incremental mode remembers the search itself, run after run, so you never have to paste an ID; each scheduled run reports what changed since the last one.

Why are some products missing, or marked EXPIRED while still on Kogan?

Two known limitations, described under "Pagination and page caps" and "Resume and recurring updates". First, when one run covers several keywords, URLs or a specials category, a later one stops as soon as a page holds only products an earlier one already returned, so its deeper pages are skipped. Second, a results page that fails to load is treated as the end of that search. With Emit expired on, products the run did not reach for either reason are marked EXPIRED even though they are still listed, and come back as REAPPEARED on a later run. Run overlapping keywords or URLs as separate runs, and treat EXPIRED as "not seen this run" rather than proof of delisting.

Why did my run fail instead of returning an empty dataset?

If not one request could be read from the site, the run stops with a clear message so "no products matched" is never confused with "nothing could be read". Run it again in a few minutes. If only some keywords or URLs could be read, you still get what was found.

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.

๐Ÿ”— Want more e-commerce data?

Pair this actor with these related scrapers from the same team:

๐Ÿ”Œ PB Tech Scraper
Scrape pbtech.co.nz products with full specifications, price, brand, condition, per-store...
๐Ÿ›’ Officeworks Scraper
Scrape Officeworks products by keyword, category, or URL. Extract names, brands, prices...
๐Ÿ›’ Chemist Warehouse AU
Scrape chemistwarehouse.com.au products with prices, RRP, discounts, stock, images...
๐Ÿ›’ Naver Shopping Scraper
Scrape Naver Shopping products by Korean or English keyword, or by URL. Returns 190+...
๐Ÿ›’ Harvey Norman Scraper
Scrape Harvey Norman Australia products: name, brand, price, was-price / discount...
๐Ÿ›’ SHEIN Scraper
Scrape SHEIN product listings by keyword or from any category, sale or search link...

๐Ÿ‘‰ Browse all abotapi scrapers

๐Ÿ’ฌ Support

  • ๐Ÿž 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 contact@abotapi.com.
  • โญ Enjoying it? A quick review on the actor page helps other users find it.