JB Hi-Fi Product Scraper & Price Tracker (Australia) avatar

JB Hi-Fi Product Scraper & Price Tracker (Australia)

Pricing

from $0.28 / 1,000 product scrapeds

Go to Apify Store
JB Hi-Fi Product Scraper & Price Tracker (Australia)

JB Hi-Fi Product Scraper & Price Tracker (Australia)

JB Hi-Fi scraper: the newest 25,000 products or any collection, filtered by brand (APPLE, SAMSUNG, SONY...), sale and publish time. One row per product: AUD price range, price before markdown, per-seller offers and SKU, stock tag, photo, timestamps. For JB Hi-Fi price drop and new-product watch.

Pricing

from $0.28 / 1,000 product scrapeds

Rating

0.0

(0)

Developer

Superslow Sloth

Superslow Sloth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

A JB Hi-Fi scraper and JB Hi-Fi price tracker for www.jbhifi.com.au, Australia's largest home entertainment retailer. It reads the catalogue newest-published first and returns one flat row per product: title, brand (APPLE, SAMSUNG, SONY, LEGO), the price range in AUD, the price before markdown and the discount, whether it can be bought, the shop's stock tag (InStock, LimitedStock, AwaitingStock), and every offer as a variant with its own SKU, price and stock flag. Filter by brand, by sale and by publish time (24 hours, 3 days) and schedule it to get a new-product alert, or run it daily and compare rows by handle to watch each product's price drop.

No account, no API key, no login, no browser. JB Hi-Fi's category pages are rendered in the browser and hold no products in the HTML, but the shop's open product feed does: one request returns 250 products. JB Hi-Fi published about 800 products in the 24 hours to 2026-10-27, so a 24-hour window is four requests.

Input

FieldNotes
brandsReturn only products by these brands, spelled as JB Hi-Fi spells them in vendor: APPLE, SAMSUNG, SONY, GOOGLE, LEGO, DELL, HP, ASUS. Case and extra spaces are ignored; otherwise the match is exact. Leave empty for every brand.
onlyOnSaleReturn only products where at least one variant is priced below its price before markdown (on_sale). Only about 0.7% of products carry one (see below), so this reads many pages to find a few rows.
publishedAfterReturn only products that went live after this moment: a span back from now (24 hours, 3 days, 90 minutes, 1 week), a date (2026-10-16, midnight UTC) or a date-time (2026-10-16T12:00:00Z, no offset means UTC). This is the product's publish time (published_at), not the record's creation time (created_at). On the whole catalogue the run stops at the first older product, since the feed is newest-published first. Leave empty for no cut-off.
collectionsJB Hi-Fi collections to read instead of the whole catalogue, one per line: the name from the address (android-phones_3binxgvkinsnudz6imeoau) or the link (https://www.jbhifi.com.au/collections/android-phones_3binxgvkinsnudz6imeoau). The shop's category pages (televisions, sale, apple-iphone) are not collections here and fail as unknown. A collection is in the shop's own order, not newest first, so publishedAfter filters it but cannot stop early. Leave empty to read the whole catalogue, newest first.
maxItemsProducts to return per collection, or for the whole catalogue (default 250, up to 25,000). 250 per page.
proxyConfigurationApify datacenter proxy by default.

Filtered products are read but not returned and not charged, and do not count toward maxItems.

Example input, products that went live on JB Hi-Fi in the last day:

{
"publishedAfter": "24 hours",
"maxItems": 1000
}

Example input, every Apple product among the newest 25,000, to snapshot prices:

{
"brands": ["APPLE"],
"publishedAfter": "",
"maxItems": 3000
}

Example input, everything currently marked down:

{
"onlyOnSale": true,
"publishedAfter": "",
"maxItems": 500
}

Output

Prices are numbers in Australian dollars; currency is AUD. The feed is not re-priced by the visitor's country: the same 250 products carried the same prices from exits in the United States, Colombia, Brazil, Saudi Arabia and Japan, and under every localization cookie tried (2026-10-27). A field the shop did not send is null, never 0 or "".

FieldNotes
query, positionThe shop URL (whole catalogue) or collection URL that first found the product, and its place in that list (1 is newest on the catalogue, 250 per page).
storewww.jbhifi.com.au.
product_id, handle, urlShopify's product id (a string), the URL handle and the product link. Use handle or product_id to follow one product between runs.
title, vendor, product_typeApple iPhone 17 Pro Max 512GB (Silver), APPLE, COMMUNICATIONS. vendor is the brand in the shop's upper case. product_type is one of 19: MOVIES, IT, ACCESSORIES, TELCO SERVICES, MUSIC, Wearables & Outdoor, CAMERAS, COMPUTERS, AUDIO, SMALL APPLIANCES...
price, price_maxThe lowest and highest current variant price. On a marketplace product (below) that is the cheapest and dearest seller's price.
original_price, original_price_max, on_sale, discount_percentPer variant its compare_at_price when that is above its price, otherwise its price. on_sale is true when at least one variant is reduced, and discount_percent is the largest reduction, (1 - price / compare_at_price) * 100, one decimal place, worked out from the prices. Null when nothing is reduced, never 0.
available, variant_count, available_variant_countWhether any variant can be bought now, how many variants there are, and how many can be bought.
tagsBrand:Apple and a stock-status tag: InStock, LimitedStock, AwaitingStock, NoLongerAvailable, TemporarilyUnavailable, ComingSoon. The status tag is the only stock signal finer than available.
option_names["Title"] on JB Hi-Fi's own stock, ["Seller"] on a marketplace product.
variantsOne entry per offer: variant_id, title (the seller's name on a marketplace product, Default Title on JB Hi-Fi's own), sku, price, compare_at_price, available, options.
published_atWhen the product went live, ISO 8601 with the shop's offset. What the feed is ordered by and what publishedAfter compares against. A relisted product gets a new one.
created_at, updated_atWhen the record was created (can be a year older than published_at) and last changed. The shop rewrites updated_at in bulk, so it is not a price-change time.
image_url, image_countThe first photo on cdn.shopify.com, as sent, and how many photos there are.

Example row (real values, 2026-10-27, exactly as the actor returns it):

{
"query": "https://www.jbhifi.com.au",
"position": 4,
"store": "www.jbhifi.com.au",
"product_id": "7334830899401",
"title": "Apple iPhone 17 Pro Max 512GB (Silver)",
"handle": "apple-iphone-17-pro-max-512gb-silver",
"url": "https://www.jbhifi.com.au/products/apple-iphone-17-pro-max-512gb-silver",
"vendor": "APPLE",
"product_type": "COMMUNICATIONS",
"tags": [
"Brand:Apple",
"LimitedStock"
],
"created_at": "2025-09-10T06:38:03+10:00",
"published_at": "2026-10-26T22:02:24+11:00",
"updated_at": "2026-10-27T07:04:42+11:00",
"image_url": "https://cdn.shopify.com/s/files/1/0024/9803/5810/files/816127-Product-0-I-638930469805142860.jpg?v=1757904007",
"image_count": 18,
"currency": "AUD",
"price": 2399.0,
"price_max": 2399.0,
"original_price": 2599.0,
"original_price_max": 2599.0,
"on_sale": true,
"discount_percent": 7.7,
"available": true,
"variant_count": 1,
"available_variant_count": 1,
"option_names": [
"Title"
],
"variants": [
{
"variant_id": "40426204135625",
"title": "Default Title",
"sku": "816127",
"price": 2399.0,
"compare_at_price": 2599.0,
"available": true,
"options": [
"Default Title"
]
}
]
}

Honest nulls and what is not here

  • Most products are not JB Hi-Fi's own stock. 78% of the newest 25,000 (19,519) are marketplace listings: option_names is ["Seller"] and each variant is one seller's offer (153 sellers; Gameology, Hobbyco, Green Gadgets, Desky and Phonnic hold the most). The seller is the variant's title. 936 products have more than one seller, and the sku is the same on each. The other 5,481 are JB Hi-Fi's own stock, with one Default Title variant.
  • Markdowns are rare. Only 169 of 25,000 products (0.7%) send a price before markdown, all of them JB Hi-Fi's own stock and none of the marketplace listings, and every one is above the price. For the rest, discount_percent is null and the way to see a price fall is to compare price between two runs.
  • No ratings, reviews or stock counts. The catalogue feed carries none. available and the stock tag say what the shop shows, nothing more.
  • No product lacks a price. No product in the 25,000 is priced 0.00, has no photo, no product type or a variant without a sku.

Pricing

Pay per event:

  • $0.002 per run (actor-start), charged only after your input is validated, so a run that fails on bad input costs nothing.
  • $0.00028 per product row written (product-scraped), i.e. $0.28 per 1,000 products. A row that is not written is not charged: products filtered by brands, onlyOnSale or publishedAfter, and repeats another collection already returned, are free.

How it fetches

It reads /products.json, the public catalogue feed every Shopify shop serves (and /collections/<name>/products.json for a collection). Measured 2026-10-27: HTTP 200 JSON, 1.03 MB per 250 products (4.1 KB a product), no key or login needed, 100 consecutive pages without a refusal from Apify datacenter addresses. A refusal (403, 429, 430, 5xx), a 200 that is not the feed, or a dropped connection is treated as the address being blocked, and the actor rotates to a fresh one and retries.

Things worth knowing, all measured on 2026-10-27:

  • Newest-published first. published_at never increased down all 100 pages (25,000 distinct products, 2026-10-27 06:31 back to 2026-08-21 15:54, about 66 days). created_at is not in order, which is why the cut-off is on published_at. About 800 products went live in a day and 4,200 in a week.
  • At most 25,000 products per list. Shopify refuses any page beyond page * 250 = 25,000 with HTTP 400. JB Hi-Fi lists more than that (/meta.json says 25,001), so the whole catalogue always ends at the window, about two months back, and a run that reads to it without having returned maxItems rows logs the list as capped. Products published earlier than that are reachable only through a collection.
  • Filters on the feed are ignored. ?vendor=, ?product_type=, ?q= and ?order= return the same page as sending nothing, so brands are matched on the rows. A rare brand on the whole catalogue therefore reads up to 100 pages (about 100 MB, about four minutes); a short publishedAfter window stops long before that.
  • Collections are small and hand-made. The shop lists 13,987 collection handles, 778 of them with any product and none with more than 18; the category names a shopper types (televisions, sale, apple-iphone) are not collections. A collection's count includes unpublished products (kids-sci-fi-movies said 18, its feed held 4). They do reach older products: android-phones_3binxgvkinsnudz6imeoau returned four phones published between February 2025 and July 2026, all four on sale (7.5% to 30.0% off).
  • An unknown collection looks empty. The feed answers an unknown name with an empty list; the actor asks the collection's own record, and a name that does not exist fails instead of being reported as empty.

If JB Hi-Fi changes its feed, the run fails with a message instead of returning empty rows.