Marks & Spencer Scraper at a glance
Marks & Spencer Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes recordtype, id, title, url and productid, 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.50 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.50 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 30 options
Collect marksandspencer.com (M&S) products and individual reviews from keyword searches, categories or product links. Get prices, all colour galleries, size-level inventory, composition, care, ratings, and review responses, with filters, sorting, resume and recurring updates.
What Marks & Spencer Scraper can do
- Three ways in. Search terms, category browsing and multiple pasted links.
- Filters. Department, brand, colour, size, price and additional store filters.
- Sorting. Six product sorts and four review sorts.
- Rich detail. Full descriptions and galleries across available colour variants.
- Size-level stock. Individual size SKUs with the inventory and prices published by the store.
- Recurring runs. Resume an earlier collection or collect recurring changes.
Choose what to collect
These inputs let you configure Marks & Spencer Scraper - Products, Prices, Stock & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose keyword search or pasted links. Only the inputs in the selected mode are used. |
searchTermsarray | Search each term separately. Defaults to cashmere jumper. Ignored when category is filled or mode is url. |
departmentstring | Optional clothing department: Womens or Mens. Applies the store department filter in search mode only. |
categorystring | Optional category path, category link or SubCategory identifier. Browse this category instead of search terms. Search filters and sort still apply. |
brandsarray | Optional exact brand names shown in the store filters, such as Autograph or JAEGER. Search mode only. |
coloursarray | Optional colour filter names, such as Navy or Black. Search mode only. |
sizesarray | Optional exact size filter labels, such as S, M or 10. Search mode only. |
Show 23 more inputs
| Input | What it controls |
|---|---|
facetarray | Optional native filter pairs, one per line, such as Fit=Regular fit or Neck Type=Crew neck. Use the exact filter name and value shown for your search. Search mode only. |
minPriceinteger | Optional minimum price in GBP. Search mode only. |
maxPriceinteger | Optional maximum price in GBP. Search mode only. |
minRatinginteger | Optional minimum average product rating from 0 to 5. Search mode only. |
sortBystring | Use the store ordering in search mode. URL mode preserves the ordering specified in each link. |
urlsarray | Paste one or more M&S product, category or search links. Left untouched, url mode scrapes one example of each supported link shape (product, search, paginated, sorted, category, brand, apex host), bounded by Max items. Search-mode fields are ignored. Results begin at the page specified in each link. |
outputTypestring | Products saves product rows. Reviews saves individual review rows. Products and reviews saves both, joined by productId. Saved products count toward Max items; saved reviews count toward Max reviews, a separate budget. |
fetchDetailsboolean | Add full descriptions, composition, care, all colour galleries and size-level inventory. Each successfully saved enriched product adds one detail-enrichment charge. Reviews are separate saved items. Suppressed, skipped and failed rows do not add this charge. |
reviewSortstring | Ordering for individual review rows in Reviews or Products and reviews output. |
reviewRatingsarray | Optional exact star ratings to include, from 1 to 5. Empty includes all ratings. Applies to review output only. |
maxReviewsPerProductinteger | Limit on individual review rows per product. Default 20. Set 0 to collect all available reviews for each product until Max reviews is reached. |
maxPagesinteger | Optional limit on result or review pages per source. Blank or 0 means unlimited pages until the source ends or the relevant budget is reached: Max items for product pages, Max reviews for review pages. No default page cap. |
maxItemsinteger | Maximum saved product rows across the run, including recurring update rows. Default 20. Set 0 for unlimited products. Reviews use the separate Max reviews budget and never count against this. |
maxReviewsinteger | Maximum saved review rows across the run, independent of Max items. Default 20. Set 0 for unlimited reviews (still bounded by Maximum reviews per product and Maximum pages per source, if set). Values above 1000000 are not accepted. |
resumeFromRunIdstring | Optional previous run or dataset ID. Skip previously saved product and review IDs. Combine datasets to continue a collection. Resumed runs do not emit expired rows. For recurring collection, use incrementalMode instead. |
incrementalModeboolean | Remember this exact collection scope between runs. Return NEW, UPDATED or REAPPEARED rows. Use stateKey to name the collection, emitUnchanged to include unchanged rows and emitExpired for missing rows. |
stateKeystring | Optional name for a recurring collection. The selected mode, output type, terms or links, filters and detail setting also identify its baseline; review sort, rating and per-product limits do not. Different scopes never share a baseline. |
emitUnchangedboolean | Incremental mode only. Also save unchanged products or reviews marked UNCHANGED. Each saved row is charged as an item; saved enriched products can add the detail charge. |
emitExpiredboolean | Incremental mode only. Save EXPIRED rows after a complete collection. No expiration after a cap, resumed run or incomplete source. Expired rows count as saved items and do not add a detail charge. |
ignoreFieldsForChangesarray | Incremental mode only. Field names (dotted paths such as variants.price are allowed) that never mark a row UPDATED and never appear in changedFields. Ignored fields stay in the output. Volatile fields scrapedAt, searchTotal, searchTerm, searchIndex, input, matchedFilters and lastSeenAt are always ignored. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a page per record; other connectors get a best-effort write or digest. Each connector receives a condensed summary per record, not the full record; the complete record always stays in the dataset. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL or id of the Notion page under which record pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Maximum saved items to send to each selected connector. Does not limit or change the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
recordTyperecordType (text)idid (text)titletitle (text)urlurl (link)productIdproductId (text)productUrlproductUrl (link)brandbrand (text)priceprice (text)currencycurrency (text)averageRatingaverageRating (text)reviewCountreviewCount (text)ratingrating (text)Show 28 more fields
reviewTextreviewText (text)userNicknameuserNickname (text)submissionTimesubmissionTime (text)imagesimages (text)variantsvariants (text)attributesattributes (text)fetchedDetailsfetchedDetails (text)changeTypechangeType (text)changedFieldschangedFields (text)firstSeenAtfirstSeenAt (text)lastSeenAtlastSeenAt (text)previousPricepreviousPrice (text)colourscolours (text)sizessizes (text)compositioncomposition (text)careInstructionscareInstructions (text)promotionspromotions (text)itemConditionitemCondition (text)reviewIdreviewId (text)isRecommendedisRecommended (text)secondaryRatingssecondaryRatings (text)positiveFeedbackCountpositiveFeedbackCount (text)negativeFeedbackCountnegativeFeedbackCount (text)clientResponsesclientResponses (text)syndicationSourcesyndicationSource (text)isSyndicatedisSyndicated (text)badgesOrderbadgesOrder (text)reviewStatsreviewStats (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"recordType": "product",
"id": "P00000001",
"productId": "P00000001",
"title": "Sample cashmere jumper",
"brand": "Sample Brand",
"url": "https://www.marksandspencer.com/sample-product/p/clp00000001",
"productUrl": "https://www.marksandspencer.com/sample-product/p/clp00000001",
"description": "Sample full product description.",
"price": 50,
"previousPrice": 60,
"currency": "GBP",
"averageRating": 4.5,
"reviewCount": 10,
"images": [
"https://assets.digitalcontent.marksandspencer.app/image/upload/00000001"
],
"colours": [
"Navy"
],
"sizes": [
"Small"
],
"composition": "Sample fabric composition",
"careInstructions": [
"Sample care instruction"
],
"variants": [
{
"id": "00000001",
"skus": [
{
"id": "00000001001",
"size": {
"primarySize": "Small"
},
"inventory": {
"quantity": 10,
"quantityOnHand": 10,
"quantityAdvised": 0
}
}
]
}
],
"attributes": {
"sampleAttribute": "Sample value"
},
"fetchedDetails": true,
"changeType": "NEW",
"changedFields": [],
"firstSeenAt": "2026-01-01T00:00:00.000Z",
"lastSeenAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Fashion resellers and price trackers: watch a product, a search or a whole category for price and stock changes before restocking.
- Affiliate and comparison sites: pull complete descriptions, colour galleries and prices to publish accurate listings without manual entry.
- Review and reputation analysis: collect review text, ratings, recommendation flags and retailer responses to track recurring praise or complaints on a range.
- Merchandising and competitor research: browse a department or category by best selling, new arrivals or rating to see what is being pushed.
- Size and stock monitoring: track individual size SKUs and published inventory for a product to catch restocks or sellouts.
- Recurring collection pipelines: schedule the same search, category or links and receive only the products and reviews that changed since the last run.
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 Marks & Spencer Scraper return?
The documented output for Marks & Spencer Scraper includes recordtype, id, title, url, productid, producturl, brand and price. Availability of each field depends on the source page and the selected mode.
How much does Marks & Spencer Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Recurring updates. Each run then returns only NEW, UPDATED or REAPPEARED rows for the same search, category or links, and unchanged rows are not billed unless Include unchanged rows is also on.
Why do some product rows have fewer fields than others?
Include product details controls this. On, every product adds full descriptions, composition, care instructions and colour and size galleries. Off, search and category results still keep the fields shown on the results page, such as price, rating and any listed colours or sizes, while a pasted product link keeps only a smaller core field set (identifiers, links, title, brand, price, currency, rating, review count and images). Turn Include product details on for the complete published data on every product.
Why didn't Include missing rows report everything that disappeared?
Include missing rows shares the Max items or Max reviews budget with new and updated rows. If your tracked collection loses more items in one run than that budget allows to report, the extra missing rows are still recorded internally as gone and will not be offered as expired again later either, unless they reappear in the source. For example, 7 disappeared products with Max items set to 3 give 3 EXPIRED rows, and the other 4 are never reported. Set Max items or Max reviews to 0, or comfortably above the size of your tracked collection, whenever you rely on this option.
Why did my run fail instead of returning an empty dataset?
If a pasted link or a category path cannot be read, the run fails with a message instead of quietly returning nothing. Check that every link is a valid Marks & Spencer product, category or search link, then run it again in a few minutes. If result pages cannot be read once the search has started, the run keeps any rows it already saved and its status message ends with "Collection stopped before every result was scanned." A search that genuinely has no matching products returns an empty dataset without that note.
