# PagesJaunes Business Leads Scraper & Monitor (`datamole/pagesjaunes-scraper`) Actor

Extract French business leads from PagesJaunes with verified phones, the direct-marketing opt-out flag, website, SIRET, NAF, staff size, revenue and active status from the official registry. Filter by mobile, website, rating or advertiser and monitor new businesses.

- **URL**: https://apify.com/datamole/pagesjaunes-scraper.md
- **Developed by:** [DataMole](https://apify.com/datamole) (community)
- **Categories:** Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.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.

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

![DataMole](https://raw.githubusercontent.com/YoiderD/datamole-assets/main/banner.png)

## 📒 PagesJaunes Business Leads Scraper & Monitor

> **Turn any PagesJaunes search into a French B2B lead list: verified phone numbers, with the direct-marketing opt-out flag on every number.** Add the website, SIRET, NAF code, staff size, revenue and active or closed status from the official company registry.

> 🕒 **Last updated:** 2026-11-03 · **60+ fields** per business · every page of a search (20 businesses per page) · all of France, including overseas departments

**PagesJaunes Business Leads Scraper** searches pagesjaunes.fr the way you do ("Quoi, qui ?" + "Où ?"), opens every phone number and tells you which ones refused direct marketing, so your calling list respects the "Opposé aux opérations de marketing direct" icon. Turn on full details to get each business page plus a free check against the official French registry (INSEE Sirene and RNE).

| 🎯 Who uses it | 💡 What for |
|---|---|
| Sales teams and SDRs selling to French SMEs | Call lists filtered by mobile phone and marketing opt-out |
| Web and marketing agencies | Businesses without a website, or not advertising on PagesJaunes |
| Suppliers, wholesalers, franchise networks | Every bakery, plumber or lawyer in a département or région |
| Market researchers | Density, ratings and company size by activity and area |

### 📋 What it does

- 🔎 **Searches like the site:** any activity or business name, in a city, postal code, département or région, sorted by relevance, best rating or most reviews. Every term is searched in every location.
- ☎️ **Full phone numbers:** every number of the business (landline, mobile, VoIP), in display and international format, with its type.
- 🚫 **Direct-marketing opt-out per number:** reads the PagesJaunes opt-out icon, and with the registry check also the INSEE opt-out from commercial prospecting. `canCallForMarketing` sums it up.
- 💼 **Advertiser signals:** paying PagesJaunes advertisers, premium listings, "Super Pro" badge, owner-edited profiles, and online actions (quote request, appointment, table booking, click and collect, messaging).
- 🌐 **Full business details (optional):** website and social profiles, Google Maps link, GPS, opening hours, all activities, description, payment methods, clientele, certifications (RGE, Qualibat, Artisan…) and brands.
- 🏛️ **Official registry (optional, no extra charge):** SIRET, SIREN, NAF code and section, legal form, creation date and age, official headcount, company category (PME, ETI, GE), latest revenue and net income, open establishments, RGE and Qualiopi status, managers of companies, active or closed.
- 🗺️ **Geography added:** département code and name and région from the postal code.
- 🎯 **Lead filters before you pay:** phone or mobile only, drop opted-out numbers, advertisers or non-advertisers, minimum rating and reviews. With full details: website or no website, minimum employees, companies created after a date, skip closed companies.
- 👀 **Monitor mode:** schedule the same search and get only the businesses that appeared since the last run.

### ⚙️ Input

| Field | What it does |
|---|---|
| `searchTerms` | Activities or business names in French, for example `plombier`, `restaurant italien`, `avocat` |
| `locations` | City, postal code, département or région, for example `Paris`, `75015`, `Bouches-du-Rhône`, `Bretagne` |
| `searchUrls` | Optional PagesJaunes search pages (`https://www.pagesjaunes.fr/annuaire/chercherlespros?...`) |
| `sortBy` | `relevance`, `rating` (best rated first) or `reviews` (most reviews first) |
| `maxItems` | Total businesses to save (default 100) |
| `maxPagesPerSearch` | Optional page cap per term and location |
| `includeDetails` | Opens each business page: website, socials, hours, GPS, SIRET, NAF and more |
| `includeRegistry` | With details: checks the official registry (default on, no extra charge) |
| `phoneFilter` | `any`, `with-phone` or `mobile` |
| `excludeMarketingOptOut` | Drops numbers opposed to direct marketing |
| `advertiserFilter` | `any`, `advertisers` or `non-advertisers` |
| `minRating`, `minReviews` | Quality filters on PagesJaunes reviews |
| `websiteFilter` | With details: `any`, `with-website` or `without-website` |
| `excludeClosedBusinesses` | With details and registry: skips closed companies or establishments (default on) |
| `minEmployees`, `createdAfter` | With details: company size and creation date filters |
| `monitorMode`, `monitorName` | Return only businesses not seen in previous runs |

**Example: mobile numbers you can call, plumbers in Paris**

```json
{
    "searchTerms": ["plombier"],
    "locations": ["Paris"],
    "phoneFilter": "mobile",
    "excludeMarketingOptOut": true,
    "maxItems": 200
}
```

**Example: hair salons in Bordeaux without a website, with registry data**

```json
{
    "searchTerms": ["coiffeur"],
    "locations": ["Bordeaux"],
    "includeDetails": true,
    "websiteFilter": "without-website",
    "advertiserFilter": "non-advertisers",
    "maxItems": 100
}
```

**Example: bakeries opened since 2023 in Brittany, best rated first**

```json
{
    "searchTerms": ["boulangerie"],
    "locations": ["Bretagne"],
    "sortBy": "rating",
    "includeDetails": true,
    "createdAfter": "2023-01-01",
    "maxItems": 50
}
```

### 📊 Output

Real record from a run with full details (some lists shortened):

```json
{
    "id": "09570235",
    "name": "Immobilière Pujol",
    "url": "https://www.pagesjaunes.fr/pros/09570235",
    "activity": "agences immobilières",
    "activities": [
        "Agences immobilières",
        "Syndics de copropriétés",
        "Gestion locative"
    ],
    "services": [
        "location de maison",
        "location de local professionnel",
        "location de bureau"
    ],
    "phone": "+33491373839",
    "phoneDisplay": "04 91 37 38 39",
    "phoneType": "landline",
    "phones": [
        {
            "number": "04 91 37 38 39",
            "e164": "+33491373839",
            "type": "landline",
            "marketingOptOut": false
        }
    ],
    "mobilePhone": null,
    "hasMarketingOptOut": false,
    "canCallForMarketing": false,
    "website": "http://www.immobiliere-pujol.fr",
    "hasWebsite": true,
    "socialProfiles": {
        "facebook": "http://www.facebook.com/151338101553718",
        "instagram": "https://www.instagram.com/immobiliere_pujol/",
        "youtube": "https://www.youtube.com/watch?v=y6UuCL2v3xw"
    },
    "googleMapsUrl": null,
    "street": "7 rue Doct Jean Fiolle",
    "postalCode": "13006",
    "city": "Marseille",
    "departmentCode": "13",
    "department": "Bouches-du-Rhône",
    "region": "Provence-Alpes-Côte d'Azur",
    "fullAddress": "7 rue Doct Jean Fiolle 13006 Marseille",
    "latitude": 43.285042,
    "longitude": 5.38334,
    "rating": 4.9,
    "reviewCount": 612,
    "latestReviewAt": "2026-10-20",
    "isPagesJaunesAdvertiser": true,
    "isPremiumListing": true,
    "isSuperPro": false,
    "profileEditedByOwner": true,
    "badges": [
        "meilleures notes"
    ],
    "hasPhotos": true,
    "onlineActions": {
        "quoteRequest": true,
        "appointmentBooking": false,
        "tableBooking": false,
        "onlineOrdering": false,
        "clickAndCollect": false,
        "instantMessaging": true
    },
    "description": "Notre agence propose plusieurs services à Marseille et alentours : syndic de copropriété, gestion locative, mise en location, et transaction immobilière. Nou...",
    "openingHours": {
        "monday": [
            "09:00-12:00",
            "14:00-18:00"
        ],
        "tuesday": [
            "09:00-12:00",
            "14:00-18:00"
        ]
    },
    "openDaysPerWeek": 5,
    "paymentMethods": [],
    "clientele": [],
    "certifications": [],
    "brands": [
        "AGENCES REUNIES"
    ],
    "siret": "05680886800048",
    "siren": "056808868",
    "nafCode": "68.32A",
    "legalForm": "SAS, société par actions simplifiée",
    "companyCreatedAt": "1956-01-01",
    "companyAgeYears": 70.8,
    "establishmentType": "Siège",
    "companyEmployees": {
        "min": 50,
        "max": 99,
        "label": "50-99"
    },
    "establishmentEmployees": {
        "min": 50,
        "max": 99,
        "label": "50-99"
    },
    "registry": {
        "siren": "056808868",
        "legalName": "IMMOBILIERE PUJOL",
        "acronym": null,
        "status": "active",
        "closedAt": null,
        "createdAt": "1956-01-01",
        "legalFormCode": "5710",
        "legalForm": "SAS",
        "isSoleTrader": false,
        "companyCategory": "PME",
        "nafCode": "68.32A",
        "nafSection": "L - Activités immobilières",
        "employees": {
            "min": 50,
            "max": 99,
            "label": "50-99"
        },
        "employeesYear": 2024,
        "establishmentsCount": 7,
        "openEstablishmentsCount": 3,
        "financialYear": 2024,
        "revenue": 6893307,
        "netIncome": 568760,
        "establishmentStatus": "active",
        "establishmentCreatedAt": "2012-06-15",
        "isHeadOffice": true,
        "isRGE": false,
        "isQualiopi": false,
        "isTrainingOrganization": false,
        "isSocialEconomy": false,
        "isAssociation": false,
        "prospectingOptOut": true,
        "managers": [
            {
                "name": "MATANEL",
                "role": "Président de SAS",
                "isCompany": true
            },
            {
                "name": "SO'AUDIT",
                "role": "Commissaire aux comptes titulaire",
                "isCompany": true
            }
        ],
        "registryUpdatedAt": "2026-11-03T08:27:27"
    },
    "imageUrl": "https://www.pagesjaunes.fr/media/newdam/ee/97/2f/00/00/a8/1a/e9/c3/12/6624ee972f0000a81ae9c312/6624ee972f0000a81ae9c313.jpg",
    "hasDetails": true,
    "searchTerm": "agence immobilière",
    "searchLocation": "Marseille",
    "searchPage": 1,
    "searchPosition": 17,
    "scrapedAt": "2026-11-03T21:34:01.295Z"
}
```

Without full details, the business page fields (`website`, `siret`, `openingHours`, `registry` and others) are `null` or empty and `hasDetails` is `false`. `rating` is `null` when the business has no reviews. `registry` is `null` when the business page shows no SIRET. `managers` lists only managers of companies whose registry entry is public, never sole traders.

### ✨ Why this one

- ✅ **The opt-out flag on every number,** not just the number. Cold-calling lists that respect the PagesJaunes icon and the INSEE prospecting opt-out.
- ✅ **Official registry data in the same row:** active or closed, headcount, revenue, NAF, legal form. No second tool to match SIRETs.
- ✅ **Every number, typed:** landline, mobile or VoIP, plus a ready-to-dial `+33` format.
- ✅ **Filters that save money:** businesses that fail your filters are skipped and not charged.
- ✅ **Advertiser and website signals** that agencies use to qualify prospects.
- ✅ **Monitor mode** for new businesses in your area or sector.

### 🚀 How to use

1. Create a free Apify account.
2. Open the Actor and fill in what (activity) and where (city, postal code, département or région).
3. Turn on full details if you need the website, SIRET and registry data.
4. Click **Start**.
5. Download the results or connect them to Google Sheets, Make, Zapier, n8n or the API.

### 💼 Use cases

- **SDR team:** every accountant in Lyon with a mobile number and no marketing opt-out, ready for the dialer.
- **Web agency:** restaurants in a département without a website and not advertising on PagesJaunes.
- **Solar installer network:** roofers and electricians with RGE certifications and 10+ employees.
- **Wholesaler:** bakeries opened in the last two years, with their address and opening hours.
- **Local SEO consultant:** businesses with poor ratings or few reviews in a city.

### ❓ FAQ

**Do I need a PagesJaunes account?** No. The Actor reads public pages.

**How many businesses can I get?** As many as PagesJaunes shows for your search, 20 per page. Large cities return thousands per activity.

**What does `canCallForMarketing` mean?** `true` when at least one number has no opt-out icon and the company did not opt out of commercial prospecting at INSEE. It is a helper, not legal advice: check the rules (including Bloctel for consumers) that apply to your campaign.

**Why is the SIRET sometimes missing?** PagesJaunes does not show it for every business. Without it, the registry check is skipped.

**Is revenue always available?** No. Many small companies do not publish their accounts. The year of the figures is in `financialYear`.

**Free Apify plan?** Runs on the free plan return a preview of 10 businesses. Any paid plan unlocks full runs.

**What happens with an unknown location?** The run stops that search and saves a clear error row telling you to check the spelling.

### 🔌 Integrations

Works with the Apify API, schedules, webhooks, Google Sheets, Make, Zapier, n8n, Slack and any tool that reads JSON.

### 🕳️ More from DataMole

| Actor | What it does |
|---|---|
| [Company Enrichment](https://apify.com/datamole/company-enrichment) | Emails, socials and company facts from any website |
| [Tech Stack Detector](https://apify.com/datamole/tech-stack-detector) | Technologies a website runs on |
| [SEO & GEO Audit](https://apify.com/datamole/seo-geo-audit) | SEO and AI-search readiness of any page |
| [Domain Intel](https://apify.com/datamole/domain-intel-scraper) | DNS, mail setup, SSL and hosting of a domain |

**Need a field, filter or source we don't cover yet?** Open an issue on this Actor. We read everything.

### ⚖️ Disclaimer

This Actor collects publicly available data from pagesjaunes.fr and the French government company API (recherche-entreprises.api.gouv.fr). It is not affiliated with or endorsed by PagesJaunes or Solocal. Personal data of sole traders is subject to the GDPR: use the data responsibly, honor opt-outs and follow the laws that apply to your use.

# Actor input Schema

## `searchTerms` (type: `array`):

Activities in French as you would type them on PagesJaunes, for example plombier, restaurant italien, avocat, agence immobilière, coiffeur. A business name also works.

## `locations` (type: `array`):

Examples: Paris, Lyon, 75015, Bouches-du-Rhône, Bretagne, Île-de-France. Each location is searched separately.

## `searchUrls` (type: `array`):

Paste search pages from pagesjaunes.fr (https://www.pagesjaunes.fr/annuaire/chercherlespros?quoiqui=...\&ou=...). Useful to reuse a search with its suggestions already applied.

## `sortBy` (type: `string`):

Same sorting options as the site. Best rated first is the fastest way to get established businesses.

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

Total businesses saved across all searches. PagesJaunes shows 20 per page.

## `maxPagesPerSearch` (type: `integer`):

Optional cap per search term and location. Leave empty to go through every page.

## `includeDetails` (type: `boolean`):

Adds website and social profiles, SIRET, SIREN, NAF code, legal form, creation date, staff size, opening hours, GPS, all activities, description, payment methods, certifications, brands and the Google Maps link.

## `includeRegistry` (type: `boolean`):

With full details on: adds whether the company is active or closed, company category (PME, ETI, GE), official headcount, latest revenue and net income, number of establishments, RGE and Qualiopi status, managers of companies, and the INSEE opt-out from commercial prospecting. No extra charge.

## `phoneFilter` (type: `string`):

Keep only businesses with a phone number, or with a mobile number.

## `excludeMarketingOptOut` (type: `boolean`):

PagesJaunes marks numbers whose owner refuses direct marketing (the 'Opposé aux opérations de marketing direct' icon). Turn on for cold calling: those numbers are dropped, and a business with no other number is skipped.

## `advertiserFilter` (type: `string`):

Paying advertisers already invest in marketing. Non-advertisers are prospects for agencies that sell visibility.

## `minRating` (type: `number`):

Keep businesses rated at least this much (out of 5). Businesses without reviews are skipped when set.

## `minReviews` (type: `integer`):

Keep businesses with at least this many PagesJaunes reviews.

## `websiteFilter` (type: `string`):

Businesses without a website are the classic prospect list for web agencies.

## `excludeClosedBusinesses` (type: `boolean`):

With full details and the registry check on: drops listings whose company or establishment is closed according to INSEE.

## `minEmployees` (type: `integer`):

Keep companies whose official staff range reaches this number. Example: 10 keeps 10-19, 20-49 and larger.

## `createdAfter` (type: `string`):

Keep only companies registered after this date. Great to reach new businesses that still need suppliers.

## `monitorMode` (type: `boolean`):

The first run saves everything and remembers it. Later runs with the same search return only businesses not seen before.

## `monitorName` (type: `string`):

Give the memory a name to keep it when you change other settings. By default the memory is tied to the search settings.

## `proxyConfiguration` (type: `object`):

PagesJaunes is protected by Cloudflare: French residential proxies are required and already set.

## Actor input object example

```json
{
  "searchTerms": [
    "plombier"
  ],
  "locations": [
    "Paris"
  ],
  "sortBy": "relevance",
  "maxItems": 100,
  "includeDetails": false,
  "includeRegistry": true,
  "phoneFilter": "any",
  "excludeMarketingOptOut": false,
  "advertiserFilter": "any",
  "websiteFilter": "any",
  "excludeClosedBusinesses": true,
  "monitorMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}
```

# 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 = {
    "searchTerms": [
        "plombier"
    ],
    "locations": [
        "Paris"
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "FR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datamole/pagesjaunes-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 = {
    "searchTerms": ["plombier"],
    "locations": ["Paris"],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "FR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("datamole/pagesjaunes-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 '{
  "searchTerms": [
    "plombier"
  ],
  "locations": [
    "Paris"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "FR"
  }
}' |
apify call datamole/pagesjaunes-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datamole/pagesjaunes-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/Xar66OVUSUzhdezn9/builds/iGkk6I8uqaK5tPe01/openapi.json
