Boulanger.com - Prices, Discounts, Variants & Reviews avatar

Boulanger.com - Prices, Discounts, Variants & Reviews

Pricing

from $1.00 / 1,000 product results

Go to Apify Store
Boulanger.com - Prices, Discounts, Variants & Reviews

Boulanger.com - Prices, Discounts, Variants & Reviews

Scrape Boulanger (boulanger.com) electronics and home-appliance products: current price plus strike-through was-price, specials, colour/capacity variant matrix, brand, category, full spec sheet and customer reviews with ratings. Search by keyword or paste links.

Pricing

from $1.00 / 1,000 product results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Boulanger Product Scraper

Pull product data from Boulanger (boulanger.com), a French electronics, multimedia and home-appliance retailer. Search by keyword and/or category, or paste product and search-result links directly -- including specials collections such as Soldes or Bons plans. Every record includes the current price, the strike-through reference price with computed discount when a product is genuinely marked down, and the colour/capacity/size variant matrix when you ask for full detail.

Why This Scraper?

  • Was-price and discount, structured, never fabricated. When a product is marked down against the site's own reference price, both prices are captured plus the computed discount amount, percentage, and the site's own promo label. Full-price products simply carry null -- nothing is guessed.
  • Specials, first-class. A specialsOnly toggle keeps only products genuinely on a strike-through discount right now; paste any specials collection link (Soldes, Bons plans, ventes flash) directly in URL mode.
  • Real narrowing, not a filter that quietly does nothing. A single requested brand narrows via the site's own search facet (verified against the live site); sort reorders the full server-side result set.
  • Colour/capacity/size variant matrix. Products sold in more than one configuration return every sibling variant, each with its own id, url, price and availability.
  • Reviews straight from the product page. Overall rating, rating count, a rating breakdown, and the product's own individual reviews (author, date, rating, title, body, verified-purchase flag where shown) -- not a third-party review vendor host.
  • Flattened spec sheet. Full detail returns every characteristic the product page itself declares (capacity, dimensions, energy class, EAN, and whatever else that category carries) rather than a fixed field list, so nothing category-specific is silently dropped.
  • Two ways in. Keyword/category search with real site filters (brand, price range, discount-only, sort), or paste any product/search-result/specials link and continue pagination automatically.
  • Optional export to your apps. Send results into Notion, Linear, Airtable, or any Apify MCP connector alongside the dataset.
  • Resume and recurring updates. Turn on Incremental mode to get only NEW, UPDATED, and REAPPEARED products on every scheduled run, or resume one specific interrupted crawl with resumeFromRunId.

Data You Get

FieldExample value
productId / sku / ean00000001, sample-sku-guid, 0000000000000
nameSample Brand Robot Vacuum Cleaner Black
brandSampleBrand
category / breadcrumbPathVacuum cleaners, ["Home", "Home appliances", "Vacuum cleaners"]
urlhttps://www.boulanger.com/ref/00000001
price / priceExclTax / currency229.00, 190.83, EUR
originalPrice / discountAmount / discountPercent299.00, 70.00, 23.0
isOnSpecial / promoLabeltrue, Ancien prix
onlineAvailable / condition / sellerNametrue, new, Sample Retailer
image / images["https://static.example.com/000000000.jpg"]
descriptionfull product description text
characteristics{"Suction power": "13 000 Pascals", "Battery life": "4 h 50", "Made in": "Sample Country"}
variants[{"axis": "couleur", "name": "Sample Colour", "url": "https://www.boulanger.com/ref/00000002", "price": 229.00, "available": true}]
rating / reviewCount4.8, 96
reviews.averageRating / reviews.ratingCount / reviews.totalReviewCount4.8, 96, 10
reviews.ratingBreakdown{"1": 0, "2": 0, "3": 0, "4": 1, "5": 9}
reviews.items[][{"rating": 5, "title": "Sample title", "body": "Sample review text.", "author": "Jane D.", "date": "2026-01-01", "verifiedPurchase": true}]

Sample shape: values above are illustrative placeholders, not from a live product.

How to Use

1. Keyword search, first page, with reviews (default):

{
"mode": "search",
"searchTerm": "aspirateur robot",
"maxItems": 20
}

2. Keyword + category, filtered to a brand, discounted items only, sorted by price:

{
"mode": "search",
"searchTerm": "smartphone",
"category": "reconditionne",
"brands": ["Apple"],
"specialsOnly": true,
"sortBy": "PRICE_ASC",
"maxItems": 50,
"maxPages": 5
}

3. Full product detail (spec sheet + variants) and reviews for a pasted product link:

{
"mode": "url",
"urls": ["https://www.boulanger.com/ref/00000001"],
"fetchDetails": true,
"fetchReviews": true
}

4. Paste a specials/search-result link and keep paginating forward:

{
"mode": "url",
"urls": ["https://www.boulanger.com/resultats?tr=aspirateur"],
"maxItems": 100,
"maxPages": 10
}

5. Daily monitoring: only what changed since the last run:

{
"mode": "search",
"searchTerm": "aspirateur robot",
"incrementalMode": true,
"maxItems": 50
}

Resume and recurring updates

Two different things, both under the same input section:

  • resumeFromRunId continues ONE specific interrupted crawl. Paste a previous run ID or dataset ID and this run skips every product that run already collected, picking up where it left off -- useful after a run was stopped early or hit an error partway through a large pull.
  • incrementalMode is for running the SAME search or URL set again and again (daily, weekly, on a schedule) and getting only what changed. It remembers the previous run's products in a dedicated key-value store, keyed automatically from the mode, search/URL and filter settings (or your own stateKey if you want to name or deliberately share a campaign) -- so two differently-configured runs never mix their baselines. Every product is classified as changeType: NEW (first time seen), UPDATED (a comparable field changed -- see changedFields), REAPPEARED (was gone, is back), or, with emitExpired on and only once a run has fully scanned every tracked search/URL, EXPIRED (was tracked, no longer found). UNCHANGED products are tracked but not returned unless emitUnchanged is on -- both extra-emission toggles are off by default because they return, and bill, rows you already have. The state key folds in fetchReviews alongside the search filters, since turning it on or off changes the emitted record shape.
  • incrementalMode defaults to false -- a normal run's behavior and output shape are unchanged until you opt in. Combining it with resumeFromRunId bootstraps a brand-new monitoring campaign from that resumed crawl's results; if a baseline already exists for the derived (or given) state key, the run fails fast rather than silently mixing the two.

How far pagination goes

With maxPages left empty, a search or listing URL is walked until the run has covered the result total boulanger.com states for it ("698 articles"), counted by page number against the site's own fixed 40-slot result grid. It is deliberately not stopped by a page that yielded fewer than 40 products: the site seeds sponsored tiles into that grid, so a perfectly ordinary page in the middle of a large search returns fewer products than the grid has slots, and treating that as the end would silently return a single page of a several-hundred-product search.

Only a walk that reached that stated total (or an empty page) counts as a complete scan, which is also the condition incrementalMode requires before it will mark anything EXPIRED. Every other stop, maxPages, maxItems, the filter rule below, or a page the site repeated, is reported in the log as not having reached the end of results.

How filtering is bounded

minPrice/maxPrice, additional brands beyond the first, and specialsOnly have no equivalent on boulanger.com's own search request (only the first requested brand is a real search facet), so they are checked after each result page is fetched rather than sent as a query parameter. To stop a very selective combination from paging through an entire search or category looking for survivors, a search stops after 5 consecutive result pages that contained new (not-yet-seen) products but none of them matched your filters.

Pages that have nothing new on them at all -- for example, when resuming a previous run with resumeFromRunId, the early pages are re-walked purely to confirm nothing changed -- never count toward this limit; only your filters can trip it, and only once they have actually had unseen products to discard.

The run log tells you which of two things happened:

  • "Page N: ... product(s)" followed by the next page -- the walk kept finding matches (or kept walking past already-seen pages on a resume).
  • "Stopping this search after page N: the last 5 page(s) had new products but none matched your filters." -- the run gave up on that 5-page rule. These results were not read to the end; more matches may exist further down. Narrow the search/category or widen the filters to see more.

Input Parameters

ParameterTypeDescription
modestringsearch or url.
searchTermstringKeyword (search mode only; uses the site's own product search).
categorystringA category/department name (search mode only), combined with searchTerm into the site's own free-text search.
brandsarrayExact brand names to keep (applies in both search mode and URL mode); the first is narrowed server-side, the rest client-side.
minPrice / maxPricenumberEUR price band to keep (applies in both search mode and URL mode). Checked after each page is fetched, not sent as a search parameter -- see "How filtering is bounded" below.
specialsOnlybooleanKeep only products currently showing a genuine discount against the site's own reference price (applies in both search mode and URL mode). Paste a specials collection URL directly in url mode for a whole promotions page.
sortBystringRELEVANCE, PRICE_ASC, PRICE_DESC, or TOP_RATED.
urlsarrayProduct or search-result/specials-listing URLs to scrape (url mode only).
fetchDetailsbooleanFetch full product detail (description, EAN/GTIN, breadcrumb category, flattened characteristics, image gallery, variant matrix).
fetchReviewsbooleanFetch the product's own reviews.
maxReviewsPerProductintegerCap on written reviews per product; the product page itself only ever surfaces a recent subset.
maxPagesintegerCap on result pages per search/URL entry; empty = no page cap (bounded by Max products and the guards described below, never silently truncated).
maxItemsintegerCap on total products returned; 0 = unlimited.
resumeFromRunIdstringPrevious run ID or dataset ID to continue ONE interrupted crawl without re-returning/re-charging products it already collected. See "Resume and recurring updates" below.
incrementalModebooleanRecurring monitoring of the same search/URL set: returns only NEW/UPDATED/REAPPEARED products against a remembered baseline. Default false. See "Resume and recurring updates" below.
stateKeystringIncremental mode only. Name a monitoring campaign, or deliberately share state across differently-configured runs. Leave empty to derive one automatically.
emitUnchangedbooleanIncremental mode only. Also return UNCHANGED products. Off by default -- returns and bills rows you already have.
emitExpiredbooleanIncremental mode only. Also return EXPIRED products once a run fully scans every tracked search/URL. Off by default -- returns and bills extra synthetic rows.
proxyobjectApify proxy configuration. Works on every plan by default.
mcpConnectorsarrayOptional MCP connectors to export results into (Notion, Linear, Airtable, Apify).
notionParentPageUrlstringNotion connector only: page under which item pages are created.
maxNotifyListingsintegerCap on items exported to each connector per run. Does not affect the dataset.

Output Example

{
"productId": "00000001",
"sku": "sample-sku-guid",
"ean": "0000000000000",
"name": "Sample Brand Robot Vacuum Cleaner Black",
"brand": "SampleBrand",
"category": "Vacuum cleaners",
"breadcrumbPath": ["Home", "Home appliances", "Vacuum cleaners"],
"url": "https://www.boulanger.com/ref/00000001",
"price": 229.00,
"priceExclTax": 190.83,
"currency": "EUR",
"originalPrice": 299.00,
"discountAmount": 70.00,
"discountPercent": 23.0,
"isOnSpecial": true,
"promoLabel": "Ancien prix",
"onlineAvailable": true,
"condition": "new",
"sellerName": "Sample Retailer",
"image": "https://static.example.com/000000000.jpg",
"description": "Sample product description as shown on the site.",
"characteristics": { "Suction power": "13 000 Pascals", "Battery life": "4 h 50", "Made in": "Sample Country" },
"variants": [
{ "axis": "couleur", "name": "Sample Colour", "url": "https://www.boulanger.com/ref/00000002", "price": 229.00, "available": true }
],
"rating": 4.8,
"reviewCount": 96,
"reviews": {
"averageRating": 4.8,
"ratingCount": 96,
"totalReviewCount": 10,
"ratingBreakdown": { "1": 0, "2": 0, "3": 0, "4": 1, "5": 9 },
"items": [
{ "rating": 5, "title": "Sample title", "body": "Sample review text.", "author": "Jane D.", "date": "2026-01-01", "verifiedPurchase": true }
]
}
}

Sample shape: values above are illustrative placeholders, not from a live product.

A note on reviews and prices

Reviews come directly from the product page itself, not a third-party review vendor host -- the page only ever surfaces its own recent written reviews, while the overall rating and rating count reflect the full history. reviews.ratingBreakdown is a 1-5 histogram computed from the reviews returned in this run: the product page itself does not expose a full-population breakdown widget, so this is a sample statistic rather than the site's own total distribution. originalPrice reflects the site's own reference price and is only ever populated when it is genuinely higher than the current price -- a full-price product always carries null there, never a fabricated discount.

Send results into your apps (MCP connectors)

Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in the mcpConnectors field. Each connector receives a condensed, human-readable summary per product (name plus key fields), while the complete record always stays in the Apify dataset.

FieldTypeDescription
mcpConnectorsarrayConnector IDs to export results into (Notion, Linear, Airtable, Apify). Leave empty to skip; it never changes the dataset output.
notionParentPageUrlstringNotion connector only: the page under which item pages are created.
maxNotifyListingsintegerCap on items exported to each connector per run. Does not affect the dataset.

A note on plans

The default connection works on every Apify plan, including the free tier. Change it only for a specific country or very large runs.