From cf0fe586ebf3a0c8ad09e6958c17976ea9161dc9 Mon Sep 17 00:00:00 2001 From: m Date: Sat, 7 Feb 2026 12:50:33 +0100 Subject: [PATCH] Add IKEA furniture data research report --- RESEARCH-ikea-data.md | 352 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 352 insertions(+) create mode 100644 RESEARCH-ikea-data.md diff --git a/RESEARCH-ikea-data.md b/RESEARCH-ikea-data.md new file mode 100644 index 0000000..181d15d --- /dev/null +++ b/RESEARCH-ikea-data.md @@ -0,0 +1,352 @@ +# IKEA Furniture Data Import — Research Report + +**Task:** t-05dd7 +**Date:** 2026-02-07 +**Researcher:** researcher role + +## Executive Summary + +**There is no official public IKEA API for furniture data.** However, there are multiple viable paths to get IKEA product dimensions and 3D models into our room planner. The recommended approach is a **tiered strategy**: start with a curated hand-built catalog of common IKEA items using known dimensions, with optional GLB model loading for enhanced visuals later. + +--- + +## 1. IKEA APIs (Official) + +### IKEA Has No Public Developer API + +IKEA does not offer a public REST/GraphQL API for developers. There is no developer portal, no API keys, no official documentation. + +### Undocumented Internal Endpoints + +IKEA's website uses internal APIs that have been partially reverse-engineered: + +| Endpoint | Purpose | Format | +|----------|---------|--------| +| `sik.search.blue.cdtapps.com/{country}/{lang}/search-result-page?q={query}&size=24&types=PRODUCT` | Product search | JSON | +| `www.ikea.com/{country}/{lang}/products/{itemNo[5:]}/{itemNo}.json` | Product detail (PIP) | JSON | +| `api.ingka.ikea.com/cia/availabilities/{country}/{lang}?itemNos={itemNo}` | Stock/availability | JSON | +| `www.ikea.com/{region}/{country}/iows/catalog/availability/{itemNo}` | Legacy availability (deprecated Dec 2021) | XML | +| `web-api.ikea.com/{country}/{lang}/rotera/data/exists/{itemNo}/` | 3D model existence check | JSON | +| `web-api.ikea.com/{country}/{lang}/rotera/data/model/{itemNo}/` | 3D model metadata + CDN URL | JSON | + +The **Rotera API** is most relevant for us — it returns a `modelUrl` field pointing to the actual GLB file on IKEA's CDN. This is what the Blender IKEA Browser add-on uses internally. + +**IKEA Kreativ**: Their AI-powered room planner at `ikea.com/us/en/home-design/` uses AWS infrastructure (API Gateway at `ddh79d7xh5.execute-api.us-east-1.amazonaws.com`). No public API. + +**Status**: All endpoints are undocumented, unsupported, and may break at any time. Rate limiting and anti-bot measures exist. The IOWS endpoints are deprecated. + +**Sources**: https://sbmueller.github.io/posts/ikea/ | Postman workspace: https://www.postman.com/galactic-shuttle-566922/ikea/overview + +### Archived Python Client + +**vrslev/ikea-api-client** (GitHub, 1k+ stars) — Python client for IKEA internal APIs supporting cart, search, stock, item info, and 3D models. **Archived October 2024** — no longer maintained. MIT license. + +- Supported: stock lookup, product search, item specs, 3D model retrieval (`RoteraItem` endpoint) +- Install: `pip install ikea-api[httpx]` +- **Not recommended** for new projects since archived + +**Source**: https://github.com/vrslev/ikea-api-client + +### npm: ikea-availability-checker (Active) + +**Ephigenia/ikea-availability-checker** — Node.js package for checking IKEA stock across 40+ countries and 400+ stores. Actively maintained. + +```bash +npm install ikea-availability-checker +# CLI: ikea-availability-checker stock --country us 30457903 +``` + +Not directly useful for dimensions/models but proves Node.js access to IKEA endpoints is feasible. + +**Source**: https://github.com/Ephigenia/ikea-availability-checker + +--- + +## 2. Open Datasets with Dimensions + +### Best: Hugging Face — IKEA US CommerceTXT (30,511 products) + +- **Records**: 30,511 products across 632 categories +- **Fields**: Name, SKU, Price, Dimensions (Width/Height/Depth), Materials, Category, Images, URLs +- **Format**: CommerceTXT v1.0.1 (text-based, parseable) + Parquet (56.5 MB) +- **License**: CC0 1.0 (Public Domain) — fully usable +- **Date**: July 15, 2025 +- **Dimensions**: Yes, in the `@SPECS` section (e.g., `Width: 12", Height: 16"`) + +```python +from datasets import load_dataset +dataset = load_dataset("tsazan/ikea-us-commercetxt") +``` + +**Source**: https://huggingface.co/datasets/tsazan/ikea-us-commercetxt + +### Good: Kaggle — IKEA SA Furniture (2,962 items) + +- **Records**: 2,962 items +- **Fields**: name, category, price, width (cm), height (cm), depth (cm), designer, description +- **Format**: CSV +- **License**: Kaggle dataset terms +- **Date**: April 2020 (somewhat dated) +- **Dimensions**: Yes — width, height, depth in centimeters + +**Source**: https://www.kaggle.com/datasets/ahmedkallam/ikea-sa-furniture-web-scraping + +### Good: GitHub — IKEA Dataset (12,600+ items) + +- **Records**: 12,600+ images with furniture dimensions +- **Fields**: Name, dimensions (width/length/height cm), material +- **Format**: ZIP archives + Python scraping script +- **Organization**: By room (bedroom, bathroom, kitchen, living room, etc.) +- **Date**: January 2020 + +**Source**: https://github.com/valexande/IKEA-Dataset + +### Reference: Dimensions.com — IKEA Collection + +- **Content**: Dozens of IKEA products with precise dimensions + technical drawings +- **Formats**: DWG, SVG, JPG (2D) + 3DM, OBJ, SKP (3D models) +- **Coverage**: KALLAX, HEMNES, BESTÅ, BEKANT, and many more series +- **Dual units**: Both inches and centimeters +- **Includes**: Weight capacities +- **Note**: Good for manual reference but not easily machine-parseable without scraping + +**Source**: https://www.dimensions.com/collection/ikea-furniture + +--- + +## 3. IKEA 3D Models + +### Web-Sourced GLB Models (Best Path for Three.js) + +IKEA product pages with a "View in 3D" button serve simplified, Draco-compressed GLB (binary glTF) files. These are: +- **Format**: GLB (binary glTF 2.0) — native Three.js format +- **Quality**: "Lowest quality versions" — simplified from manufacturing models for web delivery +- **Properties**: Scaled in metric, basic materials applied, KHR_Texture_Transform extension +- **Compatibility**: Direct import into Three.js via `GLTFLoader` + `DRACOLoader` + +#### Tools to Download IKEA GLB Models + +| Tool | Type | Stars | Status | License | +|------|------|-------|--------|---------| +| [IKEA 3D Model Download Button](https://github.com/apinanaivot/IKEA-3D-Model-Download-Button) | Tampermonkey userscript | 941 | Active (Jan 2026) | — | +| [IKEA 3D Model Batch Downloader](https://github.com/apinanaivot/IKEA-3d-model-batch-downloader) | Python (Selenium+BS4) | — | Active | GPL-3.0 | +| [IKEA Browser for Blender](https://extensions.blender.org/add-ons/ikea-browser/) | Blender addon | 95k downloads | Active (v0.4.0, Oct 2025) | GPL-3.0 | +| [Chrome Extension](https://chromewebstore.google.com/detail/ikea-3d-models-downloader/kihdhjecfjagoplfnnpdbbnhkjhnlfeg) | Chrome extension | — | Active | — | + +The **batch downloader** workflow: +1. Give it an IKEA category URL (e.g., `https://www.ikea.com/fi/fi/cat/chairs-fu002/`) +2. Scrapes product links → extracts 3D model URLs → downloads GLB files +3. Stores metadata in SQLite database +4. Deduplication built-in + +**Note**: Not all IKEA products have 3D models. Only items with the "View in 3D" button are available. + +### Official IKEA 3D Assembly Dataset (GitHub) + +- **Source**: https://github.com/IKEA/IKEA3DAssemblyDataset +- **Items**: Only 5 products (LACK, EKET, BEKVÄM, DALFRED) +- **Formats**: GLB/glTF + OBJ + PDF assembly instructions +- **License**: CC BY-NC-SA 4.0 — **non-commercial only, research purposes** +- **Verdict**: Too few items and restrictive license. Not suitable for our use. + +### Sweet Home 3D IKEA Libraries + +- **180 models**: https://3deshop.blogscopia.com/180-ikea-models-for-sweethome3d/ +- **342 models (bundle)**: https://3deshop.blogscopia.com/ikea-bundle-342-models/ +- **Format**: SH3F (Sweet Home 3D format) — would need conversion +- **Quality**: Community-created, based on real IKEA products +- **Note**: Format is proprietary to Sweet Home 3D, would require extraction/conversion + +### Third-Party Model Sources + +- **Sketchfab**: Search "IKEA" — many free community models, various licenses +- **TurboSquid**: Free IKEA models available +- **Clara.io**: Some IKEA models +- **Trimble 3D Warehouse**: IKEA models available (SketchUp format) + +--- + +## 4. Web Scraping Feasibility + +### Existing Scrapers + +| Project | Stack | Notes | +|---------|-------|-------| +| [IKEA Scraper](https://github.com/Abdelrahman-Hekal/IKEA_Scraper) | Python | Full scraper for ikea.com | +| [ikea-webscraper](https://github.com/gamladz/ikea-webscraper) | Selenium | Product info extraction | +| [IKEA-project](https://github.com/furkansenn/IKEA-project) | Selenium | Product scraping | +| [ikea-scraper](https://github.com/bonzi/ikea-scraper) | — | IKEA data extraction | + +### Technical Challenges + +- IKEA uses heavy client-side rendering (React/Next.js) requiring browser automation (Selenium) +- Anti-bot protections: CAPTCHAs, rate limiting, IP blocking +- Dimension data is embedded in product pages in varying formats +- Product IDs are 8-digit numbers but URL structure varies by locale + +### Legal Considerations + +- IKEA's Terms of Service prohibit automated scraping +- IKEA actively protects trademarks and trade dress under US Trademark Act +- For personal/non-commercial home planning use, tools like the Blender extension operate in a gray area +- The HuggingFace CommerceTXT dataset (CC0) is the safest legal path for product data + +--- + +## 5. Standard IKEA Dimensions Reference + +Manually verified dimensions for the most common IKEA product lines: + +### Storage + +| Product | Width (cm) | Depth (cm) | Height (cm) | +|---------|-----------|-----------|------------| +| KALLAX 1×4 | 42 | 39 | 147 | +| KALLAX 2×2 | 77 | 39 | 77 | +| KALLAX 2×4 | 77 | 39 | 147 | +| KALLAX 4×4 | 147 | 39 | 147 | +| BILLY bookcase (standard) | 80 | 28 | 202 | +| BILLY bookcase (narrow) | 40 | 28 | 202 | +| BILLY bookcase (short) | 80 | 28 | 106 | +| HEMNES 6-drawer dresser | 108 | 50 | 131 | +| HEMNES 3-drawer dresser | 108 | 50 | 96 | +| HEMNES bookcase | 90 | 37 | 197 | +| BESTÅ TV bench | 120/180 | 42 | 38 | +| MALM 6-drawer dresser | 80 | 48 | 123 | +| MALM 4-drawer dresser | 80 | 48 | 100 | +| PAX wardrobe (standard) | 100/150/200 | 58 | 201/236 | + +### Tables + +| Product | Width (cm) | Depth (cm) | Height (cm) | +|---------|-----------|-----------|------------| +| LACK side table | 55 | 55 | 45 | +| LACK coffee table | 90 | 55 | 45 | +| LACK TV bench | 90 | 26 | 45 | +| LISABO desk | 118 | 45 | 74 | +| BEKANT desk (rect) | 120/140/160 | 80 | 65-85 | +| LINNMON/ALEX desk | 150 | 75 | 73 | +| MELLTORP dining table | 125 | 75 | 74 | +| EKEDALEN ext. table | 120-180 | 80 | 75 | + +### Seating + +| Product | Width (cm) | Depth (cm) | Height (cm) | +|---------|-----------|-----------|------------| +| POÄNG armchair | 68 | 82 | 100 | +| STRANDMON wing chair | 82 | 96 | 101 | +| KLIPPAN 2-seat sofa | 180 | 88 | 66 | +| EKTORP 3-seat sofa | 218 | 88 | 88 | +| KIVIK 3-seat sofa | 228 | 95 | 83 | +| MARKUS office chair | 62 | 60 | 129-140 | + +### Beds + +| Product | Width (cm) | Depth (cm) | Height (cm) | +|---------|-----------|-----------|------------| +| MALM bed (queen, 160) | 160 | 209 | 92 (headboard) | +| MALM bed (king, 180) | 180 | 209 | 92 (headboard) | +| MALM bed (single, 90) | 90 | 209 | 92 (headboard) | +| HEMNES bed (queen) | 163 | 211 | 66 (headboard 112) | +| KURA reversible bed | 99 | 209 | 116 | +| SUNDVIK child bed | 80 | 167 | 83 | + +### Kitchen + +| Product | Standard Width (cm) | Depth (cm) | Height (cm) | +|---------|-----------|-----------|------------| +| METOD base cabinet | 60/80 | 60 | 80 | +| METOD wall cabinet | 60/80 | 37 | 60/80/100 | +| METOD tall cabinet | 60 | 60 | 200/220 | +| KNOXHULT base cabinet | 120/180 | 61 | 85 | +| VADHOLMA kitchen island | 126 | 79 | 90 | + +--- + +## 6. Recommendations for Our Project + +### Recommended Approach: Tiered Strategy + +#### Tier 1: Curated IKEA Catalog (Immediate) + +Extend `data/furniture-catalog.json` with IKEA-specific items: +- Add 30-50 most popular IKEA products with verified dimensions +- Use our existing procedural mesh format (box geometry parts) +- Add `ikeaId` field (8-digit product number) for future linking +- Add `ikeaSeries` field (KALLAX, BILLY, MALM, etc.) +- Add `ikeaUrl` field for reference + +**Schema extension**: +```json +{ + "id": "ikea-kallax-2x4", + "name": "KALLAX Regal 2×4", + "ikeaId": "80275887", + "ikeaSeries": "KALLAX", + "ikeaUrl": "https://www.ikea.com/de/de/p/kallax-regal-weiss-80275887/", + "category": "storage", + "rooms": ["wohnzimmer", "arbeitszimmer", "kinderzimmer"], + "dimensions": { "width": 0.77, "depth": 0.39, "height": 1.47 }, + "variants": [ + { "color": "white", "hex": "#ffffff" }, + { "color": "black-brown", "hex": "#3c3028" }, + { "color": "white-stained-oak", "hex": "#d4c4a8" } + ], + "mesh": { ... } +} +``` + +**Effort**: ~2-3 hours to add 30 items manually from IKEA website +**Risk**: None — uses verified public dimensions + +#### Tier 2: GLB Model Import (Enhancement) + +Add optional GLB model loading to the renderer: +- Use Three.js `GLTFLoader` + `DRACOLoader` to load IKEA GLB files +- Users download GLB files themselves (personal use) via browser extension +- Store in local `models/` directory +- Fall back to procedural mesh if GLB not available + +```javascript +// In catalog entry: +{ + "id": "ikea-kallax-2x4", + "model3d": "models/ikea/kallax-2x4.glb", // optional + "mesh": { ... } // fallback procedural geometry +} +``` + +**Effort**: ~4-6 hours for GLTFLoader integration +**Risk**: Low — GLB loading is standard Three.js functionality + +#### Tier 3: Dataset Import Tool (Future) + +Build a converter that parses the HuggingFace CommerceTXT dataset: +- Extract product dimensions from `@SPECS` section +- Map categories to our catalog format +- Auto-generate procedural meshes from dimensions +- Run offline as a data pipeline + +**Effort**: ~1-2 days +**Risk**: Medium — dimension parsing from free-text specs varies in reliability + +### What NOT to Do + +1. **Don't scrape IKEA live** — Legal risk, fragile, unnecessary when datasets exist +2. **Don't depend on undocumented APIs** — They change without notice +3. **Don't bundle IKEA 3D models** — Trademark/IP issues. Let users provide their own +4. **Don't use the IKEA 3D Assembly Dataset for the app** — License is NC-SA research only + +--- + +## 7. Key Sources + +| Resource | URL | Best For | +|----------|-----|----------| +| HuggingFace IKEA US | https://huggingface.co/datasets/tsazan/ikea-us-commercetxt | Dimension data (CC0) | +| Kaggle IKEA SA | https://www.kaggle.com/datasets/ahmedkallam/ikea-sa-furniture-web-scraping | Structured CSV with dims | +| Dimensions.com IKEA | https://www.dimensions.com/collection/ikea-furniture | Reference dimensions + drawings | +| 3D Batch Downloader | https://github.com/apinanaivot/IKEA-3d-model-batch-downloader | Downloading GLB models | +| Blender IKEA Browser | https://extensions.blender.org/add-ons/ikea-browser/ | Model inspection/conversion | +| IKEA API Blog | https://sbmueller.github.io/posts/ikea/ | Understanding IKEA endpoints | +| Sweet Home 3D IKEA | https://3deshop.blogscopia.com/ikea-bundle-342-models/ | Pre-made 3D models (needs conversion) |