Only if you were already recording the price, because macys.com shows today's price and no history. Keep a list of Macy's product ids and send them to Scavio's Macy's API, POST /api/v1/macys/product, every day: each call returns the current price, the regular ("Reg.") price, the sale price, percent off, sale end date and deal label for up to 10 products, for 1 credit. Store every row with a date, and a regular price that climbs just before a sale label appears is a query away. A 10-product watchlist checked daily costs 30 credits a month.
The question comes from r/MacysStores, where a long-time shopper posted in September 2025 that they were "noticing wild pricing": a set of OXO bowls they had been watching jumped from the price on OXO's own site to a much higher one, then went on sale at the manufacturer's price. The thread drew 14 upvotes and 18 comments. The top reply came from someone in charge of markups at a store, who said there had been more markups that month than they had ever seen. A screenshot settles one product once. A price log settles it for every product you care about, every day.
What one check returns
We searched Macy's for "oxo mixing bowls" on November 9, 2026, eighteen days before Black Friday. It returned 18 OXO items: 17 on sale at 40% to 42% off, all ending November 12, and one at full price. Then we priced one of them with a product call (price fields kept, the rest trimmed):
{
"requested_id": 12680074,
"id": 12680074,
"title": "3-Pc. Mixing Bowl Set",
"brand": "OXO",
"price": 29.99,
"regular_price": 50,
"sale_price": 29.99,
"percent_off": 40,
"price_label": "Sale",
"on_sale": true,
"sale_ends": "2026-11-12",
"deal_label": null,
"price_valid_until": "2026-11-12",
"rating": 4.8,
"review_count": 83
}That is what Macy's says the deal is worth today: $29.99 against a regular $50, until November 12. Whether this set sold at $50 in October, or at $29.99 most of the year, is what a history answers, and it starts with the first row you store. We cannot tell which OXO bowls the Reddit poster was watching, and no API can show what they cost in September 2025.
Step 1: Store every check
import os, sqlite3, requests
from datetime import date
WATCHLIST = [12680074, 25839233, 10928457, 10020147, 4916836,
28229426, 24043186, 16834030, 4632095]
db = sqlite3.connect("macys_prices.db")
db.execute("""CREATE TABLE IF NOT EXISTS prices (
checked_on TEXT, product_id INTEGER, price REAL, regular_price REAL,
percent_off INTEGER, price_label TEXT, sale_ends TEXT, deal_label TEXT)""")
today = date.today().isoformat()
for i in range(0, len(WATCHLIST), 10):
r = requests.post(
"https://api.scavio.dev/api/v1/macys/product",
headers={"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}"},
json={"product_ids": WATCHLIST[i:i + 10]},
timeout=120,
)
for p in r.json()["data"]["products"]:
db.execute("INSERT INTO prices VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
(today, p["requested_id"], p["price"], p["regular_price"],
p["percent_off"], p["price_label"], p["sale_ends"],
p["deal_label"]))
db.commit()Run it once a day from cron. Batches of 10 keep it to one call per 10 products; our 10-product call came back in 5.8 seconds with all 10 found. Key the rows on requested_id, which echoes the id you sent even when Macy's answers with a collection, and an id Macy's does not know is listed in not_found and not billed.
Step 2: Ask the history the Reddit question
After a few weeks of rows, "did they raise it before the sale?" becomes a query: for each product, find days where the regular price went up, and check whether a sale label followed within two weeks.
SELECT cur.product_id,
prev.checked_on AS before_day, prev.regular_price AS reg_before,
cur.checked_on AS raised_on, cur.regular_price AS reg_after,
(SELECT MIN(s.checked_on) FROM prices s
WHERE s.product_id = cur.product_id
AND s.checked_on > cur.checked_on
AND s.checked_on <= date(cur.checked_on, '+14 days')
AND s.price_label = 'Sale') AS sale_started
FROM prices cur
JOIN prices prev
ON prev.product_id = cur.product_id
AND prev.checked_on = date(cur.checked_on, '-1 day')
WHERE cur.regular_price > prev.regular_price;A row with sale_started filled in is exactly the pattern in the thread: Reg. went up, then a sale arrived. Compare the sale price with reg_before: if they match, the sale brought the price back to where it was. Alert on a new low instead, and you skip the labels entirely.
Step 3: Check the brand's own price, if you want to
The poster's other check was the manufacturer's site. A single product call returns each variant's UPC; the mixing bowl set's is 719812013633. Match on it at other stores, for example through the Google Shopping API, to compare Macy's price with what the brand and other retailers charge the same day.
What this can and cannot tell you
- History starts when you start: every response is today's price. Start a few weeks before the sale you care about; Black Friday is November 27, 2026, and 50 of the first 60 items on Macy's Black Friday list end on November 28.
- Sale end dates:
sale_ends(andprice_valid_untilon/product) is a date with no time. It is null on most clearance and Last Act items, which carryprice_label"Now" instead of "Sale". - Percent off:
percent_offis measured against Macy's ownregular_price, which is the number this whole question doubts. Your log is the independent check. - Coupons: promo codes are not returned, so the tracked price is before any coupon. Promotion text Macy's prints, such as a bonus offer with an end date, comes through as given.
- Store prices: this is the macys.com price. A store pickup check says whether a store can hand the item over, not what its shelf tag says.
- US only: macys.com in the United States.
A 10-product watchlist checked daily is 30 calls and 30 credits a month, $0.03 at the Growth rate of $1 per 1,000 credits; the 50 free credits on signup cover the first 50 checks. 500 products checked every hour is 50 calls per check, 36,000 credits a month, $36. For sale lists, clearance and store stock, see how to get Macy's sale prices; for every other way to get Macy's data, see the best Macy's price tracker APIs.
Try the Macy's API free, 50 credits, no card, or run the product call in the playground.
Reference: Macy's API overview · product docs · deals docs · search docs · how to get Macy's sale prices
Frequently asked questions
Does Macy's raise prices before a sale?
You can only tell for products you were already tracking. Macy's shows today's price, its regular price and the percent off, and the percent off is measured against that regular price. If your own history shows the regular price rising shortly before a sale label appears, the advertised saving is smaller than it looks. No API can show prices from before you started recording them.
Is there a way to keep track of price drops on Macy's?
Yes. Keep a list of Macy's product ids and send them to Scavio's /api/v1/macys/product in groups of 10 once a day. Each 1-credit call returns price, regular price, sale price, percent off, on-sale flag, sale end date and deal label for all 10. Store each row with the date and a drop is a lower price than the previous row.
What do Reg., Sale and Now mean on Macy's?
Reg. is Macy's stated regular price, which the API returns as regular_price. The word printed before the current price comes back as price_label: Sale on most promotions, usually with an end date, Now on most clearance and Last Act markdowns, and Only or Your Choice on some deal prices. The current price, what a shopper pays before any coupon, is price.
How often should I check Macy's prices?
Daily catches most changes; Today Only prices end the same day, so check those lists in the morning. Around Black Friday, November 27, 2026, hourly helps. With Scavio, a 10-product watchlist checked daily is 30 credits a month, and 500 products checked hourly is 36,000 credits, $36 at the Growth rate of $1 per 1,000 credits.