# PagesBlanches France Residential Directory Scraper (`jungle_synthesizer/pagesblanches-france-residential-directory-scraper`) Actor

Look up French residents by name or phone number on PagesBlanches, the national residential directory. Returns full name, phone, and address (street, postal code, commune, department, region) per match. Covers all of France — search a name, a number, or narrow by commune, department, or postal code.

- **URL**: https://apify.com/jungle\_synthesizer/pagesblanches-france-residential-directory-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 record scrapeds

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?

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

## France Residential Phone & Address Lookup — PagesBlanches

Look up a French resident's phone number and address, or run the search in reverse and turn a
phone number into a name. Backed by [PagesBlanches](https://www.pagesjaunes.fr/pagesblanches),
France's national white-pages directory. Returns full name, national and E.164 phone format,
street address, postal code, commune, department, and region — covering all of France, commune
by commune.

***

### PagesBlanches Scraper Features

- Searches by name or phone number in the same field — the lookup auto-detects which.
- Returns phone numbers in both national format (`0142410146`) and E.164 (`+33142410146`), plus a mobile flag.
- Splits every address into street, postal code, commune, department, and region — no regex required on your end.
- Narrows to a single commune, department, or postal code, or searches nationwide with the location field left blank.
- Runs multiple names or numbers in one batch. Feed it a list, get back a list.
- Paginates automatically up to your `maxItems` cap, so a common surname doesn't stop at page one.

***

### Who Uses France Residential Directory Data?

- **Skip tracers and process servers** — turn a last-known name into a current address for service of process.
- **Debt recovery agencies** — locate a debtor's phone and address before the first outreach attempt.
- **Insurance investigators** — verify a claimant's registered address against what's on file.
- **B2C list builders** — build region-specific contact lists for a French consumer campaign, one commune or the whole country.
- **Background and due-diligence teams** — cross-check a name against a published residential listing before onboarding.

***

### How PagesBlanches Scraper Works

1. Give it one or more names or phone numbers, and optionally a commune, department, or postal code to narrow the search.
2. It runs each query against PagesBlanches and walks the result pages up to your `maxItems` limit.
3. Every matching listing comes back as a structured record — name, phone, and a parsed address, ready to export.

***

### Input

```json
{
  "queries": ["Martin Laviolette"],
  "location": "Paris",
  "maxItems": 15
}
```

| Field      | Type    | Default | Description |
|------------|---------|---------|-------------|
| `queries`  | array   | —       | Full names (e.g. `"Martin Laviolette"`) or phone numbers (e.g. `"0142410146"`) to look up. Each entry is its own search. |
| `location` | string  | (none)  | Commune, department, or postal code to narrow the search (e.g. `"Lyon"`, `"75009"`, `"Rhône"`). Leave empty to search all of France. |
| `maxItems` | integer | 15      | Maximum total records to return across every query. |

**Reverse lookup** — put a phone number in `queries` instead of a name and PagesBlanches runs it as an annuaire inversé (reverse directory) search:

```json
{
  "queries": ["0661101304"],
  "maxItems": 5
}
```

***

### PagesBlanches Scraper Output Fields

```json
{
  "listing_id": "014806920900000000",
  "full_name": "Lefevre Martin",
  "first_name": "Martin",
  "last_name": "Lefevre",
  "phone": "0142410146",
  "phone_e164": "+33142410146",
  "mobile": null,
  "street_address": "104 r Folie Méricourt",
  "postal_code": "75011",
  "commune": "Paris",
  "department": "75 - Paris",
  "region": "Île-de-France",
  "listing_url": "https://www.pagesjaunes.fr/particuliers/014806920900000000",
  "query_name": "Martin Laviolette",
  "query_location": "Paris",
  "result_rank": 3,
  "page_number": 1,
  "scraped_at": "2026-09-01T20:03:15.236Z"
}
```

| Field            | Type    | Description |
|------------------|---------|-------------|
| `listing_id`     | string  | PagesBlanches internal listing id. |
| `full_name`      | string  | Display name as shown on the listing (surname first, per site convention). |
| `first_name`     | string  | Given name, split from `full_name`. Best-effort — the site doesn't expose structured name fields. |
| `last_name`      | string  | Surname, split from `full_name`. Best-effort. |
| `phone`          | string  | Phone number in national format. Null on privacy-masked listings. |
| `phone_e164`     | string  | Phone number in E.164 format. |
| `mobile`         | string  | Set to the phone value when it's a French mobile number (06/07 prefix), else null. |
| `street_address` | string  | Street address. Null when the listing discloses a phone but not an address. |
| `postal_code`    | string  | 5-digit French postal code. |
| `commune`        | string  | Commune (city/town) name. |
| `department`     | string  | Department, derived from postal code (e.g. `"75 - Paris"`). |
| `region`         | string  | Region, derived from department (e.g. `"Île-de-France"`). |
| `listing_url`    | string  | PagesBlanches listing detail URL. |
| `query_name`     | string  | The input query (name or phone) that produced this record. |
| `query_location` | string  | The location filter used for this query, if any. |
| `result_rank`    | integer | 1-indexed position of this record within its query's result set. |
| `page_number`    | integer | Search-result page this record was found on. |
| `scraped_at`     | string  | Timestamp this record was collected. |

Not every listing discloses both a phone and an address — PagesBlanches lets individuals mask
either field independently, so `phone` and `street_address` are each populated only when the
listing shows it.

***

### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large crawl stops before it finishes — because it hit `maxItems`, your spend cap (`maxTotalChargeUsd`), or was aborted — start a new run with **the same input** plus that `resumeCursor` to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly your 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

***

### FAQ

#### How do I look up a French phone number or address?

PagesBlanches Scraper takes a name or a phone number in the `queries` field and an optional
location. Run it, and matching residential listings come back as structured records with phone
and address split into separate fields.

#### Can I search a specific commune, department, or postal code?

Yes. Set `location` to a commune name, department name, or postal code and every query in the
run is narrowed to it. Leave it blank and the search covers all of France.

#### Does this cover reverse phone lookup?

Yes. Put a phone number in `queries` instead of a name and PagesBlanches runs it as an annuaire
inversé search — not every number has consented to reverse listing, so a legitimate result is
sometimes zero matches.

#### Do I need an account or API key for PagesBlanches?

No. PagesBlanches Scraper needs no login and no API key — give it names or numbers and an
Apify token, and it does the rest.

#### Why is the address missing on some records?

PagesBlanches lets individuals mask their phone or their address independently of each other.
A record with a name and phone but no address (or vice versa) is a real listing, not a parsing
gap.

***

### Need More Features?

Need custom fields or a different search mode? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use PagesBlanches Scraper?

- **Covers all of France** — every commune, department, and postal code, in one actor.
- **Structured, not raw** — addresses arrive pre-split into street, postal code, commune, department, and region, plus a national and E.164 phone format, so you skip the regex.
- **Batch-native** — run a list of names or numbers in one job instead of one run per lookup.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

## `queries` (type: `array`):

Each entry is a full name (e.g. "Martin Laviolette") or a French phone number (e.g. "0142410146") to look up. The site auto-detects which — one entry, one search.

## `location` (type: `string`):

Commune, department, or postal code to narrow the search (e.g. "Paris", "Lyon", "75009", "Rhône"). Leave empty to search all of France.

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

Maximum total records to return across all queries.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "queries": [
    "Martin Laviolette"
  ],
  "maxItems": 15
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "queries": [
        "Martin Laviolette"
    ],
    "maxItems": 15
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/pagesblanches-france-residential-directory-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "queries": ["Martin Laviolette"],
    "maxItems": 15,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/pagesblanches-france-residential-directory-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "queries": [
    "Martin Laviolette"
  ],
  "maxItems": 15
}' |
apify call jungle_synthesizer/pagesblanches-france-residential-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/pagesblanches-france-residential-directory-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/vLqUJfMHzg8Nayued/builds/hYO59nul7W6E4igdX/openapi.json
