Fnac Scraper - Products, Prices, Variants & Reviews
Pricing
from $1.00 / 1,000 product results
Fnac Scraper - Products, Prices, Variants & Reviews
Scrape Fnac (fnac.com) products: current price plus strike-through discount, colour/model variant matrix, brand, breadcrumb category, and the site's own reviews with rating. Search by keyword/category or paste product and search-result links.
Pricing
from $1.00 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
0
Monthly active users
17 hours ago
Last modified
Categories
Share
Fnac Scraper: Prices, Discounts, Variants & Reviews
Fnac Scraper turns Fnac.com, the French electronics, media and entertainment retailer, into structured product data. Search by keyword and/or category, or paste product and search-result links directly, and get the current price, the strike-through reference price with a computed discount when a product is genuinely marked down, the colour/model variant matrix, a flattened spec sheet and the site's own reviews and rating. Export to JSON, CSV or Excel, pipe results into Notion, Linear or Airtable, or read them straight through the API.
Why This Scraper?
- Was-price and discount, never fabricated. When a listing card shows a product 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. A full-price product carries null there, never a guessed discount. A pasted single-product link does not carry this discount data at all, since it reads the product page directly rather than a listing card; see the FAQ below.
- Real narrowing in search mode. In search mode, a requested brand narrows through the site's own search facet server side, and sort reorders the full server-side result set, both verified against live results. A pasted category or search-result link in URL mode does not send the brand facet to the site, and cannot filter by brand client-side either, since a plain listing card never carries its own brand; use search mode if you need brand narrowing.
- Colour/model variant matrix. Products sold in more than one colour or configuration return every sibling variant, each with its own id, url, image and availability.
- Reviews straight from the product page. Overall rating, rating count and the product's own individual written reviews (author, date, rating, title, body, verified-purchase flag), read directly from the page, not a third-party review vendor.
- Flattened spec sheet. Full detail returns every characteristic the product page itself declares, storage, screen size, colour, EAN, condition and whatever else that category carries, rather than a fixed field list.
- Two ways in. Keyword and/or category search with real site filters, or paste any product or search-result link and let pagination continue automatically.
- Built for schedules. Turn on incremental mode to get only new and changed products on every recurring run, and a fully blocked run fails loudly instead of quietly returning an empty dataset.
Use Cases
- Price tracking and deal alerts: monitor a search or a list of products for price drops and genuine promotions over time.
- Catalog and competitor research: build a dataset of prices, discounts, specs and variant availability across a category.
- Review and reputation analysis: collect a product's own ratings and written reviews before stocking or recommending it.
- Assortment and variant mapping: pull the full colour/model matrix for a product line to see what is actually available.
- Feed a shop-comparison site or bot: keep prices and availability current with scheduled, incremental runs.
Data You Get
Sample shape: values are illustrative placeholders, not from a live product.
| Field | Example |
|---|---|
productId / sku | "77340219" / "9871234567890" (EAN) |
name | "Aurivex SoundWave Pro 500 Casque Sans Fil Noir" |
brand | "Aurivex" (null on a plain listing card; populated only via full product detail or a pasted single-product link) |
category / breadcrumbPath | "Casque audio" / ["Accueil", "Son", "Casques et ecouteurs", "Casques sans fil"] |
url | "https://www.fnac.com/mp77340219/aurivex-soundwave-pro-500-casque-sans-fil-noir/w-4" |
price / currency | 89.99 / "EUR" |
originalPrice / discountAmount / discountPercent | 119.99 / 30.00 / 25.0 |
isOnSpecial / promoLabel | true / "Vente flash" |
onlineAvailable / condition | true / "new" |
sellerName | "Fnac" (or a marketplace seller's name) |
image / images | "https://static.example.com/000000001.jpg" / a gallery array |
description | full product description text |
characteristics | {"Autonomie": "30h", "Couleur": "Noir", "EAN": "9871234567890"} (full detail only) |
cardCharacteristics | {"Autonomie": "30h", "Couleur": "Noir"} (short spec teaser, present on every listing card) |
variants | [{"axis": "Couleur", "name": "Bleu", "url": "https://www.fnac.com/mp77340220/.../w-4", "available": true}] |
rating / reviewCount | 4.3 / 18 |
reviews.averageRating / reviews.ratingCount / reviews.totalReviewCount | 4.3 / 18 / 6 |
reviews.items[] | [{"rating": 5, "title": "Tres bon son", "body": "Le son est clair et la batterie tient longtemps.", "author": "Marie L.", "date": "Posted on 03 Mar 2026", "verifiedPurchase": true}] |
changeType | "NEW" (incremental mode only; also UPDATED, UNCHANGED, REAPPEARED, EXPIRED) |
changedFields / firstSeenAt / lastSeenAt | ["price"] / "2026-01-01T00:00:00Z" / "2026-03-01T00:00:00Z" (incremental mode only) |
A pasted single product link always reads the full product page and fills description, brand, sku, category, breadcrumbPath, the flattened characteristics spec sheet, the images gallery and the variants matrix, plus the genuine in-stock/out-of-stock value in onlineAvailable. In search or listing mode, turning on Fetch full product details only adds description, characteristics, images and variants; brand, sku, category, breadcrumbPath and onlineAvailable stay at their listing-card defaults (null, null, null, null and true) even with the toggle on, since the detail parser used there does not read those fields. unitPrice and storePickupAvailable are fields the dataset always carries but the site does not currently expose a value for, so they are always null.
How to Use
- Pick a mode:
search(keyword and/or category) orurl(paste product or search-result links). - Fill in the fields for that mode, and set the filters (brand, price range, discount-only) and sort you want.
- Choose whether to fetch full product detail and/or reviews, and set Max items and Max pages to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
1. Keyword search, first page, with reviews (the default):
{"mode": "search","searchTerm": "iphone","maxItems": 20}
2. Keyword filtered to a brand, discounted items only, sorted by price:
{"mode": "search","searchTerm": "smartphone","brands": ["Apple"],"specialsOnly": true,"sortBy": "PRICE_ASC","maxItems": 50,"maxPages": 5}
3. Full product detail and reviews for a pasted product link:
{"mode": "url","urls": ["https://www.fnac.com/mp50936969/APPLE-iPhone-14-6-1-128-Go-Bleu-Reconditionne-Avec-Batterie-neuve/w-4"],"fetchDetails": true,"fetchReviews": true}
4. Recurring monitoring of the same search, only what changed:
{"mode": "search","searchTerm": "iphone","incrementalMode": true,"maxItems": 50}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/fnac-com-scraper").call(run_input={"mode": "search", "searchTerm": "iphone", "maxItems": 20})for product in client.dataset(run["defaultDatasetId"]).iterate_items():print(product["name"], product["price"], product["currency"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/fnac-com-scraper').call({ mode: 'search', searchTerm: 'iphone', maxItems: 20 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted crawl. Paste a previous run or dataset id and this run skips every product it already collected, so you don't pay twice. - Incremental mode (
incrementalMode) is for running the same search or URL set again and again on a schedule. Each product is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(kept but not returned unlessemitUnchangedis on), or, once a run has fully scanned every tracked search/URL withemitExpiredon,EXPIRED. A product only ever comes back markedREAPPEAREDif it was previously tombstoned that way, that is, only after some earlier run hademitExpiredon and completed a full, uncapped, non-resumed scan that had already marked it gone. IfemitExpiredhas never been turned on for a given search, a product that vanishes and later comes back is simply reported asUPDATEDorUNCHANGEDlike any other rescrape, neverREAPPEARED.stateKeynames or shares the stored state. Leave it blank and the actor derives one automatically from your search filters plus thefetchReviewssetting, since turning that on or off changes the emitted record shape; set your ownstateKeyto share state deliberately across differently configured runs instead. - Combining
resumeFromRunIdwithincrementalModebootstraps 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. - With incremental mode off, output is exactly as before.
Run time limits and partial results
Every run has a time limit. If the detail/review enrichment of the last batch of products cannot finish before that limit, the run returns those products anyway with their listing data (price, discount, rating) and an empty reviews object, and says so in a status message starting with "Partial results:". Those specific records are not billed the enrichment surcharge. To enrich everything within a short limit, lower Max items or turn full detail/reviews off.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape; the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each product, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the Pipe results into your apps input field. If the picker is empty, you have not authorized a connector yet.
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip. Use maxNotifyListings to cap how many items are exported per connector per run.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keyword and/or category) or url (paste product or search-result-listing links). |
searchTerm | string | None (prefill "iphone") | Free-text keyword. Search mode only. |
category | string | None | A category/rayon name, folded into the same free-text search as searchTerm. Search mode only. |
sortBy | string | RELEVANCE | RELEVANCE, PRICE_ASC, PRICE_DESC, BEST_SELLERS, or TOP_RATED. Search mode only. |
urls | array | None (prefill one sample search link) | Product or search-result-listing links to scrape. URL mode only; pagination continues forward automatically. |
brands | array | Empty (prefill) | Exact brand names to keep; only the first one in the list is applied. Search mode only; a pasted category or search-result link in URL mode is not narrowed by this field. |
minPrice | number | None | Only return products priced at or above this amount, in EUR. Applies in both modes. |
maxPrice | number | None | Only return products priced at or below this amount, in EUR. Applies in both modes. |
specialsOnly | boolean | false | Only return products currently showing a genuine discount against the site's own reference price, from listing-card data. A pasted single-product link never carries this discount data, so it is always filtered out when this is on. |
fetchDetails | boolean | false | Adds full description, EAN/SKU, breadcrumb category, the flattened characteristics spec sheet, image gallery, and the colour/model variant matrix. |
fetchReviews | boolean | true | Fetch the product's own reviews: overall rating, rating count and recent written reviews. |
maxReviewsPerProduct | integer | 10 | Cap on written reviews fetched per product when Fetch reviews is on. |
maxPages | integer | None (empty means no page limit) | Stop after this many result pages per search/URL entry. |
maxItems | integer | 20 | Cap on total products returned across every search/URL entry. 0 = unlimited. |
resumeFromRunId | string | None | Continue one interrupted run without re-collecting or re-charging products it already returned. |
incrementalMode | boolean | false | Recurring monitoring of the same search/URL set: returns only new and changed products against a remembered baseline. |
stateKey | string | None | Name or share an incremental-mode monitoring campaign. Leave empty to derive one automatically. |
emitUnchanged | boolean | false | Also return (and bill) products that have not changed since the last run. |
emitExpired | boolean | false | Also return (and bill) products no longer found, and start tombstoning missing products so a later reappearance can be detected. Only takes effect once a run fully scans every tracked search/URL. |
proxy | object | Apify Proxy | Connection settings. |
mcpConnectors | array | None | Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify). |
notionParentPageUrl | string | None | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items exported to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values above are illustrative placeholders, not from a live product.
{"productId": "77340219","sku": "9871234567890","name": "Aurivex SoundWave Pro 500 Casque Sans Fil Noir","brand": "Aurivex","category": "Casque audio","breadcrumbPath": ["Accueil", "Son", "Casques et ecouteurs", "Casques sans fil"],"url": "https://www.fnac.com/mp77340219/aurivex-soundwave-pro-500-casque-sans-fil-noir/w-4","price": 89.99,"currency": "EUR","originalPrice": 119.99,"discountAmount": 30.00,"discountPercent": 25.0,"isOnSpecial": true,"promoLabel": "Vente flash","onlineAvailable": true,"condition": "new","sellerName": "Fnac","image": "https://static.example.com/000000001.jpg","description": "Sample product description as shown on the site.","characteristics": { "Autonomie": "30h", "Couleur": "Noir", "EAN": "9871234567890" },"variants": [{ "axis": "Couleur", "name": "Bleu", "url": "https://www.fnac.com/mp77340220/aurivex-soundwave-pro-500-casque-sans-fil-bleu/w-4", "available": true }],"rating": 4.3,"reviewCount": 18,"reviews": {"averageRating": 4.3,"ratingCount": 18,"totalReviewCount": 6,"items": [{ "rating": 5, "title": "Tres bon son", "body": "Le son est clair et la batterie tient longtemps.", "author": "Marie L.", "date": "Posted on 03 Mar 2026", "verifiedPurchase": true }]}}
Plan Requirement
The default connection works out of the box, and the run automatically continues with a different connection when one is refused. For large or frequent runs, or to fetch from a specific country, the residential proxy group gives more headroom; pick it under Connection.
FAQ
How much does it cost?
You pay per product returned, plus a smaller detail-enrichment charge for each returned product whose page was fetched for full detail and/or reviews. Fetch reviews is on by default, so a normal run already pays that surcharge for every product it returns; turn Fetch details and Fetch reviews off if you only need the listing-card fields (price, discount, rating). Products suppressed by incremental mode (UNCHANGED, with Emit unchanged off) are never billed, even when their page had to be fetched to check for changes. The Pricing tab shows the current rates, and Max items caps the size of any run.
Is it legal to scrape Fnac?
This actor collects only publicly available product data. You are responsible for how you use it: follow Fnac's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated products, unchanged ones are not billed, and a product only comes back marked REAPPEARED if an earlier run had Emit expired on and had already completed a full scan that marked it gone.
Why did filtering by multiple brands not narrow further?
Only the first brand in the list narrows the search, since product cards do not carry a brand field of their own to check the rest against. To combine several brands, run the actor once per brand.
Why does a pasted product link always fetch the full page?
A single product link has no listing card to fall back on, so the actor always reads the full product page for it, regardless of the Fetch full product detail toggle, to get any data at all. Note that this means it never carries the listing-card discount fields (originalPrice, discountAmount, discountPercent, isOnSpecial, promoLabel), which always come back null there. The detail-enrichment charge itself is still gated by the toggles: it only applies when Fetch full product detail actually finds and adds data, or when Fetch reviews successfully reads the reviews endpoint at all, even if that product happens to have zero reviews.
Why did my run fail instead of returning an empty dataset?
If Fnac refuses every request, or serves a page that declares results but returns none of the actual product cards, the run stops with a clear connection message instead of quietly returning nothing. Run it again in a few minutes. A search that genuinely matched nothing still succeeds, with a message saying so.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ Want more electronics data?
Pair this actor with these related scrapers from the same team:
| ๐ Boulanger.com Scrape Boulanger (boulanger.com) electronics and home-appliance products: current price... | ๐ Darty Scraper Scrape Darty (darty.com) products: current price plus strike-through reference price and... |
| ๐ PcComponentes Scraper Scrape PcComponentes (pccomponentes.com) products: current price plus strike-through... | ๐ MediaMarkt Germany Scraper Scrape MediaMarkt.de products by keyword or URL. Extract current and original prices... |
| ๐ Bic Camera Scraper Scrape Bic Camera (biccamera.com) products: JPY price, list price and discount, Bic Point... | ๐ A101 Turkey Scraper Scrape A101.com.tr products across A101 Ekstra and A101 Kapฤฑda. Extract 80+ fields... |
๐ Browse all abotapi scrapers
๐ฌ Support & custom scrapers
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- โญ Enjoying it? A quick review on the actor page helps other users find it.