Macy's
Macy's regular or sale price (a range when options differ), stock, rating and review count, colours and image, by product id, about 75,000 products per credit. Search and category browsing too. Store pickup for one store as a paid extra.
Macy's regular or sale price (a range when options differ), stock, rating and review count, colours and image, by product id, about 75,000 products per credit. Search and category browsing too. Store pickup for one store as a paid extra.
At a glance
Property | Value |
|---|---|
|
|
Item id | The number after |
Marketplaces | Live: |
Tiers |
|
Ids per call | 300 |
Typical call | 8–25 s for 300 ids |
Search |
|
`price` is never a coupon price
price is Macy's regular price, or its sale price when the product is marked down. Coupon and promo-code prices are not given. A product with options at different prices (sizes, colours) has no single price: price is null and macys.priceRange is its lowest and highest. A range is not a discount, and a range where only some colours are on sale shows the whole range. Prices change during the day; ask again for a current one.
What stock means here
availability.inStock is Macy's own flag on the product, and macys.variants counts how many of its options (size and colour) Macy's lists as available. There are no unit counts. A product Macy's no longer sells has no price and inStock: false. A collection of products (a master listing that groups many styles, such as a shirt in 22 colours or a set of sheets) is judged by its product flag only: macys.variants is null for it, and it has no pickup.
Example
- cURL
- Python
- Node.js
curl -X POST "https://api.scrapelyserp.com/v1/products" \
-H "Authorization: Bearer $SCRAPELY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "macys",
"ids": [
"26580087",
"https://www.macys.com/shop/product/tommy-hilfiger-mens-regular-fit-heritage-oxford-shirt?ID=18618230"
]
}'import os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPELY_API_KEY']}"}
r = requests.post(
"https://api.scrapelyserp.com/v1/products",
headers=HEADERS,
json={
"platform": "macys",
"ids": [
"26580087",
"https://www.macys.com/shop/product/tommy-hilfiger-mens-regular-fit-heritage-oxford-shirt?ID=18618230",
],
},
timeout=30,
)
r.raise_for_status()
data = r.json()
for p in data["results"]:
print(p["id"], p["status"], (p.get("price") or {}).get("amount"), p["macys"]["rating"])const res = await fetch('https://api.scrapelyserp.com/v1/products', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SCRAPELY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
platform: 'macys',
ids: [
'26580087',
'https://www.macys.com/shop/product/tommy-hilfiger-mens-regular-fit-heritage-oxford-shirt?ID=18618230',
],
}),
signal: AbortSignal.timeout(30_000),
});
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();
for (const p of data.results) console.log(p.id, p.status, p.price?.amount, p.macys?.rating);Full reference → POST /v1/products
Macy's fields
Besides the common fields, each result carries a macys object.
Field | Description |
|---|---|
| Macy's regular price, or the sale price when marked down. |
| Macy's regular price, when the product is on sale at one price. |
| The lowest and highest current price when options differ (then |
| Macy's flag on the product, how many options are available out of how many, and Macy's own few-left flag. |
| Macy's own review average (0 to 5) and the number of reviews. Both are |
| The brand and the colour names the product comes in. |
| Set only when a marketplace seller sells the product (not Macy's itself). |
| The product page on Macy's and one picture. Macy's pages may refuse a script that fetches them; the link opens in a browser. |
Not given | Coupon and promo-code prices, unit counts, and the price of a single size or colour. |
macys/search also lists a category: send category with the number after id= in a Macy's category link, for example 20635 (men's dress shirts). Use query or category, not both.
Store pickup (paid extra)
Send tier: "pickup" with store, a Macy's store number such as 8 (Queens - Rego Park). Each result then has macys.pickup: the store's name and place, whether it offers pickup at all (storeOffersPickup), whether any option can be picked up there (available) and how many (variantsAvailable of variantsChecked). It is Macy's own pickup flag for each option, not a unit count, and it is not a promise for today: ask again close to the time.
A pickup call costs about a third more per product (about 55,000 per credit instead of about 75,000), because every option is checked at the store. Only a store number works: a ZIP code does not choose a store, and there is no ZIP lookup. A store number Macy's does not know makes every item unavailable and costs nothing. store is refused on the standard tier.
Statuses on Macy's
partial: Macy's answered without a title, or (pickup tier) the pickup answer failed after retries. The price and stock are still real. Ask again later.not_found: Macy's has no such product id.unavailable: no usable answer after retries, or a store number Macy's does not know. Not charged; ask again.