Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the ASOS API page →
E-commerce & Marketplaces

ASOS API & Scraper

The ASOS API returns fashion product data from ASOS as clean JSON.

11 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The primary search endpoint returns products with id, name, price, brand, colour, images, stock and colour variants, plus facets for brands, colours, sizes and price, and you can browse a category, sale and new-in, pull a product, its reviews and similar items, and the navigation and filters. It is built for fashion-price monitoring, catalog enrichment and retail analytics that need ASOS data without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.

Reference

ASOS ids, stores and the four numbers on one product

A single ASOS garment carries four different identifiers, and one of them changes meaning between actions. The store parameter is what sets the currency, and the enum now lists only the five storefronts that answer. Everything below was measured on 2026-08-27, mostly against product 210791038, a Bershka halter midi dress.

Field or valueWhat it identifiesMeasured value
idThe colourway-level product, the number after /prd/ in the URL210791038
colour_way_idWhich colour the row is showing. Present on search rows, null on the product action210791039
product_codeASOS's internal style code. A string on product, an integer on search"156679606"
variants[].idOne size of one colour210791040, for size XS - UK 6
variants[].skuThat size's stock-keeping code"156679614"
variants[].ean13-digit retail barcode for that size"8447489469461"
variants[].size vs brand_sizeASOS's own size label vs the brand's label"XS - UK 6" vs "XS"
variants[].sellerPartner that fulfils the order. null when ASOS holds the stock itself{"id": "BRKAFS", "description": "BERSHKA UK LTD"}
store=COM / GBUK and international. COM is the defaultcurrency GBP, prices formatted "£27.99"
store=USUnited Statescurrency USD, prices formatted "$157.00"
store=DE / FRGermany and Francecurrency EUR, current_text "64,99 €" with current_value 64.99
store=<anything else>Rejected by the schema, with no upstream callINVALID_PARAM "invalid value for 'store'", with the five allowed values in error.detail

current_text is formatted the way that store formats money, comma-decimal included, while current_value is always a plain number. On the product action watch meta.stockprice: "v4_matched_12" means live per-size price and stock were matched for 12 variants, and "unavailable" means they were not and the prices you are looking at are the ones embedded in the page.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/asos/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "dress"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "asos",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1324,
    "record_count": 48,
    "bytes": 0,
    "cache_hit": false,
    "completeness_pct": 100,
    "method": "internal_json_api",
    "store": "COM",
    "currency": "GBP",
    "total": 22080,
    "offset": 0,
    "limit": 48,
    "has_more": true,
    "next_offset": 48
  },
  "data": {
    "products": [
      {
        "id": 210882523,
        "name": "[redacted-name]",
        "brand": "Bershka",
        "colour": "Brown",
        "colour_way_id": 210882524,
        "product_code": 157114835,
        "price": {
          "current_value": 22.99,
          "current_text": "£22.99",
          "previous_value": 29.99,
          "previous_text": "£29.99",
          "rrp_value": null,
          "rrp_text": "",
          "currency": "GBP",
          "is_marked_down": true,
          "is_outlet_price": false
        },
        "images": [
          "https://images.asos-media.com/images.asos-media.com/products/bershka-bandeau-mini-dress-in-brown/[redacted-phone]-brown",
          "https://images.asos-media.com/images.asos-media.com/products/bershka-bandeau-mini-dress-in-brown/[redacted-phone]",
          "https://images.asos-media.com/images.asos-media.com/products/bershka-bandeau-mini-dress-in-brown/[redacted-phone]"
        ],
        "url": "https://www.asos.com/bershka/bershka-bandeau-mini-dress-in-brown/prd/[redacted-phone]#colourWayId-[redacted-phone]",
        "in_stock": true,
        "is_selling_fast": true,
        "has_variant_colours": false,
        "colour_variant_product_ids": [
          210882498,
          210882523
        ],
        "video_url": null
      },
      {
        "id": 210791038,
        "name": "[redacted-name]",
        "brand": "Bershka",
        "colour": "YELLOW",
        "colour_way_id": 210791039,
        "product_code": 156679606,
        "price": {
          "current_value": 27.99,
          "current_text": "£27.99",
          "previous_value": null,
          "previous_text": "",
          "rrp_value": null,
          "rrp_text": "",
          "currency": "GBP",
          "is_marked_down": false,
          "is_outlet_price": false
        },
        "images": [
          "https://images.asos-media.com/images.asos-media.com/products/bershka-halter-midi-dress-with-linen-in-yellow/[redacted-phone]-yellow",
          "https://images.asos-media.com/images.asos-media.com/products/bershka-halter-midi-dress-with-linen-in-yellow/[redacted-phone]",
          "https://images.asos-media.com/images.asos-media.com/products/bershka-halter-midi-dress-with-linen-in-yellow/[redacted-phone]"
        ],
        "url": "https://www.asos.com/bershka/bershka-halter-midi-dress-with-linen-in-yellow/prd/[redacted-phone]#colourWayId-[redacted-phone]",
        "in_stock": true,
        "is_selling_fast": true,
        "has_variant_colours": false,
        "colour_variant_product_ids": [
          210790975,
          210791038,
          211330738
        ],
        "video_url": null
      },
      {
        "id": 210987260,
        "name": "[redacted-name]",
        "brand": "ASOS DESIGN",
        "colour": "MONO SPOT",
        "colour_way_id": 210987262,
        "product_code": 157508553,
        "price": {
          "current_value": 36,
          "current_text": "£36.00",
          "previous_value": null,
          "previous_text": "",
          "rrp_value": null,
          "rrp_text": "",
          "currency": "GBP",
          "is_marked_down": false,
          "is_outlet_price": false
        },
        "images": [
          "https://images.asos-media.com/images.asos-media.com/products/asos-design-cut-out-detail-midaxi-dress-in-mono-polka-dot/[redacted-phone]-monospot",
          "https://images.asos-media.com/images.asos-media.com/products/asos-design-cut-out-detail-midaxi-dress-in-mono-polka-dot/[redacted-phone]",
          "https://images.asos-media.com/images.asos-media.com/products/asos-design-cut-out-detail-midaxi-dress-in-mono-polka-dot/[redacted-phone]"
        ],
        "url": "https://www.asos.com/asos-design/asos-design-cut-out-detail-midaxi-dress-in-mono-polka-dot/prd/[redacted-phone]#colourWayId-[redacted-phone]",
        "in_stock": true,
        "is_selling_fast": true,
        "has_variant_colours": false,
        "colour_variant_product_ids": [
          210197533,
          210197535,
          210530514
        ],
        "video_url": "www.asos-video.com/video/upload/q_auto/t_legacy_product_video/[redacted-phone]-catwalk"
      }
    ],
    "facets": [
      {
        "id": "range",
        "name": "[redacted-name]",
        "type": "TextMultiSelect",
        "values": [
          {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]",
            "is_selected": "[trimmed-depth]"
          },
          {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]",
            "is_selected": "[trimmed-depth]"
          }
        ]
      },
      {
        "id": "freshness_band",
        "name": "[redacted-name]",
        "type": "TextMultiSelect",
        "values": [
          {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]",
            "is_selected": "[trimmed-depth]"
          },
          {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]",
            "is_selected": "[trimmed-depth]"
          },
          {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]",
            "is_selected": "[trimmed-depth]"
          }
        ]
      },
      {
        "id": "floor",
        "name": "Gender",
        "type": "TextMultiSelect",
        "values": [
          {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]",
            "is_selected": "[trimmed-depth]"
          },
          {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]",
            "is_selected": "[trimmed-depth]"
          },
          {
            "id": "[trimmed-depth]",
            "name": "[trimmed-depth]",
            "count": "[trimmed-depth]",
            "is_selected": "[trimmed-depth]"
          }
        ]
      }
    ],
    "search_term": "dress",
    "category_name": null,
    "total": 22080,
    "offset": 0,
    "limit": 48,
    "has_more": true,
    "next_offset": 48
  }
}
Actions

What the ASOS API does

ActionDescriptionConcrete use caseKey params
searchKeyword product search across the ASOS catalogue with filters (price, brand, colour, size, product type, sale, new-in, discount), sorting and offset/limit pagination.Pricing teams call search to get keyword product search across the ASOS catalogue with filters (price, brand, colour, size, pr….query, store, lang, currency, country, ...
categoryBrowse all products in a category by category_id, with the same filters, sorting and pagination as search. Get category ids from the 'navigation' action.Marketplace operators call category to get browse all products in a category by category_id, with the same filters, sorting and paginati….category_id, store, lang, currency, country, ...
saleOn-sale / marked-down products only. Provide a keyword (query) or a category_id; supports the same filters, sort and pagination as search.Catalog enrichment teams call sale to get on-sale / marked-down products only.query, category_id, store, lang, currency, ...
new_inNewest arrivals — freshness-sorted products, optionally limited to a recent window (today / last 7 / 14 / 28 days). Provide a keyword (query) or a category_id.Retail analysts call new_in to get newest arrivals.query, category_id, store, lang, currency, ...
productfull product detail (sizes/stock/description/images) by product_id or product_urlPricing teams call product to get full product detail (sizes/stock/description/images) by product_id or product_url.product_id, product_url, store
productsbatch product detail for comma-separated product_idsMarketplace operators call products to get batch product detail for comma-separated product_ids.product_ids, store
navigationcategory links from gender landing pages; format=tree returns nested path hierarchyCatalog enrichment teams call navigation to get category links from gender landing pages; format=tree.gender, store, format
reviewsproduct reviews + rating summary from PDP embedded ratings blob (paginated)Retail analysts call reviews to get product reviews + rating summary from PDP embedded ratings blob (paginated).product_id, product_url, offset, limit
similarrelated products via same-brand search fallback (true mightLike API is account-gated)Pricing teams call similar to get related products via same-brand search fallback (true mightLike API is account-gated).product_id, product_url, limit, store
filtersavailable search/category facets (brands, colours, sizes, price ranges)Marketplace operators call filters to get available search/category facets (brands, colours, sizes, price ranges).query, category_id, store, lang, currency, ...
suggestionssearch autocomplete suggestions for partial queryCatalog enrichment teams call suggestions to search autocomplete suggestions for partial query.query, store, lang, currency, country
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/asos/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"dress"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.asos.search with {"query":"dress"}.
Use cases

Who uses this API and why

  • Fashion-pricing tools call search and sale to track ASOS prices and markdowns by brand.
  • Catalog-enrichment products use product to fill listings with images, colours and variants.
  • Retail analysts use new_in and facets to spot trending brands and categories.
FAQ

Questions developers ask before integrating

What is the difference between an ASOS product id, product_code and sku?

id is the product as ASOS links to it, and it is colour-level: 210791038 is the yellow colourway of that dress. product_code ("156679606") is the internal style code. sku is per size, so the XS is "156679614", and each size also has its own 13-digit ean ("8447489469461") and its own numeric variant id (210791040). Fetch by id, match against a warehouse feed by sku or ean.

Which ASOS store codes actually return data, and what currency does each give?

COM and GB return GBP, US returns USD, DE and FR return EUR - re-measured on all five. Those five are the whole enum; a sixth value that used to sit in it was removed because ASOS never accepted it, and anything outside the five is now refused by the schema before a call goes out, with the allowed values listed in the error. The default is COM. The store changes the assortment too, not just the money: the same query reported 21,417 results on GB and 100 on FR.

Why did asking for store=US return a price in GBP?

Because that product is not sold in the US store, so the live per-store price and stock lookup found nothing and the response fell back to the price embedded in the product page. The tell is meta.stockprice: it read "unavailable" on that call, against "v4_matched_5" for the same product with store=COM. When you request a market, check that field before trusting price.currency.

Is price.previous_value the was-price?

Only when is_marked_down is true. On the product action a full-price item returns previous_value equal to current_value (27.99 and 27.99), while search returns previous_value null for the same item. On a marked-down item the actions agree: 210882523 came back as current 17.99, previous 29.99, is_marked_down true. So branch on is_marked_down rather than on whether previous_value is present.

How do I see which sizes are in stock?

variants[] carries in_stock per size, plus is_low_in_stock and is_restocking_soon. On product 210791038 the XS and S variants were in_stock true while M - UK 10 was false, even though the product-level in_stock was true. Product-level in_stock means at least one size is available, so read the variant rows whenever size matters.

What does a populated variants[].seller mean?

It means a partner brand fulfils the order rather than ASOS shipping from its own stock. The Bershka dress returned seller {"id": "BRKAFS", "description": "BERSHKA UK LTD"} on every size, while a Never Fully Dressed item on the US store returned seller null on its variants. The id is a short alphanumeric partner code, not a numeric account id.

What happens if I pass a brand name ASOS does not recognise?

You get an empty result set, not an error. Brand names are resolved to ASOS facet ids before the search runs, so a misspelling like 'Nikeee' resolved to nothing and the call returned ok true with total 0 and no products. Call the filters action first to list the brand, colour and size facets a query actually supports.

Why does colour_way_id come back null on the product action?

The product action returns the garment as a whole and hangs colour information off each variant row instead, so the top-level colour_way_id is null while every variant carries its own (210791039 on that dress). Search rows do fill the top-level field, because a search row is one colourway. If you need it from the product action, read variants[0].colour_way_id.

What is the ASOS API?

ASOS API is a ReefAPI endpoint group for asos It returns live JSON through POST requests under /asos/v1.

Is the ASOS API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. ASOS calls use the same shared credit balance as every other ReefAPI engine.

Do I need an ASOS login or account?

No login to ASOS is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the ASOS data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the ASOS API use?

ASOS actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call ASOS from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call asos actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / asos

ASOS

ASOS

base /asos/v111 endpoints
post/asos/v1/category1 credit

Browse all products in a category by category_id, with the same filters, sorting and pagination as search. Get category ids from the 'navigation' action.

ParameterAllowed / rangeDescription
category_idrequiredASOS category id (the cid in a category URL; see navigation).
store = COMoptionalCOM · GB · US · DE · FRASOS market/store — sets default language, currency and ship-to country.
langoptionalOverride the store's locale (advanced), e.g. en-GB, de-DE.
currencyoptionalOverride the store's currency (advanced), e.g. USD, EUR.
countryoptionalOverride ship-to country code (advanced), e.g. GB, US.
offset = 0optional0–Pagination offset (skip N). Page forward with meta.next_offset.
limit = 48optional1–200Results per page (1-200, default 48); clamped to 200.
sortoptionalfreshness · pricedesc · priceascSort order. Omit for relevance (default). Only these keys are valid.
min_priceoptionalMinimum price filter (in the store's currency).
max_priceoptionalMaximum price filter (in the store's currency).
brandoptionalFilter by brand — name (e.g. 'Nike', 'ASOS DESIGN') or facet id. Names are auto-resolved to ids; call the 'filters' action to list options.
colouroptionalFilter by colour — name (e.g. 'Black', 'Blue', 'Multi') or facet id.
sizeoptionalFilter by size — label (e.g. 'M', 'UK 10', 'XS') or facet id.
product_typeoptionalFilter by product type facet id (e.g. 8416=Dresses); see 'filters'.
on_saleoptionalsale · new_seasonLimit to marked-down items only.
new_in_withinoptionaltoday · yesterday · 7d · 14d · 28dLimit to items added within this window (the site's 'New in' filter).
discountoptional20 · 30 · 40 · 50 · 60 · 60+Minimum discount tier for marked-down items.
channeloptionalClient channel (advanced).
Try in playground →
post/asos/v1/sale1 credit

On-sale / marked-down products only. Provide a keyword (query) or a category_id; supports the same filters, sort and pagination as search.

ParameterAllowed / rangeDescription
queryoptionalKeyword to find sale items for (sale needs query OR category_id).
category_idoptionalCategory id to browse on sale (alternative to query).
store = COMoptionalCOM · GB · US · DE · FRASOS market/store — sets default language, currency and ship-to country.
langoptionalOverride the store's locale (advanced), e.g. en-GB, de-DE.
currencyoptionalOverride the store's currency (advanced), e.g. USD, EUR.
countryoptionalOverride ship-to country code (advanced), e.g. GB, US.
offset = 0optional0–Pagination offset (skip N). Page forward with meta.next_offset.
limit = 48optional1–200Results per page (1-200, default 48); clamped to 200.
sortoptionalfreshness · pricedesc · priceascSort order. Omit for relevance (default). Only these keys are valid.
min_priceoptionalMinimum price filter (in the store's currency).
max_priceoptionalMaximum price filter (in the store's currency).
brandoptionalFilter by brand — name (e.g. 'Nike', 'ASOS DESIGN') or facet id. Names are auto-resolved to ids; call the 'filters' action to list options.
colouroptionalFilter by colour — name (e.g. 'Black', 'Blue', 'Multi') or facet id.
sizeoptionalFilter by size — label (e.g. 'M', 'UK 10', 'XS') or facet id.
product_typeoptionalFilter by product type facet id (e.g. 8416=Dresses); see 'filters'.
on_saleoptionalsale · new_seasonLimit to marked-down items only.
new_in_withinoptionaltoday · yesterday · 7d · 14d · 28dLimit to items added within this window (the site's 'New in' filter).
discountoptional20 · 30 · 40 · 50 · 60 · 60+Minimum discount tier for marked-down items.
Try in playground →
post/asos/v1/new_in1 credit

Newest arrivals — freshness-sorted products, optionally limited to a recent window (today / last 7 / 14 / 28 days). Provide a keyword (query) or a category_id.

ParameterAllowed / rangeDescription
queryoptionalKeyword for new arrivals (new_in needs query OR category_id).
category_idoptionalCategory id for new arrivals (e.g. 27108 = women's New In).
store = COMoptionalCOM · GB · US · DE · FRASOS market/store — sets default language, currency and ship-to country.
langoptionalOverride the store's locale (advanced), e.g. en-GB, de-DE.
currencyoptionalOverride the store's currency (advanced), e.g. USD, EUR.
countryoptionalOverride ship-to country code (advanced), e.g. GB, US.
offset = 0optional0–Pagination offset (skip N). Page forward with meta.next_offset.
limit = 48optional1–200Results per page (1-200, default 48); clamped to 200.
sortoptionalfreshness · pricedesc · priceascSort order. Omit for relevance (default). Only these keys are valid.
min_priceoptionalMinimum price filter (in the store's currency).
max_priceoptionalMaximum price filter (in the store's currency).
brandoptionalFilter by brand — name (e.g. 'Nike', 'ASOS DESIGN') or facet id. Names are auto-resolved to ids; call the 'filters' action to list options.
colouroptionalFilter by colour — name (e.g. 'Black', 'Blue', 'Multi') or facet id.
sizeoptionalFilter by size — label (e.g. 'M', 'UK 10', 'XS') or facet id.
product_typeoptionalFilter by product type facet id (e.g. 8416=Dresses); see 'filters'.
on_saleoptionalsale · new_seasonLimit to marked-down items only.
new_in_withinoptionaltoday · yesterday · 7d · 14d · 28dLimit to items added within this window (the site's 'New in' filter).
discountoptional20 · 30 · 40 · 50 · 60 · 60+Minimum discount tier for marked-down items.
Try in playground →
post/asos/v1/product1 credit

full product detail (sizes/stock/description/images) by product_id or product_url

ParameterAllowed / rangeDescription
product_idoptionalASOS product id. (product needs product_id OR product_url.)
product_urloptionalFull ASOS product URL (alternative to product_id).
store = COMoptionalCOM · GB · US · DE · FRASOS market/store — sets default language, currency and ship-to country.
Try in playground →
post/asos/v1/products1 credit

batch product detail for comma-separated product_ids

ParameterAllowed / rangeDescription
product_idsrequiredComma-separated ASOS product ids (max 20).
store = COMoptionalCOM · GB · US · DE · FRASOS market/store — sets default language, currency and ship-to country.
Try in playground →
post/asos/v1/navigation1 credit

category links from gender landing pages; format=tree returns nested path hierarchy

ParameterAllowed / rangeDescription
genderoptionalwomen · menWhich landing page to read categories from.
store = COMoptionalCOM · GB · US · DE · FRASOS market/store — sets default language, currency and ship-to country.
formatoptionalflat · treeOutput shape.
Try in playground →
post/asos/v1/reviews1 credit

product reviews + rating summary from PDP embedded ratings blob (paginated)

ParameterAllowed / rangeDescription
product_idoptionalASOS product id. (reviews needs product_id OR product_url.)
product_urloptionalFull ASOS product URL (alternative to product_id).
offset = 0optional0–Pagination offset (skip N). Page forward with meta.next_offset.
limit = 10optional1–50Reviews per page (1-50, default 10).
Try in playground →
post/asos/v1/similar1 credit

related products via same-brand search fallback (true mightLike API is account-gated)

ParameterAllowed / rangeDescription
product_idoptionalASOS product id. (similar needs product_id OR product_url.)
product_urloptionalFull ASOS product URL (alternative to product_id).
limit = 12optional1–200Max similar products (1-200, default 12).
store = COMoptionalCOM · GB · US · DE · FRASOS market/store — sets default language, currency and ship-to country.
Try in playground →
post/asos/v1/filters1 credit

available search/category facets (brands, colours, sizes, price ranges)

ParameterAllowed / rangeDescription
queryoptionalKeyword to get facets for. (filters needs query OR category_id.)
category_idoptionalCategory id to get facets for (alternative to query).
store = COMoptionalCOM · GB · US · DE · FRASOS market/store — sets default language, currency and ship-to country.
langoptionalOverride the store's locale (advanced), e.g. en-GB, de-DE.
currencyoptionalOverride the store's currency (advanced), e.g. USD, EUR.
countryoptionalOverride ship-to country code (advanced), e.g. GB, US.
Try in playground →
post/asos/v1/suggestions1 credit

search autocomplete suggestions for partial query

ParameterAllowed / rangeDescription
queryrequiredPartial search text to autocomplete.
store = COMoptionalCOM · GB · US · DE · FRASOS market/store — sets default language, currency and ship-to country.
langoptionalOverride the store's locale (advanced), e.g. en-GB, de-DE.
currencyoptionalOverride the store's currency (advanced), e.g. USD, EUR.
countryoptionalOverride ship-to country code (advanced), e.g. GB, US.
Try in playground →