# PAP.fr Scraper - France Owner-Direct Property Listings (`sian.agency/pap-property-scraper`) Actor

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.

- **URL**: https://apify.com/sian.agency/pap-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.17 / 1,000 property listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## PAP.fr Scraper: France Owner-Direct Property Listings 🚀

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![SeLoger Scraper](https://img.shields.io/badge/Store-SeLoger%20Scraper-E30613)](https://apify.com/sian.agency/seloger-property-scraper?fpr=sian) [![Immoweb Scraper](https://img.shields.io/badge/Store-Immoweb%20Scraper-1AE392)](https://apify.com/sian.agency/immoweb-be-property-scraper?fpr=sian) [![atHome.lu Scraper](https://img.shields.io/badge/Store-atHome.lu%20Scraper-1AE392)](https://apify.com/sian.agency/athome-lu-property-scraper?fpr=sian)

#### 🎉 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](https://apify.com/sian.agency/seloger-property-scraper?fpr=sian) for agency listings across France, sale and rent, with €/m² and DPE. Use [Immoweb Scraper](https://apify.com/sian.agency/immoweb-be-property-scraper?fpr=sian) for Belgium, sale and rent. Use [atHome.lu Scraper](https://apify.com/sian.agency/athome-lu-property-scraper?fpr=sian) 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](https://mcp.apify.com)? 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](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — 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:

```text
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](https://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.

```bash
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**

```json
{
  "operation": "search",
  "listingType": "sale",
  "propertyType": "appartement",
  "location": "paris",
  "maxPrice": 400000,
  "maxResults": 100
}
```

**Example: open adverts you already have**

```json
{
  "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):**

```json
{
  "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

```javascript
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

```python
from apify_client import ApifyClient
client = 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

```bash
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)

1. **Trigger**: a daily schedule
2. **HTTP Request**: call the actor's run-sync endpoint with your city and budget
3. **Process**: keep adverts whose `listingId` you have not seen before
4. **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.

[🔗 View current pricing](https://apify.com/sian.agency/pap-property-scraper?fpr=sian)

***

### ❓ 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` / `maxPrice` for 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](https://blog.apify.com/is-web-scraping-legal/).

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](https://apify.com/sian.agency/pap-property-scraper/issues)
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Changelog

This Actor's version history is a separate document: https://apify.com/sian.agency/pap-property-scraper/changelog.md

# Actor input Schema

## `operation` (type: `string`):

Pick one per run. **Property Search** returns the adverts for a city, sale or rent, apartments or houses. **Property Detail** opens pap.fr advert addresses you paste and returns the street, DPE, GES, the owner's phone and every photo.

## `listingType` (type: `string`):

Which side of pap.fr to read. Sale is the larger pool (about 13,000 adverts nationwide); rentals are about 3,400. Prices for rentals are the monthly rent.

## `propertyType` (type: `string`):

Apartments, houses, or both. 'Apartments and houses' runs the two searches one after the other and counts toward the same Max adverts.

## `location` (type: `string`):

A French city, or all of France. Paris apartments for sale are about 1,000 adverts. All of France returns the first 350 or so that pap.fr lists; paste department pages below to go further. Ignored when you paste search page URLs.

## `maxResults` (type: `integer`):

How many adverts to return. Free accounts stop at 20 per run. pap.fr shows about 350 adverts per search at most, so runs above 300 in Paris are split across the 20 arrondissements automatically. For more of France, paste department or town search pages below.

## `minPrice` (type: `integer`):

Keep only adverts at or above this price, in euros (monthly rent for rentals). Adverts without a price are left out when a band is set. Leave empty for no floor.

## `maxPrice` (type: `integer`):

Keep only adverts at or below this price, in euros. Leave empty for no ceiling.

## `includeDetails` (type: `boolean`):

Opens every advert the search returns and adds the street, GES, lift, map position, publish date, the owner's phone, the full description and the full-size photos. Billed as one Property Detail on top of each search row. Off by default: the search row already has price, rooms, area, city, DPE and photos.

## `searchUrls` (type: `array`):

Paste pap.fr search pages instead of using the dropdowns, for example https://www.pap.fr/annonce/vente-appartements-paris-75-g439. Any town pap.fr covers works this way. Filters after a '?' in the address cannot be read, so use the price fields above for a price band. Used by Property Search only.

## `listingUrls` (type: `array`):

The pap.fr advert addresses to open in Property Detail mode, one per line, for example https://www.pap.fr/annonces/appartement-paris-10e-75010-r458003076. Used by Property Detail only.

## Actor input object example

```json
{
  "operation": "search",
  "listingType": "sale",
  "propertyType": "appartement",
  "location": "paris",
  "maxResults": 25,
  "includeDetails": false,
  "listingUrls": [
    {
      "url": "https://www.pap.fr/annonces/appartement-paris-10e-75010-r458003076"
    }
  ]
}
```

# Actor output Schema

## `papListings` (type: `string`):

Every pap.fr advert this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "operation": "search",
    "listingType": "sale",
    "propertyType": "appartement",
    "location": "paris",
    "maxResults": 25,
    "includeDetails": false,
    "listingUrls": [
        {
            "url": "https://www.pap.fr/annonces/appartement-paris-10e-75010-r458003076"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/pap-property-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "operation": "search",
    "listingType": "sale",
    "propertyType": "appartement",
    "location": "paris",
    "maxResults": 25,
    "includeDetails": False,
    "listingUrls": [{ "url": "https://www.pap.fr/annonces/appartement-paris-10e-75010-r458003076" }],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/pap-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "operation": "search",
  "listingType": "sale",
  "propertyType": "appartement",
  "location": "paris",
  "maxResults": 25,
  "includeDetails": false,
  "listingUrls": [
    {
      "url": "https://www.pap.fr/annonces/appartement-paris-10e-75010-r458003076"
    }
  ]
}' |
apify call sian.agency/pap-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/pap-property-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ZK6bP4i5zgOkSbrtI/builds/N9BGIMnWwCBlRv9QV/openapi.json
