Fnac Scraper - Products, Prices, Variants & Reviews avatar

Fnac Scraper - Products, Prices, Variants & Reviews

Pricing

from $1.00 / 1,000 product results

Go to Apify Store
Fnac Scraper - Products, Prices, Variants & Reviews

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

Abot API

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

0

Monthly active users

17 hours ago

Last modified

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.

FieldExample
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 / currency89.99 / "EUR"
originalPrice / discountAmount / discountPercent119.99 / 30.00 / 25.0
isOnSpecial / promoLabeltrue / "Vente flash"
onlineAvailable / conditiontrue / "new"
sellerName"Fnac" (or a marketplace seller's name)
image / images"https://static.example.com/000000001.jpg" / a gallery array
descriptionfull 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 / reviewCount4.3 / 18
reviews.averageRating / reviews.ratingCount / reviews.totalReviewCount4.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

  1. Pick a mode: search (keyword and/or category) or url (paste product or search-result links).
  2. Fill in the fields for that mode, and set the filters (brand, price range, discount-only) and sort you want.
  3. Choose whether to fetch full product detail and/or reviews, and set Max items and Max pages to control run size and cost.
  4. 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 ApifyClient
client = 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 classified NEW, UPDATED (with changedFields), UNCHANGED (kept but not returned unless emitUnchanged is on), or, once a run has fully scanned every tracked search/URL with emitExpired on, EXPIRED. A product only ever comes back marked REAPPEARED if it was previously tombstoned that way, that is, only after some earlier run had emitExpired on and completed a full, uncapped, non-resumed scan that had already marked it gone. If emitExpired has never been turned on for a given search, a product that vanishes and later comes back is simply reported as UPDATED or UNCHANGED like any other rescrape, never REAPPEARED. stateKey names or shares the stored state. Leave it blank and the actor derives one automatically from your search filters plus the fetchReviews setting, since turning that on or off changes the emitted record shape; set your own stateKey to share state deliberately across differently configured runs instead.
  • Combining resumeFromRunId with incrementalMode 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.
  • 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.

  1. Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the Pipe results into your apps input field. If the picker is empty, you have not authorized a connector yet.
  3. For Notion, also set notionParentPageUrl to 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

ParameterTypeDefaultDescription
modestringsearchsearch (keyword and/or category) or url (paste product or search-result-listing links).
searchTermstringNone (prefill "iphone")Free-text keyword. Search mode only.
categorystringNoneA category/rayon name, folded into the same free-text search as searchTerm. Search mode only.
sortBystringRELEVANCERELEVANCE, PRICE_ASC, PRICE_DESC, BEST_SELLERS, or TOP_RATED. Search mode only.
urlsarrayNone (prefill one sample search link)Product or search-result-listing links to scrape. URL mode only; pagination continues forward automatically.
brandsarrayEmpty (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.
minPricenumberNoneOnly return products priced at or above this amount, in EUR. Applies in both modes.
maxPricenumberNoneOnly return products priced at or below this amount, in EUR. Applies in both modes.
specialsOnlybooleanfalseOnly 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.
fetchDetailsbooleanfalseAdds full description, EAN/SKU, breadcrumb category, the flattened characteristics spec sheet, image gallery, and the colour/model variant matrix.
fetchReviewsbooleantrueFetch the product's own reviews: overall rating, rating count and recent written reviews.
maxReviewsPerProductinteger10Cap on written reviews fetched per product when Fetch reviews is on.
maxPagesintegerNone (empty means no page limit)Stop after this many result pages per search/URL entry.
maxItemsinteger20Cap on total products returned across every search/URL entry. 0 = unlimited.
resumeFromRunIdstringNoneContinue one interrupted run without re-collecting or re-charging products it already returned.
incrementalModebooleanfalseRecurring monitoring of the same search/URL set: returns only new and changed products against a remembered baseline.
stateKeystringNoneName or share an incremental-mode monitoring campaign. Leave empty to derive one automatically.
emitUnchangedbooleanfalseAlso return (and bill) products that have not changed since the last run.
emitExpiredbooleanfalseAlso 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.
proxyobjectApify ProxyConnection settings.
mcpConnectorsarrayNoneOptional MCP connectors to export results into (Notion, Linear, Airtable, Apify).
notionParentPageUrlstringNoneNotion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap 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.

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.

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.