# ManoMano Scraper \[$1.5/1k💰] | DIY Prices | 5 EU Markets (`ahmed_jasarevic/manomano-fr-scraper`) Actor

Scrape ManoMano DIY & home-improvement product offers from France, Germany, Spain, Italy and UK: price, brand, seller, rating, specs, EAN and SKU via ManoMano's own Algolia API for price monitoring and e-commerce intelligence.

- **URL**: https://apify.com/ahmed\_jasarevic/manomano-fr-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ManoMano Scraper — DIY Marketplace Product Data (FR/DE/ES/IT/UK)

Scrape **product offers from ManoMano** — Europe's leading DIY & home-improvement marketplace (manomano.fr, .de, .es, .it, .co.uk) — with title, brand, price, seller, rating, specs, EAN and SKU for **price monitoring and European e-commerce intelligence**. Queries ManoMano's own Algolia search backend: fast, cheap, no browser needed.

### Main Use Cases

- **DIY price monitoring** — track prices, retail prices and discounts per brand/seller across all 5 European marketplaces.
- **Competitive assortment analysis** — brand, seller and category mix for tools, gardening, heating, electrical and bathroom segments.
- **Catalog & EAN enrichment** — resolve products by EAN/GTIN, SKU, model/article/offer IDs with technical specs for catalog and BI pipelines.
- **Digital shelf analytics** — ratings, review counts, delivery signals and seller-country data per listing.
- **Full catalog enumeration** — page through the entire `offers` index (~33.6M FR / ~10.3M DE / ~6.3M IT / ~5.2M ES / ~2.1M UK offers).

### How It Works

ManoMano's Next.js storefront is walled by Cloudflare Bot Management — but the **Algolia search backend that powers the site is open**. Each country marketplace runs its own Algolia app (IDs `TL8RERAGBU` for FR, `FD1A5VMJFK` DE, `4T0221LE8P` ES, `PVN63KBXCA` IT, `ULRH5GM865` UK), and the actor POSTs query requests straight to it with **1,000 hits per request**. Filters map 1:1 to Algolia facets: `categories.last_id` (category URLs), category-tree facets (hub pages), plus `brand_name` and `seller_name`. Because it's a plain HTTP CheerioCrawler, it runs at 256 MB with **no proxy** and fractional compute cost.

### Monitor DIY Product Prices Without an Official ManoMano API

ManoMano's official Partners API is **seller-only** (orders, offers, stock for registered merchants) — there is no public price/catalog API. This actor reads the same public Algolia index the site's search uses, returning price, price without VAT, retail price, discount %, currency and seller data per offer — the exact signals price-monitoring dashboards are built on. Schedule daily runs per brand (e.g. `MAKITA`, `BOSCH`) or seller to capture price movement.

### Enrich Catalogs With EAN, SKU & Technical Specs

Every offer row carries `ean` (GTIN barcodes), `sku`, `modelId`, `articleId`, `offerId`, `specs`/`specsResolved` (PIM attribute map + human-readable names), category tree and image URLs — a ready-made enrichment layer for SKU databases and comparison engines.

### Input

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `country` | enum | No | `fr` | Marketplace: `fr`, `de`, `es`, `it`, `uk`. Overridden per-URL by the URL host. |
| `startUrls` | array | No | `[]` | Direct ManoMano URLs — product (`.../makita-perceuse-...-ddf484rf3j`), category (`.../perceuse-1146`), hub (`.../hub/outillage-463`), search (`.../recherche?q=perceuse+visseuse`) or `/cat/` URLs. Host selects the marketplace. Takes precedence over `searchQuery`/`categoryId`. |
| `searchQuery` | string | No | — | Keyword search, e.g. `perceuse`, `robinet`, `peinture`. |
| `categoryId` | integer | No | — | Leaf category ID from a category URL (e.g. `1146` = perceuse). |
| `brand` | string | No | — | Brand filter, e.g. `MAKITA`, `BOSCH`. |
| `seller` | string | No | — | Seller-name filter, e.g. `Brico Mania MF`. |
| `maxItems` | integer | No | `100` | Max offers to extract (max 100000; free tier preview 10). |
| `proxy` | object | No | off | Not needed — the Algolia API is proxy-free. |

### Example Input

```json
{
  "country": "fr",
  "searchQuery": "perceuse visseuse",
  "brand": "MAKITA",
  "maxItems": 1000
}
```

### Output

One dataset item per product offer:

```json
{
  "country": "fr",
  "title": "Perceuse visseuse MAKITA DDF484Z 18V Li-Ion Ø 13 mm (Produit seul)",
  "brand": "MAKITA",
  "price": 104.0,
  "priceWithoutVat": 86.67,
  "retailPrice": 109.82,
  "discount": "5",
  "currency": "EUR",
  "sellerName": "Brico Mania MF",
  "sellerId": 5816269,
  "sellerCountry": "FR",
  "rating": 4.6,
  "ratingCount": 371,
  "ean": ["00088381826310", "09005426756792"],
  "sku": "4205",
  "modelId": 71825035,
  "articleId": 78566961,
  "offerId": "f6af2f29-529a-42fb-8d83-6f1da3362644",
  "specs": { "84": ["Sans fil"], "14": [18], "46": ["Auto-serrant"] },
  "specsResolved": { "Alimentation": ["Sans fil"], "Diamètre": [18], "Type de mandrin": ["Auto-serrant"] },
  "minQuantity": 1,
  "shippingCost": 0,
  "hasFreeDelivery": true,
  "hasRelayDelivery": true,
  "categories": { "l0": ["Outillage"], "l1": ["Outillage électroportatif"], "l2": ["Perceuse, visseuse..."], "l3": ["Perceuse"] },
  "categoryLastId": 1146,
  "images": ["https://cdn.manomano.com/pim-media/images/medium/44b766..."],
  "url": "https://www.manomano.fr/makita-perceuse-visseuse-18v-3x3ah-ddf484rf3j"
}
```

#### Dataset schema (default dataset — `overview` view)

`title`, `brand`, `price`, `priceWithoutVat`, `retailPrice`, `discount`, `currency`, `sellerName`, `sellerId`, `sellerCountry`, `rating`, `ratingCount`, `ean`, `sku`, `modelId`, `articleId`, `offerId`, `url`, plus `specs`, `specsResolved`, `categories`, `categoryLastId`, `images`, `minQuantity`, `shippingCost`, `hasFreeDelivery`, `hasRelayDelivery` (schema-backed fields; the actor's dataset schema is being completed by the developer).

### Track Prices & Discounts Across 5 European Marketplaces

With `country` (`fr`/`de`/`es`/`it`/`uk`) and per-URL host detection, one actor covers ManoMano's French, German, Spanish, Italian and UK catalogs. Run it on a schedule per brand or seller and append outputs to your dataset to build a full DIY price-history store.

### Integrations & Automation

- **Apify API** — feed offer rows into a price-tracking dashboard, comparison engine or catalog.
- **Webhooks** — alert on price or discount changes.
- **Scheduling** — daily price monitoring, weekly category sweeps.
- **Export** — JSON, CSV, HTML, Excel.

*Recommended schedule:* daily for price monitoring (per brand/seller); weekly for category research sweeps.

### Related Actors

- [ManoMano Listings Scraper](https://apify.com/piotrv1001/manomano-listings-scraper) — ManoMano listings + product-detail pages (PDPs) across FR/DE/ES/IT/UK.
- [ManoMano Scraper — French DIY & Home Improvement](https://apify.com/studio-amba/manomano-scraper) — manomano.fr-focused scraper.
- [French Price Comparison Actor — GTIN Price Data](https://apify.com/m3web/french-price-comparison-actor) — EAN-driven French price comparison across Amazon, Cdiscount, ManoMano and more.
- [Autodoc Scraper — Car Parts with OEM & EAN](https://apify.com/studio-amba/autodoc-scraper) — related EU marketplace catalog scraping (parts vertical).
- [Mister-Auto Scraper — Car Parts, Prices & OEM](https://apify.com/studio-amba/mister-auto-scraper) — EU aftermarket parts index scraping.

### FAQ

#### Why use this actor instead of the official ManoMano API?

ManoMano's official Partners API (manomano.dev / developer.manomano.com) is a **seller/merchant API** — orders, offers, stock and invoice data for registered sellers. It offers **no public product-catalog or price endpoint**. This actor reads the same public Algolia search index the site's own search uses, giving you full catalog, price, seller and spec data without a seller account.

#### What are alternatives to this actor / EU DIY product data?

- [piotrv1001/manomano-listings-scraper](https://apify.com/piotrv1001/manomano-listings-scraper) — PDP-level detail ($0.015/detail) plus listings.
- [studio-amba/manomano-scraper](https://apify.com/studio-amba/manomano-scraper) — FR-focused alternative.
- [m3web/french-price-comparison-actor](https://apify.com/m3web/french-price-comparison-actor) — GTIN-keyed French price comparison.
- Off-platform: Piloterr, Parse.bot, Octoparse, Spider.cloud ManoMano endpoints.

#### How can I get the whole ManoMano catalog for a country?

Leave `brand`, `seller`, `searchQuery` and `categoryId` empty and set `country` + a large `maxItems` — the actor pages through the entire `offers` index for that marketplace (FR ~33.6M offers, DE ~10.3M, IT ~6.3M, ES ~5.2M, UK ~2.1M).

#### What is the best way to watch a brand's prices?

Run daily with `brand: "MAKITA"` (or any brand) and compare `price`/`retailPrice`/`discount` over time. Append runs to one dataset for a full price-history series.

#### How do I scrape one specific product?

Paste the product URL (e.g. `https://www.manomano.fr/makita-perceuse-visseuse-18v-3x3ah-ddf484rf3j`) into `startUrls` — the actor returns that offer and all its seller variants (host auto-selects the marketplace).

### SEO Keywords

manomano scraper, manomano api alternative, diy ecommerce data, bricolage product data, manomano fr, manomano de, manomano es, manomano it, manomano uk, diy price monitoring, ean gtin enrichment, sku database enrichment, power tools price data, perceuse prix, home improvement marketplace data, manomano sellers, digital shelf analytics, catalog enumeration, european marketplace intelligence, manomano brand filter

### For AI Agents & LLM Apps

- **Purpose:** given a country, keywords, category ID, brand/seller filters, or direct ManoMano URLs, returns one structured offer record per product (title, brand, price incl./excl. VAT, retail price, discount, currency, seller + rating, EAN, SKU, model/article/offer IDs, specs, category tree, delivery flags, images).
- **Minimal input:**

```json
{ "country": "fr", "searchQuery": "perceuse", "maxItems": 50 }
```

- **Variant — brand price monitoring:**

```json
{ "country": "de", "brand": "MAKITA", "maxItems": 1000 }
```

- **Variant — direct URLs:**

```json
{ "startUrls": [{ "url": "https://www.manomano.fr/perceuse-1146" }], "maxItems": 500 }
```

- **Output field list (offers dataset):** `country`, `title`, `brand`, `price`, `priceWithoutVat`, `retailPrice`, `discount`, `currency`, `sellerName`, `sellerId`, `sellerCountry`, `rating`, `ratingCount`, `ean`, `sku`, `modelId`, `articleId`, `offerId`, `mmid`, `meId`, `objectId`, `specs`, `specsResolved`, `minQuantity`, `shippingCost`, `hasFreeDelivery`, `hasRelayDelivery`, `categories`, `categoryIds`, `categoryLastId`, `images`, `image`, `url`.

Behaviors an agent should know:

- `startUrls` **takes precedence** over `searchQuery`/`categoryId`; the URL host overrides `country`.
- Product URLs carry no numeric ID — the actor resolves them by searching the exact slug in the Algolia index.
- `maxItems` default 100 (max 100000); free accounts preview 10 items.
- **No proxy needed** — Algolia backend is not Cloudflare-walled; leave `proxy` off.
- Live per-offer stock quantity is **not** exposed by the index (only `minQuantity`, `hasFreeDelivery`, `hasRelayDelivery`); product detail pages are Cloudflare-walled so per-variant deep enrichment is out of scope.
- `specs` is the raw PIM attribute map; `specsResolved` names common attribute IDs — unknown IDs stay in the raw map.
- **Billing:** pay-per-event — `result` $0.0015/offer row (+ Actor Start ~$0.00005).

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by ManoMano (ManoMano SE, Paris). It reads only publicly available offer data from the same Algolia search backend the ManoMano website uses — no login bypass, no seller account. Users are responsible for complying with ManoMano's Terms of Service and applicable data-protection law (GDPR applies to any EU personal data). Product and price data should be used for legitimate analysis, monitoring and comparison purposes in line with fair-competition rules.

# Actor input Schema

## `country` (type: `string`):

ManoMano marketplace to scrape. Each country runs its own Algolia search backend.

## `searchQuery` (type: `string`):

Keyword to search for (e.g. 'perceuse', 'robinet', 'peinture'). Leave empty to browse a category or enumerate the whole catalog.

## `startUrls` (type: `array`):

Paste ManoMano URLs to scrape directly — product pages, category pages (e.g. .../perceuse-1146), hub pages (e.g. .../hub/outillage-463), or search URLs (e.g. .../recherche?q=perceuse). The URL host selects the marketplace automatically (overrides 'Country'). When this field is filled, it takes precedence over 'Search query' and 'Category ID'.

## `categoryId` (type: `integer`):

Filter by leaf category ID (the number at the end of a category URL, e.g. 1146 for 'perceuse'). Leave empty to search all categories.

## `brand` (type: `string`):

Only return offers from this brand (e.g. MAKITA, BOSCH).

## `seller` (type: `string`):

Only return offers from this seller name (e.g. 'Brico Mania MF').

## `maxItems` (type: `integer`):

Maximum number of product offers to extract. Free users are capped at 10 items.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "country": "fr",
  "startUrls": [],
  "maxItems": 100,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "country": "fr",
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/manomano-fr-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "country": "fr",
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/manomano-fr-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "country": "fr",
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/manomano-fr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/manomano-fr-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/oFC88e4ah7FlHYbER/builds/y92fTaLOcG5i53AYA/openapi.json
