Dunnes Stores Scraper — Fashion & Home Prices, Sizes, EANs
Pricing
from $1.00 / 1,000 products
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Security
Limited permissionsShare
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.
| Source | Market | From | Standout fields |
|---|---|---|---|
| Dunnes Stores (dunnesstores.com) | Ireland | $1.00 / 1,000 products | price / 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;
availableis 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.
maxPriceappears only when sizes differ in price;wasPriceonly on discounted sizes. - A category name used in several departments (for example
Clothing) is ambiguous and returnsNOT_FOUND; use the path, such aswomen/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 asBUDGET_LIMITorTIME_LIMITinRUN_SUMMARY; that is a partial collection. A failed query makes the runPARTIAL. - Blocked requests, unknown categories and products that are not found return a free status row (
"recordType": "query", withstatusandreason) that says what happened. Invalid input returns one free status row ("recordType": "status","status": "INVALID_INPUT", withreason). Searches with no results push no row; they end asNO_PRODUCTSinRUN_SUMMARYand 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
| Parameter | Type | Default | Description |
|---|---|---|---|
searchTerms | array | — | Keywords such as jeans or duvet cover. At most 50 search terms plus categories per run. |
categories | array | — | 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. |
productUrls | array | — | dunnesstores.com product URLs (.../savida-stripe-jeans-7951169/p) or product IDs (36256). Up to 500; fetched first. |
maxItemsPerQuery | integer | 100 | Cap per search term or category. 0 means everything, up to 2,500. |
includeDetails | boolean | false | Add 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. |
sort | select | relevance | relevance, price_asc, price_desc, newest, best_selling, name_asc, name_desc. Matters when maxItemsPerQuery cuts a result set. |
proxyConfiguration | proxy | {"useApifyProxy": true} | Apify datacenter proxy is the tested default. Blocked or rate-limited requests are retried on a fresh IP. |
feedback | string | — | 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.
| Field | Type | Meaning |
|---|---|---|
retailer | string | Always "Dunnes Stores". |
productId / styleCode | string | Dunnes product ID and style code (the number in the product URL). |
name / brand | string | Product name and brand, for example Savida, Gallery, Dunnes Stores. |
department / category / categoryPath | string | For example "Women", "Jeans", "Women > Clothing > Jeans". |
price / maxPrice | number | Lowest and highest price among in-stock sizes in EUR (all sizes if none is in stock); maxPrice omitted when equal. |
currency | string | "EUR". |
onSale / available | boolean | An in-stock size is discounted; any size is in stock. |
colours / gender / ageGroup | array / string / string | As tagged by Dunnes; omitted when not tagged. |
variantCount / variants | number / array | Each variant: sku, ean, size, colour, price, wasPrice (only when discounted), available. |
image / url / releaseDate | string | Main image, product page, date Dunnes listed it (YYYY-MM-DD). |
source | object | {source: "search" | "category" | "product", searchTerm?, category?, categoryUrl?, page?}. |
description / detailsAndCare / sizeFit / countryOfOrigin / images | string / array | Detail tier, with includeDetails and only where published. |
recordType | string | "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.
| Event | Price | What it covers |
|---|---|---|
product | $1.00 / 1,000 products | One delivered product row, all sizes and colours nested. |
product-detail | $4.00 / 1,000 products | One 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
- Coles Scraper — prices, unit prices, specials, barcodes
- Woolworths AU Scraper — prices, specials, barcodes, nutrition
- ALDI AU Scraper — prices, unit prices, Special Buys
- Woolworths NZ Scraper — prices, club prices, specials
- New World NZ Scraper — store prices, Clubcard offers, promotions
- Pak'nSave Scraper — store prices, unit prices, promotions
- Tesco UK Scraper — prices, Clubcard offers, barcodes
- Sainsbury's Scraper — prices, unit prices, offers, barcodes
- ALDI Ireland Scraper — prices, unit prices, Specialbuys
- Dunnes Stores Scraper — you are here
- Mercadona Scraper — prices, unit prices, categories
Full catalogue: github.com/architek-earth.
architek.earth · code like concrete
🙋 Support & legal
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
BLOCKEDstatus row, and input, output and prices are unchanged. - 2026-10-24 — A search, category or product stopped as
BLOCKEDnow 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
productandproduct-detailat the listed prices (the run fails withPRICING_MISMATCH, nothing collected or charged); a challenge or captcha page served as HTTP 200 is reported asBLOCKEDat once; a spending limit equal to the exact cost endsCOMPLETE; invalid input and early stops add one freerecordType: "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.