PAP.fr Scraper icon

PAP.fr Scraper

Scrape PAP.fr real estate listings across France. Extract property prices, addresses, room counts, floor areas, full photo galleries, descriptions and…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

PAP.fr Scraper at a glance

PAP.fr Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, change type (incremental mode), url, type and property, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.50 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Real Estate, Developer Tools, Automation
Region
Europe
Pricing
$1.50 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
34 options

Scrape PAP.fr real estate listings across France. Extract property prices, addresses, room counts, floor areas, full photo galleries, descriptions and location details including arrondissement, department and region. Ideal for property research, price comparison and market analysis.

What PAP.fr Scraper can do

  • Owner listed only. PAP.fr does not accept agency listings, so every record is a private seller or landlord, not an agent relisting the same property everywhere.
  • Two ways to search. Type a French city or district name and pick filters from the form (price, living area, land area, rooms, bedrooms, property categories, features, sort), or paste any PAP.fr search, city or listing URL you already opened in your browser.
  • Detail depth on demand. Turn on detail fetching for coordinates, energy and greenhouse gas ratings, street address, seller phone, reference number, bedrooms, floor, charges, property tax and the full photo gallery. Turn it off for a faster run with just the results page fields.
  • French geography, resolved. Type a place the way you would on PAP.fr ("Paris", "Lyon 3e", "Saint-Malo"): it is looked up in PAP.fr's own location search, the department is derived when you leave it blank, a name shared by several departments is flagged in the log with the alternatives, and a name PAP.fr does not know is reported with its suggestions instead of being guessed.
  • Auto pagination. Walks every result page forward to the limit you set, whether you start from the form or from a pasted URL that already points at page 10.
  • Built for monitoring. Incremental mode returns only new, updated and reappeared listings on repeat runs of the same search, and resume support lets a large one time pull continue across separate runs without re collecting anything.

Choose what to collect

These inputs let you configure PAP.fr Scraper - France Properties, Prices & Listings. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestringFilter mode = pick property type + city, plus optional price / surface / land / rooms / bedrooms / feature filters. URL mode = paste any pap.fr search or listing URL already refined in a browser.

Choices: filter, url

locationsarrayType a French city, town or district name as you would on pap.fr (e.g. Paris, Lyon, Paris 15e, Saint-Malo). It is looked up in pap.fr's own location search, so no site id is needed. The department code is auto-derived and only needed to pick between places that share a name (e.g. Saint-Denis exists in both 93 and 974); the run log names the alternatives when a name is ambiguous, and a name pap.fr does not know is reported with its suggestions, never guessed.
listingTypestringPick Vente (Buy) or Location (Rent). Filter mode only.

Choices: Buy, Rent

listingTypesarrayOptional. Tick both to search sales AND rentals for every location in the same run (each listing keeps its own Buy/Rent label). When set, this replaces "Buy or rent?". Leave empty to use "Buy or rent?" alone. Filter mode only.
propertyTypestringWhat kind of property to search for. Filter mode only.

Choices: Apartment, House, Plot, Parking, CommercialProperty

roomsMinintegerMinimum number of rooms (pièces), e.g. 3 returns 3, 4, 5… rooms. 6 means "6 or more". Applied as pap.fr's own rooms filter. Filter mode only.
roomsMaxintegerMaximum number of rooms (pièces). Combine with Min rooms for a range, e.g. 2–3. 6 or more means no upper limit. Filter mode only.
Show 27 more inputs
More input fields
InputWhat it controls
bedroomsMinintegerMinimum number of bedrooms (chambres), applied by pap.fr's own search. Combine with Max bedrooms for a range. Filter mode only.
bedroomsMaxintegerMaximum number of bedrooms (chambres). pap.fr's own search has no working maximum, so this is checked on each result: the listing's printed bedroom count must be at or below this value (a 1-room studio counts as 0 bedrooms; a listing that prints neither count is left out). Filter mode only.
priceMinintegerMinimum price in euros (sale price, or monthly rent for rentals). Applied as pap.fr's own price filter. Filter mode only.
priceMaxintegerMaximum price in euros (sale price, or monthly rent for rentals). Filter mode only.
surfaceMinintegerMinimum living area in m². Filter mode only.
surfaceMaxintegerMaximum living area in m². Filter mode only.
landSurfaceMinintegerMinimum land/garden area in m² (houses and plots). Filter mode only.
landSurfaceMaxintegerMaximum land/garden area in m² (houses and plots). Filter mode only.
propertyTypesarrayOptional. Pick one or more of pap.fr's own property categories, including ones the single Property type list doesn't have (whole buildings, life-annuity sales, houseboats, offices…). When set, this replaces Property type. Values pap.fr doesn't offer for the chosen Buy/Rent are ignored with a warning. Filter mode only.
featuresarrayOptional. Only return listings pap.fr tags with ALL of these features. Some apply to sales only or rentals only; ones that don't fit the chosen Buy/Rent are ignored with a warning. Filter mode only.
excludeNewBuildbooleanHide new-build developer programmes from sale results. Sales only. Filter mode only.
strictLocationbooleanWhen a place has few listings, pap.fr also shows listings from nearby places, marked “à N km de …”. Turn this on to keep only listings inside the place you searched. Off (default): nearby listings are included and each one carries its distance in distanceFromSearchKm. Filter mode only.
sortBystringHow to order results. Filter mode only, in URL mode the sort is taken from your pasted URL. Default = most recent first (PAP's own default).

Choices: Default, PriceAsc, PriceDesc, SurfaceAsc, SurfaceDesc, DateAsc

urlsarrayOne or more pap.fr URLs: search pages, city pages or listing/detail pages (e.g. https://www.pap.fr/annonces/appartement-paris-18e-75018-r464203311). Tip: open pap.fr in your browser, pick property type + location + any price/surface/bedroom filters, then paste the resulting URL here. Every search path shape pap.fr emits passes through unchanged, including the alternative spellings pap.fr uses on its own page links ("appartement-a-louer-…", "ventes-appart-…"); see the README's URL shapes table. A city page (https://www.pap.fr/immobilier/-g) is converted to the full search for that place, sale or rent per Listing type. A pasted detail URL is fetched as a single listing. If a search URL ends with -N (page number), scraping starts at page N and walks forward. Any other URL (e.g. the bare pap.fr homepage) is skipped with a warning, not silently scraped as empty.
referencesarrayOptional. pap.fr listing reference codes as printed on the listing ("Réf. : G35/3579"). Each one is looked up on pap.fr and returned as a single listing, in either mode. Leave Locations empty in Filter mode to look up references only.
maxPagesintegerHow many result pages to walk per location / URL. PAP returns 12 listings per page (+3 featured). Leave empty to walk every result page.
maxListingsintegerHard cap across the whole run. 0 = unlimited (bounded only by Max pages).
fetchDetailsbooleanAdds lat/lng, DPE/GES energy classes, street address, full seller description, reference number, bedrooms, floor, HOA charges, property tax, heating type, and the full high-res photo gallery. Turn off for a faster run with just the SERP-level fields (price, rooms, m², city, primary photo). Each listing whose detail page loads also bills the detail-enrichment charge event (see the Pricing tab); listings whose detail page could not be read are not billed for it.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by listing id) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. For recurring monitoring of the same search instead, use Incremental mode below.
incrementalModebooleanTurn this on for daily/weekly recurring monitoring of the same search. The first run returns all matching listings as NEW. Later runs return only NEW, UPDATED, and REAPPEARED listings by default. Turn on "Emit unchanged listings" or "Emit expired listings" only when you also want those rows returned (and billed). State is kept separately per search (location/URL, listing/property type, rooms, sort, and detail-fetch setting), use State key below to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search inputs above (mode, locations/URLs, listing/property type, rooms, sort, detail-fetch setting), different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max pages/Max listings capped it, a block stopped it early, or Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. Reappeared listings (a previous EXPIRED id seen again) can only ever occur once this has been turned on for at least one earlier run.
ignoreFieldsForChangesarrayOptional. Field names to exclude from change detection on top of the built-in defaults (currently just the per-fetch scrapedAt timestamp), use this if you notice a field flipping every run for a reason you don't care about. A bare name ignores a top-level field (e.g. priceDisplay); a dotted path ignores one nested field (seller.phone); a path ending in . ignores an entire nested object (seller., additionalProperties.). Ignored fields are still returned in every row, only changeType/changedFields detection ignores them. Leave empty to use only the built-in defaults.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID
changeTypeChange type (incremental mode)
urlURL (link)
listingTypeType
propertyTypeProperty
titleTitle
priceValuePrice
priceCurrencyCurrency
priceDisplayPrice (formatted)
roomsRooms
livingSpacem²
bedroomsBedrooms
Show 59 more fields
floorFloor
hoaChargesYearlyHOA charges/year
propertyTaxYearlyProperty tax/year
heatingTypeHeating type
descriptionDescription
streetAddressStreet address
cityCity
arrondissementArrondissement
postcodeZIP
regionRegion
departmentDepartment
departmentCodeDepartment code
latitudeLat
longitudeLng
energyClassDPE
ghgClassGES
isActiveActive (boolean)
referenceReference
sellerPhoneSeller phone
sellerSeller (json)
refusesCommercialSolicitationNo solicitation (boolean)
propertyCategorypap.fr category
badgeBadge
isExclusiveOnly on pap.fr (boolean)
isFeaturedFeatured (À la une) (boolean)
hasVirtualTourVirtual tour (boolean)
virtualTourUrlVirtual tour URL (link)
phonesPhones (array)
hasEmailMessage contact (boolean)
transportsNearby transport (array)
publishedAtPublished (date)
pricePerM2€/m² (number)
previousPricePrevious price (number)
notaryPricePrice incl. notary fees (number)
monthlyLoanPaymentEst. monthly loan (number)
landSurfaceLand m² (number)
characteristicsCharacteristics (array)
teaserOwner headline
contactTextOwner contact note
videoUrlVideo (link)
videoCallChannelsVideo-call visit via (array)
priceValidatedPrice validated by pap.fr (boolean)
monthlyChargesRent charges / month (number)
securityDepositSecurity deposit (number)
referenceRentCapRent-control cap (number)
rentSupplementRent supplement (number)
isFurnishedFurnished (rentals) (boolean)
distanceFromSearchKmKm outside searched place (number)
searchUrlFound on search (link)
searchPageResults page (number)
searchPositionPosition on page (number)
detailFetchStatusDetail page
imageCountImages
imagesImage URLs (array)
additionalPropertiesAdditional properties (json)
scrapedAtScraped (date)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
lastSeenAtLast seen (incremental mode) (date)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "id": "400000001",
  "url": "https://www.pap.fr/annonces/appartement-paris-18e-75018-r400000001",
  "listingType": "Buy",
  "propertyType": "Apartment",
  "title": "Vente appartement 3 pieces 57 m2 Paris 18e",
  "priceValue": 590000,
  "priceCurrency": "EUR",
  "priceDisplay": "590 000 €",
  "rooms": 3,
  "livingSpace": 57,
  "bedrooms": 2,
  "floor": 4,
  "hoaChargesYearly": 2766,
  "propertyTaxYearly": 1450,
  "heatingType": "individuel gaz",
  "description": "Bel appartement lumineux au 4e etage avec ascenseur, proche commerces et metro.",
  "streetAddress": "Rue Muller, 75018 Paris",
  "city": "Paris 18e",
  "postcode": "75018",
  "arrondissement": "Paris 18e",
  "department": "Paris",
  "region": "Ile-de-France",
  "departmentCode": "75",
  "latitude": 48.8358,
  "longitude": 2.2899,
  "energyClass": "D",
  "ghgClass": "D",
  "isActive": true,
  "reference": "G20/2718",
  "sellerPhone": "01 99 00 12 34",
  "seller": {
    "@type": "Person",
    "name": "Particulier"
  },
  "refusesCommercialSolicitation": false,
  "isFurnished": null,
  "imageCount": 18,
  "images": [
    "https://cdn.pap.fr/photos/example-1.jpg",
    "https://cdn.pap.fr/photos/example-2.jpg"
  ],
  "additionalProperties": {
    "Type de bien": "Appartement",
    "Ascenseur": "Oui"
  },
  "scrapedAt": "2026-04-22T10:00:00.000Z"
}

Ways to use this data

  • Buyers and renters: track new owner listed apartments or houses in specific cities without agency markups or duplicate listings.
  • Market research: build a dataset of asking prices, living area and rooms across French cities to study pricing trends.
  • Investors and analysts: monitor a set of departments for new listings, price drops or delisted properties over time.
  • Proptech and data teams: feed owner listed inventory into a search tool, valuation model or lead pipeline.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does PAP.fr Scraper return?

The documented output for PAP.fr Scraper includes id, change type (incremental mode), url, type, property, title, price and currency. Availability of each field depends on the source page and the selected mode.

How much does PAP.fr Scraper cost?

It costs $1.50 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

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

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared listings, and unchanged ones are not returned or billed unless you turn emitUnchanged on.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push listing summaries into Notion, Linear or Airtable.

Ready to collect with PAP.fr Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.