Mattress Firm Scraper - Mattress Price & Stock by Size (USA) avatar

Mattress Firm Scraper - Mattress Price & Stock by Size (USA)

Pricing

from $2.45 / 1,000 product scrapeds

Go to Apify Store
Mattress Firm Scraper - Mattress Price & Stock by Size (USA)

Mattress Firm Scraper - Mattress Price & Stock by Size (USA)

Mattress Firm scraper: product pages or the whole sitemap to one row per size offer (Twin to Cal King) with USD price, in-stock flag, SKU, barcode, brand, firmness, rating and reviews. For mattress price and stock watching.

Pricing

from $2.45 / 1,000 product scrapeds

Rating

0.0

(0)

Developer

Superslow Sloth

Superslow Sloth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Security

Limited permissions

Share

Mattress Firm scraper: mattress price and stock by size (USA)

This Mattress Firm scraper reads product pages on Mattress Firm (the US mattress retailer: mattresses, adjustable bases, foundations, pillows, protectors, headboards and bedding) and returns one row per size: the USD price of the Twin, the Twin XL, the Full, the Queen, the King and the Cal King of each product, an in-stock flag, the SKU and barcode, brand, firmness, rating and review count, the link and the photo. Give it the products you track, or switch on the sitemap to read the whole site, and run it on a schedule: diff the dataset to get a mattress price and stock watch, with a price per size and not a single "from" price per product.

No account, no API key, no login, no browser. One request returns every size of a product.

Input

FieldNotes
productUrlsProduct pages to read, one per line: the page address (https://www.mattressfirm.com/tempur-breeze-pro-pillow/5637524826.p), the path, or just the product number (5637524826). A category address (ending in .c) is refused with a message, because Mattress Firm draws its category pages in the browser: use fromSitemap to discover products. The same product given twice, or with different ?variantid= values, is read once.
fromSitemapAlso read every product in Mattress Firm's sitemap (/sitemap_index.xml: about 170 products when this actor was built), after the ones in productUrls. Default off. About a third of the sitemap's products are no longer sold; they are skipped at no charge (see below).
maxItemsStop after writing this many rows (default 100, up to 50,000). A row is one size, so a mattress sold in six sizes is six rows. Products are read in the order given, the sitemap's after yours.
proxyConfigurationApify RESIDENTIAL proxy by default. Mattress Firm sits behind Cloudflare, which refuses datacenter addresses.

Example input:

{
"productUrls": [
"https://www.mattressfirm.com/frisco-21-medium-euro-pillowtop-mattress/5637674080.p",
"https://www.mattressfirm.com/tempur-breeze-pro-pillow/5637524826.p"
],
"maxItems": 30
}

Output

Prices are numbers in US dollars; currency is USD on every offer measured. One row is one product size offer: a mattress is a row per size, a pillow a row per size and height, a headboard a row per size and colour, and a product sold in one version (a comforter set, a sleep mask) is one row with no size. sku is the unique key of a row and product_id ties the rows of one product together. A row reports the price on the day it was read (scraped_at); keep the datasets of scheduled runs and compare them to see a price move or a size go out of stock.

FieldNotes
product_id, skuMattress Firm's product id (the number before .p in the address) and the variant id of the row, both strings. sku is unique per row. A product with a single version, asked for without ?variantid=, prints an empty SKU on the page: the row then carries the product id as its sku.
name, product_namename spells the variant out ("Frisco 2.1 Medium Euro Pillowtop Mattress - Queen"); product_name is the product alone, and equals name for a single-version product.
brandAs the page names it (Sealy, Tempur-Pedic, Sleepy's); null if absent.
sizeThe size as the page names it: Twin, Twin XL, Full, Queen, King, Cal King, Split Cal King, Full/Queen and other spellings the page uses. Null for a product with a single version.
color, height, foundationThe other axes a product varies by: a headboard's colour, a pillow's height (Low, Medium, High), a box spring's foundation height. Null where the product does not vary by it.
firmnessThe comfort level the page gives the variant (MEDIUM COMFORT, FIRM COMFORT), on the products that carry one; null otherwise.
currency, priceUSD, and the price of this size today. The page's structured data carries no was-price or list price, so there is no column for one: a markdown shows up as the price changing between two runs.
in_stock, availabilityavailability is the page's schema.org value as sent (InStock, OutOfStock); in_stock is true for InStock, false for OutOfStock, and null for anything else or nothing. It is per size.
conditionnew, used or refurbished; null when the offer says none.
gtinThe variant's barcode as sent (14 digits, zero-padded); null when absent.
url, image_urlThe variant's page address (with its ?variantid=) and its first photo.
rating, review_countThe product's average star rating (rounded to two decimals) and the number of reviews it is from, shared by every size of the product. Both null where the page carries no rating (the single-version products measured had none).
scraped_atWhen the row was read, UTC, ISO 8601.

Example row (a real row, 2026-11-02):

{
"product_id": "5637674080",
"sku": "5637674850",
"name": "Frisco™ 2.1 Medium Euro Pillowtop Mattress - Queen",
"product_name": "Frisco™ 2.1 Medium Euro Pillowtop Mattress",
"brand": "Sealy",
"size": "Queen",
"color": null,
"height": null,
"foundation": null,
"firmness": "MEDIUM COMFORT",
"currency": "USD",
"price": 649.99,
"in_stock": true,
"availability": "InStock",
"condition": "new",
"gtin": "00748369787681",
"url": "https://www.mattressfirm.com/frisco-21-medium-euro-pillowtop-mattress/5637674080.p?variantid=5637674850",
"image_url": "https://images-us-prod.cms.dynamics365commerce.ms/cms/api/cncgmclkfv/imageFileData/search?fileName=/Products/144589P%20%5E%20%20%5E%20Queen%20%5E%20%20%5E%20Prime_000_001.png&fallback%3D%2FProducts%2F144589P_000_001.png",
"rating": 4.35,
"review_count": 1992,
"scraped_at": "2026-11-02T09:15:42Z"
}

Honest nulls

A field the page did not carry is null, never 0 or "".

  • No was-price, discount or sale flag. Mattress Firm's page data holds one price per size and no list price. A sale is a lower price than on the previous run.
  • No description, specs or review text. This is the price-and-stock table, one row per size.
  • No store inventory. in_stock is the online offer, not a store's shelf.

Pricing

Pay per event:

  • $0.002 per run (actor-start), charged only after your input is validated, so a run that fails on bad input costs nothing.
  • $0.00245 per product written (product-scraped), i.e. $2.45 per 1,000 rows, 30% under the cheapest comparable Mattress Firm actor on the Apify Store ($0.0035 per item) when this one was built. One row is one product size offer, so a mattress sold in six sizes is six rows. A row is charged only after it is written. A product Mattress Firm no longer sells, a product that cannot be read, and a size the same product repeats are not written and not charged.

How it fetches

It reads the schema.org structured data (application/ld+json) that every Mattress Firm product page carries for search engines: a product group with one product and one offer per variant. The page is about 0.2 to 0.8 MB. Measured 2026-11-01 from the Apify platform on a probe run of 10 requests per proxy group: RESIDENTIAL answered a real page 6 of 10 times and datacenter 0 of 10 (every refusal was a Cloudflare page, HTTP 403 "Attention Required!" or "Just a moment..."). The actor therefore defaults to the residential group and treats a refusal (403, 429, 5xx), a 200 that carries no product data, or a dropped connection as the address being blocked: it retries from a fresh exit address and a different browser fingerprint (seven are tried in turn, one attempt each). Product pages are read four at a time and written in the order you gave them.

Things worth knowing, all measured on 2026-11-02:

  • A third of the sitemap is dead. The sitemap lists 222 addresses of 174 distinct products, all dated 2025-07-08. Read in full, 113 had offers, 60 were gone and 1 was refused by a rate limit on the machine used for the test: Mattress Firm answers a product it no longer sells with HTTP 200 and its 404 page (33) or with a category page (27). The actor recognises both, reports the product as skipped in the run log, does not retry it and does not charge for it.
  • One product, one request. A product page lists every size whatever ?variantid= it is asked with, so the sitemap's several addresses of one product are read once.
  • Single-version products. A product with one offer (a comforter set) has no size, no rating and no product group; its row has size null.
  • Category pages are not read. They are drawn in the browser and hold no product data in the HTML.
  • A page with no usable price (the offers carry none) fails that product with a message and is not charged, rather than writing a zero.

If Mattress Firm changes its page layout, the run fails with a message instead of returning empty rows.