LEGO Sale & Retiring Sets Monitor: Price Drop Alerts
Pricing
from $1.50 / 1,000 set row returneds
LEGO Sale & Retiring Sets Monitor: Price Drop Alerts
LEGO.com sale and retiring-soon sets to Google Sheets or Discord: price, list price, % off, stock and the 'retiring soon' flag per set. Get alerts for new sales, price drops, sets just flagged retiring and back in stock. US, UK, Canada, Germany. No login, no images.
Pricing
from $1.50 / 1,000 set row returneds
Rating
0.0
(0)
Developer
Adriana Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Read the LEGO.com sale page and the sets LEGO marks "Retiring soon" as one spreadsheet-ready row per set: price, the price before the sale, percent off, stock status and the retiring flag. Switch on monitoring and the actor remembers what each set cost last time, then tells you which sets are newly on sale, dropped in price, just got flagged as retiring, came back in stock or disappeared, and posts that to Discord, Slack or Telegram.
It reads LEGO's own list pages, the ones you see in a browser, for the United States, United Kingdom, Canada and Germany. No login, no API key. It returns prices and stock facts only: no images, no descriptions.
Who uses this
- Resellers and flippers who buy LEGO on sale or just before retirement and sell it on BrickLink, eBay or Vinted. Run it every few hours and get a message when a set you care about drops or gets flagged retiring.
- Deal channels (Discord, Telegram, Slack) that post LEGO deals. One run per storefront, an alert only when something moved.
- Collectors and spreadsheet people who want the whole sale list, or one theme such as Star Wars, as a table with the discount worked out.
- n8n, Make and Clay builders who need LEGO sale data inside a workflow.
Try it in 30 seconds
Press Start with the pre-filled input. It reads the US LEGO Sale page and returns the first 21 sets:
{ "lists": ["sale"] }
Add the retiring list and keep only big discounts on Star Wars sets:
{ "lists": ["sale", "retiring-soon"], "themes": ["Star Wars"], "minDiscountPct": 20 }
What you get
One row per set. A set that is on both the sale and the retiring list is returned (and billed) once, with listsFound showing both.
{"setNumber": "76470", "name": "Enchanted Flying Ford Anglia™", "theme": "Harry Potter™","locale": "en-us", "currency": "USD", "price": 63.99, "listPrice": 79.99, "discountPct": 20,"retiringSoon": true, "availability": "E_AVAILABLE", "canAddToBag": true,"pieces": 868, "ageRange": "14+", "list": "sale", "listsFound": ["sale"]}
The lists also carry accessories and apparel (a T-shirt, a hat), which have longer product codes. Filter on setNumber or theme in your sheet if you only want sets. A product with several variants (sizes) is one row at its cheapest variant, and variantCount says how many.
Monitoring: a price-drop alert in three steps
- Turn on monitoring. Tick Track changes between runs. Sets with no change you asked about are left out and not billed, so a quiet run returns one summary row (
setCount0) and costs only the start fee. Tick Remember silently on the first run if you do not want the whole sale page returned (and posted) on run one. - Pick what to hear about. Alert on takes one word per line:
new-sale(on sale and not before),price-drop(at least Smallest price drop, 5% by default),now-retiring(LEGO just flagged it),back-in-stock, andgone(the set left the list it was on; only trusted when the whole list was read). Each row'schangeTypesays which fired, withpreviousPrice,changePctandlowestEverSeen. - Send it somewhere. Paste a Discord or Slack webhook, a Telegram bot link or any URL into Send alerts to. Each alert arrives as one message with the name, set number, price and what it was, theme, pieces and link. For n8n or Make leave the format on JSON, or skip the link and read the dataset for rows where
changeTypeisdrop,new,now-retiring,back-in-stockorgone.
Schedule the saved input every few hours. Alerts are sent only for rows that were billed, messages are never billed, and a failed message never fails the run (the rows' notifyErrors says why).
Example runs
Resellers who want to know the moment a set gets flagged retiring. Change themes.
{"lists": ["retiring-soon"], "themes": ["Star Wars", "Icons"], "deltaMode": true, "deltaName": "retiring-watch", "alertOn": ["now-retiring", "price-drop"], "notifyUrl": "<your Discord webhook>"}
A daily Discord post of new deep discounts. Change minDiscountPct.
{"lists": ["sale"], "minDiscountPct": 30, "deltaMode": true, "deltaName": "deep-sales", "skipFirstRun": true, "alertOn": ["new-sale"], "notifyUrl": "<your Discord webhook>"}
The whole UK sale list in a sheet, no monitoring. Change locale.
{"lists": ["sale"], "locale": "en-gb", "maxItems": 100}
Limits, stated plainly
- It returns LEGO.com's list pages as shown. LEGO.com decides what is on sale, what is flagged retiring and the order (its Recommended order). The actor adds no sort of its own, and the server-side sort option of the page does not deliver a list.
- Four storefronts. United States, United Kingdom, Canada and Germany. Sale works on all four, retiring soon on en-us, en-gb and de-de, new on en-us and de-de. A list a storefront does not serve is skipped, with a note in the log. France returned an empty sale page when it was checked.
- A retiring flag is LEGO's flag, not a retirement date. There is no date on the page. Sets flagged "retiring soon" are often at full price: use
discountPctandminDiscountPctto separate sale from retiring. - No minifigure counts. LEGO.com's list pages carry no minifigure count, so the column does not exist. Piece count is there when LEGO states one.
- Prices only: no images, no descriptions, no checkout. The actor never opens a product page, the bag or an account page. It reads only the
/categories/list pages that LEGO.com's robots.txt allows, one page per second. - No secondary-market prices. LEGO.com has no sold price. BrickLink and eBay comparisons are not included.
goneneeds a full read. A set is called gone only when every list it was last seen on was read to its last page with every tile parsed. A run that stops early (yourmaxItems, a refused page, the time budget) never calls anything gone.- At most 300 sets per list. The run stops at the last page, at 20 pages per list, or after about three minutes.
- Misses are free. Blocked, a changed page, an empty list: nothing is charged.
How to use
- In the Apify Console. Open the actor page and click Start — the
listsfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~lego-sale-retiring-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"lists":["sale"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Input
{"lists": ["sale"]}
One list per line: sale, retiring-soon or new. Leave it as sale for the LEGO Sale page, add retiring-soon for the sets LEGO marks as retiring soon (the page LEGO calls Last chance to buy). A pasted LEGO.com category link is read for its list name. Prices and stock facts only: no images, no descriptions, no login. Accepted formats: sale, retiring-soon, new, https://www.lego.com/en-us/categories/sales-and-deals.
Sample output
| query | found | status | setCount | setsRead | listsChecked | listsFailed | truncated | monitorStatus | sets | setNumber | name | theme | url | locale | currency | price | listPrice | discountPct | retiringSoon | featuredFlags | availability | canAddToBag | pieces | rating | ageRange | list | listsFound | checkedAt | changeType | changes | previousPrice | changePct | lowestEverSeen | firstSeenAt | notifyErrors | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| sale | true | OK | <all sets (full list)> | <discount %> | <lego.com flags> | <price change %> | 1970-01-01T00:00:00.000Z |
A miss comes back as a row with "found": false and is never charged.
Pricing
Pay-per-event. A flat per-run fee covers session/proxy warmup; you're billed
per item only when data is actually found and returned — see
.actor/pay_per_event.json for exact prices. A miss is never charged.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~lego-sale-retiring-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"lists":["sale"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~lego-sale-retiring-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"lists":["sale"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~lego-sale-retiring-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"lists":["{{LEGO.com list}}"]}, mapping the row's LEGO.com list into the lists array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "LEGO Sale & Retiring Sets Monitor | Apify" — the agent will find and run this actor.
FAQ
Is this the official LEGO API? No. It reads the public LEGO.com list pages without logging in, only the /categories/ paths that robots.txt allows, and takes the embedded product data of each page.
Which sets does "retiring soon" show? The ones LEGO.com tags "Retiring soon" on its Last chance to buy page. The tag is LEGO's; there is no retirement date on the page.
Why is a set missing that I can see on LEGO.com? The lists are read as the server sends them. A tile that is not a product (a gift-with-purchase banner) is skipped, and maxItems, themes, minDiscountPct and retiringOnly all narrow the result. setsRead shows how many different sets the run saw before those filters.
What does a watchlist remember? For each set: last price, lowest price seen, whether it was on sale, flagged retiring and in stock, and which lists it was on. It is stored in an Apify key-value store under your account and capped at 5,000 sets.
Does it work with a datacenter proxy? The default proxy is Apify's datacenter pool. If LEGO.com refuses it you get a free BLOCKED row; switch the proxy to Residential in the input.