# ManoMano Listings Scraper (`piotrv1001/manomano-listings-scraper`) Actor

The ManoMano Listings Scraper extracts product listings and detailed PDPs from ManoMano (FR/DE/ES/IT/UK), capturing titles, brands, sellers, prices, discounts, ratings, images, categories, EAN, SKU, attributes, and delivery info — ideal for price tracking and e-commerce intelligence.

- **URL**: https://apify.com/piotrv1001/manomano-listings-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 product listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

### 🛠️ ManoMano Listings Scraper

Easily extract product listings from **ManoMano**, Europe's leading DIY and home improvement marketplace. The **ManoMano Listings Scraper** turns any category URL on `manomano.fr` (or `.de`, `.es`, `.it`, `.co.uk`) into clean, structured JSON — with optional one-click upgrade to full product detail pages (PDPs).

### ✨ Features

-   🏷️ **Comprehensive Product Data**: Title, brand, seller, current price, retail price, discount %, currency, rating, review count, images, full category trail, delivery type, promo flags, and PDP URL — stable and complete extraction.
-   🔎 **Category-Based Extraction**: Drop in any ManoMano category URL of the form `/{slug}-{categoryId}` and pagination is handled automatically.
-   📄 **Optional PDP Enrichment**: Flip on `scrapeProductDetails` and each listing is followed to its product detail page for the full description, attribute table, EAN, manufacturer SKU, media, breadcrumbs, carbon score, repairability index, and more.
-   💸 **Pay Per Event Pricing**: Pay only for what you extract — cheap per-card listings, separate higher fee for deep PDPs.
-   🌍 **Multi-Locale**: Same scraper works across all five ManoMano marketplaces (FR / DE / ES / IT / UK).
-   🛡️ **Reliable Against Anti-Bot Protection**: Handled transparently — no proxy or anti-bot configuration needed on your side.

### 🛠️ How It Works

1. **Enter Category URLs** – Provide one or more ManoMano category URLs (e.g. `https://www.manomano.fr/perceuse-visseuse-perforateur-burineur-marteau-piqueur-465`).
2. **Pick Depth** – Leave `scrapeProductDetails` off for fast shallow card data, or turn it on to also fetch full PDPs.
3. **Cap Results** – Set `maxItems` to control how many products you want (default 50).
4. **Run the Scraper** – Start the run and receive structured JSON in the dataset.

### ⚙️ Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | array of `{ url }` | _required_ | ManoMano category URLs (`/{slug}-{categoryId}`). FR / DE / ES / IT / UK all supported. |
| `scrapeProductDetails` | boolean | `false` | If enabled, each listed product is followed to its PDP and a richer record (description, attributes, EAN, manufacturer SKU, media, breadcrumbs, delivery, carbon score, repairability) is also stored. |
| `maxItems` | integer | `50` | Global cap on listing products scraped across all categories. Pagination stops once the cap is reached. ManoMano returns 44 products per page and caps each category at 6 000 results. |

#### Example input

```json
{
    "startUrls": [
        { "url": "https://www.manomano.fr/perceuse-visseuse-perforateur-burineur-marteau-piqueur-465" }
    ],
    "scrapeProductDetails": true,
    "maxItems": 100
}
````

### 📊 Sample Output Data

The scraper produces two row shapes in the dataset. Shallow rows (`dataType: "listing"`) are always pushed; deep rows (`dataType: "detail"`) are pushed additionally when `scrapeProductDetails` is on.

#### Listing row

```json
{
    "dataType": "listing",
    "articleId": "73863399",
    "title": "Dewalt – Perceuse-visseuse sans fil 12V avec 2 batteries 2.0Ah – DCD701D2",
    "url": "https://www.manomano.fr/p/dewalt-perceuse-sans-fil-dcd-701-d2-12v-2-ah-15-10mm-73863399",
    "brand": "DEWALT",
    "sellerName": "Maxoutil.",
    "priceCurrent": 168.17,
    "priceRetail": 328.04,
    "currency": "EUR",
    "discountPercentage": 48,
    "ratingAverage": 4.73,
    "ratingCount": 45,
    "imageRegular": "https://cdn.manomano.com/dewalt-perceuse-…_1.jpg",
    "category0": "Outillage",
    "category1": "Outillage électroportatif",
    "category2": "Perceuse, visseuse, perforateur, burineur, marteau-piqueur",
    "category3": "Perceuse",
    "deliveryType": "manoExpressFree",
    "isInPromo": true,
    "scrapedAt": "2026-05-17T15:22:43.812Z"
}
```

#### Detail row (PDP)

```json
{
    "dataType": "detail",
    "url": "https://www.manomano.fr/p/perceuse-visseuse-sans-fil-makita-ddf453sfe3-…-78567310",
    "articleId": 78567310,
    "manufacturerSKU": "DDF453SFE",
    "ean": "0088381659741",
    "title": "Perceuse-visseuse MAKITA Brushless LXT DDF453SFE 18V + 2 batteries 3Ah + chargeur + coffret",
    "description": "<h4>Description générale</h4>La perceuse visseuse Makita DDF453SFE est un outil sans fil léger…",
    "attributes": [
        { "name": "Tension", "label": "18 V", "valueType": "numerical", "unit": { "abbreviation": "V" } },
        { "name": "Couple de serrage max.", "label": "42 Nm", "valueType": "numerical" }
    ],
    "priceCurrent": 169,
    "currency": "EUR",
    "brand": "MAKITA",
    "carbonScore": { "…": "…" },
    "repairabilityIndex": { "…": "…" },
    "breadcrumbs": ["Outillage", "Outillage électroportatif", "Perceuse, visseuse, perforateur…"],
    "scrapedAt": "2026-05-17T15:22:43.812Z"
}
```

### 💰 Pricing — Pay Per Event

This Actor uses Apify's **Pay Per Event** model. You only pay for what you extract:

| Event | Price (USD) | When it fires |
| --- | --- | --- |
| `product-listing` | $0.002 per item ($2 / 1 000) | Every shallow product card extracted from a category listing page. |
| `item-detail` | $0.015 per item ($15 / 1 000) | Every full PDP scraped (only when `scrapeProductDetails: true`). |

Examples:

- **1 000 listing items, no PDPs**: 1 000 × $0.002 = **$2.00**.
- **1 000 listing items + PDPs**: 1 000 × $0.002 + 1 000 × $0.015 = **$17.00**.

Free Apify plan users still receive monthly platform credit that covers small runs.

### 🌍 Multi-Locale Support

The same scraper works against all five ManoMano marketplaces — drop in any category URL from the locale you care about and the output schema, pagination, and PDP enrichment behave identically.

| Country | Domain | Currency |
| --- | --- | --- |
| 🇫🇷 France | `manomano.fr` | EUR |
| 🇩🇪 Germany | `manomano.de` | EUR |
| 🇪🇸 Spain | `manomano.es` | EUR |
| 🇮🇹 Italy | `manomano.it` | EUR |
| 🇬🇧 United Kingdom | `manomano.co.uk` | GBP |

### 💡 Tips

- **Skip PDPs for analytics.** Listing rows already include price, discount, brand, seller, rating, category, delivery — usually enough for price tracking, assortment monitoring, or market sizing.
- **Mind the 6 000-per-category cap.** ManoMano caps each category to 6 000 results (≈137 pages × 44). For deeper extraction, partition by brand, attribute, or price range using ManoMano's facet query params.

### 🚀 Run It

[Run this Actor on Apify](https://apify.com/) to get structured ManoMano data instantly — no infrastructure setup, no anti-bot wrangling, just clean JSON.

# Actor input Schema

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

ManoMano category listing URLs to scrape. Use the form https://www.manomano.fr/{slug}-{categoryId} (e.g. https://www.manomano.fr/perceuse-visseuse-perforateur-burineur-marteau-piqueur-465). Also works for .de, .es, .it, .co.uk.

## `scrapeProductDetails` (type: `boolean`):

If enabled, each product card from the listing is followed to its product detail page (PDP) and a richer record (description, attributes, EAN, manufacturer SKU, media, breadcrumbs, delivery, carbon score, repairability, etc.) is also stored. Charges the higher 'item-detail' event per PDP in addition to 'product-listing' per card.

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

Global cap on the number of listing products scraped across all categories. Pagination stops once this cap is reached. ManoMano returns 44 products per page and caps each category at 6000 results.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.manomano.fr/perceuse-visseuse-perforateur-burineur-marteau-piqueur-465"
    }
  ],
  "scrapeProductDetails": false,
  "maxItems": 50
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.manomano.fr/perceuse-visseuse-perforateur-burineur-marteau-piqueur-465"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/manomano-listings-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 = { "startUrls": [{ "url": "https://www.manomano.fr/perceuse-visseuse-perforateur-burineur-marteau-piqueur-465" }] }

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.manomano.fr/perceuse-visseuse-perforateur-burineur-marteau-piqueur-465"
    }
  ]
}' |
apify call piotrv1001/manomano-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=piotrv1001/manomano-listings-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ManoMano Listings Scraper",
        "description": "The ManoMano Listings Scraper extracts product listings and detailed PDPs from ManoMano (FR/DE/ES/IT/UK), capturing titles, brands, sellers, prices, discounts, ratings, images, categories, EAN, SKU, attributes, and delivery info — ideal for price tracking and e-commerce intelligence.",
        "version": "0.0",
        "x-build-id": "d7CXzFyP3raqaRrB0"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/piotrv1001~manomano-listings-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-piotrv1001-manomano-listings-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/piotrv1001~manomano-listings-scraper/runs": {
            "post": {
                "operationId": "runs-sync-piotrv1001-manomano-listings-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/piotrv1001~manomano-listings-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-piotrv1001-manomano-listings-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Category URLs",
                        "type": "array",
                        "description": "ManoMano category listing URLs to scrape. Use the form https://www.manomano.fr/{slug}-{categoryId} (e.g. https://www.manomano.fr/perceuse-visseuse-perforateur-burineur-marteau-piqueur-465). Also works for .de, .es, .it, .co.uk.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "scrapeProductDetails": {
                        "title": "Scrape product details (PDPs)",
                        "type": "boolean",
                        "description": "If enabled, each product card from the listing is followed to its product detail page (PDP) and a richer record (description, attributes, EAN, manufacturer SKU, media, breadcrumbs, delivery, carbon score, repairability, etc.) is also stored. Charges the higher 'item-detail' event per PDP in addition to 'product-listing' per card.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Global cap on the number of listing products scraped across all categories. Pagination stops once this cap is reached. ManoMano returns 44 products per page and caps each category at 6000 results.",
                        "default": 50
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
