HM Similar Product Scraper retrieves “similar products” recommendations for a given H&M product page URL and returns structured results you can use for product discovery, catalog enrichment, and merchandising workflows. It’s designed to provide consistent, JSON-ready H&M similar products data for developers and analysts who need fast, repeatable lookups.
Created by Bitbash, built to showcase our approach to Scraping and Automation!
If you are looking for hm-similar-product you've just found your team — Let’s Chat. 👆👆
This project takes an H&M product URL and returns grouped sets of recommended/similar items (e.g., “style with”, “alternatives”, “upsell”) along with key product metadata such as pricing, availability, images, and variants. It solves the problem of manually collecting recommendation widgets and related product suggestions at scale. It’s built for developers, researchers, and e-commerce teams that want a dependable H&M similar product pipeline for analytics, automation, and integrations.
- Accepts a single
productUrlinput and fetches recommendation groups tied to that product. - Outputs category-labeled recommendation blocks (e.g., style-with, alternatives, upsell).
- Captures pricing ranges, formatted prices, and availability status for each recommended item.
- Includes variant swatches with per-variant URLs, colors, and images when available.
- Uses rate limiting and robust error handling to reduce failures during retrieval.
| Feature | Description |
|---|---|
| Similar product groups | Returns multiple recommendation sections with a label and corresponding products array. |
| Rich product metadata | Extracts product IDs, names, URLs, brand, category codes, and tracking identifiers. |
| Price normalization | Provides both numeric price values and human-friendly formatted prices when available. |
| Availability capture | Includes stock state and “coming soon” flags to support inventory-aware workflows. |
| Variant swatches | Collects variant article IDs, color names/codes, variant URLs, and variant images. |
| Image collection | Returns multiple image URLs plus model/product images where present. |
| Stable JSON output | Produces a predictable schema ideal for dashboards, exports, and downstream enrichment. |
| Defensive runtime behavior | Built-in validation, retries, and graceful failures for missing fields. |
| Field Name | Field Description |
|---|---|
| label | Recommendation section identifier (e.g., style-with, alternatives, upsell). |
| products | List of recommended items within the section. |
| products[].id | Recommended product/article identifier. |
| products[].productName | Display name/title of the recommended product. |
| products[].brandName | Brand label (typically “H&M”). |
| products[].url | Product page URL for the recommended item. |
| products[].trackingId | Tracking identifier returned by the source page/widget. |
| products[].external | Indicates whether the item is external or on-site. |
| products[].showPriceMarker | Flag indicating whether special price markers are shown. |
| products[].prices | Array of price objects (type, numeric values, formatted price). |
| products[].prices[].priceType | Price type label (e.g., whitePrice). |
| products[].prices[].price | Numeric price value. |
| products[].prices[].minPrice | Minimum price for ranged prices (if present). |
| products[].prices[].maxPrice | Maximum price for ranged prices (if present). |
| products[].prices[].formattedPrice | Human-readable formatted price string. |
| products[].availability | Stock/availability container. |
| products[].availability.stockState | Stock state string (e.g., Available). |
| products[].availability.comingSoon | Whether the item is marked as coming soon. |
| products[].iswatches | Variant swatch list (articleId, color, url, images). |
| products[].iswatches[].articleId | Variant/article identifier for a swatch. |
| products[].iswatches[].url | Variant-specific product page URL. |
| products[].iswatches[].colorName | Variant color name. |
| products[].iswatches[].colorCode | Variant color code. |
| products[].iswatches[].productImage | Variant image URL. |
| products[].images | Additional image URLs for the product. |
| products[].hasVideo | Whether product media includes a video. |
| products[].colorName | Primary display color name. |
| products[].colors | Color code(s) string used for color grouping. |
| products[].colourShades | Human-readable shade grouping when available. |
| products[].modelImage | Model image URL (if present). |
| products[].productImage | Main product image URL (if present). |
| products[].mainCatCode | Main category code string used for categorization. |
| products[].newArrival | Whether the item is flagged as a new arrival. |
| products[].sellingAttribute | Marketing attribute label (e.g., New Arrival). |
| products[].isOnline | Whether item is available online (if present). |
[
{
"label": "product-page-style_with",
"products": [
{
"id": "1235139001",
"productName": "Sports Sunglasses with Chain",
"brandName": "H&M",
"url": "https://www2.hm.com/en_us/productpage.1235139001.html",
"prices": [
{
"priceType": "whitePrice",
"price": 34.99,
"minPrice": 34.99,
"maxPrice": 34.99,
"formattedPrice": "$ 34.99"
}
],
"availability": { "stockState": "Available", "comingSoon": false },
"iswatches": [
{
"articleId": "1235139001",
"colorName": "Silver-colored",
"colorCode": "DFDEDE",
"url": "https://www2.hm.com/en_us/productpage.1235139001.html",
"productImage": "https://image.hm.com/assets/hm/c1/72/c172e8aedd282affc3c5d72000ff77cd68d5f95a.jpg"
}
],
"images": [
{ "url": "https://image.hm.com/assets/hm/d0/98/d09855cec4fda783c26af40f14dc1f9034703e8c.jpg" },
{ "url": "https://image.hm.com/assets/hm/10/5a/105a0543ae3db424ce79b7bb369e9a54fd0412a7.jpg" }
],
"mainCatCode": "ladies_accessories_sunglasses"
}
]
},
{
"label": "product-page-alternatives",
"products": [
{
"id": "1242269001",
"productName": "Loose Fit Parachute Pants",
"brandName": "H&M",
"url": "https://www2.hm.com/en_us/productpage.1242269001.html",
"prices": [
{
"priceType": "whitePrice",
"price": 34.99,
"minPrice": 34.99,
"maxPrice": 34.99,
"formattedPrice": "$ 34.99"
}
],
"availability": { "stockState": "Available", "comingSoon": false },
"mainCatCode": "men_trousers_casual"
}
]
}
]
hm-similar-product-scraper (IMPORTANT :!! always keep this name as the name of the apify actor !!! HM Similar Product )/
├── src/
│ ├── main.ts
│ ├── input/
│ │ ├── schema.ts
│ │ └── validate.ts
│ ├── http/
│ │ ├── client.ts
│ │ ├── rateLimit.ts
│ │ └── retry.ts
│ ├── extractors/
│ │ ├── recommendations.ts
│ │ ├── productMapper.ts
│ │ └── normalize.ts
│ ├── output/
│ │ ├── format.ts
│ │ └── save.ts
│ ├── utils/
│ │ ├── logger.ts
│ │ └── guards.ts
│ └── types/
│ ├── input.ts
│ └── output.ts
├── .env.example
├── .gitignore
├── package.json
├── package-lock.json
├── tsconfig.json
├── README.md
└── LICENSE
- E-commerce analysts use it to track H&M similar products across categories, so they can identify merchandising patterns and cross-sell opportunities.
- Catalog teams use it to enrich product records with “alternatives” and “style with” links, so they can improve discovery and internal search relevance.
- Automation builders use it to feed recommendation results into workflows, so they can auto-generate bundles, collections, or comparison pages.
- Researchers use it to collect recommendation graph data, so they can study product adjacency, clustering, and trend shifts.
- Price monitoring teams use it to capture prices and availability for related items, so they can compare positioning and detect changes.
How do I run it with a product URL?
Provide a single productUrl pointing to a valid H&M product page. The tool will retrieve recommendation sections for that page and return a JSON array of { label, products }.
What happens if some fields are missing (e.g., no swatches or no images)?
The output remains valid JSON. Optional fields may be empty arrays or omitted depending on the mapper, but the main structure (label, products) stays consistent.
Does it support different locales/regions? Yes—use a product URL from the specific regional domain you need. The extractor reads recommendations from that page and returns the results for that locale.
How should I handle rate limits or intermittent failures? Keep concurrency conservative, enable retries with backoff, and use the built-in rate limiter. For large batch runs, space requests and log failures for re-processing.
Primary Metric: Typical end-to-end retrieval completes in ~1.2–2.8 seconds per product URL on stable connectivity, depending on the number of recommendation groups returned.
Reliability Metric: In steady-state runs with conservative request pacing, successful responses commonly sustain ~97–99% completion across batches of 1,000 product URLs.
Efficiency Metric: Memory usage remains low (commonly under ~150 MB) because the workflow streams parsing and normalizes only required fields before output.
Quality Metric: Data completeness is high for core fields (label, id, productName, url, prices, availability), with variant swatches and extended media captured whenever present on the product page.
