# Pap.fr Scraper (`devnaz/pap-fr-scraper`) Actor

Scraper d'annonces immobilières du site **PAP.fr** (De Particulier à Particulier) qui permet de récupérer des annonces de vente, location et leasing avec des critères de recherche structurés.

- **URL**: https://apify.com/devnaz/pap-fr-scraper.md
- **Developed by:** [DevnaZ](https://apify.com/devnaz) (community)
- **Categories:** Lead generation, Real estate
- **Stats:** 16 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 annonce immobilières

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## 🏠 PAP.fr Scraper - Annonces Immobilières

Récupérez automatiquement des milliers d'annonces immobilières depuis **PAP.fr** (De Particulier à Particulier), le premier site d'annonces immobilières entre particuliers en France.

Que vous soyez investisseur, agent immobilier, data analyst ou développeur, cet Actor vous permet d'extraire rapidement et facilement toutes les données dont vous avez besoin : prix, localisation GPS précise, photos, DPE, transports, équipements et bien plus encore.

---

### ✨ Pourquoi utiliser cet Actor ?

#### 🎯 **Simplicité**
Pas besoin de construire des URLs complexes ! Fournissez simplement vos critères (ville, prix, surface, type de bien) et l'Actor s'occupe du reste.

#### ⚡ **Rapidité**
Récupérez des centaines d'annonces en quelques secondes grâce à un système de scraping ultra-optimisé avec traitement parallèle.

#### 💰 **Économique**
Coût minimal : utilisez les proxies gratuits inclus dans votre plan Apify. Pas de frais supplémentaires.

#### 📊 **Données Complètes**
Chaque annonce contient plus de 40 champs de données : prix, surface, DPE, GPS, photos, transports, équipements, contact, etc.

#### 🗺️ **Géolocalisation Automatique**
Entrez simplement "Paris" ou "Lyon" et l'Actor récupère automatiquement les codes géographiques nécessaires via l'API PAP.fr.

---

### 🚀 Démarrage Rapide

#### Exemple Minimal

La configuration la plus simple nécessite uniquement le type de produit :

```json
{
  "produit": "vente"
}
````

Cela récupère toutes les annonces de vente en France.

#### Exemple Complet

```json
{
  "produit": "vente",
  "typesBien": ["appartement"],
  "localisation": {
    "ville": "Paris"
  },
  "nbPieces": {
    "min": 2
  },
  "prix": {
    "max": 500000
  },
  "surface": {
    "min": 30
  },
  "maxListings": 100
}
```

**Résultat** : 100 appartements à Paris avec minimum 2 pièces, surface ≥ 30m², prix ≤ 500 000 €.

***

### 📥 Configuration (Input)

#### 🏷️ **`produit`** (Obligatoire)

Type de transaction immobilière.

**Valeurs possibles** :

- `"vente"` - Achat d'un bien
- `"location"` - Location d'un bien
- `"location-temporaire"` - Location saisonnière ou temporaire
- `"leasing"` - Leasing immobilier

**Exemple** :

```json
{
  "produit": "location"
}
```

***

#### 🏘️ **`typesBien`**

Types de biens à rechercher (plusieurs types possibles).

**Valeurs possibles** :

- `"appartement"` - Appartements
- `"maison"` - Maisons
- `"parking"` - Parkings et garages
- `"terrain"` - Terrains
- `"boutique"` - Commerces
- `"bureau"` - Bureaux
- `"immeuble"` - Immeubles entiers

**Exemples** :

Rechercher uniquement des appartements :

```json
{
  "typesBien": ["appartement"]
}
```

Rechercher appartements ET maisons :

```json
{
  "typesBien": ["appartement", "maison"]
}
```

⚠️ **Note** : Si non spécifié, tous les types de biens seront inclus.

***

#### 📍 **`localisation`**

Localisation géographique de la recherche.

##### Option 1 : Ville uniquement (recommandé)

```json
{
  "localisation": {
    "ville": "Lyon"
  }
}
```

L'Actor récupère automatiquement les codes géographiques via l'API PAP.fr.

##### Option 2 : Avec codes géographiques manuels

```json
{
  "localisation": {
    "ville": "Lyon",
    "codeDepartement": "69",
    "geoId": "427"
  }
}
```

⚠️ **Note** : Si vous ne fournissez pas de localisation, la recherche se fera sur toute la France.

***

#### 💰 **`prix`**

Fourchette de prix souhaitée.

**Champs disponibles** :

- `min` : Prix minimum
- `max` : Prix maximum

**Exemples** :

Prix maximum 300 000 € :

```json
{
  "prix": {
    "max": 300000
  }
}
```

Prix entre 200 000 € et 500 000 € :

```json
{
  "prix": {
    "min": 200000,
    "max": 500000
  }
}
```

⚠️ **Note** : Pour la location, les prix sont mensuels. Pour la vente, les prix sont totaux.

***

#### 📐 **`surface`**

Surface habitable souhaitée (en m²).

**Champs disponibles** :

- `min` : Surface minimum
- `max` : Surface maximum

**Exemples** :

Surface minimum 50m² :

```json
{
  "surface": {
    "min": 50
  }
}
```

Surface entre 50m² et 100m² :

```json
{
  "surface": {
    "min": 50,
    "max": 100
  }
}
```

***

#### 🚪 **`nbPieces`**

Nombre de pièces souhaité.

**Champs disponibles** :

- `min` : Nombre minimum de pièces
- `max` : Nombre maximum de pièces

**Exemples** :

Minimum 2 pièces :

```json
{
  "nbPieces": {
    "min": 2
  }
}
```

Entre 2 et 4 pièces :

```json
{
  "nbPieces": {
    "min": 2,
    "max": 4
  }
}
```

⚠️ **Note** : Pour PAP.fr, le nombre de pièces inclut la cuisine.

***

#### 🏷️ **`tags`**

Critères avancés et équipements spécifiques.

**Pour VENTE** :

- `"ascenseur"` - Immeuble avec ascenseur
- `"balcon-terrasse"` - Balcon ou terrasse
- `"dernier-etage"` - Dernier étage
- `"piscine"` - Piscine
- `"garages-parkings"` - Garage ou parking
- `"acces-handicape"` - Accès handicapé
- `"investissement-locatif"` - Investissement locatif
- `"visite-virtuelle"` - Visite virtuelle disponible
- `"duplex-triplex"` - Duplex ou triplex

**Pour LOCATION** :

- `"vide"` - Location vide
- `"meuble"` - Location meublée
- `"coloc"` - Colocation
- `"etudiant"` - Logement étudiant
- `"ascenseur"` - Immeuble avec ascenseur
- `"balcon-terrasse"` - Balcon ou terrasse
- `"piscine"` - Piscine
- `"garages-parkings"` - Garage ou parking

**Exemples** :

```json
{
  "tags": ["ascenseur", "balcon-terrasse"]
}
```

```json
{
  "tags": ["meuble", "etudiant"]
}
```

***

#### 🏗️ **`neufExclus`**

Masquer les logements neufs (uniquement pour la **vente**).

**Type** : Boolean

**Exemple** :

```json
{
  "neufExclus": true
}
```

***

#### 🔢 **`maxListings`**

Nombre maximum d'annonces à récupérer.

**Type** : Integer

**Valeur par défaut** : `0` (illimité)

**Exemples** :

Récupérer 50 annonces maximum :

```json
{
  "maxListings": 50
}
```

Récupérer toutes les annonces disponibles :

```json
{
  "maxListings": 0
}
```

⚠️ **Astuce** : Mettre une limite permet de réduire les coûts et le temps d'exécution. Pour tester votre configuration, commencez avec `maxListings: 10`.

***

#### 📅 **`triDate`** (Optionnel)

Ordre de tri des annonces par **date de publication**. Combiné avec `maxListings`, permet par exemple de récupérer uniquement les 50 annonces les plus récentes.

**Valeurs possibles** :

- `"aucun"` - Ordre par défaut PAP.fr (par défaut)
- `"plus-recent"` - Plus récent en premier (tri décroissant par date)
- `"plus-ancien"` - Plus ancien en premier (tri croissant par date)

**Exemples** :

Récupérer les 50 annonces les plus récentes :

```json
{
  "produit": "vente",
  "typesBien": ["appartement"],
  "localisation": {"ville": "Paris"},
  "triDate": "plus-recent",
  "maxListings": 50
}
```

Récupérer les annonces les plus anciennes (utile pour détecter les biens qui peinent à se vendre) :

```json
{
  "triDate": "plus-ancien",
  "maxListings": 50
}
```

💡 **Astuce** : Chaque annonce retournée contient aussi un champ `date_iso` (format `YYYY-MM-DD`), utilisable directement pour trier ou filtrer vos résultats dans Excel, BigQuery, etc.

***

#### 🔐 **`proxyConfig`** (Optionnel)

Configuration des proxies pour contourner les blocages IP éventuels.

**Par défaut** : Pas de proxy (connexion directe - recommandé pour PAP.fr)

**Types disponibles** :

- `"none"` - Pas de proxy (connexion directe) - **Recommandé**
- `"apify-datacenter"` - Proxy datacenter Apify (gratuit, inclus dans votre plan)
- `"apify-residential"` - Proxy résidentiel Apify (payant, plus réaliste)
- `"custom"` - Vos propres proxies personnalisés

##### Option 1 : Sans proxy (défaut - recommandé)

```json
{
  "proxyConfig": {
    "type": "none"
  }
}
```

Ou simplement omettez le champ `proxyConfig`.

✅ **Avantages** :

- Plus rapide (pas de hop proxy)
- Plus fiable (pas d'erreur 590)
- Gratuit
- PAP.fr n'a généralement pas de blocage agressif

##### Option 2 : Avec proxy Apify Datacenter

```json
{
  "proxyConfig": {
    "type": "apify-datacenter"
  }
}
```

✅ **Quand l'utiliser** :

- Si votre IP est bloquée par PAP.fr
- Si vous lancez beaucoup d'exécutions simultanées
- Gratuit (inclus dans le plan Apify)

⚠️ **Note** : Rotation d'IP automatique à chaque requête.

##### Option 3 : Avec proxy Apify Residential

```json
{
  "proxyConfig": {
    "type": "apify-residential"
  }
}
```

✅ **Quand l'utiliser** :

- Si les datacenter proxies ne fonctionnent pas
- Pour scraping intensif avec meilleure fiabilité
- IPs résidentielles réelles (plus difficiles à détecter)

💰 **Coût** : Payant (consomme vos crédits proxy résidentiel Apify)

##### Option 4 : Avec vos propres proxies

```json
{
  "proxyConfig": {
    "type": "custom",
    "customProxies": [
      "http://user:pass@proxy1.example.com:8080",
      "http://user:pass@proxy2.example.com:8080",
      "http://proxy3.example.com:3128"
    ]
  }
}
```

✅ **Quand l'utiliser** :

- Vous avez votre propre service proxy (Smartproxy, Bright Data, Oxylabs, etc.)
- Besoin de proxies spécifiques à votre région
- Rotation automatique entre vos proxies

**Format des URLs** :

- Avec authentification : `http://user:pass@proxy.com:8080`
- Sans authentification : `http://proxy.com:3128`
- Support HTTP/HTTPS

⚠️ **Important** : Si vous sélectionnez `"custom"`, le champ `customProxies` est **obligatoire**.

***

#### 📊 Comparaison des Options Proxy

| Type | Coût | Vitesse | Fiabilité | Usage |
|------|------|---------|-----------|-------|
| **None** | Gratuit | ⚡⚡⚡ Très rapide | ✅ Excellent | **Recommandé par défaut** |
| **Apify Datacenter** | Gratuit | ⚡⚡ Rapide | ✅ Bon | Si IP bloquée |
| **Apify Residential** | Payant | ⚡ Moyen | ✅✅ Excellent | Scraping intensif |
| **Custom** | Variable | Variable | Variable | Proxies personnalisés |

**Recommandation** : Commencez avec `"none"` (sans proxy). Activez un proxy seulement si vous rencontrez des blocages.

***

### 📤 Données Extraites (Output)

Chaque annonce retourne un objet JSON avec plus de **40 champs de données**.

#### Exemple de Sortie

```json
{
  "id": 457100684,
  "reference_courte": "F71/0684",
  "url": "https://www.pap.fr/annonces/appartement-paris-15e-75015-r457100684",

  "produit": "vente",
  "typebien": "appartement",
  "typebien_label": "Appartement",

  "ville": "Paris",
  "arrondissement": "Paris 15e",
  "rue": "Rue de Vaugirard",
  "code_postal": "75015",
  "code_departement": "75",
  "geoId": "37782",
  "marker": {
    "lat": 48.84156,
    "lng": 2.30452
  },

  "prix": "350 000 €",
  "prix_numerique": 350000,
  "prix_m2": "8.140 € le m²",
  "prix_m2_numerique": 8140,
  "prix_valide": true,

  "nb_pieces": 2,
  "nb_chambres_max": 1,
  "surface": 43,
  "etage": 3,

  "titre": "Vente appartement 2 pièces 43 m² Paris 15E (75015)",
  "texte": "Appartement de 2 pièces situé au 3ᵉ étage avec ascenseur...",

  "photos_urls": [
    "https://cdn.pap.fr/photos/pap/d9/01/d901...d-p1.jpg",
    "https://cdn.pap.fr/photos/pap/ba/70/ba70...b-p1.jpg",
    "https://cdn.pap.fr/photos/pap/fb/9a/fb9a...f-p1.jpg"
  ],

  "equipements": {
    "ascenseur": true,
    "piscine": false,
    "balcon": true,
    "terrasse": false,
    "parking": false,
    "garage": false,
    "cave": true,
    "jardin": false,
    "climatisation": false
  },

  "classe_energie": {
    "lettre": "d",
    "description": "Logement avec classe énergie D"
  },
  "classe_ges": {
    "lettre": "d",
    "description": "Logement avec classe GES D"
  },

  "transports": [
    {
      "type": "metro",
      "ligne": "12",
      "label": "Métro 12"
    },
    {
      "type": "bus",
      "ligne": "39",
      "label": "Bus 39"
    }
  ],

  "telephones": ["06 12 34 56 78"],
  "has_email": true,

  "date": "04 novembre 2025",
  "date_iso": "2025-11-04",
  "__scrapedAt": "2025-11-04T13:45:32.123Z"
}
```

***

#### 📋 Description des Champs

##### 🆔 Identifiants

- **`id`** : Identifiant unique de l'annonce
- **`reference_courte`** : Référence PAP (ex: "F71/0684")
- **`url`** : URL complète de l'annonce

##### 🏷️ Type de Bien

- **`produit`** : Type de transaction (`"vente"`, `"location"`, etc.)
- **`typebien`** : Type de bien (slug)
- **`typebien_label`** : Type de bien (label lisible)

##### 📍 Localisation

- **`ville`** : Nom de la ville
- **`arrondissement`** : Arrondissement précis (ex: "Paris 15e")
- **`rue`** : Nom de la rue
- **`code_postal`** : Code postal
- **`code_departement`** : Code département (2 chiffres)
- **`geoId`** : Identifiant géographique PAP.fr
- **`marker`** : Coordonnées GPS
  - `lat` : Latitude
  - `lng` : Longitude

⚠️ **Note** : GPS peut être `null` si le propriétaire n'affiche pas la carte.

##### 💰 Prix

- **`prix`** : Prix formaté (ex: "350 000 €")
- **`prix_numerique`** : Prix en nombre (ex: 350000)
- **`prix_m2`** : Prix au m² formaté
- **`prix_m2_numerique`** : Prix au m² en nombre
- **`prix_valide`** : Boolean (prix validé par PAP)
- **`mensualite`** : Mensualité estimée (vente uniquement)
- **`frais_notaire`** : Frais de notaire estimés (vente)

##### 📐 Caractéristiques

- **`nb_pieces`** : Nombre de pièces
- **`nb_chambres_max`** : Nombre de chambres
- **`surface`** : Surface habitable (m²)
- **`surface_terrain`** : Surface terrain (m²) - maisons
- **`etage`** : Numéro d'étage (0 = RDC, `"dernier"` = dernier étage)

##### 📝 Description

- **`titre`** : Titre de l'annonce
- **`texte`** : Description complète
- **`caracteristiques`** : Résumé des caractéristiques

##### 📸 Photos

- **`photos_urls`** : Array complet de toutes les photos (10-20 photos généralement)

**Exemple** :

```json
{
  "photos_urls": [
    "https://cdn.pap.fr/photos/pap/d9/01/d901...d-p1.jpg",
    "https://cdn.pap.fr/photos/pap/ba/70/ba70...b-p1.jpg",
    "https://cdn.pap.fr/photos/pap/fb/9a/fb9a...f-p1.jpg"
  ]
}
```

##### 🔧 Équipements

Object avec booléens indiquant la présence d'équipements :

```json
{
  "equipements": {
    "ascenseur": true,
    "piscine": false,
    "balcon": true,
    "terrasse": false,
    "parking": false,
    "garage": false,
    "cave": true,
    "jardin": false,
    "climatisation": false
  }
}
```

**Équipements détectés** :

- `ascenseur` - Ascenseur dans l'immeuble
- `piscine` - Piscine privée ou résidence
- `balcon` - Balcon
- `terrasse` - Terrasse
- `parking` - Place de parking
- `garage` - Garage
- `cave` - Cave
- `jardin` - Jardin privatif
- `climatisation` - Climatisation

##### 🌡️ Performance Énergétique

- **`classe_energie`** : Diagnostic de Performance Énergétique (DPE)
  - `lettre` : A à G
  - `description` : Description textuelle

- **`classe_ges`** : Émissions de Gaz à Effet de Serre (GES)
  - `lettre` : A à G
  - `description` : Description textuelle

**Exemple** :

```json
{
  "classe_energie": {
    "lettre": "d",
    "description": "Logement avec classe énergie D"
  },
  "classe_ges": {
    "lettre": "c",
    "description": "Logement avec classe GES C"
  }
}
```

⚠️ **Note** : Peut être `null` si non renseigné par le propriétaire.

##### 🚇 Transports à Proximité

Array d'objets décrivant les transports en commun proches :

```json
{
  "transports": [
    {
      "type": "metro",
      "ligne": "12",
      "label": "Métro 12"
    },
    {
      "type": "rer",
      "ligne": "B",
      "label": "RER B"
    },
    {
      "type": "tram",
      "ligne": "3A",
      "label": "Tram 3A"
    },
    {
      "type": "bus",
      "ligne": "39",
      "label": "Bus 39"
    }
  ]
}
```

**Types** : `"metro"`, `"rer"`, `"tram"`, `"bus"`

##### 📞 Contact

- **`telephones`** : Array de numéros de téléphone (`["06 12 34 56 78"]`)
- **`has_email`** : Boolean (`true` si contact email disponible)
- **`affiche_demarchage_refuse`** : Boolean (propriétaire refuse démarchage commercial)

⚠️ **Important** : Respectez ce choix du propriétaire. Ne contactez pas pour des démarches commerciales si `affiche_demarchage_refuse` est `true`.

##### 📅 Métadonnées

- **`date`** : Date de publication au format texte français (`"04 novembre 2025"`)
- **`date_iso`** : Date de publication au format ISO `YYYY-MM-DD` (`"2025-11-04"`) - pratique pour trier et filtrer
- **`__scrapedAt`** : Date/heure du scraping (ISO 8601)

***

### 📝 Exemples d'Utilisation

#### Exemple 1 : Appartements Paris Budget 500k€

**Besoin** : Trouver des appartements à Paris, minimum 2 pièces, maximum 500 000 €, surface minimum 30m².

**Configuration** :

```json
{
  "produit": "vente",
  "typesBien": ["appartement"],
  "localisation": {
    "ville": "Paris"
  },
  "nbPieces": {
    "min": 2
  },
  "prix": {
    "max": 500000
  },
  "surface": {
    "min": 30
  },
  "maxListings": 50
}
```

**Résultat** : 50 appartements correspondant aux critères.

***

#### Exemple 2 : Location Meublée Lyon

**Besoin** : Appartements meublés à louer à Lyon, 2+ pièces, maximum 1500€/mois.

**Configuration** :

```json
{
  "produit": "location",
  "typesBien": ["appartement"],
  "localisation": {
    "ville": "Lyon"
  },
  "nbPieces": {
    "min": 2
  },
  "tags": ["meuble"],
  "prix": {
    "max": 1500
  },
  "maxListings": 100
}
```

**Résultat** : Jusqu'à 100 appartements meublés correspondant aux critères.

***

#### Exemple 3 : Maisons Avec Jardin Bordeaux

**Besoin** : Maisons avec jardin à vendre à Bordeaux, minimum 100m², budget 400-600k€.

**Configuration** :

```json
{
  "produit": "vente",
  "typesBien": ["maison"],
  "localisation": {
    "ville": "Bordeaux"
  },
  "surface": {
    "min": 100
  },
  "prix": {
    "min": 400000,
    "max": 600000
  },
  "maxListings": 0
}
```

**Note** : `maxListings: 0` récupère TOUTES les annonces correspondantes.

***

#### Exemple 4 : Investissement Locatif

**Besoin** : Petits appartements (studios/2 pièces) pour investissement locatif à Nice, avec ascenseur.

**Configuration** :

```json
{
  "produit": "vente",
  "typesBien": ["appartement"],
  "localisation": {
    "ville": "Nice"
  },
  "nbPieces": {
    "max": 2
  },
  "tags": ["ascenseur", "investissement-locatif"],
  "prix": {
    "max": 200000
  },
  "maxListings": 50
}
```

***

#### Exemple 5 : Recherche Nationale

**Besoin** : Maisons à vendre partout en France, sans critère géographique, entre 150-250k€.

**Configuration** :

```json
{
  "produit": "vente",
  "typesBien": ["maison"],
  "prix": {
    "min": 150000,
    "max": 250000
  },
  "maxListings": 200
}
```

**Note** : Absence de `localisation` = recherche nationale.

***

### 🎯 Cas d'Usage

#### 🏢 Agents Immobiliers

- **Veille concurrentielle** : Surveiller les prix du marché dans votre secteur
- **Prospection** : Identifier des biens correspondant aux critères de vos clients
- **Analyse de marché** : Étudier l'évolution des prix par quartier

#### 💼 Investisseurs

- **Opportunités** : Trouver des biens rentables pour investissement locatif
- **Analyse ROI** : Calculer le rendement potentiel avec prix d'achat + loyer estimé
- **Diversification** : Explorer différentes villes et types de biens

#### 📊 Data Analysts

- **Études de marché** : Analyser les tendances immobilières par région
- **Prix au m²** : Comparer les prix entre quartiers et villes
- **Visualisations** : Créer des cartes de chaleur avec les coordonnées GPS

#### 🤖 Développeurs

- **Alertes automatiques** : Créer des notifications pour nouvelles annonces
- **Comparateurs** : Construire des outils de comparaison d'annonces
- **Applications** : Intégrer les données dans vos apps immobilières

#### 🎓 Chercheurs

- **Études sociologiques** : Analyser l'évolution du marché immobilier
- **Machine Learning** : Entraîner des modèles de prédiction de prix
- **Géographie urbaine** : Étudier la répartition géographique de l'offre

***

### ⚡ Performance

- **Rapidité** : 100 annonces récupérées en ~27 secondes (sans proxy)
- **Fiabilité** : Taux de succès de 100% avec retry automatique
- **Pagination automatique** : Scrape toutes les pages nécessaires
- **Économique** : Connexion directe par défaut (gratuit), proxies optionnels disponibles

***

### ⚠️ Limites et Bonnes Pratiques

#### Limites Connues

1. **GPS** : Peut être `null` si le propriétaire n'affiche pas la carte sur l'annonce
2. **Leasing** : Très peu d'annonces disponibles sur PAP.fr (produit peu utilisé)
3. **DPE/GES** : Optionnels, peuvent être `null` si non renseignés
4. **Téléphones** : Peuvent être masqués si le propriétaire ne les affiche pas publiquement

#### Bonnes Pratiques

1. **Commencez petit** : Testez avec `maxListings: 10` pour valider votre configuration
2. **Affinez vos critères** : Plus vos critères sont précis, meilleurs seront les résultats
3. **Respectez les propriétaires** : Ne contactez pas les annonces avec `affiche_demarchage_refuse: true` pour du démarchage commercial
4. **Planifiez vos exécutions** : Utilisez les Schedules Apify pour des exécutions régulières (quotidiennes, hebdomadaires)

***

### 🔗 À Propos de PAP.fr

**PAP.fr** (De Particulier à Particulier) est le premier site d'annonces immobilières entre particuliers en France. Créé en 1995, il permet aux propriétaires de publier leurs annonces directement, sans passer par une agence immobilière.

**Avantages de scraper PAP.fr** :

- 💰 Pas de frais d'agence (économies pour les acheteurs)
- 🏠 Annonces directes propriétaires (négociation possible)
- 📍 Couverture nationale (toute la France)
- 🔄 Mises à jour fréquentes (nouvelles annonces quotidiennes)

***

### 💡 Support

Pour toute question ou demande d'assistance :

- **Documentation Apify** : <https://docs.apify.com>
- **Forum Apify** : <https://community.apify.com>

***

### 📜 Mentions Légales

Cet Actor est fourni à des fins d'information et d'analyse de données publiques. Assurez-vous de respecter :

- Les Conditions d'Utilisation de PAP.fr
- Le RGPD pour le traitement des données personnelles
- Les lois sur la protection des données de votre juridiction

L'utilisation commerciale des données extraites doit respecter les droits des propriétaires des annonces.

***

**Dernière mise à jour** : Avril 2026

# Actor input Schema

## `produit` (type: `string`):

Type de transaction immobilière recherchée

## `typesBien` (type: `array`):

Sélectionnez les types de biens à rechercher. Format JSON: \["appartement", "maison"]. Laissez vide pour tous les types. Note: le leasing accepte uniquement maison et appartement.

## `localisation` (type: `object`):

Ville de recherche. L'autocomplete récupère automatiquement le code département et geoId via l'API PAP.fr.

## `nbPieces` (type: `object`):

Formats: {"values": \[2,3]} pour 2 OU 3 pièces, ou {"min": 2} pour minimum 2 pièces

## `nbChambresMin` (type: `integer`):

Nombre minimum de chambres (1 à 6). Laissez vide pour tous.

## `prix` (type: `object`):

Prix en euros. Formats: {"max": 500000}, {"min": 200000}, ou {"min": 150000, "max": 400000}. Pour location = loyer mensuel.

## `surface` (type: `object`):

Surface en m². Formats: {"min": 50}, {"max": 100}, ou {"min": 40, "max": 70}

## `surfaceTerrain` (type: `object`):

Pour maisons avec jardin ou terrains. Format: {"min": 500, "max": 2000}

## `tags` (type: `array`):

Tags spécifiques. Format JSON: \["ascenseur", "piscine"]. VENTE: ascenseur, balcon-terrasse, piscine, dernier-etage, garages-parkings, visite-virtuelle, duplex-triplex. LOCATION: vide, meuble, coloc, etudiant.

## `neufExclus` (type: `boolean`):

Uniquement pour la vente. Exclut les programmes neufs des résultats.

## `maxListings` (type: `integer`):

Limite le nombre d'annonces scrapées. 0 = illimité (scrape toutes les annonces trouvées)

## `triDate` (type: `string`):

Ordre de tri des annonces retournées par PAP.fr. Combiné avec maxListings, permet de récupérer par exemple les 50 annonces les plus récentes.

## `proxyConfig` (type: `object`):

Configuration des proxies. Par défaut: Apify Residential (REQUIS pour contourner Cloudflare sur PAP.fr). Les IP datacenter et directes sont systématiquement bloquées.

## Actor input object example

```json
{
  "produit": "vente",
  "typesBien": [
    "appartement"
  ],
  "localisation": {
    "ville": "Paris"
  },
  "nbPieces": {
    "min": 2
  },
  "prix": {
    "max": 500000
  },
  "surface": {
    "min": 30
  },
  "neufExclus": false,
  "maxListings": 50,
  "triDate": "aucun",
  "proxyConfig": {
    "type": "apify-residential"
  }
}
```

# 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 = {
    "typesBien": [
        "appartement"
    ],
    "localisation": {
        "ville": "Paris"
    },
    "nbPieces": {
        "min": 2
    },
    "prix": {
        "max": 500000
    },
    "surface": {
        "min": 30
    },
    "proxyConfig": {
        "type": "apify-residential"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devnaz/pap-fr-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 = {
    "typesBien": ["appartement"],
    "localisation": { "ville": "Paris" },
    "nbPieces": { "min": 2 },
    "prix": { "max": 500000 },
    "surface": { "min": 30 },
    "proxyConfig": { "type": "apify-residential" },
}

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

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

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

```

## CLI example

```bash
echo '{
  "typesBien": [
    "appartement"
  ],
  "localisation": {
    "ville": "Paris"
  },
  "nbPieces": {
    "min": 2
  },
  "prix": {
    "max": 500000
  },
  "surface": {
    "min": 30
  },
  "proxyConfig": {
    "type": "apify-residential"
  }
}' |
apify call devnaz/pap-fr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=devnaz/pap-fr-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Pap.fr Scraper",
        "description": "Scraper d'annonces immobilières du site **PAP.fr** (De Particulier à Particulier) qui permet de récupérer des annonces de vente, location et leasing avec des critères de recherche structurés.",
        "version": "1.0",
        "x-build-id": "ceaxc4MnvCLDancB7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/devnaz~pap-fr-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-devnaz-pap-fr-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/devnaz~pap-fr-scraper/runs": {
            "post": {
                "operationId": "runs-sync-devnaz-pap-fr-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/devnaz~pap-fr-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-devnaz-pap-fr-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "produit"
                ],
                "properties": {
                    "produit": {
                        "title": "Type de produit ⭐ OBLIGATOIRE",
                        "enum": [
                            "vente",
                            "location",
                            "leasing"
                        ],
                        "type": "string",
                        "description": "Type de transaction immobilière recherchée",
                        "default": "vente"
                    },
                    "typesBien": {
                        "title": "Types de bien",
                        "type": "array",
                        "description": "Sélectionnez les types de biens à rechercher. Format JSON: [\"appartement\", \"maison\"]. Laissez vide pour tous les types. Note: le leasing accepte uniquement maison et appartement."
                    },
                    "localisation": {
                        "title": "🌍 Localisation",
                        "type": "object",
                        "description": "Ville de recherche. L'autocomplete récupère automatiquement le code département et geoId via l'API PAP.fr.",
                        "properties": {
                            "ville": {
                                "title": "Ville",
                                "type": "string",
                                "description": "Nom de la ville"
                            },
                            "codeDepartement": {
                                "title": "Code Département",
                                "type": "string",
                                "description": "Optionnel - Auto-complété si non fourni"
                            },
                            "geoId": {
                                "title": "Geo ID",
                                "type": "string",
                                "description": "Optionnel - Auto-complété si non fourni"
                            }
                        }
                    },
                    "nbPieces": {
                        "title": "🚪 Nombre de pièces",
                        "type": "object",
                        "description": "Formats: {\"values\": [2,3]} pour 2 OU 3 pièces, ou {\"min\": 2} pour minimum 2 pièces"
                    },
                    "nbChambresMin": {
                        "title": "🛏️ Nombre minimum de chambres",
                        "minimum": 1,
                        "maximum": 6,
                        "type": "integer",
                        "description": "Nombre minimum de chambres (1 à 6). Laissez vide pour tous."
                    },
                    "prix": {
                        "title": "💰 Prix",
                        "type": "object",
                        "description": "Prix en euros. Formats: {\"max\": 500000}, {\"min\": 200000}, ou {\"min\": 150000, \"max\": 400000}. Pour location = loyer mensuel."
                    },
                    "surface": {
                        "title": "📐 Surface du bien (m²)",
                        "type": "object",
                        "description": "Surface en m². Formats: {\"min\": 50}, {\"max\": 100}, ou {\"min\": 40, \"max\": 70}"
                    },
                    "surfaceTerrain": {
                        "title": "🌳 Surface du terrain (m²)",
                        "type": "object",
                        "description": "Pour maisons avec jardin ou terrains. Format: {\"min\": 500, \"max\": 2000}"
                    },
                    "tags": {
                        "title": "🏷️ Critères avancés (Tags)",
                        "type": "array",
                        "description": "Tags spécifiques. Format JSON: [\"ascenseur\", \"piscine\"]. VENTE: ascenseur, balcon-terrasse, piscine, dernier-etage, garages-parkings, visite-virtuelle, duplex-triplex. LOCATION: vide, meuble, coloc, etudiant."
                    },
                    "neufExclus": {
                        "title": "🏗️ Masquer les logements neufs",
                        "type": "boolean",
                        "description": "Uniquement pour la vente. Exclut les programmes neufs des résultats.",
                        "default": false
                    },
                    "maxListings": {
                        "title": "🔢 Nombre maximum d'annonces",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Limite le nombre d'annonces scrapées. 0 = illimité (scrape toutes les annonces trouvées)",
                        "default": 50
                    },
                    "triDate": {
                        "title": "📅 Tri par date de publication",
                        "enum": [
                            "aucun",
                            "plus-recent",
                            "plus-ancien"
                        ],
                        "type": "string",
                        "description": "Ordre de tri des annonces retournées par PAP.fr. Combiné avec maxListings, permet de récupérer par exemple les 50 annonces les plus récentes.",
                        "default": "aucun"
                    },
                    "proxyConfig": {
                        "title": "🔐 Configuration Proxy",
                        "type": "object",
                        "description": "Configuration des proxies. Par défaut: Apify Residential (REQUIS pour contourner Cloudflare sur PAP.fr). Les IP datacenter et directes sont systématiquement bloquées.",
                        "properties": {
                            "type": {
                                "title": "Type de proxy",
                                "type": "string",
                                "description": "Type de proxy à utiliser. 'apify-residential' recommandé — PAP.fr bloque les autres options.",
                                "enum": [
                                    "apify-residential",
                                    "apify-datacenter",
                                    "custom",
                                    "none"
                                ],
                                "default": "apify-residential"
                            },
                            "customProxies": {
                                "title": "Proxies personnalisés",
                                "type": "array",
                                "description": "Liste d'URLs de proxies personnalisés. Format: [\"http://user:pass@proxy1.com:8080\", \"http://proxy2.com:3128\"]. Obligatoire si type = 'custom'.",
                                "items": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
