~/ecommerce/macys-scraper

Macy's Scraper — Products, Prices, SKUs & News

Extract Macy's product data — prices, variants, SKU/UPC barcodes, images, ratings & reviews — plus Macy's Inc. news, from search, category, trending, and product URLs. No browser, Akamai-proof.

department store TypeScriptCrawleeCheerio US
proooxy/macys-scraper — spec
categoryecommerce / department store
languageTypeScript
stackTypeScript, Crawlee, Cheerio
marketsUS
outputclean, RAG-ready JSON

key features

Four surfaces in one actor — product search, category, trending, and Macy's Inc. news

Beats Akamai Bot Manager without a browser by using Macy's own mobile & website JSON APIs

Per-SKU UPC barcodes with color, size, availability, and price for every purchasable variant

Prices as integer cents plus localized formatted strings — no floating-point rounding

Full review intelligence — star histogram, recommend counts, and secondary fit/size ratings

All shades and sizes grouped under one product record, not one row per variant

Clean canonical URLs only — internal API endpoints and client keys never leak into output

One normalized schema across search, category, trending, and product-detail results

use cases

  • Department-store price and promotion monitoring at SKU level
  • Competitive analysis — Macy's vs Nordstrom, Ulta, or brand DTC pricing
  • Catalog matching across retailers via per-variant UPC barcodes
  • Review and rating intelligence for brands sold at Macy's
  • Retail news monitoring — Macy's Inc. press releases and earnings announcements

input parameters

ParameterTypeRequiredDescription
scrapeTypestringrequiredSurface to scrape: search, category, trending, news, or all (default: search).
querystringoptionalKeyword for product search, e.g. women shoes.
startUrlsarrayoptionalMacy's product/category URLs or Macy's Inc. news URLs.
categoryIdsarrayoptionalMacy's category IDs (e.g. 5449). Category URLs are preferred when known.
trendingUrlsarrayoptionalTrending, bestseller, or curated listing URLs.
newsUrlsarrayoptionalMacy's Inc. news listing or article URLs.
includeProductDetailsbooleanoptionalEnrich listing items with full product detail — variants, SKUs, galleries (default: true).
maxPagesnumberoptionalMax pagination depth per listing/news source.
maxResultsnumberoptionalCap on output records. 0 = no cap.
proxyobjectrequiredApify Proxy or custom proxy URLs. Residential, country US recommended.

Output Example

 1{
 2  "type": "product",
 3  "source": {
 4    "id": "12345678",
 5    "canonicalUrl": "https://www.macys.com/shop/product/calvin-klein-womens-sheath-dress?ID=12345678",
 6    "retailer": "macys",
 7    "currency": "USD"
 8  },
 9  "title": "Women's Sleeveless Sheath Dress",
10  "brand": "Calvin Klein",
11  "categories": ["Women", "Dresses", "Work Dresses"],
12  "price": {
13    "sale": 5999,
14    "list": 9800,
15    "currentFormatted": "$59.99",
16    "stockStatus": "InStock"
17  },
18  "stats": { "rating": 4.6, "reviewCount": 9, "ratingPercentage": 92 },
19  "options": [
20    { "type": "Color", "values": [{ "id": "1", "name": "Black" }] },
21    { "type": "Size", "values": [{ "id": "10", "name": "M" }, { "id": "12", "name": "L" }] }
22  ],
23  "variants": [
24    {
25      "id": "987654",
26      "sku": "192837465012",
27      "options": ["Black", "M"],
28      "price": { "stockStatus": "InStock" },
29      "extraInfo": { "upc": "192837465012" }
30    }
31  ],
32  "medias": [{ "type": "Image", "url": "https://slimages.macysassets.com/is/image/MCY/products/.../main.jpg" }]
33}

Pricing

Pay-per-event — you’re billed only for items actually saved:

EventPriceWhat it covers
Product scraped$0.006One product with full detail — variants, SKUs/UPCs, prices, images, ratings
Article scraped$0.002One Macy’s Inc. news article — title, author, date, body, images

Volume discounts apply automatically on higher Apify plans (down to $0.0045 per product). A 1,000-product crawl is ~$6.00 at list price.

Tips

  • Use residential US proxies. The product-detail endpoint is intermittently rate-limited; residential session rotation gets through cleanly, while datacenter IPs see more 403s.
  • Keep concurrency modest. maxConcurrency of 2–3 is the sweet spot — higher values raise rate-limit hits without improving throughput.
  • Prefer category URLs over bare IDs. The URL carries the category path the API expects; a bare ID may resolve to a broader or empty result set.
  • Turn off includeProductDetails for a fast listing-level sweep (name, brand, listing price, image, rating) when you don’t need variants or descriptions.

faq

How does it get past Akamai without a browser?
It doesn't fight the JS challenge at all. Listings come from Macy's mobile app API and product details from the website's JSON API — both run on separate infrastructure that answers anonymous read requests. No login, no cookies, no API key.
Are prices in dollars or cents?
Integer cents (5999 = $59.99) to avoid floating-point rounding, with localized formatted strings ($59.99) alongside.
How are variants and UPCs handled?
All colors and sizes are grouped under a single product record with a variants[] array. Each variant carries its own UPC barcode, color, size, availability, and price — recovered from Macy's SKU relationship data, not scraped off a swatch widget.
Can I scrape products and news in one run?
Yes. Set scrapeType to all and provide any mix of query, startUrls, categoryIds, trendingUrls, and newsUrls.

related in ~/ecommerce

ecommerce/sephora-scraper >99%
beauty

Sephora Scraper (Global)

Scrape any Sephora storefront — 21 markets, one actor.

PythonCrawleecurl_cffi
open

Run Macy's Scraper — Products, Prices, SKUs & News, or get a custom build

Start extracting on Apify in minutes, or hire me to build a bespoke scraper and RAG pipeline for your exact source and schema.

run on Apify get custom data