IKEA Products Scraper - Prices, Ratings & Images
Pricing
from $1.05 / 1,000 results
IKEA Products Scraper - Prices, Ratings & Images
Scrapes IKEA products from the search endpoint ikea.com itself calls: price with currency, rating and review count, images, colours, measurements and category path. Reads the price from where it actually lives, and states the 1,000-product reachability ceiling.
Pricing
from $1.05 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
IKEA Products Scraper — Prices, Ratings & Images
Reads IKEA products from the JSON endpoint ikea.com's own search calls. No key, no auth, no HTML parsing.
What you get
recordType | One per | Carries |
|---|---|---|
PRODUCT | product | range name, product type and a joined full name, price with currency, rating and review count, measurements, main and contextual images, colours, category path, business structure, availability, and the product-page URL |
SEARCH_SUMMARY | search term | IKEA's own match count, how much of it is actually reachable, and IKEA's related searches |
ERROR | failed input | a named reason |
There is no pagination, and the match count is a false promise
offset is not an optional extra — every value returns HTTP 400. The only
lever is size, and it is capped:
size=1000 -> 1000 products (7.5 MB of JSON)size=2000 -> HTTP 400
So a term whose count reads 9,231 will yield 1,000 products, ever. The honest total and the unreachable remainder sit in the same object, and nothing marks the difference.
Every summary reports totalMatching, estimatedReachable,
estimatedUnreachable and hitReachabilityCeiling. Because narrowing the
query is the only route to the rest, IKEA's own related searches are
returned on the summary row — that's what they're for here.
The price is not where it looks like it is
The product object carries priceNumeral and currencyCode at its top
level — exactly where a reader would go — and both are null on every row.
The real values live under salesPrice:
product.priceNumeral null <- decoyproduct.currencyCode null <- decoyproduct.salesPrice.numeral 99.99 <- the priceproduct.salesPrice.currencyCode "USD" <- the currency
A scraper reading the obvious fields produces a dataset where every price is
null and nothing errors. This actor reads the real ones and also emits the
decoys as priceNumeralDecoy / currencyCodeDecoy, so you can see for
yourself they're empty rather than wonder whether something was dropped.
name is the range, not the product
IKEA names ranges, not products: name is "MICKE" and typeName is
"Desk". Neither alone is a usable title — "MICKE" means nothing to a reader.
Both are emitted, plus fullName ("MICKE Desk") for the common case.
The market selects a catalogue, not a translation
Same query, same day:
/us/en/ -> 196 products, USD/gb/en/ -> 259 products, GBP/de/de/ -> 528 products, EUR
So a run against another market is a different product set, not the same
one relabelled. Market and language are recorded on every row, and product URLs
come back market-correct. A market or language that doesn't exist is an honest
HTTP 404 — /us/zz/ fails rather than silently falling back to English.
Honest, for the record
- a nonsense term → zero products with a count of 0, not an unfiltered baseline
- an empty term → a genuine browse-everything result (9,231 matches), not an error, exposed as the Browse the whole catalogue toggle
- an unknown
typesvalue → HTTP 400
Notes
- One request per search term. A
size=1000response is roughly 7.5 MB, so concurrency defaults to 2. sik.search.blue.cdtapps.com/robots.txtnames no AI bot and carries no rule matching this path;www.ikea.comallows/search/. No WAF observed.