ASOS Scraper – Products, Prices, Sizes, Stock & Reviews
Pricing
from $1.50 / 1,000 plp product rows
ASOS Scraper – Products, Prices, Sizes, Stock & Reviews
Search ASOS by keyword or browse 39 built-in categories. One row per product: name, brand, colour, price and previous price, localised URL, images and sale flags. Switch on details for every size with its SKU, real in-stock status, rating and description. Needs a residential proxy.
Pricing
from $1.50 / 1,000 plp product rows
Rating
0.0
(0)
Developer
R.L.
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Extract product data from ASOS by keyword search or category browse — name, brand, colour, price and previous price, images, sale flags, and (optionally) every size in the run with its SKU and real in-stock status, plus ratings and the full description. It calls ASOS's own mobile app API rather than rendering pages, so it returns clean structured JSON instead of parsed HTML. Get results via the Apify API, schedule runs, or plug straight into Make/Zapier/Google Sheets.
What can I use it for?
- Price monitoring — track markdowns, previous-price drops, and outlet pricing across competitor or your own catalogue.
- Market research — pull assortment, brand mix, and pricing by category and region.
- Stock tracking — check size-level availability (SKU, low-stock, restocking) before a drop sells out.
- Feed building — power a price-comparison site, deal alert bot, or affiliate feed with live ASOS data.
How do I run it?
- Click Try for free and open the Input tab.
- Enter a search keyword (e.g.
dress,Nike sneakers) or pick a category from the dropdown — a category overrides the keyword. - Pick your store/locale (
store,currency,lang,sizeSchema) to match the ASOS region you care about. See which locales work — they have to be a combination ASOS accepts. - Set Max items (
0= everything matching) and optionally turn on Include product details for per-size SKU and stock, ratings, gender and description (slower and charged again per product — one extra request each). - Click Start and grab results from the Dataset tab, or via API in JSON, CSV, Excel, etc.
No coding needed, but everything here is also driveable via the Apify API for scheduled or automated runs.
What input does it take?
| Field | Description |
|---|---|
q | Search keyword. Leave empty to browse by category instead. One of q or category is required. |
category | Category ID to browse (dropdown, 39 categories). Overrides q. |
store / currency / lang / sizeSchema | Locale settings. Default US/USD/en-US/US. |
maxItems | Max products to return. 0 = all matches. Default 100. |
limit | Results per page from ASOS (max 72, the default). |
includeDetails | Fetch each product's detail page for per-size SKU and stock, ratings, gender, fit and description. Off by default — one extra request per product. |
detailConcurrency | Parallel detail requests when includeDetails is on (1–20, default 8). |
proxyConfiguration | Proxy to use. Residential proxy is required — ASOS blocks datacenter IPs via Akamai — and is preselected for you. |
Which categories can I browse?
Pick one from the dropdown, or pass the ID directly:
| Category | ID | Category | ID |
|---|---|---|---|
| Men's Accessories | 4210 | Women's Bags | 8730 |
| Men's Activewear | 26090 | Women's Boots | 6455 |
| Men's Bags | 9265 | Women's Coats & Jackets | 2641 |
| Men's Boots | 5774 | Women's Dresses | 8799 |
| Men's Face + Body | 19517 | Women's Face + Body | 1314 |
| Men's Hoodies & Sweatshirts | 5668 | Women's Jeans | 3630 |
| Men's Jackets & Coats | 3606 | Women's Jewellery | 4175 |
| Men's Jeans | 4208 | Women's Jumpers & Cardigans | 2637 |
| Men's Jewellery | 5034 | Women's Lingerie | 6046 |
| Men's Shirts | 3602 | Women's Sandals | 6458 |
| Men's Shoes | 4209 | Women's Shirts | 15200 |
| Men's Shorts | 7078 | Women's Shoes | 4172 |
| Men's Suits | 5678 | Women's Shorts | 9263 |
| Men's Sunglasses | 6519 | Women's Suits | 13632 |
| Men's Swimwear | 13210 | Women's Sunglasses | 4545 |
| Men's T-Shirts & Vests | 7616 | Women's Swimwear | 2238 |
| Men's Trainers | 5775 | Women's Tops | 4169 |
| Men's Trousers | 4910 | Women's Trainers | 6456 |
| Women's Accessories | 4174 | Women's Trousers | 2640 |
| Women's Activewear | 26091 |
Which stores and locales work?
ASOS does not check these four fields separately: it resolves one store from store + currency + lang together and answers HTTP 400 "No valid store was found" when that triple is not one it serves. So each store code goes with exactly one language and a short list of currencies — changing currency on its own is always rejected. Note that the UK store code is COM, not GB. The full set, verified against the live API:
| Region | store | currency | lang |
|---|---|---|---|
| United States (default) | US | USD | en-US |
| United Kingdom | COM | GBP | en-GB |
| Australia | AU | AUD | en-AU |
| Germany | DE | EUR | de-DE |
| France | FR | EUR or USD | fr-FR |
| Italy | IT | EUR | it-IT |
| Spain | ES | EUR | es-ES |
| Netherlands | NL | EUR | nl-NL |
| Sweden | SE | SEK | sv-SE |
| Denmark | DK | DKK | da-DK |
| Poland | PL | PLN | pl-PL |
| Russia | RU | RUB or USD | ru-RU |
| Rest of world | ROW | USD, GBP, EUR, AUD, CAD, CHF, CNY, HKD, NZD, SGD or AED | en-GB |
Case does not matter (com/gbp/en-gb work as well). A combination ASOS does not serve no longer fails the run: the Actor checks it before the first request and finishes with a status message naming the offending value and the right one, e.g. "store 'GB' is not a valid ASOS store code — the United Kingdom store is 'COM'".
lang changes the language of name and description (the German store really does return German titles), currency changes priceText and currency, and the url is built for the store you asked for so it does not 404 on a country-exclusive line.
sizeSchema decides whether brandSize reads US 4, UK 8 or DE 36, and is the one field ASOS validates per store, inconsistently: US and UK are accepted everywhere, EU is accepted by COM, US and IT but rejected by DE and FR, and a store's own schema (DE on the German store, AU on the Australian one) is accepted where it applies. It is therefore left to ASOS rather than pre-checked — if ASOS rejects it, the run reports that and finishes rather than failing. Leave it at US or UK if you do not need a local size.
What does each row contain?
Each dataset row is one product. Example from a real run (includeDetails: true, trimmed):
{"id": 211123790,"name": "ASOS DESIGN gold-tone hardware structured mini dress with one shoulder in black scuba-style fabric","brandName": "ASOS DESIGN","currentPrice": 84.99,"priceText": "$84.99","previousPrice": null,"currency": "USD","isMarkedDown": false,"colour": "Black","colourWayId": 211123795,"productCode": 158017324,"url": "https://www.asos.com/us/asos-design/asos-design-gold-tone-hardware-structured-mini-dress-with-one-shoulder-in-black-scuba-style-fabric/prd/211123790#colourWayId-211123795","gender": "Women","averageRating": 4.1,"totalReviewCount": 13,"inStockSizes": ["US 0", "US 2", "US 4", "US 6", "US 8", "US 12"],"sizes": [{ "brandSize": "US 0", "sku": "158017325", "ean": null, "colour": "Black", "countryOfManufacture": "RO", "isInStock": true, "isLowInStock": false, "isRestockingSoon": false }],"careInfo": "Machine wash according to instructions on care labels"}
You can download the dataset in JSON, CSV, Excel, XML, or HTML from the Console or API.
Fields from search and category browse
| Field | Description |
|---|---|
id / productCode | ASOS product id (the number in the product URL) and the product code |
name / brandName | Product title and brand, in the language of lang |
currentPrice / previousPrice / priceText / previousPriceText / currency | Price now and before, as numbers and as the formatted strings ASOS shows |
isMarkedDown / isOutletPrice / isPromotion / hasMultiplePrices | Pricing flags |
colour / colourWayId / hasVariantColours | This colourway, its id, and whether other colours of the same product exist |
url / images | Localised product page URL (with the colourway anchor) and the image URLs for this colourway |
isSellingFast / isRestockingSoon / isNew | ASOS's own badges for this product |
productType | ASOS's record type. In practice it is the constant Product — it is not a category label, so do not group by it |
Fields that need includeDetails: true
Without it, these keys are present but null, so the row shape stays stable:
| Field | Description |
|---|---|
sizes | Every size in the run: brandSize, sku, ean, colour, countryOfManufacture, isInStock, isLowInStock, isRestockingSoon |
inStockSizes | Just the size names you can actually buy right now |
averageRating / totalReviewCount | Review score and count |
description / aboutMe / sizeAndFit / careInfo | The product copy, converted from ASOS's HTML to plain text |
gender / fitType / isDiscontinued | Who it is listed for, the fit name, and whether ASOS has discontinued it |
Why is "in stock" more reliable here?
ASOS's catalogue lists every size of a product with isAvailable: true, even sizes that are sold out — the flag means "this is a valid size", not "you can buy it". A scraper that trusts it reports everything as available. This Actor makes a second call to ASOS's stock/price endpoint and merges the real per-variant state, so isInStock, isLowInStock and isRestockingSoon reflect what is actually purchasable, and inStockSizes is that subset. If the stock call fails for one product, that product falls back to the catalogue flag rather than dropping out.
Which brands are on ASOS?
The Actor does not filter by brand — you get whatever ASOS returns for your keyword or category, ASOS's own labels and third-party ones alike. Brands seen in sample runs include Nike, adidas Originals, New Balance, Fred Perry, Tommy Hilfiger, Tommy Jeans, Jack & Jones, ONLY & SONS, Mango, Topshop, Miss Selfridge, Princess Polly, Reclaimed Vintage, Noak, ASOS DESIGN and ASOS Curve. To pull a single brand, search its name as the keyword (q) and filter the rows on brandName.
How much does a run cost?
Billing is pay-per-event, and there are two events (see the Pricing tab):
- one per product row pushed, and
- one more per product when
includeDetailsis on — charged only if the detail data actually came back, so a failed detail fetch is not billed.
So an enriched run costs about twice a plain one for the same number of products, and maxItems is the cap that bounds both. Platform usage is small: this calls an API rather than rendering pages, and the Actor runs in 128–512 MB of RAM. The residential proxy traffic is billed per Apify's proxy pricing.
Tips
- Leave
maxItemsat a reasonable value while testing — set0only once you know how big the category or keyword is. - Skip
includeDetailsunless you need per-size stock, ratings or descriptions. It doubles both the requests and the charge. - Raise
detailConcurrencyfor faster detail fetches, but watch for proxy or rate-limit errors if you push it too high. - Rows are deduplicated by product id across pages, because ASOS search rankings shift between page requests — so a run of 100 can end up asking for more than two pages.
FAQ
Do I need an ASOS account or API key? No. There is no login, token or API key — the Actor calls the endpoints ASOS's own app calls, unauthenticated. You do need a proxy (below).
Why do I need a residential proxy? ASOS's API is behind Akamai bot protection, which blocks datacenter IP ranges. Residential Apify Proxy is preselected in the input; a datacenter proxy or no proxy will fail rather than return partial data.
Can I scrape a specific product URL? Not directly — the input takes a keyword or a category, not a URL or a product id. Search the product name and match on id, which is the number at the end of every ASOS product URL (/prd/211123790).
Does it return reviews? It returns the score and the count (averageRating, totalReviewCount) with includeDetails on, not the individual review texts.
How do I get prices in GBP or EUR? Set the whole locale group, not just the currency: store: "COM" with currency: "GBP" and lang: "en-GB" for the UK, store: "DE" with currency: "EUR" and lang: "de-DE" for Germany. Changing currency alone leaves it inconsistent with the store and ASOS rejects it. The ROW store is the exception: it takes eleven currencies with lang: "en-GB".
What happens if the run fails? Input the Actor cannot work with — neither q nor category, or a locale combination ASOS does not serve — is not treated as a failure: the run stops, finishes successfully and the status message says which value was wrong and what to use instead. Nothing is charged, because nothing was delivered. A genuine problem still fails loudly: if ASOS blocks the requests the page fetch raises and the run ends non-zero rather than quietly pushing an empty dataset, and with includeDetails on the first product's detail is fetched up front for the same reason, so a systematic block fails the run instead of shipping unenriched rows.
The API changed and results stopped coming back. ASOS's mobile API is not public and can change without notice. Open an issue on the Actor's Issues tab and it will be looked at.
Disclaimer: The Actor only fetches publicly accessible product data from ASOS's own API. You are responsible for complying with ASOS's Terms of Service and the law in your jurisdiction, especially around commercial reuse of the data.
Did you find this useful?
Rate this actor on Apify! Your feedback helps other users find it and helps us keep improving it.