Dan Murphy’s Scraper icon

Dan Murphy’s Scraper

Scrape Dan Murphy’s products by category, keyword, or specials. Extract 45+ fields, including regular, sale and member prices, case and unit pricing,…

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

Dan Murphy’s Scraper at a glance

Dan Murphy’s Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes stock code, product, brand, department and url, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 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
Web data
Pricing
$2.00 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
30 options

Scrape Dan Murphy’s products by category, keyword, or specials. Extract 45+ fields, including regular, sale and member prices, case and unit pricing, stock, ratings, reviews, country, variety, and ABV. Incremental mode tracks changes.

What Dan Murphy’s Scraper can do

  • Two ways to find products. Browse a department (with sub-department, brand, country, region and style filters), or paste category, style and product links directly. No need to build URLs by hand. Beer, spirits, whisky, accessories and gifts answer today; the site's data service rejects the wine, premix and some other routes right now, and the run log says so instead of returning an empty list.
  • Every price that applies, at once. Regular price, sale price, member-only offers, case pricing and per-unit pricing, so you always know which price a shopper actually pays.
  • 45+ fields per product. Ratings, review counts, stock levels, country of origin, variety/style, ABV, standard drinks, awards, closures and more.
  • Specials and member-offer filters in both modes. Narrow any department, sub-department or pasted category link to only current offers or member deals.
  • Built for scheduled price-watch runs. Incremental mode classifies every product NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED between runs, so a recurring schedule reports only what changed.
  • Optional detail-page enrichment. Switch on rich descriptions, tasting notes and recommended products only when you need them, charged only for the products it actually fetches.

Choose what to collect

These inputs let you configure Dan Murphy’s Scraper - Prices, Stock, Ratings & Specials. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredSearch mode walks a department (optionally a sub-department, a keyword, a brand, specials-only). URL mode walks any category route or product link you paste, multiple allowed, pagination walks forward automatically.

Choices: search, url

departmentstringDepartment route. Beer, spirits, whisky, accessories and gifts answer today; the site's backend currently rejects several others (the wine, premix, other-drinks, zero-alcohol and food routes answer 'Category does not exist'). A rejected department is reported in the run log, and a run where every scope was rejected fails with that message instead of finishing empty. Keep the enum values: the site may re-enable them.

Choices: beer, red-wine, white-wine, champagne-sparkling, spirits, whisky, fortified-wine, premix, other-drinks, zero-alcohol-drinks, accessories, food-snacks, gifts

subDepartmentstringSub-department name, matched case-insensitively against the department's own list (e.g. 'Craft Beer' or 'craft-beer' for /beer/craft-beer, 'Scotch Whisky' for /whisky/scotch-whisky, 'Vodka' for /spirits/vodka). A name that matches nothing stops that scope with an error listing the valid values. Leave empty for the whole department.
searchTermstringFree-text search. If given, a keyword scope runs in addition to the department scope.
brandstringBrand name or slug, matched case-insensitively against the department's brand list ('Stone & Wood' or 'stone-and-wood', '4 Pines'). A brand that matches nothing stops that scope with an error listing the valid brands; it is never silently ignored. Search mode only.
urlsarrayCategory routes (/beer/craft-beer, /whisky/scotch-whisky, /spirits) and/or product links (/product/{code}/{name}). Multi-URL supported. Pagination starts at the pasted URL's first page and walks forward. The specials, member-offers, price and facet filters in the next section apply to category URLs too. Search links (/search?searchTerm=...) run a keyword scope; if the site answers the term with a category or style page, that page is walked instead. A link the site rejects is reported in the run log. A ?page=N suffix is not used (the walk starts at page 1). Left untouched in url mode, the five example links are scraped (a sub-department, a multi-word sub-department, a department, a department /all link and a product link).
specialsOnlybooleanOnly products with a current offer (the site's currentoffer facet). Applies to the department scope in search mode and to every category URL in url mode (not to the keyword search or pasted product links).
Show 23 more inputs
More input fields
InputWhat it controls
memberOffersOnlybooleanOnly products carrying a member (My Dan Murphy's) offer. Applies to the department scope in search mode and to every category URL in url mode (not to the keyword search or pasted product links).
minPricenumberOnly products priced at or above this amount (the site's native price filter). Leave empty for no lower bound. Applies to search mode and to every URL in url mode.
maxPricenumberOnly products priced at or below this amount. Leave empty for no upper bound.
countrystringCountry of origin, matched case-insensitively against the site's own country facet (e.g. 'Australia'). Comma-separated for several. Applies to the department scope, the keyword scope and every category URL.
regionstringRegion facet, matched case-insensitively against what the site offers for that department (e.g. 'Geelong'). Comma-separated for several.
stylestringStyle facet of the department (beer style such as 'IPA' or 'Pale Ale', whisky style...), matched case-insensitively. Comma-separated for several.
varietystringThe site's variety facet, which lists the department's types (e.g. 'Craft Beer', 'Scotch Whisky'). Same list as the sub-department, applied as a filter. Comma-separated for several.
sortBystringNative site sort applied to every scope. With a small Max products this selects the cheapest / most expensive items.

Choices: Relevance, Name, PriceAsc, PriceDesc

fetchDetailsbooleanFetch each pushed product's detail payload (tasting/rich description, recommendations). Adds a per-product surcharge, see pricing. Listing tiles already carry prices, member offers, ratings, stock and attributes without this.
maxPagesintegerCap on pages walked per scope. 0 walks until the department is exhausted.
maxProductsintegerCap on products scanned, applied to each scope separately (the keyword search, the department and every pasted category link each get their own allowance; pasted product links are not counted). Default 20. 0 = unlimited (a full department can be tens of thousands of products).
resumeFromRunIdstringContinue ONE interrupted run: products already collected by that run are skipped. Cannot be combined with incremental mode.
incrementalModebooleanFor scheduled monitoring: the run remembers the previous run of the SAME search and classifies every product NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. Compared: every output field (price, was price, special and member-offer flags, case/single/any-six prices, stock quantity, purchasable/delivery flags, name, description, ratings, images...). Never compared: scrapedAt, categoryUrl (the link a row was collected from) and the detail-enrichment flags, plus anything listed in 'Ignore fields when detecting changes'. Defaults off, no existing user's runs change until they opt in.
stateKeystringManual key for the incremental baseline. Leave empty to auto-key on mode + department + filters, so two different filter setups never share a baseline.
emitUnchangedbooleanIncremental mode only. Also return (and bill) products classified UNCHANGED.
emitExpiredbooleanIncremental mode only. Also return (and bill) products that vanished since the last complete run. When Max products is above 0 the EXPIRED rows are limited to Max products minus the rows already pushed in the run.
changeScopestringIncremental mode only. 'all' compares every field except the volatile ones. 'priceAndStock' marks a product UPDATED only when its price, was-price, special/member-offer flags, case/single/any-six prices, stock quantity or purchasable/delivery flags move; descriptions, images and labels never create an UPDATED row. Changing this under an auto state key starts a fresh baseline; use a State key to keep one.

Choices: all, priceAndStock

compactUpdatesbooleanIncremental mode only. UPDATED and EXPIRED rows carry only ids, url, name, current price/stock and priceChanges {field: {old, new}} instead of the full record. NEW rows stay full. Compact UPDATED rows skip detail enrichment, 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 stock fields (stockQty, purchasable) 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 variations.image drop that key from every array element. scrapedAt, categoryUrl and the detail-enrichment flags are always ignored.
mcpConnectorsarrayConnector ids (authorized under Apify → Settings → Integrations) to push results into, Notion and compatible MCP targets. Optional.
notionParentPageUrlstringFor a Notion MCP connector: the parent page the results are written under. Optional.
maxNotifyListingsintegerCap on items exported to connectors per run. 0 exports everything pushed.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

stockcodeStock code (text)
nameProduct (text)
brandBrand (text)
departmentDepartment (text)
urlURL (text)
categoryUrlCollected from (text)
changeTypeChange type (incremental mode) (text)
pricePrice (AUD) (number)
wasPriceWas price (number)
isOnSpecialOn special (boolean)
isOnOfferHas a current offer (boolean)
isMemberOfferMember offer (boolean)
Show 31 more fields
memberOfferLabelMember offer label (text)
casePriceCase price (number)
singlePriceSingle price (number)
ratingRating (number)
reviewCountReviews (number)
countryCountry (text)
styleStyle / variety (text)
sizeSize (text)
abvABV (text)
stockQtyStock (number)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (date)
lastSeenAtLast seen (date)
scrapedAtScraped at (text)
descriptiondescription (text)
richDescriptionrichDescription (text)
tastingNotestastingNotes (text)
foodMatchfoodMatch (text)
awardaward (text)
closureclosure (text)
standardDrinksstandardDrinks (text)
packageSizepackageSize (text)
unitunit (text)
purchasablepurchasable (text)
deliveryOnlydeliveryOnly (text)
sashsash (text)
badgesBadges (array)
imageUrlimageUrl (text)
imageLargeimageLarge (text)
recommendedStockcodesrecommendedStockcodes (text)
detailFetchedDetail fetched (text)

Example output

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

{
  "stockcode": "812345",
  "name": "Sample Brewing Co Pale Ale 6x355mL Cans",
  "url": "https://www.danmurphys.com.au/product/812345/sample-brewing-co-pale-ale-6x355ml-cans",
  "description": "Sample Brewing Co Pale Ale 6x355mL Cans",
  "brand": "Sample Brewing Co",
  "department": "beer",
  "categoryUrl": "https://www.danmurphys.com.au/beer",
  "badges": [
    "Top seller"
  ],
  "price": 45.99,
  "wasPrice": 52.99,
  "isOnSpecial": true,
  "isOnOffer": true,
  "isMemberOffer": true,
  "memberOfferLabel": "Member Price",
  "promotionType": "member offer",
  "casePrice": 179.99,
  "singlePrice": 52.99,
  "inAnySixPrice": 42.99,
  "unit": "Each",
  "packageSize": "6 pack",
  "abv": "4.5%",
  "standardDrinks": "9.8",
  "country": "Australia",
  "style": "Pale Ale",
  "size": "355mL",
  "rating": 4.3,
  "reviewCount": 87,
  "stockQty": 240,
  "purchasable": true,
  "imageUrl": "https://cdn.danmurphys.com.au/images/812345-medium.jpg",
  "scrapedAt": "2026-09-30T04:00:00Z",
  "changeType": "UPDATED",
  "changedFields": [
    "price",
    "stockQty"
  ],
  "firstSeenAt": "2026-08-01T04:00:00Z",
  "lastSeenAt": "2026-09-30T04:00:00Z"
}

Ways to use this data

  • Price monitoring and comparison tools: track regular, sale and member-offer prices across departments to power price-history or comparison sites.
  • Liquor retailers and distributors: watch a competitor's specials, stock levels and new listings in your category.
  • Wine and spirits content creators: build rating- and review-based recommendation lists by variety, style, country or ABV.
  • Market researchers and analysts: track assortment changes, award-winning products and how often member offers appear over time.
  • Personal shopping tools and alerts: get notified when a tracked product or department goes on special.

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 Dan Murphy’s Scraper return?

The documented output for Dan Murphy’s Scraper includes stock code, product, brand, department, url, collected from, change type (incremental mode) and price (aud). Availability of each field depends on the source page and the selected mode.

How much does Dan Murphy’s Scraper cost?

It costs $2.00 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.

Why does the "wine" department not work?

wine on its own is not a department, and the site's data service currently rejects the wine routes too (red-wine, white-wine, champagne-sparkling, fortified-wine and the premix, other-drinks, zero-alcohol and food routes answer "Category does not exist"; checked live on 2026-10-28). The run names the rejected route in the log, and a run where nothing else was requested fails with that message instead of finishing empty. Beer, spirits, whisky, accessories and gifts answer. The wine values stay selectable so they work again as soon as the site re-enables them.

Can emitting expired products push more rows than my Max products setting?

No: when Max products per scope is above 0, EXPIRED rows never add to a run that has already reached that number. With Emit expired products on, the EXPIRED rows pushed (and billed) in a run are capped at Max products per scope minus every product row already pushed in that run, pasted product links included. Because the setting is applied per scope, a run with several scopes may already have pushed more rows than that number, and then no EXPIRED rows are emitted in that run; products beyond the cap stay remembered and are neither emitted nor billed in this run. With Max products per scope set to 0 (unlimited) the EXPIRED batch is not capped: every product missing from a complete scan is pushed as EXPIRED, so a scope that shrank a lot since the last complete run can bill many EXPIRED rows. Start a fresh State key for scopes that can shrink sharply, or check the run log's change-count summary before widening a schedule.

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 or another compatible connector.

Ready to collect with Dan Murphy’s Scraper?

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