Tony Wang6 min readHow to Scrape Macy's in 2026 (API & Python)
Scrape Macy's product detail in 2026 — sale-aware pricing, availability, images, and color-variant pricing as structured JSON — DIY, no-code, or API.
The fastest way to scrape Macy's in 2026 is to call a structured API that returns normalized JSON for product detail — sale-aware pricing, availability, images, aggregate rating, and every color variant's own price — instead of parsing Macy's product pages yourself. Macy's, part of Macy's, Inc. (which also owns Bloomingdale's), has no self-serve public API, and its product data is frequently sale-driven and color-dependent enough that a single flat "price" field misses most of the picture. This guide covers all three approaches, what each returns, where DIY breaks, and the legal basics — and it's scoped deliberately: this is a product-detail guide, not a search or category-browsing one.
Why scrape Macy's?
Macy's product data powers:
- Sale and markdown tracking — Macy's pricing runs on frequent sales, so tracking a product's sale-aware price over time surfaces real markdown patterns, not just a static list price.
- Color-variant price research — the same style can carry a different price per color; per-variant pricing lets you spot which colorways are discounted and which aren't.
- Assortment and brand research — department, division, and category-breadcrumb fields on a product let you place an item within Macy's own merchandising structure.
- Review and rating analysis — aggregate rating data per product supports sentiment tracking for a style or brand.
- Availability monitoring — check whether a specific product is in stock before it sells out.
Is it legal to scrape Macy's?
Option 1: DIY in Python (and why it breaks)
Macy's product pages render from server-side data rather than a stable public JSON endpoint, so a DIY scraper has to fetch and parse the rendered page:
import requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.macys.com/shop/product/example-product?ID=1234567",
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
soup = BeautifulSoup(resp.text, "html.parser")
# Sale pricing, per-color-variant price, availability, and rating are
# embedded in page data, not consistently exposed as selectable markup
It demos and then breaks:
- No official third-party API. Macy's has no self-serve developer program — there's no sanctioned way for an outside developer to request programmatic access.
- Bot defenses front the site. A routine, unauthenticated request can get challenged or blocked, and a browser-based scraper needs ongoing upkeep as the defense updates.
- Pricing is sale-aware and color-dependent, not one field. A product's price changes with active sales, and different color variants of the same style routinely carry different prices — a single
pricescrape misses both. - No search or category endpoint to lean on, even in a DIY build. There's no documented, stable way to enumerate Macy's catalog by keyword or category — you still need a product ID to start from a product page.
Option 2: No-code tools
Marketplace scraper actors for Macy's exist and suit a one-off pull of a short, known list of product IDs, but they inherit the same anti-bot fragility as DIY and don't give you a stable, versioned schema — or sale-aware, per-variant pricing — to build a pipeline on.
Option 3: A structured Macy's API
Crawlora's Macy's API covers product detail: sale-aware pricing, availability, images, aggregate rating, and every purchasable color variant's own price, returned as normalized JSON. It's product-detail only — there's no search or category-listing endpoint — so you start from a product ID sourced off a Macy's product page URL's ?ID= query parameter, not from an API call:
curl "https://api.crawlora.net/api/v1/macys/product/1234567" \
-H "x-api-key: $CRAWLORA_API_KEY"
In Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/macys"
# productId comes from a Macy's product page URL's ?ID= query parameter —
# Crawlora's Macy's coverage has no search endpoint to resolve it for you
product_id = "1234567"
detail = requests.get(f"{base}/product/{product_id}", headers=h).json()["data"]
A product-detail response is normalized JSON (check the docs for the full schema):
{
"code": 200,
"msg": "OK",
"data": {
"product_id": "1234567",
"name": "Women's Quilted Puffer Coat",
"brand": "Calvin Klein",
"department": "Women",
"division": "Coats",
"breadcrumbs": ["Women", "Clothing", "Coats", "Puffer Coats"],
"price": {
"current": 89.99,
"regular": 150.00,
"on_sale": true
},
"availability": "in_stock",
"rating": {
"average": 4.3,
"count": 212
},
"images": [
"https://slimages.macysassets.com/is/image/MCY/products/1/optimized/example_fpx.jpg"
],
"variants": [
{ "color": "Black", "price": 89.99, "available": true },
{ "color": "Camel", "price": 99.99, "available": true },
{ "color": "Navy", "price": 89.99, "available": false }
]
}
}
Store one row per product_id and re-run on a schedule to track price.current, price.on_sale, and each variant's price and available flag over time.
What you can collect
Public product-page data for a known product ID: name, brand, department, division, and category breadcrumb; sale-aware pricing (current, regular, on_sale); availability; images; aggregate rating (average, count); and every purchasable color variant with its own price and availability. Public product-detail data only — no search or category-listing endpoint, and never account, order, or payment information.
Limitations and common challenges
- No search or category-listing coverage. This is a product-detail endpoint only — you need a product ID before you can call it. Source IDs from Macy's product page URLs (the numeric
?ID=query parameter), not from a Crawlora search call. - No self-serve public API. Macy's has no official developer program for outside access — there's no sanctioned channel to request it.
- Bot defenses at the edge. Expect challenges on naive or high-volume automated requests to macys.com directly.
- Pricing is sale-driven and color-dependent. A product's price shifts with active sales, and different colorways can carry different prices — treat
price.currentper variant as the real number, not a single product-level price. - No nationwide bulk export. There's no official feed of Macy's full catalog, and without a search endpoint, coverage is limited to the product IDs you already have.
- Public data only. This is what a product page already shows publicly — never a way around a login or into account-level data.
Where this gets used
- Markdown tracking — watch
price.currentandprice.on_saleon specific styles through Macy's frequent sale cycles. - Color-variant pricing research — compare per-color price and availability within one style to spot which colorways are discounted.
- Assortment mapping — use
department,division, and breadcrumb fields to place tracked products within Macy's merchandising structure.
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Test the product endpoint in the Playground, check the schema in the API docs, and review pricing. For the same big-box, search-plus-detail pattern on a different chain, see how to scrape Target; for the closest general-merchandise competitor, see how to scrape Walmart; and for another department-store-style catalog, see how to scrape Kohl's. See also how to choose a web scraping API and is web scraping legal.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Can I search Macy's products with an API?
Not directly — Crawlora's Macy's coverage is product-detail only (/macys/product/{productId}), with no search or category-listing endpoint yet. Source productId values from Macy's product page URLs (the numeric ?ID= query parameter) rather than from a Crawlora search call.
Does the Macy's product endpoint detect sale pricing?
Yes — /macys/product/{productId} returns sale-aware pricing alongside availability, images, an aggregate rating, and every purchasable color variant with its own price.
Can I bulk-export Macy's entire product catalog?
No — there's no official feed of Macy's full catalog, and without a search or category-listing endpoint, coverage is limited to the product IDs you already have and look up one at a time via /macys/product/{productId}.