PAP Universal Scraper
Pricing
from $0.61 / 1,000 results
PAP Universal Scraper
🏠 Scrape PAP (pap.fr) private-seller real-estate listings by filters — rent or buy. Get price, surface, rooms, DPE/energy, photos and location, as clean structured data. Pay per result.
Pricing
from $0.61 / 1,000 results
Rating
4.0
(1)
Developer
Scrapifier
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
PAP Scraper
Scrape private-seller real estate listings from PAP (pap.fr) by filters, for sale or for rent, and export them as JSON, CSV or Excel, or pull them straight from the API.
⚡ For every listing you get the price, the living surface, the number of rooms and bedrooms, the DPE energy rating, the description, the photo URLs, the city and postal code, the property type, a price-reduced flag and the direct pap.fr link. Search by city, department or postal code, then narrow by price, surface, rooms and bedrooms. PAP (Particulier à Particulier) only lists properties sold or rented directly by their owners, no agency. No login, no cookies, no browser: the Actor fetches pap.fr pages directly, and you pay per listing.
🎯 Why scrape PAP listings?
- Property hunting: pull every flat or house that matches your budget, surface and rooms in the cities you care about, and re-run daily to catch new owner listings before anyone else.
- Lead generation for agents and brokers: owners who sell or rent by themselves on PAP are the prospects agencies want to reach. Track new private listings in your sector week after week.
- Price monitoring and market research: owner asking prices are a benchmark free of agency positioning. Compare them by city, property type and surface, and follow the
priceReducedflag over time. - Investment screening: filter by price and surface, compute the price per square metre from
priceandsurfaceArea, and rank zones by yield or discount. - Energy renovation and DPE studies: the
energyClassificationfield (A to G) lets you isolate energy-hungry homes for renovation offers or regulatory analysis. - Data and academic work: build a dated history of the French private-seller market, city by city.
📊 What data does PAP Scraper extract?
| Field | Description |
|---|---|
id | PAP listing id |
url | Direct link to the listing on pap.fr |
transaction | buy or rent |
propertyType | appartement, maison, terrain, immeuble, parking... (the pap.fr slug) |
price | Price in euros: sale price or monthly rent |
priceReduced | true when the card shows a price drop ("Nouveau prix", "Baisse de prix") |
surfaceArea | Living surface in m² |
rooms | Number of rooms (pièces) |
bedrooms | Number of bedrooms |
energyClassification | DPE / energy rating, A to G |
city | City as shown on the listing |
postalCode | Postal code, or the department number when PAP only shows the department |
description | Listing description as shown on the result card |
photos[] | Photo URLs (cdn.pap.fr) |
photoCount | Number of photos |
Any field can be null when pap.fr does not display it.
🚀 How to scrape PAP listings
- Open the Actor and pick the Transaction:
buy(properties for sale) orrent. - Add one or more Locations: city names, departments or postal codes, for example
Bordeaux,Parisor33000. Each one is resolved automatically to its PAP zone through pap.fr's own location autocomplete. - Choose the Property types (leave empty for flats and houses) and set the filters you need: min and max price, min and max surface, min rooms, min bedrooms.
- Set Max results (
100by default,0= as many as possible) and keep the default Proxy (Apify residential, country FR). - Click Start. The Actor resolves each location, walks the result pages for every property type, keeps the listings that match your filters and saves them in batches of 100.
- Open the Storage tab to preview the listings and export them as JSON, CSV, Excel or XML, or read them from the dataset API.
The same run can be started from the Apify API, the Python or JavaScript client, or put on a schedule for daily monitoring.
📥 Input parameters
| Field | Key | Type | Default | Description |
|---|---|---|---|---|
| Transaction | transaction | select | buy | buy (sale) or rent. |
| Locations | locations | array of strings | ["Bordeaux"] | Cities, departments or postal codes (e.g. Bordeaux, Paris, 33000), each resolved to its PAP zone. |
| Property types | property_types | select (multiple) | none | One or more of appartement, maison, terrain, immeuble, parking, local-commercial, boutique, bureau, chateau. Empty = flats and houses. |
| Min price | price_min | integer | none | Lowest price to include, in euros (monthly rent or sale price). |
| Max price | price_max | integer | none | Highest price to include, in euros. |
| Min surface | surface_min | integer | none | Minimum living surface in m². |
| Max surface | surface_max | integer | none | Maximum living surface in m². |
| Min rooms | rooms_min | integer | none | Minimum number of rooms (pièces). |
| Min bedrooms | bedrooms_min | integer | none | Minimum number of bedrooms. |
| Max results | max_results | integer | 100 | Listings to collect for the whole run. 0 = as many as possible. |
| Report empty searches | emit_input_status | boolean | true | Add an input_status report (one entry per location) to the run's OUTPUT record. |
| Proxy | proxyConfiguration | object | Apify residential, country FR | Recommended: pap.fr limits rapid requests, a French residential proxy keeps runs reliable. |
Example input:
{"transaction": "buy","locations": ["Bordeaux"],"property_types": ["appartement"],"price_max": 300000,"rooms_min": 2,"max_results": 100}
The first pap.fr autocomplete match is used for each location, so a postal code removes any doubt when a town name is ambiguous. property_types also accepts the English aliases flat, house, land, building, commercial, shop, office and castle. max_results is a global cap across all locations and property types, not a per-location one.
📤 Output example
Each listing is one dataset item, exportable as JSON, CSV, Excel or via the API.
{"id": "462200835","url": "https://www.pap.fr/annonces/appartement-bordeaux-33000-r462200835","transaction": "buy","propertyType": "appartement","price": 195000,"priceReduced": true,"surfaceArea": 45,"rooms": 2,"bedrooms": 1,"energyClassification": "D","city": "Bordeaux","postalCode": "33000","photoCount": 12}
The run's OUTPUT record also holds the run statistics (unique_ads, duplicates, filtered_out, requests, errors), the effective configuration and, when emit_input_status is on, an input_status entry per location with the resolved zone name (geoName), the number of listings collected and a status of ok, empty or not_found.
💡 Ready-to-run examples
Flats for sale in Bordeaux under 300,000 euros, at least 2 rooms
{ "transaction": "buy", "locations": ["Bordeaux"], "property_types": ["appartement"], "price_max": 300000, "rooms_min": 2, "max_results": 100 }
Flats for rent in Paris and Bordeaux, first 100 listings
{ "transaction": "rent", "locations": ["Paris", "Bordeaux"], "property_types": ["appartement"], "max_results": 100 }
Every house for sale in postal code 33000
{ "transaction": "buy", "locations": ["33000"], "property_types": ["maison"], "max_results": 0 }
Land and buildings for sale in Bordeaux, with the per-location report
{ "transaction": "buy", "locations": ["Bordeaux"], "property_types": ["terrain", "immeuble"], "max_results": 100, "emit_input_status": true }
💰 Pricing: how much does it cost to scrape PAP?
From $0.90 per 1,000 listings on the free plan, with automatic volume discounts down to $0.61 per 1,000 on higher Apify plans. You pay only for the results you receive, there is no subscription and no start fee. New Apify accounts get free monthly platform credits to try it.
Cost is driven purely by the number of listings saved to the dataset. Listings rejected by your price, surface, rooms or bedrooms filters are never saved, so they cost nothing, and max_results caps the whole run: start with the default 100 to validate your filters, then raise it or set 0 to collect everything.
⚙️ Performance, proxies and limits
- Proxy: The default input uses Apify residential proxies with country
FR, the recommended setup for reliable runs. - Pacing and retries: pages are fetched 1.5 seconds apart. On an HTTP 429 or 403 the request backs off (2, 4, 6 then 8 seconds) and is retried up to 4 times before the search for that location and type stops.
- Page cap: at most 100 result pages per property type and location. Paging also stops as soon as a page brings no new listing or the
max_resultscap is reached. - Filters: transaction, property type and location are part of the pap.fr search URL. Price, surface, rooms and bedrooms are checked by the Actor on every card before it is saved, so the run still walks the location's pages, but you are only charged for matching listings. A listing with no value for a filtered field (no surface shown, for instance) is excluded when that filter is set.
- Deduplication: listings are deduplicated by
idwithin a run (PAP shows the same listing under several zones). Duplicates are counted in the OUTPUT stats. - Card-level data: fields come from the search result cards, not from the detail pages. The description is the one shown on the card and photos are the card's
cdn.pap.frimages. - Empty results: a location that pap.fr cannot resolve gets
not_foundininput_status; one that resolves but yields nothing getsempty. A run with no location ends with ano_locationserror in the OUTPUT record. - Run options: the default run is set to 4096 MB of memory and a 60 minute timeout.
🔌 Integrations and API
Run PAP Scraper from the Apify API, the Python or JavaScript client, or on a schedule. Connect it to Make, Zapier, n8n, Google Sheets, Slack or any webhook through Apify integrations. Every run's dataset is available as JSON, CSV, Excel or XML from the dataset API.
curl -X POST "https://api.apify.com/v2/acts/scrapifier~pap-universal-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-H "Content-Type: application/json" \-d '{ "transaction": "buy", "locations": ["Bordeaux"], "property_types": ["appartement"], "price_max": 300000, "rooms_min": 2, "max_results": 100 }'
❓ FAQ
Is it legal to scrape pap.fr?
The Actor only reads listings that pap.fr publishes to anyone without logging in. Listings are published by private individuals and descriptions can contain personal data, so process them in line with GDPR, respect pap.fr's terms of use, and stay responsible for how you use the data. This is not legal advice.
Do I need a PAP account, login or cookies?
No. Nothing to log in to and no cookies to paste. Keep the default French residential proxy.
Can I export PAP listings to Excel or Google Sheets?
Yes. Every run's dataset downloads as CSV, XLSX, JSON or XML from the Storage tab, and the Google Sheets integration can push new listings to a sheet automatically.
How many listings can I scrape?
Set max_results to 0 to collect everything pap.fr returns for your locations and property types, up to 100 result pages per type and location. Keep a cap for a first run and combine filters to pay only for relevant listings.
How do I target a city, a department or a postal code?
Type it in locations as you would on pap.fr (Bordeaux, Paris, 33000). Each entry is resolved to its PAP zone and reported back in input_status as geoName, so you can check which zone was actually searched.
Does it include agency listings?
No. PAP (Particulier à Particulier) is a private-seller site: every listing is published directly by the owner. For agency listings, use the SeLoger, Bien'ici or Leboncoin scrapers listed below.
Are the price, surface and rooms filters applied by pap.fr?
Not all of them. Transaction, property type and location are sent to pap.fr; price, surface, rooms and bedrooms are applied by the Actor to every card before it is saved. You are never charged for a filtered-out listing, but restrictive filters on a large zone still take time.
What if a run is blocked or returns nothing?
Check the input_status report first: not_found means the location did not resolve, empty means the zone had no matching listing. If pages fail with HTTP 429 or 403, make sure the residential FR proxy is enabled and retry later: the Actor already paces and backs off, but pap.fr limits sustained traffic.
🔗 Related scrapers
- SeLoger Scraper: agency and developer real-estate listings from SeLoger, by filters.
- Bien'ici Scraper: real-estate listings from Bien'ici with map-based search.
- Leboncoin Real Estate Scraper: Leboncoin real estate by filters, private sellers and agencies, no URL needed.
- Leboncoin Scraper: any Leboncoin search URL, all categories.
🇫🇷 En français
PAP Scraper permet de scraper les annonces immobilières de PAP (pap.fr, De Particulier à Particulier), le site des ventes et locations entre particuliers, sans agence. Vous choisissez la transaction (achat ou location), une ou plusieurs localisations (ville, département ou code postal, par exemple Bordeaux, Paris ou 33000) et le type de bien (appartement, maison, terrain, immeuble, parking, local commercial, boutique, bureau, château). Les filtres de prix minimum et maximum, de surface, de nombre de pièces et de chambres affinent la recherche, et le champ max_results plafonne le nombre d'annonces collectées. Pour chaque annonce, vous obtenez le prix, la surface, les pièces, les chambres, le DPE, la description, les photos, la ville, le code postal et le lien direct vers pap.fr. Les résultats s'exportent en JSON, CSV ou Excel depuis l'onglet Storage d'Apify, ou se récupèrent via l'API pour alimenter Google Sheets, Make ou n8n. Le proxy résidentiel français configuré par défaut assure des runs stables, car pap.fr limite les requêtes rapides. Le tarif est au résultat, sans abonnement : vous ne payez que les annonces réellement extraites, à partir de 0,90 $ pour 1 000 annonces.
💬 Support
Questions, bugs or a feature request? Open an issue in the Issues tab of this Actor, I answer quickly. If PAP Scraper saves you time, a rating on the Store helps others find it.