PAP.fr Scraper ($1.10/1K) - French Private-Seller Listings avatar

PAP.fr Scraper ($1.10/1K) - French Private-Seller Listings

Pricing

from $0.35 / 1,000 listings

Go to Apify Store
PAP.fr Scraper ($1.10/1K) - French Private-Seller Listings

PAP.fr Scraper ($1.10/1K) - French Private-Seller Listings

Scrape private-seller property listings from PAP (pap.fr, De Particulier à Particulier): apartments, houses, land and parking for sale and for rent, no agencies. Filter by city, price, rooms and area. Price, DPE, photos. Add-on: full description, street and publication date.

Pricing

from $0.35 / 1,000 listings

Rating

0.0

(0)

Developer

Carabain Digital

Carabain Digital

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

What is PAP Listings Scraper?

PAP Listings Scraper scrapes property listings (annonces immobilières de particulier à particulier) from PAP (pap.fr), the French portal where private owners sell and rent out their property without an agency: apartments, houses, land and parking, for sale (vente) and for rent (location). Search by city, arrondissement, department or postcode, sale or rent, property type, price range, rooms and living area, or paste a search URL from the site, and get clean, flat listing data as JSON, CSV, Excel, XML or HTML: price, location, living area, rooms, bedrooms, DPE energy label and photos. Prefilled example: the 20 newest properties for sale in Lyon, ready in seconds. Costs $1.10 per 1,000 listings. Add-ons: Full details (full description, street, publication date, full-size photos) and Price history (price changes over time), $2.00 and $1.00 per 1,000 listings.

  • 🔎 Search like on the site: city, arrondissement, department or postcode, sale or rent, property type, price range, rooms, living area, or paste a PAP search URL
  • 🧑 Private sellers only: no agency listings, no agency fees, a view on the "sans agence" market
  • ⚡ No browser: plain HTTP on PAP's search pages, 12-15 listings per page, most recent first
  • 📚 Full details on demand: switch on Full details for the description, street, publication date and all photos
  • 📈 Track prices over time: switch on Price history to compare every run with the last one
  • 🔌 Connect anywhere: API, schedules, webhooks, Google Sheets, Make, Zapier, MCP / AI agents

What data can I extract from PAP?

🆔 Stable listing ID and URL💶 Price (vente) or monthly rent (location)
📍 Postcode and city or arrondissement🛣️ Street (Full details)
🏠 Property type and subtype📐 Living area and plot area (m²)
🛏️ Rooms and bedrooms⚡ DPE energy label (A to G)
📅 Publication date (Full details)📷 Photo URLs
📝 Full description (Full details)🏷️ Status

The search pages carry price, city, rooms, bedrooms, living area, DPE label and photos. Description, street, publication date, plot area and full-size photos come from the listing page and are only filled with the Full details add-on. PAP shows no coordinates, house number, bathroom count or construction year, and the seller's phone number only after a click on the site, so lat, lon, house_number, bathrooms, construction_year, agent_phone and the other agent fields are always null.

How do I scrape PAP listings?

  1. Create a free Apify account and open this Actor.
  2. Enter a Location (for example Lyon or 75015), pick Sale or rent and, if you like, a property type and price range. Or paste one or more Search URLs copied from pap.fr.
  3. Set Max listings (the most recent come first).
  4. Click Start, then download the listings from the Output tab as JSON, CSV, Excel, XML or HTML.

How much does it cost to scrape PAP?

You pay per listing that ends up in your dataset: $1.10 per 1,000 listings, no subscription. The monthly credit of Apify's Free plan ($5) covers around 4,500 listings without add-ons. Paid plans get volume discounts.

  • Add-on: Full details, $2.00 per 1,000 listings (off by default). Opens every listing's page and adds the description, street, publication date, plot area and all photos in full size. Charged only for listings that were actually enriched. It makes one extra request per listing, so it is much slower than the search itself.
  • Add-on: Price history, $1.00 per 1,000 listings (off by default). Adds first_seen_at, previous_price, price_change, price_change_pct, status_changed and price_history. Charged only for listings that already had history from an earlier run, so the first run is free. See the Price history section below.
  • Failed runs and empty searches cost nothing; you can cap spending with Maximum cost per run in the run options.

See the Pricing tab for the current prices.

⬇️ Input

FieldDescription
Location (location)City, arrondissement, department or postcode (required); several separated by commas
Sale or rent (listing_type)sale (vente) or rent (location)
Property type (property_type)any, house, apartment, land, commercial (offices), parking
Minimum / maximum price (min_price, max_price)In euro; for rentals per month
Minimum rooms (min_rooms)Number of rooms (pièces)
Minimum living area (min_living_area_m2)In m²; listings without a known area are left out
Search URLs (start_urls)Search pages copied from pap.fr; they replace the filters above
Max listings (limit)Stop after this many listings
Full details (includeDetails)Paid add-on: description, street, publication date, all photos
Price history (trackHistory)Paid add-on: compare with your previous runs
History store name (historyStoreName)Where the history is kept (default realestate-history)
Proxy (proxyConfiguration)French residential proxy, preselected (Apify Residential, country FR). PAP blocks datacenter IPs
{
"location": "Lyon",
"listing_type": "sale",
"limit": 20
}

PAP always searches inside a place, so Location is required. With Search URLs paste a page like https://www.pap.fr/annonce/vente-appartements-paris-75-g439-jusqu-a-500000-euros; filters in the URL are kept and the page number is ignored. PAP applies price and area filters with a margin of about 10%: with the form fields the Actor sends them to PAP and then keeps only the listings that match exactly.

⬆️ Output

Listings are stored in the default dataset, most recent first. View them as a table in the Output tab or export JSON, CSV, Excel, XML or HTML. Fields a listing does not have are null; every item has the same keys.

A listing with the Full details add-on

{
"id": "pap:463301550",
"source": "pap",
"url": "https://www.pap.fr/annonces/appartement-lyon-2e-69002-r463301550",
"title": "Vente appartement 5 pièces 108 m² Lyon 2e (69002)",
"listing_type": "sale",
"property_type": "apartment",
"property_subtype": "appartement",
"status": "available",
"price": 649000,
"price_currency": "EUR",
"price_period": null,
"price_type": "asking",
"old_price": null,
"monthly_costs": null,
"address": "bis Rue Claudius Collonge, 69002 Lyon 2e",
"street": "bis Rue Claudius Collonge",
"house_number": null,
"postcode": "69002",
"city": "Lyon 2e",
"region": null,
"country": "FR",
"lat": null,
"lon": null,
"living_area_m2": 108,
"plot_area_m2": null,
"rooms": 5,
"bedrooms": 4,
"bathrooms": null,
"energy_label": "B",
"construction_year": null,
"listed_at": "2026-11-01",
"updated_at": null,
"agent_name": null,
"agent_phone": null,
"agent_url": null,
"image_urls": [
"https://cdn.pap.fr/photos/pap/24/02/2402b6b06c7cd0304e3ab126c3e6fe87/2-p1.jpg",
"https://cdn.pap.fr/photos/pap/13/dc/13dc0c67ace1eff615f3960978798803/1-p1.jpg",
"..."
],
"description": "**Appartement familial** situé au cœur du quartier Confluence, à proximité immédiate de Perrache, des transports et des commerces.\n\nAu 6ᵉ étage avec ascenseur d ...",
"scraped_at": "2026-11-01T11:07:09Z"
}

Extra fields with the Price history add-on

{
"first_seen_at": "2026-10-23T07:00:12+00:00",
"previous_price": 575000,
"price_change": -25000,
"price_change_pct": -4.35,
"status_changed": false,
"price_history": [
{ "at": "2026-10-23T07:00:12+00:00", "price": 575000, "status": "available" },
{ "at": "2026-10-30T07:00:09+00:00", "price": 550000, "status": "available" }
]
}

What can I do with PAP data?

  • 📉 Price drop alerts: schedule a run with Price history and get notified when price_change is negative; owners often lower their price after a few weeks
  • 🏘️ Market research: asking prices and rents per m² on the private-seller market, per arrondissement or postcode
  • 🔎 Deal finding and investment: find owners selling without an agency (vente entre particuliers), filter by price, area and DPE label (investissement locatif)
  • 🧠 AI and analytics: feed descriptions and attributes into valuation models or LLM pipelines

Tips for best results

  • PAP shows at most 25 pages per search (about 300-375 listings). To collect more, split the search by arrondissement or postcode, by property type or by price range and run them as several searches or Search URLs.
  • Results come in PAP's default order, most recent publication first. PAP renews ads, so a renewed listing moves to the top; the order is roughly, not strictly, by date. There is no date in the search results: switch on Full details if you need listed_at.
  • PAP only searches inside one place per search; several comma-separated locations run one search each, and duplicates are removed by listing ID.
  • Minimum rooms is applied on the results (PAP only offers exact room counts), so a strict room filter can leave few listings per page.
  • For a daily feed, schedule a run with a high Max listings and Price history switched on.
  • Leave Full details off for counting, price monitoring and market research; switch it on when you need descriptions or the street.
  • Results from one run are deduplicated by listing ID. New-build programmes advertised on PAP's partner site (immoneuf.com) are not included.

Price history

Switch on Price history (trackHistory) and the Actor remembers every listing between runs, so you can see price drops, status changes and how long a property has been on the market.

  • Where it lives. History is kept in a named key-value store in your own Apify account (default name realestate-history, change it with History store name). Named stores never expire, you own the data, and storage costs a fraction of a cent.
  • First run starts the series. The first time a listing is seen there is nothing to compare with, so previous_price is null and you are not charged for the add-on on that listing. From the second run on, each listing gets first_seen_at, previous_price, price_change, price_change_pct, status_changed and price_history (the last 20 price/status points, one point per change).
  • Run it on a schedule. History only grows when you run the Actor. Create a schedule (daily is typical) with the same search and the same store name.
  • One store, several Actors. Every real-estate Actor we publish uses the same default store name, so a listing keeps one history even if you scrape it with a different one of our Actors. Item IDs start with the site (pap:...), so sites never clash. Use a different store name per search if you want separate series.
  • Do not run two runs on the same store at the same time. Records are updated per listing and the last writer wins, so two parallel runs can overwrite each other's newest point. Run searches that share a store one after another.
  • If you delete the store, the Actor starts a new empty history without an error.
  • Cost: $1.00 per 1,000 listings that already had history (see pricing above).

Frequently asked questions

Can I use PAP Listings Scraper with the Apify API?

Yes. Every run has a dataset you can read through the Apify API. Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("carabain-digital/pap-listings").call(run_input={
"location": "Lyon",
"listing_type": "sale",
"property_type": "apartment",
"max_price": 400000,
"limit": 100,
})
for home in client.dataset(run["defaultDatasetId"]).iterate_items():
print(home["price"], home["address"], home["living_area_m2"], "m2")

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('carabain-digital/pap-listings').call({
location: 'Lyon',
listing_type: 'sale',
property_type: 'apartment',
max_price: 400000,
limit: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'listings');

Can I use PAP Listings Scraper through an MCP server or with AI agents?

Yes. Add it to an AI agent through the Apify MCP server (https://mcp.apify.com?tools=carabain-digital/pap-listings), or let the agent find it with search-actors and run it with call-actor. A small search (limit 20) finishes in a few seconds, and the items are flat and small, so agents can read them with get-dataset-items. Example prompt: "Use PAP Listings Scraper to list the 20 newest apartments for rent by private landlords in Paris under 1,500 euro and tell me which have an A, B or C energy label."

Can I integrate PAP data with other apps?

Yes: Google Sheets, Slack, Make, Zapier, n8n, Airtable or your own webhook, through Apify integrations and webhooks. Schedule a run every morning and send the new listings or price drops to your inbox or CRM.

Why do I need a proxy?

PAP is behind Cloudflare and blocks datacenter IP addresses. The Actor therefore defaults to Apify's residential proxy in France. If a run is blocked it retries on a fresh proxy session; if it still fails the run fails with a clear message instead of returning an empty dataset.

Why is a field empty?

Without Full details, description, street, listed_at and plot_area_m2 are null: PAP only publishes them on the listing page. PAP never shows coordinates, house numbers, bathroom counts or the seller's phone number in a way an Actor can read, so those are always null. Some cards also have no price, room count or DPE label when the owner did not enter one.

Why do I get fewer listings than the total on the site?

PAP stops at 25 pages per search, and the exact filters (price, area, rooms) are applied on top of PAP's own, looser ones. Split the search by arrondissement or price range to get more.

Does it cover agency listings, sold or rented properties?

No. PAP is a private-seller portal and the Actor only returns what is currently for sale or for rent, so status is available.

The Actor only collects publicly visible listings, the same data anyone can see on pap.fr. Descriptions can contain personal data of private sellers, and rules such as GDPR may apply to how you store and use it. Check your use case with a lawyer. More background: Is web scraping legal?

PAP Listings Scraper not working? Feedback

Open an issue on the Issues tab of this Actor with the run link and we will look at it. Feature ideas are welcome there too.

Other scrapers by us

ActorCovers
France Real Estate ScraperSeLoger, Bien'ici and PAP in one run, merged newest first
Bien'ici Listings ScraperFrance: bienici.com, listings from agencies and private sellers
Immoweb Listings ScraperBelgium: immoweb.be, houses and apartments for sale and rent
Immowelt Listings ScraperGermany: immowelt.de
Pararius Listings ScraperNetherlands: pararius.nl, rentals and sales

⭐ Does it work well for you? A review on the Store page helps others find this Actor and helps us keep it maintained.