Harvey Norman Scraper icon

Harvey Norman Scraper

Scrape Harvey Norman Australia products: name, brand, price, was-price / discount, specifications, image gallery, GTIN, department, stock, dimensions,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Harvey Norman Scraper at a glance

Harvey Norman Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes title, name, change type (incremental mode), brand and price, 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
25 options

Scrape Harvey Norman Australia products: name, brand, price, was-price / discount, specifications, image gallery, GTIN, department, stock, dimensions, rating and customer reviews. Search by keyword with brand, price and rating filters, or paste product / listing URLs.

What Harvey Norman Scraper can do

  • Two ways to find products. Search by keyword with brand, price and rating filters, or paste product and listing URLs directly. Pick one per run; keywords and a Specials category can be combined within search mode.
  • Store-wide specials on demand. Scrape the Super Deals or Clearance collections directly, alongside or instead of your keywords, or paste any department-scoped sale listing URL.
  • One flat record per product. Identity, price, discount, rating and review count come back on every product, list view included, with no detail fetch required.
  • Full detail on demand. Switch on full specifications, image gallery, description, department, dimensions and reviews per run, and pay the enrichment surcharge only for products actually enriched. Pasted product URLs always get full detail; the toggle there only adds reviews.
  • Reviews with an aggregate summary. Per-review rating, body, author, date, verified-purchase flag and helpful votes, plus a star distribution and recommended count.
  • Unlimited catalogue walks. Set both Max pages per listing and Max products to 0 to walk an entire department; the run stops naturally once the storefront's own result total is reached, never on an artificial page cap.

Choose what to collect

These inputs let you configure Harvey Norman Scraper - Products, Prices, Specs & Reviews. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredChoose 'search' to use keywords and filters, or 'url' to scrape specific product or listing URLs you paste below.

Choices: search, url

queriesarrayOne or more keywords to search, for example 'oled tv' or 'gaming laptop'. Each keyword resolves to its best-matching department listing and is walked page by page.
specialsCategorystringOptional. Scrape a Harvey Norman specials collection instead of (or in addition to) your keywords: 'Super Deals' is the store-wide hottest-deals grid and 'Clearance' is the run-out / reduced-to-clear range. Discounted products carry the was-price, discount amount and percent, and the promotion label. Leave empty to search by keyword only. To scrape a department-scoped sale (e.g. TV sale, laptop sale), use URL mode and paste the sale listing URL.

Choices: super-deals, clearance

urlsarrayProduct, listing, search-results or specials URLs to scrape, for example a product page ending in .html, a department listing (add ?p=2 to start at a later page), a /catalogsearch/result/?q=keyword search page, or /super-deals and /clearance. Multiple URLs supported.
brandstringOptional. Keep only products whose brand or name matches this value, for example 'LG' or 'Samsung'.
minPriceintegerOptional. Only keep products priced at or above this amount (AUD).
maxPriceintegerOptional. Only keep products priced at or below this amount (AUD).
Show 18 more inputs
More input fields
InputWhat it controls
minRatingintegerOptional. Only keep products with an average customer rating at or above this value (1 to 5).
sortBystringOrdering applied to the collected results.

Choices: relevance, priceAsc, priceDesc, ratingDesc, nameAsc, nameDesc

detailEnrichmentbooleanFor each product, also open its page to collect the full specification set, image gallery, description, department, dimensions and an aggregate review summary plus a reviews[] array. Adds one request per product. Off by default (list view returns identity, price and aggregate rating only). Each row that reaches the dataset with its page read bills the detail-enrichment event: one detail-enrichment unit per started block of 10 reviews delivered on the row, minimum 1 unit (the page read is included in the first block): 0 to 10 reviews = 1 unit, 11 to 20 = 2, 21 to 30 = 3. The count is the reviews actually returned on the row (capped by Max reviews per product), not the product's total review count (see the Pricing tab).
maxReviewsPerProductintegerCap on reviews collected per product when detail enrichment is on. Use 0 for all available reviews, up to 1000 per product.
maxItemsintegerMaximum number of products to return across the whole run. Use 0 for unlimited.
maxPagesintegerCap on result pages walked per keyword / URL. 0 = unlimited (default): walk every page, the run still stops naturally once the storefront's own result total is reached or a page repeats with no new products, so there is no artificial page cap. Set a positive number to cap how deep each individual search goes.
resumeFromRunIdstringOptional. 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 monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn 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. Compared: every output field, including price, was price, discount, special flag, stock status, name, brand, description, specifications and categories. Never compared (still in the output): rating, reviewCount, ratingDistribution, recommendedCount, reviews, reviewsCollected, imageUrl, images, smallImage, promotion, promotionData, cashback, offers, priceRange, startingFromText, hidePrice, callToAction, callToActionUrl, urlKey, urlSuffix, metaTitle, metaDescription, metaKeyword, and searchMode (how a row was reached), plus anything listed in 'Ignore fields when detecting changes'. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately for each distinct search/filter setup (or by State key below).
stateKeystringOptional. 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 your search/filter/detail settings, different searches then never mix state with each other.
emitUnchangedbooleanOff 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.
emitExpiredbooleanOff 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: never when Max products or Max pages capped it, when Resume was used, when a pasted listing URL started after page 1, or when filters are combined with a shared State key. EXPIRED rows are limited to Max products minus the rows already returned. This returns, and bills, extra synthetic rows.
changeScopestringIncremental mode only. 'all' compares every field except the volatile ones. 'priceAndStock' marks a product UPDATED only when its price, was price, discount, special flag or stock status moves; descriptions, images, reviews and promotion text never create an UPDATED row. Changing this keeps the saved state; stored products are compared again under the new scope.

Choices: all, priceAndStock

compactUpdatesbooleanIncremental mode only. UPDATED and EXPIRED rows carry only ids, url, name, current price and stock status, and priceChanges {field: {old, new}} instead of the full record. NEW rows stay full. Compact UPDATED rows carry no detail or reviews, so they carry no detail-enrichment charge.
expireAfterMissedScansintegerIncremental mode only, with 'Emit expired products'. A product is marked EXPIRED only after it was missing from this many consecutive complete scans (1 = the first). EXPIRED means the product dropped out of the scanned listing; without a detail check a listing drop and a delisting look the same, so use the stockStatus field for availability.
ignoreFieldsForChangesarrayIncremental mode only. Field names to leave out when deciding whether a product changed (kept in the output, excluded from the comparison and from changedFields). Dotted paths such as specifications.Colour drop that nested key. Always ignored: rating, reviewCount, ratingDistribution, recommendedCount, reviews, reviewsCollected, imageUrl, images, smallImage, promotion, promotionData, cashback, offers, priceRange, startingFromText, hidePrice, callToAction, callToActionUrl, urlKey, urlSuffix, metaTitle, metaDescription, metaKeyword and searchMode. Changing this keeps the saved state; stored products are compared again under the new list.
mcpConnectorsarrayOptionally 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).
notionParentPageUrlstringURL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap 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.

titleTitle
nameName
changeTypeChange type (incremental mode) (text)
brandBrand
pricePrice
wasPriceWas
isOnSpecialOn special
currencyCurrency
ratingRating
reviewCountReviews
departmentDepartment
stockStatusStock
Show 17 more fields
skuSKU
imageUrlImage (image)
urlURL (link)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)
gtinGTIN
descriptionDescription
specificationsSpecifications (object)
imagesGallery (array)
dimensionsDimensions (object)
mainFeaturesMain features (array)
categoryPathCategory path (array)
ratingDistributionRating distribution (object)
reviewsCollectedReviews collected
reviewsreviews
priceChangesPrice changes (object)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "productId": 481027,
  "sku": "OLED55ACM2026",
  "title": "Acme 55-inch 4K OLED Smart TV",
  "name": "Acme 55-inch 4K OLED Smart TV",
  "brand": "Acme",
  "url": "https://www.harveynorman.com.au/acme-55-inch-4k-oled-smart-tv.html",
  "imageUrl": "https://www.harveynorman.com.au/media/catalog/product/a/c/acme-55-oled-front.jpg",
  "price": 2895,
  "wasPrice": 3295,
  "discountAmount": 400,
  "discountPercent": 12.14,
  "isOnSpecial": true,
  "promotion": "Save $400",
  "currency": "AUD",
  "rating": 4.64,
  "reviewCount": 87,
  "brandUrl": "https://www.harveynorman.com.au/brands/acme",
  "description": "Key features: vivid OLED panel with deep blacks and wide viewing angles...",
  "shortDescription": "A 55-inch 4K OLED television with smart features and low-latency gaming.",
  "specifications": {
    "Product Type": "OLED TVs",
    "Screen Size": "55 inch",
    "Resolution": "4K Ultra HD",
    "Barcode (GTIN)": "9312345678901"
  },
  "images": [
    "https://www.harveynorman.com.au/media/catalog/product/a/c/acme-55-oled-front.jpg",
    "https://www.harveynorman.com.au/media/catalog/product/a/c/acme-55-oled-side.jpg"
  ],
  "stockStatus": "IN_STOCK",
  "gtin": "9312345678901",
  "department": "Audio Visual",
  "category": "OLED TVs",
  "categoryPath": "tv-audio/tvs/oled-tvs",
  "dimensions": {
    "height": 82.6,
    "depth": 4.5,
    "width": 124.4,
    "weight": 21.3,
    "colour": "Black"
  },
  "ratingDistribution": {
    "1": 1,
    "2": 2,
    "3": 3,
    "4": 15,
    "5": 66
  },
  "recommendedCount": 80,
  "reviewsCollected": 20,
  "reviews": [
    {
      "reviewId": "700000001",
      "rating": 5,
      "title": "Great picture for the price",
      "body": "Deep blacks and vivid colour, very happy with this TV.",
      "author": "SampleShopper",
      "location": "VIC",
      "date": "2026-04-12T10:30:00.000+00:00",
      "verifiedPurchase": true,
      "isRecommended": true,
      "helpfulCount": 3,
      "notHelpfulCount": 0,
      "isSyndicated": false,
      "pros": [
        "Picture quality"
      ],
      "cons": null
    }
  ]
}

Ways to use this data

  • Price monitoring and deal alerts: track current and was-prices, discount amounts and the on-special flag across a department or the Clearance range.
  • Competitive and assortment research: compare specifications, stock status and ratings across brands within a category.
  • Review and reputation analysis: collect per-review ratings, pros and cons and verified-purchase flags to spot recurring product issues.
  • Catalogue monitoring: schedule Incremental mode against a department or keyword to get only new and updated products every day (and removed ones too, with Emit expired on and no caps).

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 Harvey Norman Scraper return?

The documented output for Harvey Norman Scraper includes title, name, change type (incremental mode), brand, price, was, on special and currency. Availability of each field depends on the source page and the selected mode.

How much does Harvey Norman 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. Later runs then return only new and updated products; unchanged ones are neither returned nor billed unless you turn on Emit unchanged.

What's the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues one specific interrupted or earlier crawl by skipping products already in a pasted run or dataset. Incremental mode is for running the exact same search again and again on a schedule; it remembers the state itself, so you never paste a run ID.

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

If every request to Harvey Norman was refused, the run stops with a clear connection message instead of completing with zero products, so "no matches" is never confused with "nothing could be read". Run it again in a few minutes, or check the connection warnings in the run log.

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.

Ready to collect with Harvey Norman Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.