Next.co.uk Scraper - Products, Prices, Sizes & Stock
Pricing
from $1.80 / 1,000 product records
Next.co.uk Scraper - Products, Prices, Sizes & Stock
Scrape Next.co.uk: keyword search, category and product-listing walks, full product details (price, was-price, sizes, stock, composition, images). Monitoring (NEW, UPDATED), incremental runs, resume.
Pricing
from $1.80 / 1,000 product records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
3
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Next.co.uk Scraper: Products, Prices, Sizes and Stock
Next.co.uk Scraper turns Next.co.uk, one of the UK's largest fashion and homeware retailers, into structured product data. Search by keyword, or paste any mix of category links, product listing links, style page links and bare product IDs, and get back title, current price and (when reduced) the previous price, size availability, stock markers, fabric composition and every product image. Turn on incremental mode for scheduled monitoring, or call the actor from your own code and read results straight from the dataset or the API.
Why This Scraper?
- Two ways to find products. Use the site's own keyword search, or paste category links, listing links, style page links and bare product IDs (for example
Y00003) into one list. - Full detail on demand. Open every collected product for its detail page to get sizes, stock, composition and the full image set, or turn that off for faster, cheaper listing rows only.
- Filter and sort before paying for detail. Price range and reduced-only filtering, and a choice of sort order, apply to listing cards before any detail page opens, so filtered-out products never carry the detail surcharge.
- Site facets without extra API knowledge. For filters the site itself does not expose as search parameters, such as size, colour or brand, paste a filtered listing link straight into the links list.
- Built for schedules. Incremental mode returns only new and updated products on repeat runs of the same search or listing.
- Fails loudly, not silently. A run where every request was refused stops with a clear message instead of shipping an empty dataset.
Use Cases
- Retail price monitoring: track price, was-price and stock changes across a category or a saved list of products over time.
- Deal and markdown tracking: filter for reduced-only products to catch new promotions as they appear.
- Catalog and merchandising research: pull a full category or search result to study range breadth, sizing and composition.
- Product data enrichment: resolve a list of product IDs or style links into full detail (sizes, stock, composition, images) for a downstream catalog or feed.
- Fashion and trend analysis: collect search results across many keywords to study naming, colours and price bands.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
kind | "product" |
id | "Y00001" |
title | "Sample Print Midi Dress" |
url | "https://www.next.co.uk/style/-/y00001" |
price | 45.0 |
currency | "GBP" |
wasPrice | 65.0 (null unless the product is currently reduced) |
priceMin / priceMax | 39.0 / 49.0 (detail rows only; null unless the product is sold across a price range) |
sizes | ["8", "10", "12", "14"] (from the detail page) |
outOfStockMarkers | 2 (how many "Out of stock" labels appear on the detail page; a raw count, not a per-size map) |
lowStock | true (a "Low in stock" label appears on the detail page) |
images | list of product image URLs (from the detail page, up to 12) |
image | "https://xcdn.next.co.uk/sample/Y00001.jpg" (one convenience image; can be null, and not included on rows from style links or product IDs you paste directly) |
composition | "100% Polyester" (from the detail page) |
detailFetched | true when the detail page was opened successfully; false when it was requested but refused; not included on listing-only rows |
changeType | "NEW", "UPDATED" or "UNCHANGED" (incremental mode only) |
changedFields | ["record"] (incremental mode only, present on UPDATED rows; marks that the record changed, not which field) |
firstSeenAt | "2026-09-01T09:00:00+00:00" (incremental mode only, on UPDATED and UNCHANGED rows; not on NEW rows) |
lastSeenAt | "2026-09-29T09:00:00+00:00" (incremental mode only, on UPDATED and UNCHANGED rows; not on NEW rows) |
Listing-only rows (when full detail is off) carry kind, id, title, url, price, currency, wasPrice and image only (no detailFetched key); the sizes, stock, composition and full image fields are only filled in once a product's detail page has been opened.
How to Use
- Pick a mode:
search(the site's own keyword search) orlinks(paste category links, listing links, style page links and bare product IDs, in any mix). - For search, fill in a query. For links, paste your list. Optionally set a price range, Reduced only, and a sort order; these apply to search results and walked listing pages before any detail page opens (style links and product IDs you paste directly are always returned).
- Turn Open each product for full detail on for sizes, stock, composition and images, or off for faster, listing-row-only output. Set Max items to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Keyword search:
{"mode": "search","searchQuery": "midi dresses","maxItems": 30}
Paste a mix of links, style pages and product IDs:
{"mode": "links","links": ["https://www.next.co.uk/shop/gender-women-category-dresses","https://www.next.co.uk/style/sv100000/y00001","Y00002"],"fetchDetails": true}
Filtered, sorted, listing rows only (no detail surcharge):
{"mode": "search","searchQuery": "school trousers","sortBy": "price-asc","maxPrice": 30,"fetchDetails": false}
Daily monitoring of a category:
{"mode": "links","links": ["https://www.next.co.uk/shop/gender-women-category-dresses"],"incrementalMode": true,"maxItems": 0}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/next-uk-product-scraper").call(run_input={"mode": "search", "searchQuery": "midi dresses", "maxItems": 30})for product in client.dataset(run["defaultDatasetId"]).iterate_items():print(product["title"], product["price"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/next-uk-product-scraper').call({mode: 'search', searchQuery: 'midi dresses', maxItems: 30,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How Max items and sorting interact
Site relevance order streams results and pushes each product as soon as it is resolved. Any other sort order (price low to high, price high to low, title A to Z) needs the whole result set first: the actor reads listing pages, buffers up to 2000 matching products, sorts them, and returns the first Max items. A non-default sort therefore starts a little slower, and a search or category with more than 2000 matching products is sorted over its first 2000 only.
Resume and recurring updates
-
Resume (
resumeFromRunId) is accepted, but in the current build it does not skip anything: the previous run's product IDs are loaded, but they are never matched against the new run's products, so a resumed run starts from the first listing page again and returns, and bills, every product it reaches, including ones already collected. Example: a first run with Max items 3 returns products A, B and C; resuming from it with Max items 3 returns A, B and C again, not the next three. Workaround: do not rely on Resume to continue a pull. Rerun with a higher Max items (or0) instead, and de-duplicate oniddownstream if you combine datasets. -
Incremental mode (
incrementalMode) is for repeat runs over the same search or listing, for example a daily schedule. The first run returns every matching product asNEW; later runs returnNEWandUPDATEDonly (price, sizes or stock changed since last time), and unchanged rows are suppressed and not billed unless Emit unchanged records is on.stateKeynames the saved state, or leave it blank to derive one from the rest of your run settings.changedFieldson anUPDATEDrow is always["record"]: it tells you the product changed, not which field. If a product's detail page is refused on one run, its row lacks sizes, stock and composition, so it can be reported (and billed) asUPDATEDon that run and again on the next successful one.Known limitation: on any one listing page (or, with a non-default sort, across the whole buffered result), Max items is applied to products in store order before they are checked against the saved state. If the first products in that order turn out to be unchanged, the run can stop there without ever reaching a genuinely new or updated product ranked lower on the same page, even though the page held more products. Example: a page holds 10 products, Max items is 5, and the first 5 happen to be unchanged from last run while the 6th is brand new; that run returns nothing from the page, never opens the new product, and keeps missing it on later runs as long as those products keep the same order. The same happens with a non-default sort across the whole buffered result: with Sort results by set to price low to high and Max items 5, if the 5 cheapest products are unchanged and a new product is the 6th cheapest, the run returns nothing. Such a run ends with no rows rather than failing. Workaround: set Max items to
0(no limit) for incremental or monitoring runs, or set it well above one page's worth of products.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (the site's own keyword search) or links (paste category, listing, style page or product ID entries). |
searchQuery | string | (none) | Search mode: keyword or phrase, for example dresses or school trousers. |
links | array | sample | Links mode: category/listing links are walked with pagination; style page links and bare product IDs return full detail. |
sortBy | string | relevance | relevance, price-asc, price-desc, or title-asc. Applies in both modes before detail pages open. |
minPrice | integer | (none) | Return only products priced at or above this (GBP). Products without a visible price are skipped when a price filter is set. |
maxPrice | integer | (none) | Return only products priced at or below this (GBP). Blank means no maximum. |
onSaleOnly | boolean | false | Return only products currently showing a was-price. |
fetchDetails | boolean | true | Open every collected product's detail page for sizes, stock, composition and images. Off returns listing rows only. |
maxItems | integer | 20 | Stop after this many records (0 = no limit; the run then stops when listings run out). |
resumeFromRunId | string | (none) | Paste a previous run or dataset ID to continue a large pull. See the Resume limitation above. |
incrementalMode | boolean | false | Turn on for scheduled monitoring runs: later runs return only new and updated products. |
stateKey | string | (none) | Optional name for an incremental-mode state. Leave blank to derive one from the rest of the run settings. |
emitUnchanged | boolean | false | Incremental mode only: also return (and bill) products that have not changed since the last run. |
proxyConfiguration | object | Apify Proxy | Connection settings. The site's edge refuses ordinary connections in waves on its listing routes; the actor automatically falls back to a backup connection for those pages unless you bring your own proxy. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"kind": "product","id": "Y00001","title": "Sample Print Midi Dress","url": "https://www.next.co.uk/style/-/y00001","price": 45.0,"currency": "GBP","wasPrice": 65.0,"priceMin": null,"priceMax": null,"sizes": ["8", "10", "12", "14"],"outOfStockMarkers": 2,"lowStock": true,"images": ["https://xcdn.next.co.uk/sample/Y00001_1.jpg","https://xcdn.next.co.uk/sample/Y00001_2.jpg"],"image": "https://xcdn.next.co.uk/sample/Y00001_1.jpg","composition": "100% Polyester","detailFetched": true,"changeType": "UPDATED","changedFields": ["record"],"firstSeenAt": "2026-09-01T09:00:00+00:00","lastSeenAt": "2026-09-29T09:00:00+00:00"}
Plan Requirement
The default proxy setting works out of the box, and the actor retries and automatically falls back to a backup connection when the site's edge refuses a request. Bring your own proxy with proxyUrls if you have one; runs that do this are never re-routed to the backup connection.
FAQ
How much does it cost?
You pay per product record returned, plus a small surcharge for each product opened for full detail. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape Next.co.uk?
This actor collects only publicly available product data. You are responsible for how you use it: follow Next.co.uk's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product prices and availability change constantly and are only accurate as of the run that collected them.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental changes for scheduled runs. Each run then returns only new and updated products, and unchanged ones are not returned or billed unless you turn on Emit unchanged records.
Why did my scheduled run miss a product I know changed?
See the known limitation under Resume and recurring updates above. With incremental mode on, Max items is applied in store order (or, with a non-default sort, in sorted order) before products are compared with the last run. If the first products are unchanged, they use up the cap and a genuinely new or updated product ranked lower is never checked. Example: Max items 5, a page of 10 products, the first 5 unchanged and the 6th new: the run returns nothing. Set Max items to 0, or well above one page's worth of products, for monitoring runs.
Why did a resumed run return products I already have?
In the current build, Resume does not filter out products from the previous run, so a resumed run starts over and returns (and bills) the same products again. Rerun with a higher Max items instead, and de-duplicate on id downstream if you combine datasets.
Why did my run fail instead of returning an empty dataset?
If the site refuses every single request in a run, the run stops with a clear message so "no matching products" is never confused with "nothing could be read." Run it again in a few minutes, or with fewer items. If only some pages were refused, you still get what was found, and the run's status message reports how many were refused.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client like any other actor, and read the results from the dataset or the API.
๐ Want more fashion data?
Pair this actor with these related scrapers from the same team:
| ๐ 24S Scraper Scrape 24S luxury fashion by category, filters, or URL. Extract brand, name, price... | ๐ Mango Scraper Scrape Mango (shop.mango.com) fashion products: current price plus strike-through Rebajas... |
| ๐ ZOZOTOWN Scrape ZOZOTOWN (zozo.jp), Japan's largest fashion marketplace: name, brand, JPY price... | ๐ KREAM Scraper Scrape KREAM (kream.co.kr) sneaker and fashion resale data by keyword search, filters... |
| ๐ท๏ธ ThredUp Scraper Scrape ThredUp resale listings by keyword, department, brand, size, condition, price or... | ๐ Showpo Scraper Scrape Showpo women's fashion by keyword, collection or URL. Extract product prices... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.