Next.co.uk Scraper - Products, Prices, Sizes & Stock avatar

Next.co.uk Scraper - Products, Prices, Sizes & Stock

Pricing

from $1.80 / 1,000 product records

Go to Apify Store
Next.co.uk Scraper - Products, Prices, Sizes & Stock

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

Abot API

Maintained by Community

Actor stats

1

Bookmarked

5

Total users

1

Monthly active users

19 hours ago

Last modified

Categories

Features

Limited permissions

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.

FieldExample
kind"product"
id"Y00001"
title"Sample Print Midi Dress"
url"https://www.next.co.uk/style/-/y00001"
price45.0
currency"GBP"
wasPrice65.0 (null unless the product is currently reduced)
priceMin / priceMax39.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)
outOfStockMarkers2 (how many sizes of this colourway are shown as out of stock; a raw count, not a per-size map)
lowStocktrue (at least one size is shown as low in stock)
imageslist of product image URLs (the main shots plus the product gallery, 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)
rating / reviewCount4.6 / 12 (detail rows only; average star rating and total reviews on the site, null when unrated)
reviewslist of up to maxReviewsPerProduct reviews, each with id, reviewer, rating, date, title, text, helpfulVotes, unhelpfulVotes, recommended, verifiedPurchase and replies (store responses)
itemNumber / rank / searchTerm"Y00001" / 3 / "dresses" (the style code; rank is the product's position in the site's own order within one listing link, counted from the first page the run loaded for that link and restarting for every link, so products removed by your price or sale filters leave gaps and a pasted ?p=2 link starts at 1; the search keyword from the link or query, null for direct style links and IDs)
brand / colour / department / productCategory / fit"Next" / "Blue Check" / "Womenswear" / "Dresses" / "Regular" (brand, colour, department and fit also appear on listing-only rows; the category comes from the detail page)
availableFits / colourwaysCount["Regular"] / 4 (detail page fits; number of colourways shown on the listing)
minPrice / maxPrice39.0 / 49.0 (same as priceMin / priceMax, falling back to price when the product has no range)
newIn / territory / language / realm / criteriaUrltrue / "GB" / "en" / "next" / the listing link the row came from (newIn is true when you walk a New In listing link; otherwise it is null, meaning unknown, because ordinary listings and style pages carry no new-in marker)
detailFetchedtrue 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["price", "sizes"] (incremental mode only, present on UPDATED rows; names the tracked fields that changed)
firstSeenAt / lastSeenAt"2026-09-01T09:00:00+00:00" / "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.

Dataset views: The dataset has four views: Products (listing columns), Product detail (sizes, stock, composition, images, rating), Changes (incremental) (change type and changed fields) and Reviews (one row per review, expanded from the reviews list).

How to Use

  1. Pick a mode: search (the site's own keyword search) or links (paste category links, listing links, style page links and bare product IDs, in any mix).
  2. For search, fill in a query (plain keywords such as school trousers work). An untouched links field now scrapes one example of each supported shape. Pasted ?p=N links start at that page (the site's page is 24 products). Category links in either of the site's forms (/shop/womens/clothing/dresses/f/colour-black or /shop/gender-women-category-dresses-colour-black), their sort segments, brand links (/brands/...) and searches with the site's own filter parameters are read as given; an empty result means the site lists nothing for that link; unrecognized entries are skipped with a warning. 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).
  3. 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.
  4. 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 ApifyClient
client = 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. Price low to high and price high to low are ordered by the site itself across the whole result set for searches and for /shop/gender-... style category links, so the run reads only as many results as Max items needs (within one link; with several links, each link contributes its own first Max items and the combined list is sorted again). Title A to Z, and any sort on a /shop/womens/... style category link, 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, so it starts a little slower, and a search or category with more than 2000 matching products is sorted over its first 2000 only. Links that can only be read from the site's own pages (see below) always use the buffered sort.

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 (or 0) instead, and de-duplicate on id downstream 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 as NEW; later runs return NEW and UPDATED only (price, sizes or stock changed since last time), and unchanged rows are suppressed and not billed unless Emit unchanged records is on. stateKey names the saved state, or leave it blank to derive one from the rest of your run settings. changedFields on an UPDATED row names the fields that changed (title, price, wasPrice, sizes, outOfStockMarkers, composition). Ignore fields when detecting changes (ignoreFieldsForChanges) lists fields that must not count as a change; they stay in the output. Changing that list never re-bills your saved products. 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) as UPDATED on that run and again on the next successful one. outOfStockMarkers now counts the sizes that are really sold out (earlier builds reported a fixed 0 or 1); on the first run after this change, a saved product whose only difference is that corrected count is updated in the saved state silently (not returned, not billed), so your saved state picks up the real count without a wave of UPDATED rows; with Emit unchanged records off you see the corrected count the next time that product changes. Because it is now a real per-size count, outOfStockMarkers changes more often than before (each time a size sells out or comes back), and each such change returns an UPDATED row; if you do not want those updates, add outOfStockMarkers to Ignore fields when detecting changes (ignoreFieldsForChanges).

    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.

Send results into your apps (MCP connectors)

Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each product (a title plus its key fields as plain text). The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify -> Settings -> Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the mcpConnectors field. (If the picker is empty, you have not authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection goes through Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (the site's own keyword search) or links (paste category, listing, style page or product ID entries).
searchQuerystring(none)Search mode: keyword or phrase, for example dresses or school trousers.
linksarrayone example per shape (keyword search, paginated search, category, paginated category, sorted category, style page). Placeholder style links and bare product IDs are accepted but not sampled, as they resolve to the same product as the style exampleLinks mode: category/listing links are walked with pagination; style page links and bare product IDs return full detail.
sortBystringrelevancerelevance, price-asc, price-desc, or title-asc. Applies in both modes before detail pages open.
minPriceinteger(none)Return only products priced at or above this (GBP). Products without a visible price are skipped when a price filter is set.
maxPriceinteger(none)Return only products priced at or below this (GBP). Blank means no maximum.
onSaleOnlybooleanfalseReturn only products currently showing a was-price.
fetchDetailsbooleantrueOpen every collected product's detail page for sizes, stock, composition and images. Off returns listing rows only.
maxReviewsPerProductinteger20Customer reviews collected per product that is opened for detail, newest first (0 = off, maximum 500 to keep runs bounded). Reviews are included in the product's normal rows and add no separate charge.
maxItemsinteger20Stop after this many records (0 = no limit; the run then stops when listings run out).
maxPagesinteger0Stop walking each listing or search after this many pages (0 = the built-in limit of 500 pages per link).
results_wantedinteger(none)Alias of maxItems for users migrating from other scrapers; when set it overrides maxItems.
resumeFromRunIdstring(none)Paste a previous run or dataset ID to continue a large pull. See the Resume limitation above.
incrementalModebooleanfalseTurn on for scheduled monitoring runs: later runs return only new and updated products.
stateKeystring(none)Optional name for an incremental-mode state. Leave blank to derive one from the rest of the run settings.
emitUnchangedbooleanfalseIncremental mode only: also return (and bill) products that have not changed since the last run.
ignoreFieldsForChangesarray[]Incremental mode only: field names that never count as a change.
mcpConnectorsarrayno defaultOptional MCP connectors to export results into (Notion, Linear, Airtable, Apify).
notionParentPageUrlstringno defaultNotion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items exported to each connector per run. Does not affect the dataset.
proxyConfigurationobjectApify ProxyConnection 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

Product data is read first from the site's own catalogue services, which answer on the default connection: searches, category and brand links in every form, style links and product IDs all come from there. Only a link or product those services cannot serve at that moment falls back to the site's pages.

Next.co.uk's edge refuses ordinary datacenter and residential proxy connections on its pages, so there is no setting that works by itself on those. For the page fallback the actor handles this automatically: when the default connection is refused it switches to a backup connection and reads the pages from there. This needs an Apify plan that includes proxy access. Pages can take tens of seconds each over the backup connection, and it opens and closes in waves, so a run may be slower than usual or skip some pages; the run's status message reports how many were refused.

On a plan where the default connection is unavailable but the backup connection can be opened, you will see this warning in the log:

The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable.

and, once the backup connection serves pages, Served over the backup connection (the default connection was unavailable). If no page can be read at all, the run fails with one of these messages:

  • The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required.
  • No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested Next pages.
  • Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later.

If you bring your own proxy with proxyUrls, runs are never re-routed to the backup connection.

When neither connection can be opened (a plan with no proxy access at all) the warning above is not shown and the run fails straight away with the first message.

FAQ

How much does it cost?

You pay per product record returned (the dataset item event), once per product opened for full detail (the detail enrichment event, which also covers that product's reviews), and a start event per run. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.

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...
πŸ‘— Nuuly Scraper
Scrape Nuuly clothing rental products by category, brand or URL. Extract product names...
πŸ‘— Mango Scraper
Scrape Mango (shop.mango.com) fashion products: current price plus strike-through Rebajas...
πŸ‘— Fashion Nova Scraper
Scrape Fashion Nova products by keyword, collection or URL. Extract product names...
πŸ‘— ZOZOTOWN
Scrape ZOZOTOWN (zozo.jp), Japan's largest fashion marketplace: name, brand, JPY price...
πŸ‘— Rent the Runway Scraper
Scrape Rent the Runway (renttherunway.com) designer clothing and accessories by category...

πŸ‘‰ 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.