# Leboncoin Auto Moto Scraper Pro (`leadsbrary/leboncoin-auto-moto-scraper-pro`) Actor

Cheapest 1$/1000 results. Scrape every car and motorcycle listing from Leboncoin.fr — fully filtered, zero config, proxy-ready.

- **URL**: https://apify.com/leadsbrary/leboncoin-auto-moto-scraper-pro.md
- **Developed by:** [Alexandre Manguis](https://apify.com/leadsbrary) (community)
- **Categories:** Automation, Lead generation, Integrations
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Leboncoin Auto & Moto Scraper Pro

Scrape **leboncoin.fr** car and motorcycle listings with full search filters. Returns **50+ fields per ad** including price estimate, mileage, registration year, fuel/gearbox, GPS coordinates, images and seller info.

**Proxies are already included** — nothing to configure, works out of the box.

***

### Input

> **Proxies are already provided** — no proxy setup needed.

| Parameter       | Type    | Required | Default   | Description |
|-----------------|---------|----------|-----------|-------------|
| `vehicleType`   | string  | —        | `voiture` | `voiture` (cars) or `moto` (motorcycles) |
| `keywords`      | string  | —        | —         | Free-text search: `clio`, `golf 7 diesel`, `mt07`, etc. |
| `brand`         | string  | —        | —         | Exact brand filter: `Renault`, `Peugeot`, `BMW`, `Yamaha`, `Harley-Davidson` (case-insensitive) |
| `city`          | string  | —        | France    | City or postcode: `Paris`, `75015`, `Lyon 3`, `Bordeaux` |
| `radius`        | integer | —        | `10000`   | Search radius in metres around the city (500–100000) |
| `priceMin`      | integer | —        | —         | Minimum price (€) |
| `priceMax`      | integer | —        | —         | Maximum price (€) |
| `yearMin`       | integer | —        | —         | Minimum registration year |
| `yearMax`       | integer | —        | —         | Maximum registration year |
| `mileageMin`    | integer | —        | —         | Minimum mileage (km) |
| `mileageMax`    | integer | —        | —         | Maximum mileage (km) |
| `fuel`          | array   | —        | —         | One or more of: `essence`, `diesel`, `gpl`, `electrique`, `hybride`, `hybride_rechargeable`, `gaz_naturel`, `hydrogene`, `autre` |
| `gearbox`       | string  | —        | —         | `manuelle` or `automatique` |
| `engineSizeMax` | integer | —        | —         | Max engine displacement in cm³ — **motos only** |
| `maxAds`        | integer | —        | `100`     | Maximum ads to collect (1–5000) |
| `delay`         | float   | —        | `2.0`     | Seconds between page requests (0.5–30) |
| `forceDescription` | boolean | — | `true`   | Visit each ad's page to fill in `description` (see note under Output below and Pricing below). Enabled by default — disable to skip this step, speed up runs, and avoid the extra charge. |

#### Example Input — Cars

```json
{
  "vehicleType": "voiture",
  "keywords": "clio",
  "brand": "Renault",
  "city": "Lyon",
  "priceMax": 15000,
  "fuel": ["essence", "diesel"],
  "maxAds": 50
}
```

#### Example Input — Motorcycles

```json
{
  "vehicleType": "moto",
  "brand": "Yamaha",
  "city": "Marseille",
  "priceMax": 8000,
  "engineSizeMax": 700,
  "maxAds": 50
}
```

***

### Pricing

Each ad returned is charged as 1 result. `forceDescription` is **enabled by default** and fills in the `description` field (see below) — every ad for which a description is actually found is charged as **1 extra result** on top of its normal charge, at the same per-result price you already pay. No separate fixed fee, and ads where no description could be fetched aren't charged extra. Disable `forceDescription` in the Input if you don't need the full description text and want to avoid the extra charge.

***

### Output

Each item in the dataset represents one ad. Fields that don't apply to the vehicle type (e.g. `doors` for a moto, `motorcycle_type` for a car) are returned empty/zero rather than omitted, so every item has the same shape.

| Field                        | Type    | Description |
|------------------------------|---------|-------------|
| `id`                         | integer | Leboncoin listing ID |
| `url`                        | string  | Direct URL to the ad |
| `title`                      | string  | Ad title |
| `description`                | string  | Full ad description — empty `""` if `forceDescription` is disabled or no description could be fetched for that ad |
| `status`                     | string  | Ad status (`active`, etc.) |
| `ad_type`                    | string  | `offer` or `demand` |
| `category`                   | string  | `Voitures` or `Motos` |
| `published_at`               | string  | First publication date |
| `updated_at`                 | string  | Last update date |
| `price_eur`                  | integer | Asking price in euros |
| `estimated_price_min`        | integer | Leboncoin's estimated fair-price range, low bound |
| `estimated_price_max`        | integer | Leboncoin's estimated fair-price range, high bound |
| `price_rating`               | string  | Price positioning label, e.g. `Prix équitable`, `Au-dessus du marché` |
| `monthly_payment_eur`        | integer | Monthly financing payment estimate |
| `financing_partner`          | string  | Financing partner name, if any |
| `brand`                      | string  | Vehicle brand |
| `model`                      | string  | Vehicle model |
| `finition`                   | string  | Trim level |
| `version`                    | string  | Full commercial version name |
| `registration_year`          | integer | First registration year |
| `registration_date`          | string  | First registration month/year, e.g. `07/2022` |
| `mileage_km`                 | integer | Mileage in kilometers |
| `fuel_type`                  | string  | `Essence`, `Diesel`, `Électrique`, `Hybride`, etc. |
| `gearbox_type`               | string  | `Manuelle` or `Automatique` |
| `color`                      | string  | Vehicle color |
| `condition`                  | string  | Overall condition, e.g. `Bon état général` |
| `is_import`                  | boolean | Vehicle was imported |
| `engine_power_hp`            | integer | Engine power in DIN horsepower |
| `engine_power_fiscal_cv`     | integer | Fiscal horsepower (puissance fiscale) |
| `engine_size_cm3`            | integer | Engine displacement in cm³ — **motos only** |
| `doors`                      | string  | Number of doors — **cars only** (`"6 ou plus"` for 6+) |
| `seats`                      | string  | Number of seats — **cars only** (`"7 ou plus"` for 7+) |
| `body_type`                  | string  | Body style — **cars only**, e.g. `Berline`, `Break`, `4x4` |
| `critair`                    | string  | Crit'Air vignette class (0–5) — **cars only** |
| `vehicle_history_url`        | string  | Public Histovec/Autoviza history report URL, if published |
| `vehicle_history_status`     | string  | History report visibility status |
| `motorcycle_type`            | string  | Motorcycle style — **motos only**, e.g. `Trail`, `Roadster` |
| `license_required`           | string  | Required driving license — **motos only**, e.g. `A`, `Sans permis` |
| `euro_emissions_standard`    | string  | Euro emissions standard — **motos only** |
| `next_technical_inspection`  | string  | Next roadworthy inspection year — **motos only** |
| `equipment`                  | string  | Comma-separated list of equipment/options |
| `spare_parts_availability`   | string  | Spare parts availability rating |
| `custom_ref`                 | string  | Seller's internal reference code |
| `location_city`              | string  | City name |
| `location_zipcode`           | string  | Postal code |
| `location_department`       | string  | Department name |
| `location_dept_id`           | string  | Department number |
| `location_region`            | string  | Region name |
| `location_lat`               | number  | GPS latitude |
| `location_lng`               | number  | GPS longitude |
| `seller_name`                | string  | Seller display name |
| `seller_type`                | string  | `private` or `pro` |
| `seller_store_name`          | string  | Dealer/store name, if pro |
| `seller_siren`                | string  | Seller SIREN number, if pro |
| `seller_user_id`             | string  | Leboncoin internal seller user ID |
| `seller_has_phone`           | boolean | Phone number available |
| `images_count`               | integer | Number of photos |
| `images_thumbnail`           | string  | Thumbnail image URL |
| `images_urls`                | array   | All photo URLs |
| `is_boosted`                 | boolean | Ad is boosted/promoted |
| `is_urgent`                  | boolean | Ad marked as urgent |
| `is_highlighted`             | boolean | Ad is highlighted |
| `rank`                       | integer | Position in results (1 = first) |

#### Example Output Item (car)

```json
{
  "id": 3179721158,
  "url": "https://www.leboncoin.fr/ad/voitures/3179721158",
  "title": "Renault Clio 1.0 SCe 65ch Zen",
  "price_eur": 11499,
  "estimated_price_min": 11070,
  "estimated_price_max": 12230,
  "price_rating": "Prix équitable",
  "brand": "Renault",
  "model": "Clio",
  "registration_year": 2022,
  "mileage_km": 50732,
  "fuel_type": "Essence",
  "gearbox_type": "Manuelle",
  "color": "Blanc",
  "engine_power_hp": 67,
  "doors": "5",
  "seats": "5",
  "body_type": "Citadine",
  "critair": "1",
  "location_city": "Lyon",
  "location_zipcode": "69001",
  "location_region": "Rhône-Alpes",
  "seller_type": "pro",
  "seller_has_phone": true,
  "images_count": 30,
  "rank": 1
}
```

***

### Proxy

**Proxies are already included** — nothing to configure.

***

### Technical Notes

- **Pagination:** follows leboncoin's `?page=N` parameter, up to `max_pages` returned by the API
- **Data source:** extracts `__NEXT_DATA__` JSON embedded in page HTML — no extra requests per ad by default for search fields
- **`description` field:** leboncoin's search-results API always returns an empty body for every ad — the full text only exists on the ad's own detail page, and leboncoin has no bulk/batch endpoint for it, so there's no way around one extra request per ad. `forceDescription` (enabled by default) has the actor visit each ad's page (up to 25 pages fetched concurrently) and fill in `description` — see Pricing above for billing. Disable it to skip this extra step and speed up runs.
- **Rate limiting:** configurable `delay` between search-result pages (default 2s). Detail-page fetches (`forceDescription`) run concurrently instead (25 at a time) rather than using `delay`.
- **Deduplication:** ads are deduplicated by `list_id` across pages
- **City resolver:** uses `api-adresse.data.gouv.fr` to convert city names/postcodes to leboncoin location format
- **Range filters** (`price`, `year`, `mileage`) always send an explicit lower/upper bound — leboncoin's search silently returns 0 results for open-ended ranges (e.g. `2015-`) when combined with a `city` filter

***

### Supported Cities

Any French city or postcode. Examples:

- `Paris`, `Paris 15`, `75015`
- `Lyon`, `Lyon 3`, `69003`
- `Marseille`, `13008`
- `Bordeaux`, `33000`
- `Toulouse`, `Nantes`, `Nice`, `Strasbourg`, `Montpellier`…

### Fuel & Gearbox Codes

For reference — the values used by the `fuel` and `gearbox` input filters:

| `fuel` value            | Label (FR)            |
|--------------------------|------------------------|
| `essence`                | Essence |
| `diesel`                 | Diesel |
| `gpl`                    | GPL |
| `electrique`             | Électrique |
| `hybride`                | Hybride |
| `hybride_rechargeable`   | Hybride Rechargeable |
| `gaz_naturel`            | Gaz Naturel (GNV) |
| `hydrogene`              | Hydrogène |
| `autre`                  | Autre |

| `gearbox` value | Label (FR)   |
|------------------|--------------|
| `manuelle`       | Manuelle     |
| `automatique`    | Automatique  |

***

### Hashtags & Keywords (SEO / AI referencing)

leboncoin scraper, leboncoin.fr scraper, leboncoin voitures scraper, leboncoin motos scraper, scrape leboncoin, leboncoin API, leboncoin car listings, leboncoin used cars, French classifieds scraper, voitures d'occasion scraper, annonces auto scraper, annonces moto scraper, car marketplace scraper France, French car marketplace, scrape voitures occasion, extraction annonces leboncoin, leboncoin data extraction, leboncoin dataset, leboncoin bulk export, leboncoin JSON CSV, leboncoin price estimation, leboncoin GPS location, leboncoin seller info, leboncoin images scraper, Apify leboncoin actor, Apify France automotive scraper, used car data France, moto occasion scraper, French vehicle listings, car dealer data scraper, automotive lead generation France, scraping annonces véhicules, #leboncoin #leboncoinscraper #voituresoccasion #motosoccasion #webscraping #apify #dataextraction #automotivedata #franceclassifieds #carmarketplace #leadgeneration #aiSEO #seo

# Actor input Schema

## `vehicleType` (type: `string`):

Type of vehicle to search for.

## `keywords` (type: `string`):

Free-text search. Examples: 'golf 7', 'clio diesel', 'yamaha mt07'. Leave empty to browse by filters only.

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

Exact brand filter, e.g. 'Renault', 'Peugeot', 'BMW', 'Yamaha', 'Harley-Davidson'. Case-insensitive.

## `city` (type: `string`):

City name or postcode. Examples: 'Paris', '75015', 'Lyon 3', '69003', 'Bordeaux'. Leave empty to search all of France.

## `radius` (type: `integer`):

Radius around the city centre in meters. Default: 10000 (10 km).

## `priceMin` (type: `integer`):

Minimum price in euros.

## `priceMax` (type: `integer`):

Maximum price in euros.

## `yearMin` (type: `integer`):

Minimum registration year (année de mise en circulation).

## `yearMax` (type: `integer`):

Maximum registration year (année de mise en circulation).

## `mileageMin` (type: `integer`):

Minimum mileage in kilometers.

## `mileageMax` (type: `integer`):

Maximum mileage in kilometers.

## `fuel` (type: `array`):

Filter by one or more fuel types. Leave empty for all.

## `gearbox` (type: `string`):

Filter by gearbox type. Leave empty for all.

## `engineSizeMax` (type: `integer`):

Maximum engine displacement in cm³. Only applies when Vehicle Type is 'moto'.

## `maxAds` (type: `integer`):

Maximum number of ads to collect. Leboncoin returns 35 ads per page.

## `delay` (type: `number`):

Pause between page requests to avoid rate limiting. Default: 2.0s

## `forceDescription` (type: `boolean`):

Leboncoin's search results never include the ad description ('description' is always empty otherwise) — the full text only exists on the ad's own page. Enabled by default so the actor opens each ad's page and fetches it. Billing: each ad for which a description is found this way is charged as 1 extra result, on top of its normal result charge — same per-result price your account already pays, no separate fixed fee. Also adds 1 extra request per ad and longer run time. Disable to skip this step, speed up runs, and avoid the extra charge.

## Actor input object example

```json
{
  "vehicleType": "voiture",
  "keywords": "clio",
  "brand": "Renault",
  "city": "Lyon",
  "radius": 10000,
  "maxAds": 100,
  "delay": 2,
  "forceDescription": true
}
```

# Actor output Schema

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

Dataset containing one item per scraped leboncoin.fr listing.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("leadsbrary/leboncoin-auto-moto-scraper-pro").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("leadsbrary/leboncoin-auto-moto-scraper-pro").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 '{}' |
apify call leadsbrary/leboncoin-auto-moto-scraper-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,leadsbrary/leboncoin-auto-moto-scraper-pro"
        }
    }
}

```

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/mhGh2BpHuuv5rbJo3/builds/8pOzeurx8j59eDA6v/openapi.json
