ASOS Scraper - Products, Prices & Stock avatar

ASOS Scraper - Products, Prices & Stock

Pricing

from $1.70 / 1,000 product records

Go to Apify Store
ASOS Scraper - Products, Prices & Stock

ASOS Scraper - Products, Prices & Stock

Scrape ASOS by keyword, category or URL. Every row carries the selling price and the original price, the discount, brand, colour and selling-fast flags. Sizes, per-size stock and reviews are one toggle away. Recurring change tracking is first-class.

Pricing

from $1.70 / 1,000 product records

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

ASOS Scraper: Products, Prices & Stock

Scrape ASOS, the global fast-fashion store: search by keyword, browse a category, or paste any store URL to walk it directly. The catalogue is read from the store's own JSON search API, one request per page of 48 products.

Every row carries the selling price and the original (pre-discount) price, with the discount percentage computed, plus the brand, the colour and the demand flags (new in, selling fast, restocking soon). Sizes, per-size stock and customer reviews are one toggle away.

What you get

FieldMeaning
recordId / productIdThe store's own product id, stable across runs
title / brand / productCodeProduct name, brand, style code
price / priceTextThe current selling price, as a number and as shown
originalPriceThe original (pre-discount) price
onSale / discountPercentTrue when the selling price is below the original price, and by how much
currency / colour / colourWayIdQuoting currency and the colour way
isNew / isSellingFast / isRestockingSoon / isPromotionThe store's demand flags from the listing card
imageUrl / urlProduct image and product page
description / productTypeWith Fetch product details on
sizesWith Fetch product details on: every size with brand size, SKU, EAN and per-size stock (available, inStock, isLowInStock, isRestockingSoon)
inStock / sellerWith Fetch product details on: overall availability and the seller of record
reviewsWith Fetch reviews on: rating count, average, Fit/Quality scores and the reviews themselves
changeType / changedFields / firstSeenAt / lastSeenAtIncremental-mode change tracking fields

How to use it

Search mode (default): give it search terms and it walks the store's own search results. Combine with the brand, colour and ordering filters; those are sent to the store with every page, so a filtered run reads fewer pages rather than throwing rows away afterwards. The price bounds and Discounted rows only are applied to the rows the run reads, because the store offers no parameter for them.

URL mode: paste any store URL. A product URL returns that single product in full. A search or category URL is walked page by page, and the pasted URL decides its own scope:

  • https://www.asos.com/search/?q=midi+dress (add &page=3 to start further in)
  • https://www.asos.com/women/dresses/cat/?cid=8799

Notes on scope

  • The brand, colour and ordering filters apply to every walk in both modes; a pasted product URL is the exception, it returns that one product.
  • Brand and colour ids are the store's own numeric ids. Each row carries its brandId, so scrape any product once to look an id up. A malformed token is discarded rather than sent, so a typo can never silently widen a run back to the unfiltered catalogue.
  • Rows are priced in GBP from the store's international (COM) storefront with the UK size scale; every row states its own currency.
  • The store does not serve a stock state on its listing cards, so inStock and per-size availability arrive only with Fetch product details on.
  • The declared result count moves by a few hundred between identical calls seconds apart, because the catalogue is live. The walk ends on the empty page, never on that count.

Output

Dataset rows are flat JSON. Example (illustrative placeholder, not a real product):

{
"recordId": "00000001",
"rowType": "product",
"productId": "00000001",
"title": "Sample Name Tiered Midi Dress",
"brand": "Sample Brand",
"colour": "Navy",
"price": 45.0,
"priceText": "ยฃ45.00",
"originalPrice": 60.0,
"onSale": true,
"discountPercent": 25.0,
"currency": "GBP",
"isNew": false,
"isSellingFast": true,
"imageUrl": "https://images.example.com/products/sample-dress/00000001-1.jpg",
"url": "https://www.example.com/sample-brand/sample-name-tiered-midi-dress/prd/00000001",
"scrapedAt": "2026-01-01T00:00:00Z"
}

With Fetch product details on, rows also carry description, productType, inStock, seller and sizes, for example:

{
"sizes": [
{"size": "XS - UK 6", "brandSize": "XS", "sku": "0000001", "ean": "0000000000000",
"available": true, "inStock": true, "isLowInStock": false, "isRestockingSoon": false,
"seller": "SAMPLE BRAND LTD"}
]
}

With Fetch reviews on, rows carry reviews: the store's declared rating count, the average over the reviews page it serves, Fit and Quality scores, and the reviews themselves. The store serves one page of reviews (about ten) per product to automated readers, so Max reviews per product is a cap, not a pagination promise.

With Incremental mode on, rows also carry changeType (NEW, UPDATED, UNCHANGED, REAPPEARED, EXPIRED), changedFields, firstSeenAt and lastSeenAt. Price moves and stock changes are reported as UPDATED. Resume from a previous run continues one interrupted crawl without returning or billing the records it already returned.

Limits and costs

  • maxItems is the single cap on a run (0 = unlimited). maxPages is an optional safety bound per source.
  • Fetch product details and Fetch reviews each read extra data per record. They are a paid extra (the Product details & reviews event on the pricing tab), charged once per record at most even with both on. The price pair, brand, colour and demand flags are on every row either way.
  • Emit unchanged and Emit expired return, and bill, extra rows; leave them off unless you want full snapshots or expiry tracking.

Send results into your apps (MCP connectors)

Results can be piped into the apps you already use through Model Context Protocol (MCP) connectors, as an optional side channel. This never changes the dataset output.

  • mcpConnectors: authorize a connector under Apify, Settings, API & Integrations, then select it here. Notion receives a page per record; other connectors receive a best-effort write or digest. Each connector gets a condensed summary per record; the complete record always stays in the dataset.
  • notionParentPageUrl: the Notion page under which record pages are created. Required for the Notion connector, ignored by the others.
  • maxNotifyListings: cap on records written to each connector per run.

Compute

This actor reads JSON over plain HTTP; 512 MB of memory is the default and is plenty. A minimal run finishes in well under a minute.