SSENSE Scraper - Products, Sale & Retail Prices
Pricing
from $1.70 / 1,000 product records
SSENSE Scraper - Products, Sale & Retail Prices
Scrape SSENSE by keyword, category, designer or URL. Every row carries the selling price and the regular price, the discount percent, stock state and images. Sale axes, designer pages and recurring change tracking are first-class.
Pricing
from $1.70 / 1,000 product records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
0
Monthly active users
13 days ago
Last modified
Categories
Features
Share
SSENSE Scraper: Products, Sale & Retail Prices
SSENSE Scraper turns the SSENSE luxury storefront into a clean product feed. Search by keyword, browse the men's or women's catalogue with category, designer and sale facets, or paste store URLs to walk them directly. Every row carries the current selling price and the regular price together, with the discount percent computed, and adds the product description when you switch it on. Export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- The full price pair on every row. Selling price and regular price come from the listing page itself, with the discount percent computed, so retail versus sale is on every record without a second request.
- Four ways to scope a run. Search by keyword, browse a section, category or designer, watch the sale axis, or paste store URLs directly.
- The sale axis is first class. Sale only, or a pasted sale URL, rides the store's own sale pages, including their category and designer combinations.
- Product details on demand. Turn on Fetch product details for the description, the product type keyword, the full image gallery, per-size name, SKU and stock state, composition and country of origin; the price pair, stock state and the main image (
imageUrl) are on every row either way. - Built for recurring monitoring. Incremental mode classifies every product as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against the last run, and a refused run fails loudly instead of returning an empty dataset.
- Resume without paying twice. Continue one interrupted run by its run or dataset id, and the actor skips everything it already collected there.
- Client-side price and sort controls. Narrow by price range or discounted rows only, then order the rows this run collected by price or discount.
Use Cases
- Price and discount monitoring: track the sale section or specific designers on a schedule, and get only the price moves and new markdowns.
- Resale and reseller pricing research: compare SSENSE retail and sale prices against resale platforms for the same designers and styles.
- Assortment and catalogue analysis: map which designers, categories and genders make up the storefront, with stock state per product.
- Fashion trend and content research: pull product names, designers and images to track what a luxury retailer stocks each season.
- Deal and drop alerting: watch a designer or category for restocks and new markdowns with Incremental mode.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
recordId / productId | "10000001" (the store's own product id, stable across runs) |
rowType | "product" |
title | "Sample Name Wool Coat" |
brand / brandId | "Sample Designer" / "909" |
sku | "000000S00000" |
gender | "men" (also "women") |
category | "coats" (the product type keyword, with Fetch product details on) |
categoryIds | ["3", "178"] (the store's own category ids) |
price / regularPrice | 890 / 1290 |
onSale / discountPercent | true / 31.0 |
currency | "USD" |
inStock | true |
imageUrl / url | product image and product page |
description | product description (with Fetch product details on) |
images | full product gallery, store order (with Fetch product details on) |
sizes | per size name, sku, inStock (with Fetch product details on) |
composition / countryOfOrigin | material text and the made-in country (with Fetch product details on) |
detailCarriedForward | true when a failed product page fetch reused the previous run's description and category |
scrapedAt | "2026-01-01T00:00:00Z" |
changeType | "NEW" (also "UPDATED", "UNCHANGED", "REAPPEARED", "EXPIRED", incremental mode only) |
changedFields | ["price"] (incremental mode, on an UPDATED row) |
firstSeenAt / lastSeenAt | incremental mode change tracking timestamps |
Output views and run summary
The dataset has three views: Overview (price pair, stock, link), Detail (description, gallery, sizes, composition, origin) and Changes (change type, changed fields, first and last seen). Each run also saves an OUTPUT record in the key-value store with the total records, per-scope counts and whether the run was blocked or failed.
How to Use
- Pick a mode:
search(by keyword, or by browsing a section, category, designer or the sale axis) orurl(paste store links). - Fill in the fields for that mode, and narrow with the price, discount and sort filters if you want.
- Set Max items (and, optionally, Max pages per source) to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Search by keyword:
{"mode": "search","searchTerms": ["sneakers"],"maxItems": 20}
Browse the women's sale section, discounted rows only:
{"mode": "search","gender": "women","saleOnly": true,"onSaleOnly": true,"maxItems": 50}
Browse specific designers:
{"mode": "search","designerSlugs": ["balenciaga", "rick-owens"],"maxItems": 30}
Paste a store URL:
{"mode": "url","urls": ["https://www.ssense.com/en-us/men/sneakers"],"fetchDetails": true}
URL shapes
| Shape | Example |
|---|---|
| Category | https://www.ssense.com/en-us/men/sneakers |
| Section (men) | https://www.ssense.com/en-us/men |
| Section (women) | https://www.ssense.com/en-us/women |
| Women category | https://www.ssense.com/en-us/women/bags |
| Designer | https://www.ssense.com/en-us/men/designers/balenciaga |
| Sale section | https://www.ssense.com/en-us/men/sale |
| Sale and category | https://www.ssense.com/en-us/men/sale/sneakers |
| Start from a page | https://www.ssense.com/en-us/men/sneakers?page=2 |
| Search inside a section | https://www.ssense.com/en-us/men/sneakers?q=nike |
| Product | https://www.ssense.com/en-us/men/product/salvatore-ferragamo/white-gancini-sneakers/19403311 |
| Bare product id | 19403311 |
URL mode behaviour change: a URL mode run with the urls field left untouched now scrapes one example of each shape above instead of nothing. Only the en-us storefront is supported: a locale-less path or another locale is scraped from en-us with a warning in the log, and a /search?q= path is not a store page and is skipped with a warning.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/ssense-product-scraper").call(run_input={"mode": "search", "searchTerms": ["sneakers"], "maxItems": 20})for product in client.dataset(run["defaultDatasetId"]).iterate_items():print(product["title"], product["price"], product["regularPrice"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/ssense-product-scraper').call({ mode: 'search', searchTerms: ['sneakers'], maxItems: 20 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How maxItems and maxPages shape a run
maxItems is the single cap on a run: it stops after that many records, counted across every search term, designer and URL. The budget is shared out evenly between those sources, so a source that runs out of results early can leave the run below maxItems. maxPages is an optional extra safety bound on how many result pages the run may walk per source; leave it at 0 for no page limit, and the run then stops at maxItems, not here.
Notes on scope
- A search term is never combined with a designer facet in one request; the store refuses that combination, so a designer scope walks the designer's full page instead.
- A designer slug the store does not know would silently redirect to the full catalogue. The actor detects that redirect, refuses the page, and fails the run loudly rather than returning a wider scope than you asked for.
- In URL mode, a pasted URL decides its own scope: the price, discount and sort filters still narrow what the run keeps, while the category, designers and sale only inputs are search mode only. Add
?page=3to a browse URL to start from that page. - Prices are quoted in the currency of the market you pick under Country (default US, US dollars) or of a pasted
en-xxURL; the connection country does not change the currency. Every row states its own currency. The minimum and maximum price filters compare against that number as is, so choose the Country whose currency you filter in.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset id and the actor skips everything already collected there, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same scope, for example a daily sale watch. Each record is classifiedNEW,UPDATED(withchangedFields, and a price move counts as a change),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that scanned the whole scope, and only withemitExpired).stateKeynames or shares the stored state; leave it empty and the actor derives one from the search terms, URLs and filters, so two different searches never mix state. With incremental mode off, output is exactly as before. - For recurring runs with Emit expired, paste browse URLs without
?page=, keep one State key per search, and keep Country fixed for each State key: a run that starts mid catalogue can mark products that moved to earlier pages as expired, and a currency switch (a different Country) reads as a price change. A pasted URL that starts at?page=2or later is a partial scan, so it never produces expired records.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via 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 record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where record pages should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keyword search or browse) or url (paste store URLs). |
searchTerms | array | ["sneakers"] | Search mode: one or more terms to search the store for. Leave empty to browse a section, category or designer instead. |
urls | array | one example of each shape (below) | URL mode: store product, browse, category, designer or sale URLs to paste. |
gender | string | men | Storefront section. Applies in both modes. |
category | string | (none) | Search mode only: only browse this category slug. |
designerSlugs | array | (none) | Search mode only: only browse these designer slugs. |
saleOnly | boolean | false | Search mode only: browse the sale section only. |
minPriceUsd | integer | (none) | Keep only rows priced at or above this value, compared in the row's own currency, set by Country (US dollars on the default US market). Applies in both modes. |
maxPriceUsd | integer | (none) | Keep only rows priced at or below this value, compared in the row's own currency, set by Country (US dollars on the default US market). Applies in both modes. |
onSaleOnly | boolean | false | Keep only rows with a discount. Applies in both modes. |
sortResultsBy | string | site_order | Order this run's rows by site_order, price_asc, price_desc, or discount_desc. |
siteSort | string | site_default | Ask the store itself to order pages: site_default (latest arrivals), price_asc, price_desc, discount_desc, discount_asc. Decides which rows fit under Max items. |
countryCode | string | US | One of 43 English-storefront markets (for example GB, JP, AU); sets the currency and prices of every row. Default US is unchanged. |
fetchDetails | boolean | false | Fetch each product's page for the description, the product type keyword, the full image gallery, per-size SKU and stock state, composition and country of origin. Charged once per record; the price pair, stock state and the main image (imageUrl) are on every row either way. |
maxItems | integer | 20 | Stop after this many records across all sources (0 = unlimited). |
maxPages | integer | 0 | Safety bound on result pages walked per source (0 = no limit; maxItems still applies). |
resumeFromRunId | string | (none) | Continue one interrupted run by its run or dataset id. |
incrementalMode | boolean | false | Return only new and changed records on scheduled runs over the same scope. |
stateKey | string | (none) | Name or share an incremental-mode state; derived automatically from the scope when empty. |
emitUnchanged | boolean | false | Also return (and bill) unchanged records. |
emitExpired | boolean | false | Also return (and bill) expired records, once a run has fully scanned the tracked scope. |
ignoreFieldsForChanges | array | [] | Extra field names (for example imageUrl or title) that should not make a product count as UPDATED in incremental mode. The detail only fields images, sizes, composition and countryOfOrigin are always left out of change detection (output only, they cannot be opted back in, and a dotted path inside sizes has no effect), so a restock shows through the product level inStock only. Ignored fields are still returned. Price, sale and stock fields are watched by default. |
proxy | object | Apify Proxy | Connection settings. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which record pages are created. |
maxNotifyListings | integer | 50 | Cap on records written to each connector per run. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"recordId": "10000001","rowType": "product","productId": "10000001","url": "https://www.example.com/en-us/men/product/sample-designer/sample-name-wool-coat/10000001","title": "Sample Name Wool Coat","brand": "Sample Designer","brandId": "909","sku": "000000S00000","gender": "men","category": "coats","categoryIds": ["3", "178"],"price": 890,"regularPrice": 1290,"onSale": true,"discountPercent": 31.0,"currency": "USD","inStock": true,"imageUrl": "https://example.com/images/sample-coat.jpg","description": "Sample flannel coat with a relaxed fit.","scrapedAt": "2026-01-01T00:00:00Z"}
With Incremental mode on, rows also carry changeType, changedFields, firstSeenAt and lastSeenAt; a failed product page repair adds detailCarriedForward.
Plan Requirement
The default Apify Proxy setting works; no residential proxy is needed. Measured on the default pool, the store's pages loaded for the browse, category, designer, sale, search-in-section and product shapes. The store sits behind a browser check that refuses ordinary clients on every proxy group, so the actor presents itself as a regular browser, and it rotates connections automatically when one is refused. Residential access (pick it under Proxy & connection) gives more headroom for large or frequent runs, but a single residential exit can occasionally be challenged, so it is not required and not more reliable by default.
What you may see in the log and run status:
- On a free plan the residential connection is refused. The log shows a boxed warning ("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 a backup connection serves data, "Served over the backup connection (the default connection was unavailable)."
- If every connection is refused for the account, the run fails with "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".
- If a free plan's backup connection cannot load the pages either, the run fails with "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 SSENSE pages."
- For any other run where no page loaded, the run fails with "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search."
A product page that takes longer than 25 seconds is given up on rather than stalling the run.
FAQ
How much does it cost?
You pay a small start charge and per product record returned, plus the product details charge (description, gallery, sizes, composition, origin) only when Fetch product details is on, once per delivered record. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape SSENSE?
This actor collects only publicly available product data. You are responsible for how you use it: follow SSENSE's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product names, prices and stock state are generally facts, but photos and designer names may be subject to third-party rights.
Can I track only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated records (a price move counts as an update), and unchanged ones are not billed unless you turn on Emit unchanged.
Why did URL mode return more or fewer rows than I expected?
A pasted product URL always returns exactly one record. A pasted browse, category, designer or sale URL is walked page by page like a search, and the price, discount and sort filters still narrow what the run keeps; the category, designers and sale only inputs do not apply, because the pasted URL already decides that scope.
Why did my run fail instead of returning an empty dataset?
If the store refuses every request, or a designer slug it does not know silently redirects to the full catalogue, the run stops with a clear message so "nothing matched" is never confused with "nothing could be read". Run it again in a few minutes, or check the Proxy configuration.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ More scrapers you might like
Pair this actor with these related scrapers from the same team:
| ๐งฉ Grailed Scraper Scrape Grailed by keyword, category, designer, condition, size or URL. Extract prices and... | ๐ The RealReal Scraper Scrape luxury consignment listings from therealreal.com. Browse by designer, category or... |
| ๐ 24S Scraper Scrape 24S luxury fashion by category, filters, or URL. Extract brand, name, price... | ๐ Vogue Scraper Scrape Vogue fashion, beauty and culture articles with full text, runway shows, look... |
| ๐งฉ Miravia Spain Scraper Scrape Miravia Spain by keyword, seller store or URL. Every row carries the selling price... | ๐งฉ ASOS Scraper Scrape ASOS by keyword, category or URL. Every row carries the selling price and the... |
๐ 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.