# MTB Deals > MTB Deals (https://mtbdeals.co/) tracks Black Friday 2026 mountain bike deals: every discounted bike, part and piece of gear from 60 European, UK and US shops, read from the shops' own sale pages and product feeds every two hours. Each deal carries the shop's price next to the old one, the real cut against the pre-campaign price, the frame sizes in stock, a price history and a buy-or-wait verdict. Independent: no affiliate links, no sponsored placements, no cookies, no trackers; the only account is an email address for opt-in alerts. This file summarises the site for AI agents; everything below is public. ## What the site is - [The app](https://mtbdeals.co/): one page that routes on the URL hash. Tabs: Deals (https://mtbdeals.co/#deals), Shops (https://mtbdeals.co/#shops), Calendar (https://mtbdeals.co/#calendar), Saved (https://mtbdeals.co/#saved), Alerts (https://mtbdeals.co/#alerts). The pre-rendered HTML carries the shop table, the campaign calendar and a table of the top deals as of the build; the live list needs JavaScript or the JSON below. - Filters deep-link as a hash: https://mtbdeals.co/#deals/q=stereo (search), shop=rose, brands=Cube,Scott, cats=mtb,emtb (mtb, emtb, parts, gear, gravel, ebike, bike), sizes=L,XL (S, M, L, XL, XXL, 3XL), wheels=29,mx, rides=enduro (xc, trail, enduro, dh, dirt), frames=fs|ht, sig=buy,good (the verdicts), max=3500 (euro), min=20 (percent off), real=1 (real markdowns only), new=1 (first seen in 48 h), sort=best|pct|save|popular|low|high|new|real|signal. One deal: https://mtbdeals.co/#deal=. - Campaigns tracked: Singles Day (11 Nov), Black Week (from 20 Nov), Black Friday (27 Nov), Cyber Monday (30 Nov), Cyber Week, Boxing Day and the winter sales, with each shop's own window on the Calendar tab. - Crawlable pages, rendered from the live snapshot: https://mtbdeals.co/black-friday-mountainbike-2026/ (the season's main page), https://mtbdeals.co/shop// (one per shop: live deals, campaign dates, 30-day price history), https://mtbdeals.co/brand// (brands with three or more deals), https://mtbdeals.co/category//, https://mtbdeals.co/calendar/ (campaign dates per shop) and https://mtbdeals.co/faq/, each with the current deals, a two-sentence answer and a schema.org ItemList; one deal: https://mtbdeals.co/d/ (indexable, the app one click away). ## Data: the JSON feed - [https://mtbdeals.co/api/deals](https://mtbdeals.co/api/deals): the full snapshot the app reads. Public, read-only, no key, GET only, JSON (about 2.3 MB raw, 300 KB compressed with gzip or brotli; fetch it server-side, there are no CORS headers), cached five minutes at the edge. Updated by a scan at every even UTC hour (00:00, 02:00, … 22:00); `checkedAt` is the time of the scan it holds and `nextCheckAt` the next one. - Top level: `v` (format version), `checkedAt`, `nextCheckAt`, `shops` (per shop id: live campaigns and what the scanner saw), `products` (the deals), `market` (the site-wide read: phase, live shops, bikes with a real cut), `health` (scan and benchmark status), `alerts` (whether email alerts are available). - A product: `id` (`:`, the key in share links), `shop` (the shop id), `title`, `brand`, `url` (the shop's product page: the place to buy, no affiliate parameters), `img` (the shop's photo, a CDN base URL without size parameters), `price`, `was` (the old price the shop shows), `cur` (EUR, GBP or USD), `pct` (percent off), `cat` (mtb = MTB, emtb = e-MTB, parts = Parts, gear = Gear & apparel, gravel = Gravel & road, ebike = Other e-bikes, bike = Other bikes), `ride` (xc, trail, enduro, dh, dirt), `frame` (fs = full suspension, ht = hardtail), `wheels`, `sizes` (frame sizes in stock, S–3XL) with `sizesFrom` (where they were read: the listing, the product page or the name; `none: true` when the page listed sizes and none was in stock), `camp` (the campaign the shop files it under), `first` (when we first saw it), `low` (its lowest price in our history), `real`, `used`, `alt`, `signal` (below), `hot` (opened often here in the last two days). - `real`: the markdown against the pre-campaign price: `ref` (the reference price), `src` (`omnibus` = the shop's own lowest price of the previous 30 days, as EU shops must state; `seen` = the price when we first saw it), `pct` (the cut against it, negative when the price went up) and `verdict`: `real` (a genuine new cut of 5% or more), `same` (it cost that already: not a campaign cut, though it can still be a fair price), `up` (the price rose since the reference). - `used`: second-hand prices for the same model on Marktplaats (`n` listings, `min`, `med`, `at`), as context for the verdict. - `alt`: other shops in the same region that list a comparable build (`n`, the cheapest `shop` and `price`, `d` the difference in percent). ## The verdicts (`signal.v`) - `buy` ("Buy now"): a real cut plus a reason not to wait: one size left, the cheapest shop for a comparable build, near second-hand prices, at the discount this shop reached in earlier years, the lowest price in our history, the Black Friday to Cyber Monday days, or the campaign's last days. - `good` ("Good price"): a real cut with nothing pressing, the shop's campaign price while the campaign is live, or a price that has not moved and gives no reason to wait. - `wait` ("Wait"): the price went up since the reference, another shop is at least 3% cheaper for a comparable build, the shop's own campaign is announced but not started, or a quiet shop that cut deep in earlier years has not shown yet before Black Friday. - `early` ("Too early to say"): under two days of history, or no reference price yet. - `signal.r` lists the fact codes behind it, the first being the headline: up, real, scarce, cheaper, cheapest, used, peak, headroom, low, ahead, altAhead, noshow, peakdays, late, popular, early, nohist, camp-price, flat. Facts decide; earlier years are context; no predicted prices. ## Share links - https://mtbdeals.co/d/ (the id URL-encoded, e.g. https://mtbdeals.co/d/canyon%3A3537): one deal. A link expander gets the product's Open Graph and Twitter tags (title with the price, the cut and the shop; the verdict as the description; a composed 1200×630 card as the image) and a schema.org Product/Offer block; a person gets the deal as a page (photo, price, 30-day price history, verdict, sizes, the shop's link) with an "Open in the app" link to https://mtbdeals.co/#deal=. Indexable; the 500 biggest discounts are in the sitemap. - https://mtbdeals.co/list? (the same keys as #deals/, e.g. https://mtbdeals.co/list?shop=rose&sizes=L): a filtered list. Unfurls with the count in the title, the top deals as the description, its own card and an ItemList of the first ten; a person is sent on to https://mtbdeals.co/#deals/. - https://mtbdeals.co/og/.png and https://mtbdeals.co/og/list.png?: the share cards themselves, 1200×630 PNG (the photo on a white panel, the price, the discount and the verdict), composed from the live snapshot and cached an hour. ## The 60 shops - EU: Canyon, Rose Bikes, Radon, Specialized, Trek, Giant, Bikester.nl, 12GoBiking, Bike24, Bike-Discount, Fahrrad XXL, Mantel, Mount7, BikeExchange, Decathlon, Buycycle, Bike-Components, Fahrrad.de, Liquid-Life, Bike-Mailorder, Probikeshop, Propain, YT Industries, Thok, Bikepalast, Futurumshop, Alltricks, Hibike, Bikeinn (Tradeinn), Commencal, Cannondale, Orbea, Scott, BMC, Kona, Zweirad Stadler, Rabe Bike, B.O.C., Mammoth Bikes, Bike Totaal / Profile, Nr1 MTB Shop, Purebike. - UK: Tredz, Chain Reaction / Wiggle, Biketart, Go Outdoors, Tweeks Cycles, Auto Trader (e-MTB), Sigma Sports, Merlin Cycles, Leisure Lakes Bikes. - US: Jenson USA, evo, Backcountry, Competitive Cyclist, BikesOnline, Ari Bikes, Bikemart, Mike's Bikes, REI. - Shop ids, regions, delivery to the Netherlands, campaign windows and earlier-year discounts: the Shops tab (https://mtbdeals.co/#shops) and the pre-rendered shop table in the HTML. ## Independence and privacy - No affiliate links, no sponsored placements, no trackers, no cookies, no analytics. Product links are the shops' own URLs. Outbound clicks are counted anonymously per deal (the "Popular" badge), nothing else is recorded about a visitor. - Email alerts are double opt-in; an account is an email address; unsubscribing removes the record. - The shop's checkout is what counts: UK and US shops may add shipping, duty and VAT for the Netherlands. ## Optional - [The long version of this file](https://mtbdeals.co/llms-full.txt): how the data is read, what the verdicts mean in detail, the feed field by field, every URL format. - [About](https://mtbdeals.co/about/): what MTB Deals is, how it works, who makes it. - [Privacy](https://mtbdeals.co/privacy/): what the browser stores, what the server records, email alerts, hosting. - [FAQ](https://mtbdeals.co/faq/): is the discount real, the Omnibus 30-day price, buy now or wait, which shops deliver, how the data is updated. - [Sitemap](https://mtbdeals.co/sitemap.xml): served live; the season's pages, every shop page, the brand and category pages and the 500 biggest discounts. - [robots.txt](https://mtbdeals.co/robots.txt) - [Web app manifest](https://mtbdeals.co/manifest.webmanifest): the app installs from the browser (PWA).