LOOKFANTASTIC Product & Sale Price Scraper (UK) avatar

LOOKFANTASTIC Product & Sale Price Scraper (UK)

Pricing

from $1.05 / 1,000 product scrapeds

Go to Apify Store
LOOKFANTASTIC Product & Sale Price Scraper (UK)

LOOKFANTASTIC Product & Sale Price Scraper (UK)

LOOKFANTASTIC scraper: search terms or category, brand and offer pages to one row per product with GBP price, RRP, discount percent, promo text and voucher code, brand, size variant, stock and image. For UK beauty sale and promo price watching.

Pricing

from $1.05 / 1,000 product scrapeds

Rating

0.0

(0)

Developer

Superslow Sloth

Superslow Sloth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Search LOOKFANTASTIC (a UK beauty retailer) by keyword, or read a category, brand or offer page, and get one flat row per product: the current price and the RRP in GBP, the discount in pounds and percent, the promo text and its voucher code, brand, size variant, whether it can be bought, the product link and the photo. Run it on a schedule and diff the dataset to get a LOOKFANTASTIC sale and promo price watch: which serums, brands or offers dropped, and which only advertise a code.

No account, no API key, no login, no browser. One request returns 32 products.

Input

FieldNotes
searchTermsOne or more search terms, one per line (serum, medik8, retinol night cream). A term the site recognises is sent to its category or brand page, and that whole list is read; any other term is read as search results. A product found by two terms is returned once, under the first.
startUrlsLOOKFANTASTIC pages to read in full: a category (/c/health-beauty/face/skincare-products/specific-care/serums/), a brand (/c/brands/the-ordinary/) or an offer page (/c/offers/offers/22/). A search URL (/search/?q=...) is read as that search term. Pages must list products. A brand page is read through its own list of everything (see below); a category landing page such as /c/health-beauty/face/ lists nothing and is refused. Give terms, URLs or both.
maxItemsProducts to read per term or page (default 100, up to 10,000). 32 per page.
onlyOnSaleReturn only products whose current price is below the RRP. Products that are not reduced are read, not returned and not charged.
sortpopularity (default), price-asc, price-desc, name, newest: the five choices of the site's own sort menu.
proxyConfigurationApify datacenter proxy by default.

Output

Prices are numbers in pounds; currency is the currency the page states (GBP on every page measured).

FieldNotes
query, positionThe search term or page URL that first found the product, and its place in the site's list for that source and sort (1 is first).
product_id, urlLOOKFANTASTIC's product id (12595875; the site's "sku") and the product link.
name, brandAs the page shows them. brand is null if the page sends none.
price, original_priceprice is the price now, the card's "Current price". original_price is the RRP the card strikes through. They are equal when the product is not reduced.
on_sale, discount_amount, discount_percenton_sale is true when price is below original_price. discount_amount is the pounds off, as the page sends it. discount_percent is worked out from the two prices (one decimal place). Both are null when the product is not on sale, never 0.
promo, promo_codeThe promotion banner on the card: Save 20%, Save 22% | Use Code: FLASH22, NEW IN, Complimentary Gift Set, Dermatologist Recommended. promo_code is the voucher code the text names (FLASH22). Null when there is none.
variant, variant_countThe page's variant label and how many variants the product has. See the note below.
in_stock, stock_labelFalse with stock_label COMING SOON when the card shows a disabled button instead of "Quick buy".
image_urlThe product photo, original size, on static.thcdn.com.
list_nameThe list's own title in the site's tracking data (Facial Serums). Null on search pages.

Example row (real values, 2026-10-15):

{
"query": "https://www.lookfantastic.com/c/health-beauty/face/skincare-products/specific-care/serums/",
"position": 3,
"product_id": "12595875",
"name": "ESPA Optimal Skin Rejuvenating Night Booster 30ml",
"brand": "ESPA",
"url": "https://www.lookfantastic.com/p/espa-optimal-skin-rejuvenating-night-booster-30ml/12595875/",
"image_url": "https://static.thcdn.com/productimg/original/12595875-1145339338587141.jpg",
"currency": "GBP",
"price": 28.8,
"original_price": 48.0,
"on_sale": true,
"discount_amount": 19.2,
"discount_percent": 40.0,
"promo": "Save 40%",
"promo_code": null,
"variant": null,
"variant_count": 1,
"in_stock": true,
"stock_label": null,
"list_name": "Facial Serums"
}

What the price fields mean

The page's own tracking data calls the RRP price and the current price value, which reads backwards. Which is which was checked on 160 product cards (the struck-through figure on every card equals the RRP, the "Current price" equals the current price) and on all 873 products of one category (the pounds off equal the difference, with no exception).

A voucher code is not a reduction. Under a banner such as

Save 22% | Use Code: FLASH22
the card still shows the full price: the 22% is taken at checkout. price does not include it, on_sale stays false when the product is not otherwise reduced, and the offer is in promo and promo_code. A product can be reduced and carry a code too; its price is the reduced figure without the code. Filter on promo_code to see code offers, on on_sale for shelf reductions.

Honest nulls

A field the page did not send is null, never 0 or "". A COMING SOON product can have no price at all (the page sends null for both): its row is still returned, with null price and original_price.

  • No rating or review count. The ratings are filled in by the browser after the page loads and are not in the HTML, so the rows do not carry them.
  • variant is not the size of the row. It is the page's label for the product's default variant. The Clarins Double Serum 50ml row says 30ml, and so do its 75ml and 30ml siblings. Read the size from name and url.
  • in_stock is about the card. True means a working buy button, false a disabled one. The site does not say more (stock levels, delivery dates).

Pricing

Pay per event:

  • $0.002 per run (actor-start), charged only after your input is validated, so a run that fails on bad input costs nothing.
  • $0.00105 per product row written (product-scraped), i.e. $1.05 per 1,000 products. A row that is not written is not charged: rows filtered by onlyOnSale, and repeats of a product another term already returned, are free.

How it fetches

It reads the product list that lookfantastic.com's own pages embed (an item map keyed by product id) and the product cards next to it. Measured 2026-10-15: HTTP 200 HTML from a plain home connection and from an Apify datacenter address, no key or cookie needed. A refusal (403, 429, 5xx), a 200 that is not a LOOKFANTASTIC page, or a dropped connection is treated as the address being blocked, and the actor rotates to a fresh one and retries.

Things worth knowing, all measured:

  • A search does not always return search results. /search/?q=serum is redirected to the Serums category (873 products), numbuzin to the Numbuzin brand page, red lipstick to a lipsticks list. A term the site does not recognise is answered in place (retinol night cream: 103 products, 4 pages), and one it cannot match at all gets no results. The actor reads whatever list the site lands on, all its pages. query stays the term you typed. A broad term can therefore return a whole category; maxItems bounds it.
  • A brand name lands on a brand page, not a list. cerave, medik8, nars, la roche posay, ordinary, elemis and ghd are all redirected to a hub of banners and carousels that holds no product list. Each hub links the brand's list of everything (/c/brands/cerave/view-all/, /c/brands/medik8/view-all-medik8/, /c/brands/elemis/all-elemis/); the actor follows that link and reads it, all its pages, in the sort you chose (CeraVe 84 products, The Ordinary 99, Medik8 69 on 2026-10-15). The same applies to a brand page given as a start URL. The run log says which list was read.
  • The redirect drops sort. The actor re-reads the first page from the category when you asked for a sort, so the order you chose is the order you get.
  • The price sorts follow the site's own price index. Over all 28 pages of one category the displayed current price ran in order on 27 pages in each direction; one page in each held one product out of strict order.
  • Depth. The site lists 32 products per page and has no page-size setting. The deepest list measured has 134 pages; page 100 answered in full. A page past the last is an empty list and the actor stops there. At most 10,000 products per term or page.
  • Pages repeat nothing. All 28 pages of one category were read: 873 products, none twice. A guard still ends a walk after three pages in a row that bring nothing new.
  • Category landing pages have no list. /c/health-beauty/face/ is a page of carousels and links no list of everything below it; it fails (at no charge) with a message rather than return nothing. Use a deeper category such as /c/health-beauty/face/skincare-products/.
  • Not offered. The site's facet filters (brand, price range, skin type) are not wired into this actor; start from a category or brand page that already narrows the list.