SSENSE Scraper - Products, Sale & Retail Prices avatar

SSENSE Scraper - Products, Sale & Retail Prices

Pricing

from $1.70 / 1,000 product records

Go to Apify Store
SSENSE Scraper - Products, Sale & Retail Prices

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

Abot API

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

0

Monthly active users

13 days ago

Last modified

Categories

Features

Limited permissions

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.

FieldExample
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 / regularPrice890 / 1290
onSale / discountPercenttrue / 31.0
currency"USD"
inStocktrue
imageUrl / urlproduct image and product page
descriptionproduct description (with Fetch product details on)
imagesfull product gallery, store order (with Fetch product details on)
sizesper size name, sku, inStock (with Fetch product details on)
composition / countryOfOriginmaterial text and the made-in country (with Fetch product details on)
detailCarriedForwardtrue 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 / lastSeenAtincremental 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

  1. Pick a mode: search (by keyword, or by browsing a section, category, designer or the sale axis) or url (paste store links).
  2. Fill in the fields for that mode, and narrow with the price, discount and sort filters if you want.
  3. Set Max items (and, optionally, Max pages per source) to control run size and cost, then click Start.
  4. 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

ShapeExample
Categoryhttps://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 categoryhttps://www.ssense.com/en-us/women/bags
Designerhttps://www.ssense.com/en-us/men/designers/balenciaga
Sale sectionhttps://www.ssense.com/en-us/men/sale
Sale and categoryhttps://www.ssense.com/en-us/men/sale/sneakers
Start from a pagehttps://www.ssense.com/en-us/men/sneakers?page=2
Search inside a sectionhttps://www.ssense.com/en-us/men/sneakers?q=nike
Producthttps://www.ssense.com/en-us/men/product/salvatore-ferragamo/white-gancini-sneakers/19403311
Bare product id19403311

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 ApifyClient
client = 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=3 to 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-xx URL; 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 classified NEW, UPDATED (with changedFields, and a price move counts as a change), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED or EXPIRED (only after a run that scanned the whole scope, and only with emitExpired). stateKey names 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=2 or 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.

  1. Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to 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

ParameterTypeDefaultDescription
modestringsearchsearch (keyword search or browse) or url (paste store URLs).
searchTermsarray["sneakers"]Search mode: one or more terms to search the store for. Leave empty to browse a section, category or designer instead.
urlsarrayone example of each shape (below)URL mode: store product, browse, category, designer or sale URLs to paste.
genderstringmenStorefront section. Applies in both modes.
categorystring(none)Search mode only: only browse this category slug.
designerSlugsarray(none)Search mode only: only browse these designer slugs.
saleOnlybooleanfalseSearch mode only: browse the sale section only.
minPriceUsdinteger(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.
maxPriceUsdinteger(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.
onSaleOnlybooleanfalseKeep only rows with a discount. Applies in both modes.
sortResultsBystringsite_orderOrder this run's rows by site_order, price_asc, price_desc, or discount_desc.
siteSortstringsite_defaultAsk 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.
countryCodestringUSOne of 43 English-storefront markets (for example GB, JP, AU); sets the currency and prices of every row. Default US is unchanged.
fetchDetailsbooleanfalseFetch 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.
maxItemsinteger20Stop after this many records across all sources (0 = unlimited).
maxPagesinteger0Safety bound on result pages walked per source (0 = no limit; maxItems still applies).
resumeFromRunIdstring(none)Continue one interrupted run by its run or dataset id.
incrementalModebooleanfalseReturn only new and changed records on scheduled runs over the same scope.
stateKeystring(none)Name or share an incremental-mode state; derived automatically from the scope when empty.
emitUnchangedbooleanfalseAlso return (and bill) unchanged records.
emitExpiredbooleanfalseAlso return (and bill) expired records, once a run has fully scanned the tracked scope.
ignoreFieldsForChangesarray[]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.
proxyobjectApify ProxyConnection settings.
mcpConnectorsarray(none)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which record pages are created.
maxNotifyListingsinteger50Cap 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.

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.