Kogan.com Scraper at a glance
Kogan.com Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes title, brand, price, was/rrp price and discount %, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce, Automation, Developer Tools
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 23 options
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.
What Kogan.com Scraper can do
- 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.
Choose what to collect
These inputs let you configure Kogan.com Scraper - Products, Prices, Stock & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose 'search' to use keywords and filters, or 'url' to scrape specific Kogan category/search URLs you paste below. |
queriesarray | One or more keywords to search, for example 'headphones' or 'air fryer'. Each keyword is searched separately. |
storestring | Which Kogan regional store to scrape. Prices, stock and catalogue differ per region. |
brandstring | Optional. Limit results to a single brand, for example 'Kogan' or 'Samsung'. Type it however you like: the actor normalizes the spelling for you. Confirmed for single-word brand names. Multi-word brands such as 'Gorilla Gaming' are not confirmed to narrow, so search those by keyword instead. |
sortBystring | Result ordering. Note: Kogan inserts some promoted items regardless of sort. |
specialsCategorystring | Optional. Browse one of Kogan's own deals grids instead of (or alongside) a keyword search. Adds this as an extra search target; brand/sort filters don't apply to it. Each product also gets originalPrice/discountPercent/isOnSpecial fields when Kogan itself shows a Was/SRP/Don't Pay/RRP reference price. |
urlsarray | Category or search URLs to scrape, for example https://www.kogan.com/au/shop/?q=air+fryer or https://www.kogan.com/au/c/smart-tvs/. Multiple URLs supported. |
Show 16 more inputs
| Input | What it controls |
|---|---|
minPriceinteger | Optional. Only keep products priced at or above this amount (in the store's currency). Applied to each product's price. |
maxPriceinteger | Optional. Only keep products priced at or below this amount (in the store's currency). |
fetchDetailsboolean | Open each product page for full description, all images, category, condition, average rating and rating count. Adds one request per product. |
fetchReviewsboolean | Also collect customer reviews for each product (review text, star rating, author, date). Adds requests per product. |
maxReviewsPerProductinteger | Cap on reviews collected per product when 'Fetch customer reviews' is on (1 to 500). Higher values are capped at 500, and 0 or blank (which used to mean all reviews) now means the 500 maximum. |
maxItemsinteger | Maximum number of products to return across the whole run. Use 0 for unlimited. |
maxPagesinteger | Optional safety cap on result pages walked per keyword/URL/specials category. Use 0 to walk every page; the run still stops automatically once Max products is reached, a page repeats with no new products, or the store's own result total is reached. |
resumeFromRunIdstring | Optional. 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 (a delta). Combine both runs' datasets for the full set. Max products then counts only the new products. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED products. Turn on 'Emit unchanged' or 'Emit expired' only when you also want those products returned (and billed). State is kept separately per keyword/URL/store/brand/price-range/specials-category/detail+review setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the keyword/URL, store, brand, price range, sort, specials category and detail/review settings -- different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search -- not when Max products capped it, Max pages cut a walk short, or Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names that must not make a product count as UPDATED, e.g. 'averageRating', 'ratingCount', 'reviewCount' or 'availability'. Use the top-level field names of the output. The fields are still returned in the output; they just do not trigger a change. Adding or removing a name never causes a wave of UPDATED rows by itself. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
titleTitlebrandBrandpricePriceoriginalPriceWas/RRP pricediscountPercentDiscount %isOnSpecialOn specialcurrencyCurrencyavailabilityAvailabilityaverageRatingRatingratingCountRatingsreviewCountReviewsskuSKUShow 20 more fields
gtinGTINcategoryCategoryspecialsCategorySpecials categorychangeTypeChange type (incremental mode)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)imageImage (image)urlURL (link)productIdProduct IDpriceMaxMax priceoriginalPriceLabelWas/RRP labeldiscountAmountDiscount amountconditionConditiondescriptionDescriptionimagesImages (array)storeStorepositionPositionsearchModeSearch modereviewsReview list (array)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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
}
]
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Kogan.com Scraper return?
The documented output for Kogan.com Scraper includes title, brand, price, was/rrp price, discount %, on special, currency and availability. Availability of each field depends on the source page and the selected mode.
How much does Kogan.com Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
