PAP.fr Scraper - France Owner-Direct Property Listings
Pricing
from $1.17 / 1,000 property listings
PAP.fr Scraper - France Owner-Direct Property Listings
Scrape pap.fr owner-to-owner property adverts, for sale and to rent: price in euros, m², rooms, € per m², DPE, city and photos. Open any advert for the street, GES, map position and the owner's published phone.
Pricing
from $1.17 / 1,000 property listings
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
PAP.fr Scraper: France Owner-Direct Property Listings 🚀
🎉 Every owner-to-owner advert on pap.fr as a clean row: price, m², rooms, DPE, city and photos
For investors, analysts and home-hunters who want the private-seller side of the French market
🔎 What is the PAP.fr Property Scraper — and when should you use it?
The PAP.fr Property Scraper turns owner-to-owner property adverts from pap.fr, France's particulier à particulier site, for sale and to rent into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.
Use it when you need: French property adverts placed by private owners, with no agency in between. Each row carries the asking price or monthly rent in euros, the price per square metre, rooms, bedrooms, living area and land for houses. It also has the city, postcode, Paris arrondissement, DPE class, the PAP badge (only on PAP, cheaper on PAP, new price) and the advert's photos. Open the advert and the row adds the street, GES class, lift, top floor, furnished, map position, publish date and the owner's phone when they publish one.
Use something else when: you need the agency side of the French market, which pap.fr does not carry. Use SeLoger Scraper for agency listings across France, sale and rent, with €/m² and DPE. Use Immoweb Scraper for Belgium, sale and rent. Use atHome.lu Scraper for Luxembourg and its French border towns. This actor reads pap.fr only: live owner-to-owner adverts for apartments and houses, sale and rent. Sold prices and withdrawn adverts are out of scope because pap.fr does not publish them. pap.fr shows about 350 adverts per search, so a nationwide run returns the first 350 or so; Paris runs above 300 are split across the 20 arrondissements to get past that.
🤖 Use with AI agents
Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/pap-property-scraper
Your agent can pay for its own runs. This Actor is eligible for agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.
Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want owner-direct property adverts and asking prices from pap.fr using the Apify Actor `sian.agency/pap-property-scraper`.Use it when I need: French property adverts placed by private owners, with no agency in between. Each row carries the asking price or monthly rent in euros, the price per square metre, rooms, bedrooms, living area and land for houses. It also has the city, postcode, Paris arrondissement, DPE class, the PAP badge (only on PAP, cheaper on PAP, new price) and the advert's photos. Open the advert and the row adds the street, GES class, lift, top floor, furnished, map position, publish date and the owner's phone when they publish one.Don't use it when: you need the agency side of the French market, which pap.fr does not carry — use seloger-property-scraper or immoweb-be-property-scraper or athome-lu-property-scraper instead.How to call it: leave `operation` on `search`, set `listingType` to `sale` or `rent`, `propertyType` to `appartement`, `maison` or `all`, and `location` to one of 20 French cities or `france`. Narrow with `minPrice`/`maxPrice` in euros and set `maxResults`. Turn `includeDetails` on for the street, GES, map position and owner phone, billed per advert. For a town not in the list, paste its pap.fr search page into `searchUrls`. To read adverts you already have, set `operation` to `detail` and put their addresses in `listingUrls`.Start with this input:{"operation": "search","listingType": "sale","propertyType": "appartement","location": "paris","maxPrice": 400000,"maxResults": 100}Ask me which city, sale or rent, the budget, and whether the street and phone are worth the extra per-advert charge, then run the Actor and summarise the results as a table.
Things you can ask your agent for:
- Pull every owner-listed apartment for sale in Paris under 400,000 euros and rank the arrondissements by median price per square metre.
- List this week's owner-direct rentals in Lyon with DPE class and monthly rent per square metre, ready for a sheet.
- Open these five pap.fr adverts and give me the street, energy class and publish date for each.
Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/pap-property-scraper.md.
📋 Overview
PAP.fr (Particulier à Particulier) is where French owners sell and let without an agent. This actor turns pap.fr search results and advert pages into structured data you can sort, chart and export.
What you get:
- ✅ Owner-direct stock only: every pap.fr advert is placed by a private owner. We checked five Paris adverts against SeLoger on street, price and area, and none of them was listed there.
- ⚡ 2 to 4 seconds per page: 10 to 15 adverts per search page, so 100 Paris adverts take well under a minute.
- 🎯 Typed fields: price in euros as a number, living area in m², rooms and bedrooms as numbers, € per m² already worked out.
- 💰 Pay per advert: $1.33 per 1,000 adverts on the BRONZE plan. A search that finds nothing costs only the run start.
- 🏙️ 20 cities in a dropdown, or all of France: no URL hunting for Paris, Lyon, Marseille, Bordeaux and the rest.
- ✨ Open any advert for the street, GES class, lift, map position, publish date and the owner's phone when they publish one.
✨ Features
- 🔍 City search: pick sale or rent, apartments, houses or both, and one of 20 cities or the whole country.
- 🗺️ Paris by arrondissement: Paris runs above 300 adverts are split into the 20 arrondissements automatically, which gets you past pap.fr's limit of about 350 adverts per search.
- 🔗 Any town: paste a pap.fr search page for a town that is not in the list.
- 💶 Price band: minimum and maximum price in euros (monthly rent for rentals).
- 🏷️ PAP badges as columns: "Seulement sur PAP", "Moins cher sur PAP" and "Nouveau prix" come back as text and as true/false flags.
- ⚡ DPE on every row: the energy class is on the search card, so you do not have to open the advert for it.
- 📄 Full advert on demand: street, GES, lift, top floor, furnished, latitude and longitude, publish date, full description and full-size photos.
- 📷 Photos in the table: the first photo shows as an image in the dataset view.
- 🧾 Run report: every run writes an HTML report with the adverts, anything that needs a fix and what you paid.
🎬 Quick Start
Pick a city, choose sale or rent, and press Start. The actor reads pap.fr's search pages and saves one row per advert. Turn on "Open each advert in full" when you need the street or a phone number.
curl -X POST "https://api.apify.com/v2/acts/sian.agency~pap-property-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"operation": "search", "listingType": "sale", "propertyType": "appartement", "location": "paris", "maxResults": 50}'
🚀 Getting Started (3 Simple Steps)
Step 1: Choose what to search
Pick For sale or To rent, then apartments, houses or both.
Step 2: Pick a city
Choose one of 20 cities or all of France, or paste a pap.fr search page for another town.
Step 3: Run and export
Press Start, then download the dataset as JSON, CSV or Excel.
In under a minute you'll have:
- Owner-listed adverts with price, m², rooms and € per m²
- DPE class and PAP badges on every row
- The advert link and its photos
📥 Input Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| operation | string | No | search (adverts by city) or detail (open adverts you paste). Default search. |
| listingType | string | No | sale or rent. Default sale. |
| propertyType | string | No | appartement, maison or all. Default appartement. |
| location | string | For search | One of 20 cities, or france. Not needed when you paste searchUrls. |
| maxResults | integer | No | How many adverts to return, 1 to 10,000. Default 25. |
| minPrice / maxPrice | integer | No | Price band in euros. Rentals use the monthly rent. |
| includeDetails | boolean | No | Open every advert for the street, GES, map position and phone. Billed per advert. |
| searchUrls | array | No | pap.fr search pages to read instead of the dropdowns. |
| listingUrls | array | For detail | pap.fr advert addresses to open in detail mode. |
Example: Paris apartments for sale under €400,000
{"operation": "search","listingType": "sale","propertyType": "appartement","location": "paris","maxPrice": 400000,"maxResults": 100}
Example: open adverts you already have
{"operation": "detail","listingUrls": [{ "url": "https://www.pap.fr/annonces/appartement-paris-10e-75010-r458003076" }]}
📤 Output
Every advert is one row with 40+ fields. The main ones:
| Field | Type | Description |
|---|---|---|
| thumbnail | string | First photo of the advert |
| priceEur | number | Asking price in euros (monthly rent for rentals) |
| pricePerM2 | number | Price divided by living area |
| propertyType | string | apartment, house or flatshare |
| rooms / bedrooms | number | Rooms (French "pièces") and bedrooms |
| areaM2 / plotAreaM2 | number | Living area and land, in m² |
| city / postcode / arrondissement | string | Where the property is |
| dpeClass | string | Energy class, A to G |
| badge / exclusiveToPap | string / boolean | The PAP badge, and whether the advert is only on PAP |
| url / listingId | string | The advert and its pap.fr number |
| street | string | Street name (opened adverts) |
| gesClass | string | Greenhouse-gas class (opened adverts) |
| latitude / longitude | number | Map position (opened adverts) |
| publishedAt | string | Publish date, YYYY-MM-DD (opened adverts) |
| sellerPhone / contactVia | string | Owner phone when published, and how the owner takes contact (opened adverts) |
Example (search row with the advert opened):
{"listingId": "458003076","url": "https://www.pap.fr/annonces/appartement-paris-10e-75010-r458003076","thumbnail": "https://cdn.pap.fr/photos/pap/45/c4/45c42fce3433a524fa255e425d8119fd/4-p1.jpg","propertyTitle": "Vente studio 12,50 m² Paris 10E (75010)","priceEur": 130000,"priceText": "130.000 €","listingType": "sale","propertyType": "apartment","rooms": 1,"areaM2": 12.5,"pricePerM2": 10400,"street": "Rue Bichat","city": "Paris 10e","postcode": "75010","arrondissement": "10e","departmentCode": "75","latitude": 48.871154,"longitude": 2.368382,"dpeClass": "D","gesClass": "B","papReference": "F80/3076","publishedAt": "2026-09-21","sellerPhone": "06 XX XX XX XX","contactVia": "owner-phone","imageCount": 9,"hasDetail": true,"status": "success"}
Two views ship with the dataset: 📊 Overview for search rows and 📄 Opened adverts for the street, phone and map fields.
💼 Use Cases & Examples
1. Paris asking-price index
A property analyst tracks owner-direct asking prices in Paris by arrondissement.
Input: Paris, for sale, apartments, 1,000 adverts Output: Price, m², € per m² and arrondissement for each advert Use: A median €/m² per arrondissement for the private-seller market, refreshed weekly
2. Renovation screen on DPE
A renovation investor looks for F and G rated flats priced below the local average.
Input: A city, for sale, with a price ceiling Output: DPE class on every row, GES when the advert is opened Use: Filter F and G, sort by € per m², shortlist the ones worth a visit
3. Rental yield on owner-direct stock
A buy-to-let investor compares sale prices with rents in the same city.
Input: Two runs for one city, one for sale and one to rent Output: Price and monthly rent per m², matched on rooms and area Use: A gross-yield estimate for commission-free stock
4. Only-on-PAP inventory
A buyer's search agent wants the flats that are not on the agency portals.
Input: A city search
Output: The exclusiveToPap flag and the PAP badge on every row
Use: Keep only the exclusives and show them to clients first
5. Daily new-advert watch
A home-hunter schedules the same Paris search every morning.
Input: A saved task on an Apify schedule Output: Advert ids and publish dates Use: Keep the ids already seen and look only at what appeared since yesterday
6. Research on pasted adverts
A journalist collects a set of adverts for a story on small-studio prices.
Input: detail mode with a list of pap.fr advert addresses
Output: Street, area, price, DPE and publish date for each
Use: A clean table to quote from instead of screenshots
🔗 Integration Examples
JavaScript/Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('sian.agency/pap-property-scraper').call({operation: 'search',listingType: 'sale',propertyType: 'appartement',location: 'paris',maxResults: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('sian.agency/pap-property-scraper').call(run_input={'operation': 'search', 'listingType': 'rent', 'propertyType': 'appartement', 'location': 'lyon', 'maxResults': 100})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item.get('priceEur'), item.get('areaM2'), item.get('city'))
cURL
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~pap-property-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"operation": "search", "listingType": "sale", "propertyType": "maison", "location": "bordeaux", "maxResults": 50}'
Automation Workflows (N8N / Zapier / Make)
- Trigger: a daily schedule
- HTTP Request: call the actor's run-sync endpoint with your city and budget
- Process: keep adverts whose
listingIdyou have not seen before - Action: post them to Slack, a Google Sheet or your CRM
📊 Performance & Pricing
FREE plan (try it now)
- 20 adverts per run with every field, same data as paid
- No credit card needed
- Enough to check the output on your own city
PAID plans (production)
- No cap on adverts per run
- Paris runs above 300 adverts split by arrondissement automatically
- You pay only for adverts returned
| Event | BRONZE price | What it is |
|---|---|---|
| Property Listing | $1.33 per 1,000 | One advert from a search |
| Property Detail | $2.50 per 1,000 | One advert opened in full (street, GES, map, phone) |
| Actor start | $0.005 per run | Charged once when the run starts |
Higher plans pay less per advert. Adverts that could not be read, and searches that found nothing, are not charged.
❓ Frequently Asked Questions
Q: How many adverts can one run return? A: FREE: 20 per run. Paid: no cap from us. pap.fr itself shows about 350 adverts per search, so a Paris run above 300 is split into its 20 arrondissements. To go past the first 350 elsewhere, paste department or town search pages.
Q: Is there a PAP API? A: pap.fr does not offer a public API. This actor gives you the same data as JSON through the Apify API, with no pap.fr account needed.
Q: Does every advert have a phone number?
A: No. Some owners take messages only, and some adverts route calls through pap.fr's own desk. The contactVia field says which, and sellerPhone only ever holds a number the owner published.
Q: Why is the description on search rows shorter?
A: The search card carries pap.fr's short teaser. Turn on "Open each advert in full", or use detail mode, for the full text.
Q: Can I filter by surface, lift or balcony? A: Not as inputs. pap.fr's filter pages for those are closed to automated reading, so the actor returns the fields (area, lift, features) and you filter the dataset.
Q: Why is there an advert from Boulogne in my Paris run?
A: On small searches pap.fr adds adverts from next door, labelled "à 2km de Paris 16e". The actor keeps them and fills nearbyKm with that distance, so you can drop them with one filter. Adverts inside the place you searched have it empty.
Q: What output formats are there? A: JSON, CSV, Excel, XML and HTML, straight from the Apify dataset.
Q: How fresh is the data? A: It is read live from pap.fr when the run starts.
Q: Is this legal? A: The actor reads public pages only. See the legal section below for personal data and cold-calling rules.
🐛 Troubleshooting
"pap.fr did not let this page load after several tries"
- pap.fr sometimes turns requests away for a few minutes. Run the same input again; it usually goes through.
- That row is not charged.
"pap.fr has no adverts for this search right now"
- Houses to rent in Paris, for example, often return nothing. Try the other property type, or rent instead of sale.
"The filters after '?' in a pap.fr address cannot be read"
- Paste the address without the part after "?" and use
minPrice/maxPricefor the budget.
Fewer adverts than pap.fr's headline number
- pap.fr stops listing pages after about 350 adverts per search. Split the search by town or department. In Paris, ask for more than 300 adverts to get the arrondissement split.
⚖️ Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
Opened pap.fr adverts can include a private owner's phone number, and pap.fr states on its adverts that the owner refuses commercial canvassing ("le propriétaire refuse le démarchage commercial"). Use a phone number only to ask about that property.
You can also read Apify's blog post on the legality of web scraping.
PAP and Particulier à Particulier are trademarks of Éditions Neressis. This actor is not affiliated with, endorsed by, or sponsored by PAP or Éditions Neressis.
🤝 Support
Join our active support community
- For issues or questions, open an issue on the actor's Issues tab
- Check SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools