# Laforêt France Agencies · Managers, Teams & Phones (`corent1robert/laforet-france-agences`) Actor

Export every Laforêt real estate agency in France: phone, address, GPS, opening hours, rating, number of listings, manager and the named team with roles (plus RSAC number when the agency publishes it). One row per agency or one row per team member. No login.

- **URL**: https://apify.com/corent1robert/laforet-france-agences.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 77.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 agencies

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

## Laforêt France Agencies · Managers, Teams & Phones

Export every **Laforêt real estate agency in France** with its **phone, address, GPS, opening hours, rating, number of listings, manager and named team** (first name, last name, role). One row per agency, or one row per team member for a direct CRM import.

**The whole Laforêt network (712 agencies) in one run. No login. No API key.**

### Who is this for?

| Persona | Typical goal | Suggested setup |
|---|---|---|
| Real estate network recruiters (mandataire networks, franchises) | Reach agency managers and negotiators by city | One row per: Team member, Departments: your region |
| Proptech and software vendors (CRM, e-signature, virtual tours) | Call agency managers with a named contact | One row per: Agency, Departments: empty |
| Diagnostic, mortgage broker and home-service partners | Build local agency partnerships | Departments: your area, Cities: your towns |
| Franchise developers and M\&A advisors | Map Laforêt coverage, team sizes and listing volume | One row per: Agency, Max rows: 0 |
| Market researchers | Compare agency density and ratings by department | One row per: Agency, Departments: a few |

**What you get by default.** One row per agency with phone, address, GPS, hours, rating, listings for sale and for rent, the manager and the full named team. On a sample of 60 agencies spread across France, 97% publish a named team, 92% name a manager, and teams average 6.8 people. Agencies do not publish email addresses on their Laforêt page, so rows carry the agency phone, not an email. A few agencies publish the RSAC number of their self-employed agents; the Actor extracts it when present (rare: 2 of 405 people in the sample).

### Quick start

1. Optionally type **department codes** (75 is preselected). Leave empty for the whole network.
2. Choose **one row per agency** or **one row per team member**.
3. Click **Start**. Rows appear as soon as each agency is read.

Free Apify accounts get up to 20 rows per run. Paid plans export the full network.

### Ready-made examples

- Paris Laforêt agencies with managers and phones: `{"departments": ["75"]}`
- Lyon and Rhône agency teams, one row per person: `{"departments": ["69"], "outputMode": "people"}`
- The whole Laforêt network in France: `{"maxItems": 0}`
- Bordeaux and Gironde agencies: `{"departments": ["33"]}`

### What it extracts

- **Agency:** Laforêt agency ID, name, phone (E.164 and display), street address, postal code, city, department, latitude, longitude, opening hours, rating and review count, listings for sale, listings for rent, Laforêt page URL.
- **People:** manager name and role, full team with first name, last name, role, role category (manager, sales, rental and property management, assistant, independent agent) and RSAC number when published.

### Fill rates

Real run of 20 agencies in Paris (local run, 15 October 2026):

| Field | Fill rate |
|---|---|
| Phone | 100% |
| Address, postal code, city, GPS | 100% |
| Opening hours | 100% |
| Rating | 90% |
| Listings for sale | 100% |
| Manager | 95% |
| Named team | 100% |
| Email | 0% (not published by the network) |

One row per person (20 rows, Gironde, Rhône and Haute-Garonne): full name, role, agency phone and address 100%.

### Limitations

- No email addresses: Laforêt agency pages only show a phone and a contact form.
- Team members are listed with their role, not their direct phone.
- RSAC numbers appear only when the agency publishes them.
- Ratings are the reviews shown on the Laforêt page; agencies without reviews have no rating.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `departments` | array | `["75"]` | Department codes such as `75`, `31`, `69`, `2A`. Empty = whole network. |
| `cities` | array | empty | Keep agencies whose city or postal code contains one of these values. |
| `outputMode` | string | `agencies` | `agencies` (one row per agency, team as a list) or `people` (one row per team member). |
| `maxItems` | integer | `20` | Stop after this many rows. `0` = no cap. |

API-only options (not in the form): `concurrency` (parallel agency pages, default 4, max 8), `onlyIndependentAgents` (keep only rows with an RSAC number), `verboseLogs` (technical log lines for debugging).

```json
{
  "departments": ["33", "69"],
  "outputMode": "people",
  "maxItems": 500
}
```

### How it works

1. Reads the Laforêt agency directory: the department pages you asked for, or the full network list when no department is set.
2. Opens each agency page and reads its public structured data (phone, address, GPS, hours, rating) and the "Our team" section.
3. Each row is billed and pushed as soon as it is complete.

### Output sample

Real row from a test run (15 October 2026), team shortened to two people:

```json
{
  "agency_id": "385502",
  "agency_name": "Laforêt PARIS 19 JOURDAIN",
  "phone": "+33148037171",
  "phone_display": "01 48 03 71 71",
  "address": "161 rue de Belleville",
  "postal_code": "75019",
  "city": "PARIS 19EME",
  "department_code": "75",
  "department": "Paris",
  "latitude": 48.875524,
  "longitude": 2.391313,
  "rating": 4.6,
  "review_count": 63,
  "listings_for_sale": 11,
  "listings_for_rent": null,
  "manager_name": "Julien GAGO",
  "manager_role": "Gérant",
  "team": [
    {
      "name": "Julien GAGO",
      "first_name": "Julien",
      "last_name": "GAGO",
      "role": "Gérant",
      "role_category": "manager",
      "rsac_siren": null
    },
    {
      "name": "PORTE Maxime",
      "first_name": "PORTE",
      "last_name": "Maxime",
      "role": "Conseiller immobilier",
      "role_category": "sales",
      "rsac_siren": null
    }
  ],
  "team_size": 2,
  "profile_url": "https://www.laforet.com/agence-immobiliere/paris19jourdain"
}
```

### How much does it cost to scrape Laforêt agencies?

Pay per event: $0.05 per run, then one charge per row. An agency row costs $0.003 (Free plan) down to $0.002 (Diamond). A team member row costs $0.001 down to $0.0006 ($0.002 down to $0.0012 when an RSAC number is published).

| Scenario | Free | Gold | Diamond |
|---|---|---|---|
| 20 agencies (Free plan test) | $0.11 | $0.10 | $0.09 |
| One department, 25 agencies | $0.12 | $0.11 | $0.10 |
| Whole network, 712 agencies | $2.19 | $1.69 | $1.47 |
| Whole network, one row per person (about 4,842 people) | $4.89 | $3.44 | $2.96 |

You can set a maximum cost per run in Apify: the Actor stops cleanly when your budget is reached and never exports a row it could not charge.

### Is it legal to scrape Laforêt agencies?

This Actor collects business information that agencies publish on their public pages: agency contact details and the names and roles of their staff. It does not log in and does not extract private user data. Personal data is protected by GDPR in the EU and by other laws worldwide; you should not collect it without a legitimate reason, and B2B prospecting must respect the right to object. If you are unsure, consult a lawyer. See also Apify's blog post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Also available

- [Century 21 France Agencies · SIREN, Managers & Phones](https://apify.com/corent1robert/century21-france-agences)
- [Nestenn Agences · Agency Emails & Phones France](https://apify.com/corent1robert/nestenn-agences-scraper)
- [SAFTI France consultants](https://apify.com/corent1robert/safti-france-consultants)
- [French Real Estate Agents · Multi-Network CRM](https://apify.com/corent1robert/fr-realty-agents-hub)

### Local development

```bash
npm install
npm test                      # unit tests (node --test)
apify run --input-file=.actor/INPUT.json
```

### Contact

Questions, a custom field or a bigger export: corentin@outreacher.fr

# Changelog

This Actor's version history is a separate document: https://apify.com/corent1robert/laforet-france-agences/changelog.md

# Actor input Schema

## `departments` (type: `array`):

Department codes, e.g. 75, 31, 69, 2A. Empty = the whole network in France.

## `cities` (type: `array`):

Keep agencies whose city or postal code contains one of these values.

## `outputMode` (type: `string`):

Agencies: one row per agency with its team as a list. Team members: one row per person (CRM import).

## `maxItems` (type: `integer`):

Stop after this many rows. 0 = no cap. Free Apify accounts are capped at 20 rows per run.

## Actor input object example

```json
{
  "departments": [
    "75"
  ],
  "outputMode": "agencies",
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

Agency overview (agency mode).

## `contacts` (type: `string`):

Phone, manager, address and GPS.

## `people` (type: `string`):

One row per person (team member mode).

## `results` (type: `string`):

Every field for every row.

## `runLog` (type: `string`):

Readable summary of the run.

# 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 = {
    "departments": [
        "75"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/laforet-france-agences").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 = {
    "departments": ["75"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/laforet-france-agences").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 '{
  "departments": [
    "75"
  ],
  "maxItems": 20
}' |
apify call corent1robert/laforet-france-agences --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/laforet-france-agences"
        }
    }
}
```

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/ohb4tpgDWIT4YebBM/builds/yxkdKslpYeRwJ3nid/openapi.json
