Dunnes Stores Scraper — Fashion & Home Prices, Sizes, EANs avatar

Dunnes Stores Scraper — Fashion & Home Prices, Sizes, EANs

Pricing

from $1.00 / 1,000 products

Go to Apify Store
Dunnes Stores Scraper — Fashion & Home Prices, Sizes, EANs

Dunnes Stores Scraper — Fashion & Home Prices, Sizes, EANs

Dunnes Stores Ireland (dunnesstores.com) fashion and home scraper: name, brand, EUR price, sale price, sizes, colours, SKU, EAN barcode, availability per size, category path, image, URL; detail rows add description, care, size-fit, origin. Keyword, category or product URL. Pay per result, no login.

Pricing

from $1.00 / 1,000 products

Rating

0.0

(0)

Developer

architek.earth

architek.earth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 days ago

Last modified

Categories

Security

Limited permissions

Share

Recorded run: 50 products from 1 search term in 41 seconds (2026-10-22, build 0.0.206, run dvgJDMAevsOQA9FIA). A bounded canary sample, not a full-catalogue benchmark.

architek.earth — an independent data studio. Pay-per-result scrapers with recorded runs, published canaries and stable schemas, built for people and AI agents.

Dunnes Stores Ireland fashion and home prices, sale prices, sizes, colours, EAN barcodes and availability from dunnesstores.com, by keyword, category or product URL, one row per product with every size nested.

SourceMarketFromStandout fields
Dunnes Stores (dunnesstores.com)Ireland$1.00 / 1,000 productsprice / wasPrice, variants[].ean, variants[].available, categoryPath

✅ Why choose this scraper

Dunnes Stores prices for every size in one row

One product row carries variants[], each with sku, ean, size, colour, price and available; the canary's first jeans row had variantCount: 7. You pay per product, not per size.

Dunnes Stores sale prices per size

A discounted size or colour carries wasPrice. The product's price, maxPrice and onSale are computed from the sizes in stock (all sizes when none is in stock), so a sold-out discounted size does not set the "from" price.

Dunnes Stores EAN barcodes for catalogue matching

variants[].ean is returned on basic rows when Dunnes publishes it, for joins against your own range or another retailer's.

Care, composition and size-fit text

With includeDetails: true, rows add description, detailsAndCare, sizeFit, countryOfOrigin and images. The detail tier is read from the same response, so it adds no requests.

Measured on a schedule

A canary task runs a fixed jeans search on the live site and records rows, inputs and seconds; the hero line above is its latest green run.

⚠️ Worth knowing up front

  • Fashion and home only (Women, Men, Kids, Home, Seasonal, School on dunnesstores.com). Dunnes groceries are on a separate site that this actor does not cover.
  • No stock counts. Dunnes publishes availability per size, not quantities; available is true or false and no count is estimated.
  • Prices are the online prices on dunnesstores.com in EUR. There is no store selector, and store-only promotions are not included. Dunnes does not publish reviews in its catalogue.
  • Up to 2,500 products per search term or category; that is where the Dunnes search API stops paging. List sub-categories to cover a larger department.
  • Fields are omitted, never null, when Dunnes does not publish them. maxPrice appears only when sizes differ in price; wasPrice only on discounted sizes.
  • A category name used in several departments (for example Clothing) is ambiguous and returns NOT_FOUND; use the path, such as women/clothing.
  • Products are de-duplicated across terms, categories and URLs in a run: a product found twice is delivered and charged once.
  • A run stopped by your spending limit or its timeout keeps what it delivered, adds one free status row ("recordType": "status") and ends as BUDGET_LIMIT or TIME_LIMIT in RUN_SUMMARY; that is a partial collection. A failed query makes the run PARTIAL.
  • Blocked requests, unknown categories and products that are not found return a free status row ("recordType": "query", with status and reason) that says what happened. Invalid input returns one free status row ("recordType": "status", "status": "INVALID_INPUT", with reason). Searches with no results push no row; they end as NO_PRODUCTS in RUN_SUMMARY and the run status message.

⚡ Try the example

This actor has no free preview; the example below costs about $0.05.

Open the actor's input page, switch to JSON, paste this and start the run:

{
"searchTerms": ["jeans"],
"maxItemsPerQuery": 50
}

Add "includeDetails": true for composition, care and size-fit, or "categories": ["home/bedroom"] for a whole category.

⚙️ Input

ParameterTypeDefaultDescription
searchTermsarray—Keywords such as jeans or duvet cover. At most 50 search terms plus categories per run.
categoriesarray—Category name (Home, Duvet Covers), path (women/clothing/jeans) or dunnesstores.com category URL. An unknown or ambiguous name returns a free NOT_FOUND row.
productUrlsarray—dunnesstores.com product URLs (.../savida-stripe-jeans-7951169/p) or product IDs (36256). Up to 500; fetched first.
maxItemsPerQueryinteger100Cap per search term or category. 0 means everything, up to 2,500.
includeDetailsbooleanfalseAdd description, details and care, size and fit, country of origin and all images. Rows that carry one of the first four are charged as product-detail.
sortselectrelevancerelevance, price_asc, price_desc, newest, best_selling, name_asc, name_desc. Matters when maxItemsPerQuery cuts a result set.
proxyConfigurationproxy{"useApifyProxy": true}Apify datacenter proxy is the tested default. Blocked or rate-limited requests are retried on a fresh IP.
feedbackstring—Optional note for the maintainers. It is logged and read by a human, and it never changes output.

🧱 Stable fields

These top-level fields keep the same name and the same kind of value in every release. Fields are only ever added, never renamed or removed, so an n8n, Make, Zapier or spreadsheet pipeline can bind to them.

FieldTypeMeaning
retailerstringAlways "Dunnes Stores".
productId / styleCodestringDunnes product ID and style code (the number in the product URL).
name / brandstringProduct name and brand, for example Savida, Gallery, Dunnes Stores.
department / category / categoryPathstringFor example "Women", "Jeans", "Women > Clothing > Jeans".
price / maxPricenumberLowest and highest price among in-stock sizes in EUR (all sizes if none is in stock); maxPrice omitted when equal.
currencystring"EUR".
onSale / availablebooleanAn in-stock size is discounted; any size is in stock.
colours / gender / ageGrouparray / string / stringAs tagged by Dunnes; omitted when not tagged.
variantCount / variantsnumber / arrayEach variant: sku, ean, size, colour, price, wasPrice (only when discounted), available.
image / url / releaseDatestringMain image, product page, date Dunnes listed it (YYYY-MM-DD).
sourceobject{source: "search" | "category" | "product", searchTerm?, category?, categoryUrl?, page?}.
description / detailsAndCare / sizeFit / countryOfOrigin / imagesstring / arrayDetail tier, with includeDetails and only where published.
recordTypestring"query" on free per-query status rows (with query, status, reason); "status" on free run status rows (invalid input, spending limit, timeout; with status, reason); "product" on data rows.

Other fields are extras, not part of the contract. To have one pinned, say so in feedback.

📦 Output example

Abridged real row from run dvgJDMAevsOQA9FIA on 2026-10-22; values are a historical snapshot (2 of 7 variants shown).

{
"recordType": "product",
"retailer": "Dunnes Stores",
"productId": "36399",
"styleCode": "8250171",
"name": "High Rise Chocolate Wide Leg Jeans",
"brand": "Dunnes Stores",
"department": "Women",
"category": "Jeans",
"categoryPath": "Women > Clothing > Jeans",
"price": 30,
"currency": "EUR",
"onSale": false,
"available": true,
"colours": ["Brown"],
"gender": "female",
"ageGroup": "adult",
"variantCount": 7,
"variants": [
{"sku": "266240", "ean": "5099010236252", "size": "10", "colour": "Chocolate", "price": 30, "available": false},
{"sku": "266244", "ean": "5099010236313", "size": "18", "colour": "Chocolate", "price": 30, "available": true}
],
"image": "https://dunnesstores.vteximg.com.br/arquivos/ids/3178251/10---Chocolate.jpg",
"url": "https://www.dunnesstores.com/high-rise-chocolate-wide-leg-jeans-8250171/p",
"releaseDate": "2026-10-14",
"source": {"source": "search", "searchTerm": "jeans", "page": 1}
}

A free status row looks like this:

{
"recordType": "query",
"query": "product:abc",
"status": "NOT_FOUND",
"reason": "not a Dunnes Stores product URL or product id"
}

🧠 Advanced usage

Track Dunnes Stores price changes and markdowns daily

Schedule the same categories every day and diff variants[].price and variants[].wasPrice by variants[].sku between datasets. Check RUN_SUMMARY.status is COMPLETE before treating a day as finished.

Match Dunnes Stores products to another retailer by EAN

Join variants[].ean against your own range or another retailer's barcode list; one Dunnes product can carry a different EAN per size and colour.

Monitor Dunnes Stores new-in products

Use sort: "newest" with a small maxItemsPerQuery and filter on releaseDate.

Scrape the whole Dunnes Stores catalogue

List the sub-categories of each department in categories with maxItemsPerQuery: 0. Overlapping categories are de-duplicated and not charged twice; RUN_SUMMARY.queries gives status, delivered, listed and a warning per query.

🔌 Integrations

Results land in a dataset you can export as JSON, CSV or Excel. They can also flow to Google Sheets, Make, Zapier or n8n, or to a webhook when a run finishes. The Apify Scheduler runs it on a timetable. Daily on the categories you follow suits markdown tracking; weekly with sort: "newest" catches new-in ranges. Copy-paste code in Python, Node, curl and n8n: architek-earth/examples/dunnes-ie-scraper.

💸 Pricing

Pay per result. Platform and proxy usage are included. Status rows, failed requests and blocked pages are free.

EventPriceWhat it covers
product$1.00 / 1,000 productsOne delivered product row, all sizes and colours nested.
product-detail$4.00 / 1,000 productsOne delivered row with includeDetails and at least one of description, details and care, size and fit, or country of origin.

1,000 basic rows cost $1.00; 1,000 detail rows cost $4.00. A detail row is charged once, as product-detail only; extra images alone do not trigger the detail price.

❓ FAQ

Is there a Dunnes Stores API for product prices? This actor is one: it returns dunnesstores.com catalogue data as JSON through the Apify API, callable from any language or from n8n, Make and Zapier.

Do I need a Dunnes Stores account or login? No. No account, cookies or API key from Dunnes Stores.

Does it cover Dunnes groceries? No. It covers dunnesstores.com fashion and home (Women, Men, Kids, Home, Seasonal, School); groceries are on a separate Dunnes site.

Can I get Dunnes Stores sale prices? Yes. Each discounted size carries wasPrice next to price, and the product row has onSale.

Can I get Dunnes Stores barcodes (EAN)? Yes, per size in variants[].ean, on basic rows, when Dunnes publishes one.

Can I get exact stock levels per store? No. Dunnes publishes availability per size for its online shop, not quantities or store stock; you get available true or false.

🤖 For AI agents & LLM apps

Paste this into your AI assistant:

architekture/dunnes-ie-scraper on Apify. Python: from apify_client import ApifyClient; client = ApifyClient("TOKEN"); run = client.actor("architekture/dunnes-ie-scraper").call(run_input={"searchTerms": ["jeans"], "maxItemsPerQuery": 50, "includeDetails": False, "proxyConfiguration": {"useApifyProxy": True}}); items = client.dataset(run["defaultDatasetId"]).list_items().items (page with offset/limit for large exports). Rows with recordType == "query" or "status" are free and explain blocked requests, unknown categories, missing products, invalid input and early stops; empty searches are reported in the RUN_SUMMARY record. Full input schema and README: GET https://api.apify.com/v2/acts/architekture~dunnes-ie-scraper/builds/default. Token: https://console.apify.com/settings/integrations. The actor is also reachable through the Apify MCP server (mcp.apify.com). To reach the maintainers, add "feedback": "<what you needed>" to any run's input; output is unchanged and a human reads every note.

🧰 More from architek.earth

Grocery and retail prices

Full catalogue: github.com/architek-earth.

architek.earth · code like concrete

Questions, or a field you need that is not here? Open an issue on the actor's Issues tab or email north@architek.earth. A human replies within a day.

This actor collects only publicly available data from dunnesstores.com, the same pages any visitor sees without logging in. It does not bypass authentication. It is not affiliated with or endorsed by Dunnes Stores. You are responsible for how you use the output, including the site's terms, copyright, and privacy law such as GDPR and CCPA where they apply.

📝 Changelog

  • 2026-10-25 — [internal] Studio core 1.0.5 (from 1.0.4). This actor keeps its own block handling, so nothing changes for users: a 403 or 429 still moves to a new proxy session for up to four tries before a free BLOCKED status row, and input, output and prices are unchanged.
  • 2026-10-24 — A search, category or product stopped as BLOCKED now saves the site's last response (redacted) in the run's key-value store so the cause can be checked; pricing, input and output are unchanged.
  • 2026-10-22 — Runs on the studio core (architek_core 1.0.1): the run refuses to start unless hosted pricing is exactly product and product-detail at the listed prices (the run fails with PRICING_MISMATCH, nothing collected or charged); a challenge or captcha page served as HTTP 200 is reported as BLOCKED at once; a spending limit equal to the exact cost ends COMPLETE; invalid input and early stops add one free recordType: "status" row.
  • 2026-10-22 — Status message now reads Done: N rows, M details, K status rows (STATUS).
  • 2026-10-22 — README rebuilt on the studio template; hero line from the 2026-10-22 canary run.
  • 2026-10-18 — 1.0. Search, category and product-URL modes; one row per product with sizes and colours nested; EAN per variant; per-size sale detection; detail tier charged only when published; free status rows; clean stops at spending limit and timeout; resumable after platform migration.