PagesJaunes FR $0.8/1K Comprehensive Business Data avatar

PagesJaunes FR $0.8/1K Comprehensive Business Data

Pricing

from $0.80 / 1,000 results

Go to Apify Store
PagesJaunes FR $0.8/1K Comprehensive Business Data

PagesJaunes FR $0.8/1K Comprehensive Business Data

From $0.8/1K. Scrapes business listings from PagesJaunes.fr (French Yellow Pages). Extract comprehensive business information, including contact details, ratings, reviews, opening hours, payment methods, and category hierarchy across all of France.

Pricing

from $0.80 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

0

Monthly active users

14 days ago

Last modified

Share

PagesJaunes Scraper: French Business Listings, Contacts and Reviews

PagesJaunes Scraper turns the French Yellow Pages into structured business data. Search by trade and location or paste PagesJaunes search URLs to collect names, phone numbers, addresses, activity categories, ratings and map coordinates, plus optional profile details such as websites, opening hours, photos, services, products and reviews. Run it once for a one-off list, or schedule it and turn on Incremental mode to track a search over time. Export to JSON, CSV or Excel, or read the results straight through the API.

Why This Scraper?

  • Two ways to find listings. Search by business type and location the way you would on PagesJaunes.fr, or paste your own PagesJaunes search URLs and pick up from any page.
  • Detail pages on demand. Turn on detail scraping to add website, opening hours, description, payment methods, services, products, photos and reviews to every business, not just what the results list shows.
  • Address geocoding included. Business addresses are resolved to map coordinates in the same run. Weak or ambiguous matches are dropped rather than guessed, so coordinates you get are ones you can trust.
  • Built for schedules. Incremental mode tracks one search over time and classifies each business as new, updated, unchanged, reappeared or expired, so a recurring run reports only what actually changed.
  • Resume without duplicates. Point a fresh run at a previous run or dataset ID and it skips everything already collected there, so an interrupted run never gets billed twice.
  • Automatic retries on refused connections. A blocked or rate-limited request is retried automatically with a different connection instead of failing the whole run, and a run that genuinely could not reach the site fails loudly instead of quietly returning an empty dataset that looks like "no results".
  • Send results to your other apps. Optionally pipe a summary of each business into Notion, Linear, Airtable or Apify through MCP connectors, while the full record always stays in the dataset.

Use Cases

  • Lead generation and sales prospecting: build contact lists of plumbers, restaurants, dentists or any trade in a city, department or region.
  • Local SEO and reputation monitoring: track ratings, review counts and profile details for a portfolio of listings over time.
  • Directory and marketplace enrichment: pull structured business data, address, hours, services, payment methods, to populate your own directory or app.
  • Competitive and market research: map how many businesses of a given type operate in a location, and where they cluster.
  • Data journalism and public research: analyze the density and distribution of local services across France.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
clientId"12345678"
name"Sample Plumbing Co"
activities["plombiers"]
phone"01 23 45 67 89"
address"10 rue Example 75001 Paris"
rating4.8
reviewCount42
detailUrl"https://www.pagesjaunes.fr/pros/12345678"
searchTerms"plombier"
searchLocation"Paris"
latitude / longitude48.852 / 2.35 (when a high-confidence address match is found)
website"https://example-business.fr" (when detail scraping is on)
openingHours["Mo-Fr 09:00-18:00"] (when detail scraping is on)
description"Plombier professionnel depuis 1998..." (when detail scraping is on)
paymentAccepted"Espèces, CB, Visa" (comma-joined string, when detail scraping is on)
fullAddress{"street": "10 rue Example", "postalCode": "75001", "locality": "Paris"} (when detail scraping is on)
photos["https://www.pagesjaunes.fr/media/..."] (when detail scraping is on)
reviews[{"author": "Sample User", "rating": 5, "text": "...", "date": "2026-01-01"}] (when detail scraping is on)
changeType"NEW" (Incremental mode only)
changedFields["rating", "reviewCount"] (Incremental mode only)
firstSeenAt"2026-01-01T00:00:00Z" (Incremental mode only)
lastSeenAt"2026-01-15T00:00:00Z" (Incremental mode only)

When detail scraping finds them, records also carry social profile links (Facebook, Instagram, X/Twitter, LinkedIn, YouTube, TikTok), the category breadcrumb trail, and, for restaurants and similar venues, a price range and a cuisine list plus the underlying schema.org business type. Services and products lists come from PagesJaunes' own FAQ block on the business page, when published.

How to Use

  1. Pick a Mode: search (enter a business type and location) or url (paste PagesJaunes search URLs).
  2. For search mode, fill Search Terms and Location. For URL mode, paste one or more search URLs; a page parameter already in the URL is honored as the starting page.
  3. Turn on Scrape Detail Pages if you want website, hours, reviews and other profile fields, and set Max listings / Maximum Pages to control run size and cost.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.

Search by trade and city:

{
"mode": "search",
"searchTerms": "plombier",
"location": "Paris",
"maxListings": 50
}

Paste a search URL:

{
"mode": "url",
"urls": [
{ "url": "https://www.pagesjaunes.fr/annuaire/chercherlespros?quoiqui=restaurant&ou=Lyon" }
],
"maxPages": 5,
"maxListings": 100
}

Track a search on a schedule:

{
"mode": "search",
"searchTerms": "dentiste",
"location": "Lyon",
"incrementalMode": true,
"emitExpired": true,
"maxListings": 0
}

Large volume, names and contacts only:

{
"mode": "search",
"searchTerms": "coiffeur",
"location": "Marseille",
"maxListings": 500,
"scrapeDetails": false
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/pagesjaunes-fr-scraper").call(
run_input={"mode": "search", "searchTerms": "plombier", "location": "Paris"}
)
for business in client.dataset(run["defaultDatasetId"]).iterate_items():
print(business["name"], business.get("phone"))

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/pagesjaunes-fr-scraper').call({
mode: 'search',
searchTerms: 'plombier',
location: 'Paris',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Resume and recurring updates

  • Resume from run ID (resumeFromRunId) continues ONE specific interrupted run: paste its run or dataset ID and this run skips everything already collected there (matched by clientId), so you don't pay twice.
  • Incremental mode (incrementalMode) is for scheduling the SAME search repeatedly. It remembers what it found last time, keyed on the search terms and location (or URLs) plus scrapeDetails, and classifies each business as NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED, or EXPIRED.
  • EXPIRED (emitExpired) only fires after a run that scans the entire tracked search; a capped, resumed, or partial run never marks anything expired, since it cannot tell "gone" apart from "not reached yet". REAPPEARED only appears for a business that a previous run already marked EXPIRED; it will not appear on the first run after turning emitExpired on.
  • Do not combine Resume and Incremental mode once a search already has saved Incremental state; set a different stateKey to start a separate campaign instead.
  • latitude/longitude and imageUrl are excluded from Incremental mode's change comparison (they are still returned in the record whenever present): map coordinates come from a probabilistic address match and drift by rounding-level amounts between runs, and imageUrl is the site's own rotating "primary photo" pick from the same gallery already returned in full in photos. rating and reviewCount are real data and are never excluded; they are exactly the signal a monitoring run exists to report.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each business, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (keyword and location) or url (paste PagesJaunes search URLs).
searchTermsstringplombierBusiness type or keyword to search for. Used in search mode.
locationstringParisCity, department number, or region. Used in search mode.
urlsarray[] (prefill: one example PagesJaunes search URL)PagesJaunes search URLs, each with quoiqui and ou parameters. Used only in URL mode.
maxPagesinteger0Result pages to walk per query (20 listings per page). 0 walks every available page.
maxListingsinteger20Stop after this many listings across all searches/URLs. 0 means unlimited.
scrapeDetailsbooleantrueFetch each business's detail page for website, hours, reviews and more.
proxyobjectApify Proxy, residential groupConnection settings.
resumeFromRunIdstringnoneContinue one interrupted run; skip listings already collected there.
incrementalModebooleanfalseTrack this exact search across scheduled runs and classify each business by change type.
stateKeystringnone (auto-derived from the search/URLs and scrapeDetails when empty)Optional label for the Incremental mode baseline.
emitUnchangedbooleanfalseAlso return (and bill for) businesses with no detected change.
emitExpiredbooleanfalseAlso return (and bill for) businesses no longer found, after a complete scan.
mcpConnectorsarraynoneOptional: send a summary of each business to apps you authorized under Integrations.
notionParentPageUrlstringnoneNotion connector only: page under which business pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"clientId": "12345678",
"name": "Sample Plumbing Co",
"activities": ["plombiers"],
"phone": "01 23 45 67 89",
"address": "10 rue Example 75001 Paris",
"rating": 4.8,
"reviewCount": 42,
"detailUrl": "https://www.pagesjaunes.fr/pros/12345678",
"searchTerms": "plombier",
"searchLocation": "Paris",
"latitude": 48.852,
"longitude": 2.35,
"website": "https://example-business.fr",
"description": "Plombier professionnel depuis 1998, interventions rapides.",
"openingHours": ["Mo-Fr 09:00-18:00"],
"paymentAccepted": "Espèces, CB, Visa",
"fullAddress": {
"street": "10 rue Example",
"locality": "Paris",
"postalCode": "75001",
"country": "FR"
},
"photos": ["https://www.pagesjaunes.fr/media/example.jpg"]
}

Plan Requirement

The default connection setting (a residential Apify Proxy) works out of the box, and the actor automatically retries with a different connection when one is refused. For large or frequent runs, keeping the residential proxy group enabled under Connection gives the most reliable access to PagesJaunes.fr.

FAQ

How much does it cost?

You pay per dataset record returned, plus the Apify platform's usage-based run cost for the connection you choose. The Pricing tab shows current rates. Use Max listings and Maximum Pages to cap the size, and the cost, of any run.

This actor collects only publicly available business listing data. You are responsible for how you use it: follow PagesJaunes' terms and the laws that apply to you, including data protection rules if you handle personal data such as phone numbers, and get legal advice before any commercial redistribution.

Can I get only new or changed businesses on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new or updated businesses for that same search by default; unchanged businesses are not returned or billed unless you turn on Emit unchanged. Expired businesses are returned only when Emit expired is on, and even then only after a run that scans the tracked search completely; reappeared only appears for a business that a previous complete scan already marked expired that way.

What's the difference between Resume and Incremental mode?

Resume from run ID continues ONE specific interrupted run: paste that run or dataset ID and this run returns only what wasn't collected yet. Incremental mode is for scheduling the SAME search repeatedly; it remembers state itself, so you never need to paste an ID. Don't combine the two once Incremental mode already has saved state for that search; the run stops with a clear error pointing you to use a different State key instead.

Why did my run fail instead of returning an empty dataset?

If the first search results page could not be retrieved at all, the run stops with a clear error instead of returning zero listings, so "no businesses matched" is never confused with "the site could not be reached". Retry after a few minutes. If only some detail pages fail along the way, those listings are simply missing the fields that page would have added; everything else still comes through.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the "Pipe results into your apps" field to send a summary of each business straight into Notion, Linear or Airtable.

🔗 Want more leads data?

Pair this actor with these related scrapers from the same team:

📇 Yellow Pages NZ
From $0.8/1K. Scrapes business listings from Yellow.co.nz (New Zealand Yellow Pages)...
📇 HiPages Scraper
Scrape business listings from HiPages Australia by category, location, or URL. Extract...
💼 France Travail Scraper
Scrape job offers from France Travail with titles, companies, locations, salaries...
🏠 Pap.fr
From $1/1k. Extract property listings from pap.fr. Get fully-detailed listings with...
📇 Yellow Pages AU
From $1/1K. Scrape business listings from Yellow Pages Australia by type and location...
🛒 Castorama.fr
Scrape Castorama.fr DIY and home-improvement products by keyword, category, or URL...

👉 Browse all abotapi scrapers

💬 Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.