# Efficity Consultants · Full profiles infos (emails, phones) (`corent1robert/efficity-consultants`) Actor

Export Efficity consultants: names, phones, emails, areas, Immodvisor. Full France directory or paste profile URLs. CRM-ready JSON/CSV.

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

## Pricing

from $2.79 / 1,000 advisor with emails

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Efficity Consultants Scraper

Export **Efficity** independent real estate consultants (mandataires) from the public directory at [efficity.com/consultants-immobiliers](https://www.efficity.com/consultants-immobiliers/). You get **export-ready rows**: names, phones, emails, coverage hints, Immodvisor signals, specialties, services, and full presentation text — for CRM, prospecting, or market mapping.

**Built for:** Lead lists · Territory mapping · CRM enrichment · Market research

**Custom automation or integrations:** <corentin@outreacher.fr>

***

### What does it do?

| Mode | What you get | Best for |
|------|----------------|----------|
| **Full directory** | Every consultant discovered on the public annuaire (cities, departments, regions), then one row per profile | National or large-scale export |
| **URLs** | Only the profile pages you paste | Refreshing or enriching an existing list |

The site serves **HTML in the first response**; this Actor uses **HTTP + Cheerio** (no browser). Emails hidden behind Cloudflare are **decoded** when `data-cfemail` is present.

**Try Apify** and the **Free plan** export **20 consultants** per run so the sample finishes inside the 5-minute Store timeout. Paying Console runs with a longer timeout and `maxResults: 0` still take the full directory.

***

### How it works

1. **Full directory:** Load the national consultants index, collect every listing URL (`v_` / `d_` / `r_`), then **fetch listing pages with a bounded worker pool** (your **Directory parallelism** input, default 40). As soon as one request finishes, the next URL starts — better throughput than waiting for a whole batch to finish. Slugs are deduplicated as pages are processed.
2. **URLs:** Parse your `efficity.com/{slug}/` links into slugs (duplicates removed).
3. **Profiles:** Same pool pattern for profile URLs (**Profile parallelism**, default **55**). Each slot runs fetch → Cheerio parse → `pushData` so rows appear in the dataset while the run is still downloading other profiles.
4. **Local only:** After a successful run, write **`output.csv`** next to the project (UTF-8 BOM, `;` separator) for Excel.

***

### Output fields

| Category | Fields |
|----------|--------|
| **Identity** | `slug`, `displayName`, `headline`, `subtitle` |
| **Geography** | `ville`, `departement` (from page analytics when present) |
| **Contact** | `phones`, `email`, `profileUrl`, `photoUrl` |
| **Trust / ratings** | `immodvisorRating`, `immodvisorUrl`, `immodvisorRecommendations` |
| **Offer** | `specialties`, `services` |
| **Copy** | `aboutBrief`, `aboutFull`, `metaDescription`, `ogDescription` |
| **Local context** | `priceM2Estimate` (m² price band when shown on the profile) |

Use the Dataset view **Consultants — Overview** for a slim table; the default dataset contains full rows.

***

### Sample output (one consultant)

```json
{
  "slug": "apoisneau",
  "profileUrl": "https://www.efficity.com/apoisneau/",
  "displayName": "Alexandre POISNEAU",
  "subtitle": "Votre Consultant immobilier à Bruz",
  "ville": "Bruz",
  "departement": "35",
  "phones": ["+33 6 61 96 67 65"],
  "email": "apoisneau@efficity.com",
  "specialties": ["Immobilier ancien", "Location"],
  "services": ["Estimation offerte sur place", "Accompagnement personnalisé"]
}
```

***

### Run log and status

- **Console / Apify log:** Phase banners (`====`), progress lines, counts, and duration — **English only**.
- **RUN\_LOG:** The same lines are written to the **default key-value store** as `RUN_LOG` (text) so you can follow progress while the run is active.
- **Run page:** On Apify Cloud, short **status messages** describe the current phase (listing, fetching profiles, done).

***

### Quick start (Apify Console)

1. Create a run and choose **Full directory** or **URLs**.
2. For **URLs**, paste profile links such as `https://www.efficity.com/apoisneau/`.
3. Optional: set **Max consultants** to a small number for a trial (**Full directory** only).
4. Open **Dataset** for JSON/CSV export, or **Key-value store → RUN\_LOG** for live text progress.

***

### Input examples

**Full directory (no cap):**

```json
{
  "mode": "list"
}
```

**Full directory — first 50 consultants after listing:**

```json
{
  "mode": "list",
  "maxResults": 50
}
```

**Specific profiles:**

```json
{
  "mode": "urls",
  "startUrls": [
    { "url": "https://www.efficity.com/apoisneau/" },
    { "url": "https://www.efficity.com/gbrossaud/" }
  ]
}
```

***

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `list` | `list` (full directory) or `urls` (your links only) |
| `startUrls` | array | `[]` | Consultant profile URLs (`urls` mode) |
| `maxResults` | integer | `0` | Max consultants after listing (`0` = no limit) |
| `concurrency` | integer | `55` | Max concurrent profile pipelines (fetch + parse + dataset push) |
| `listConcurrency` | integer | `40` | Max concurrent directory pages (`list` mode) |
| `fetchTimeout` | integer | `45000` | Per-request timeout (ms) |

***

### Local development

```bash
npm install
npm test
apify run
```

- **`input.json`** is read only for local runs (`!Actor.isAtHome()`), then merged under `Actor.getInput()` so CLI/API input wins. On Apify Cloud, `input.json` is ignored so run input is never overwritten by a stray file.
- Results: **`storage/datasets/default/`** (JSON items).
- **`output.csv`** is written at the project root after a successful local run (fixed column order; lists joined with `|`; see **How it works**).

***

### Important

- **Terms and law:** Use scraped data in line with Efficity’s terms and applicable privacy law (e.g. GDPR for personal data).
- **Immodvisor:** Links on a profile may point to **network-level** Immodvisor pages; values are exported as shown on the site.
- **Full runs:** A national export issues hundreds of directory requests plus one request per consultant; default **timeout** and **memory** are set for long runs (see `actor.json`). If the site throttles or returns errors, lower **Directory parallelism** and **Profile parallelism** (defaults **40** / **55**; caps **80** / **100**). Progress **ETA** stabilizes after the first ~20 profiles (early estimates can be noisy).

***

### Also available — French real estate advisors

Need several French networks in one CRM file? **[French Real Estate Agents · Multi-network](https://apify.com/corent1robert/fr-realty-agents-hub)**.

| Actor | What you get |
|-------|----------------|
| **[French Real Estate Agents · Multi-network](https://apify.com/corent1robert/fr-realty-agents-hub)** | Several French brands in one CRM table |
| **[Optimhome Advisors](https://apify.com/corent1robert/optimhome-conseillers)** | Optimhome — names, phones, emails, RSAC |
| **[IAD France Advisors](https://apify.com/corent1robert/iad-scraper)** | IAD mandataires — names, phones, emails |
| **[Keller Williams France](https://apify.com/corent1robert/kw-france-conseillers-scraper)** | KW advisors — emails, phones |
| **[SAFTI](https://apify.com/corent1robert/safti-france-consultants)** | SAFTI advisors — emails, phones |
| **[Sextant France](https://apify.com/corent1robert/sextant-agents-scraper)** | Sextant — emails, phones, GPS |
| **[megAgence](https://apify.com/corent1robert/megagence-consultants)** | megAgence — phones and GPS |
| **[BSK Immobilier](https://apify.com/corent1robert/bsk-immobilier-consultants)** | BSK — emails, phones |
| **[Les Porteclés](https://apify.com/corent1robert/les-portecles-agents)** | Names and GPS |

Browse all: **[apify.com/corent1robert](https://apify.com/corent1robert)**

### Support

Contact <corentin@outreacher.fr> for bespoke scraping, scheduling, or CRM connectors.

# Actor input Schema

## `mode` (type: `string`):

Full directory: national catalog. URLs: only the profile links you paste.

## `startUrls` (type: `array`):

Paste Efficity consultant profile URLs — one per line. Example: https://www.efficity.com/your-slug/ (URLs mode only).

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

0 = no limit on paying runs with a long timeout. Try Apify and the Free plan cap at 20 so the sample finishes in 5 minutes.

## `concurrency` (type: `integer`):

Max concurrent profiles being fetched, parsed, and written to the dataset.

## `listConcurrency` (type: `integer`):

Max concurrent directory-page requests in full-directory mode.

## `fetchTimeout` (type: `integer`):

Maximum wait time per page before the Actor retries or skips.

## Actor input object example

```json
{
  "mode": "list",
  "startUrls": [
    {
      "url": "https://www.efficity.com/apoisneau/"
    }
  ],
  "maxResults": 5,
  "concurrency": 55,
  "listConcurrency": 40,
  "fetchTimeout": 45000
}
```

# Actor output Schema

## `dataset` (type: `string`):

All consultants as JSON — open the Dataset tab or export CSV / Excel.

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

Slim columns for CRM: name, phones, email, area, profile URL.

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

Progress while listing directory pages and enriching profiles.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.efficity.com/apoisneau/"
        }
    ],
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/efficity-consultants").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 = {
    "startUrls": [{ "url": "https://www.efficity.com/apoisneau/" }],
    "maxResults": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/efficity-consultants").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 '{
  "startUrls": [
    {
      "url": "https://www.efficity.com/apoisneau/"
    }
  ],
  "maxResults": 5
}' |
apify call corent1robert/efficity-consultants --silent --output-dataset

```

## MCP server setup

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

```

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/bshrO9mCBDtqHJFr6/builds/qOgIFtcapeAwU1oEl/openapi.json
