# Barnes Luxury Agents · WhatsApp Directory (`corent1robert/barnes-international-agents`) Actor

Export BARNES luxury advisors in 24 countries. Name, role, languages, agency and WhatsApp when published — one row per person. Barnes does not list personal emails. No login, no API key.

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

## Pricing

from $7.49 / 1,000 advisor with whatsapps

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/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

## Barnes Luxury Agents · WhatsApp Directory

Export **BARNES** luxury real estate advisors from the public international directory. Pick a country (or the whole network), how many people you need, click **Start**.

Every row is **one advisor**: name, role, languages, office, photo, and **WhatsApp when Barnes publishes it**.

**No login. No API key. No Barnes account.**

Barnes does **not** publish personal emails on these pages. The public channel is WhatsApp + the office phone. This Actor does not invent inboxes.

***

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| Proptech / CRM for luxury brokerage | Named advisors + a way to reach them | **France** · Quick look, then All matching advisors |
| Outbound on WhatsApp | Direct chat links, not a generic agency inbox | **One row per advisor** · Call list (250) |
| Relocation / family office desk | Cover one city or country | **United States** or **Switzerland** · Call list |
| Agency selling tools to luxury networks | Map who sits in which bureau | **Every office listing** · All matching advisors |
| Data / ops | Stable `sourceKey` for upserts | **One row per advisor** · All countries |

**What you get by default:** full name (split first / last), job title, languages from the flag row, agency name / URL / address / office phone, photo, country, and WhatsApp in E.164 when the card has a chat button.

**What you will not get:** a personal `email` or a personal LinkedIn URL. Barnes only links the **company** LinkedIn on some office pages (`agencyLinkedinUrl`).

***

### Quick start

1. Open this Actor in [Apify Console](https://console.apify.com).
2. Leave **How many** = Quick look (25), **Country** = France, **Rows** = One row per advisor.
3. Click **Start**.
4. Open the **Outreach / CRM** dataset view — first name, last name, WhatsApp, office.

To cover the whole French network, switch How many to **All matching advisors** (about 117 offices, typically under a minute on HTTP).

### Ready-made examples (published tasks)

| Example | Best for |
|---------|----------|
| [France luxury advisors with WhatsApp](https://console.apify.com/actors/tasks/uX6Ji13rBIsP7MK5m) | Flagship EU market |
| [Miami BARNES team](https://console.apify.com/actors/tasks/61CbExfwqroaQDVZW) | US long-tail |
| [All 24 countries, unique people](https://console.apify.com/actors/tasks/0rodalY8nd7DGn9d0) | Full network snapshot |
| [Switzerland advisors for CRM](https://console.apify.com/actors/tasks/ItYwoOPil2fAVSlti) | DACH outreach |

***

### What it extracts

| Category | Fields |
|----------|--------|
| Identity | `fullName`, `firstName`, `lastName`, `jobTitle`, `photoUrl` |
| Contact | `whatsapp` (E.164), `whatsappUrl`, `phone` (rare on the card), `email` (always `null`) |
| Languages | `languages[]` from the flag strip (e.g. Spanish, French) |
| Office | `agencyName`, `agencyUrl`, `agencyAddress`, `agencyPhone`, `agencyLinkedinUrl`, `streetAddress`, `postalCode`, `city` |
| Geo | `country`, `countryCode`, `countrySlug`, `latitude`, `longitude` |
| Deduping | `sourceKey`, `officeCount`, `alsoAtAgencies[]` |

One row per **person** by default. The same advisor can appear on several Lyon (or other) office pages — those listings are merged. Switch **Every office listing** if you need one row per bureau.

Dataset views in Console: **Overview**, **Outreach / CRM**, **Offices**.

***

### Typical fill rates (directory crawl, Aug 2026)

| | Unique people | With WhatsApp |
|--|--:|--:|
| Whole network (189 offices / 24 countries) | ~2,000 | ~50% |
| France | ~1,200 | ~half of unique names |

Exact counts move as Barnes edits teams. WhatsApp is **not** on every card — some partners only show a photo and a role.

***

### Important / limitations

- **Email is always empty.** Barnes does not list personal inboxes on office team pages.
- **WhatsApp is missing on about half of unique names.** You still get name, role, office and photo.
- **Personal LinkedIn is not published.** Company pages land in `agencyLinkedinUrl` when present.
- **Quick look / Call list stop once the advisor cap is reached.** Extra offices are skipped on purpose.
- **`howMany` = All matching advisors (`0`)** runs until every selected office is read (or the run timeout).
- Names, photos and WhatsApp numbers are **personal data**. Keep a lawful basis (GDPR / local rules).

***

### Input

| Field | What it does |
|-------|----------------|
| `howMany` | Quick look (25) / Call list (250) / All matching advisors (`0` = no numerical cap) |
| `country` | `all` or one directory slug (`france`, `switzerland`, `united-states`, …) |
| `uniq` | `uniquePeople` (default) or `everyOffice` |
| `agencyUrls` | Optional. Paste office URLs you already have; skips the directory + country filter |

**API-only** (not in Console): `maxPeople` (integer override, `0` = no cap), `concurrency` (default 12, max 16), `verboseLogs`, `proxyConfiguration`. On the Apify platform, datacenter proxy is on by default.

#### Example

```json
{
  "howMany": "preview",
  "country": "france",
  "uniq": "uniquePeople"
}
```

Pasted office URL (skips the country filter):

```json
{
  "howMany": "all",
  "uniq": "uniquePeople",
  "agencyUrls": [
    "https://www.barnes-international.com/en/contact/united-states/barnes-miami.html"
  ]
}
```

***

### Output example

```json
{
  "sourceKey": "barnes:wa:5491130281032",
  "network": "barnes",
  "fullName": "Mariano Leonardo LA TORRE",
  "firstName": "Mariano Leonardo",
  "lastName": "LA TORRE",
  "jobTitle": "Managing Partner",
  "whatsapp": "+5491130281032",
  "whatsappUrl": "https://api.whatsapp.com/send?phone=5491130281032",
  "phone": null,
  "email": null,
  "linkedinUrl": null,
  "languages": ["Spanish"],
  "photoUrl": "https://assets.barnes-international.com/bdata/collaborator/2026-05/1f14d445-dd69-6426-aaa8-bb8ffaeef99f/Mariano%20La%20Torre.jpg?width=400",
  "agencyName": "BARNES Buenos Aires",
  "agencyUrl": "https://www.barnes-international.com/en/contact/argentina/barnes-buenos-aires.html",
  "agencyAddress": "Ortiz de Ocampo 3050, Of. 102 - Palacio Alcorta, C1425CLA Buenos aires, AR",
  "agencyPhone": "+5491130281032",
  "agencyLinkedinUrl": "https://www.linkedin.com/company/barnes_realty",
  "streetAddress": "Ortiz de Ocampo 3050, Of. 102 - Palacio Alcorta",
  "postalCode": "C1425CLA",
  "city": "Buenos aires",
  "country": "Argentina",
  "countryCode": "AR",
  "countrySlug": "argentina",
  "latitude": -34.57732024,
  "longitude": -58.40231671,
  "officeCount": 1,
  "alsoAtAgencies": []
}
```

`email` and `linkedinUrl` stay `null` by design — they are not on the public cards.

***

### How much does it cost to scrape Barnes advisors?

HTTP-only (no browser). You pay **per exported advisor**, not per office page. There is no extra run-start fee.

| Scenario | Free | Bronze | Silver | Gold |
|----------|------|--------|--------|------|
| 25 rows, mostly WhatsApp (Quick look) | **~$0.19** | ~$0.17 | ~$0.16 | ~$0.15 |
| 1,000 unique advisors, ~50% WhatsApp | **~$5.24** | ~$4.84 | ~$4.44 | ~$4.04 |
| Full unique network (~2,000 people) | **~$10.50** | ~$9.70 | ~$8.90 | ~$8.10 |

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| Advisor **with WhatsApp** | **$7.49 / 1k** | $6.99 | $6.49 | $5.99 |
| Advisor **without WhatsApp** | **$2.99 / 1k** | $2.69 | $2.39 | $2.09 |

Empty office pages and failed fetches are **not** billed. Compute stays low (512 MB, Cheerio/HTTP).

### Is scraping Barnes free?

The public directory is free to browse. Running this Actor on Apify is billed **per advisor** (table above). Compute is cheap because there is no headless browser.

***

### Is it legal to scrape Barnes?

This Actor only reads pages Barnes publishes on [barnes-international.com](https://www.barnes-international.com/en/about-barnes/find-an-agency.html) without an account. WhatsApp numbers and names are personal data. Your use must comply with GDPR and relevant regulations (lawful basis, retention, opt-out).

### Legal disclaimer

This is not legal advice. You are responsible for how you store and contact people in the export.

***

### 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)**. Use **this** Actor if you only need BARNES (country picker, WhatsApp pricing).

| 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 |
| **[Efficity Consultants](https://apify.com/corent1robert/efficity-consultants)** | Efficity — emails, phones |
| **[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)**

### How it works

1. Open the public find-an-agency directory (or your pasted office URLs).
2. Keep offices for the country you picked.
3. Read each office team in parallel (full roster is in the page HTML — no extra click).
4. Merge the same person listed in several bureaux (WhatsApp first, then name).
5. Write the dataset as soon as the list is ready.

Typical wall-clock: **a few seconds** for Quick look, **under a minute** for a full country, **under a minute** for all 189 offices on a warm datacenter path.

***

### Local development

```bash
cd barnes-international-agents
npm install
npm test
apify run
```

`storage/key_value_stores/default/INPUT.json` must include `howMany` and `country` (the CLI validates it **before** `main.js` runs). `.actor/INPUT.json` matches the Console Try prefill (France, Quick look).

- `apify run` uses that KV input (or `.actor/INPUT.json` on first run).
- `apify run --input-file=./input.smoke.json` — one Neuilly office, fastest local check.
- `apify run --input-file=./input.json` — same as Try (France preview). On key collision, **CLI / KV input overwrites** the repo file.

***

### Internals (maintainers)

Office teams live in `#team .card-agent`. WhatsApp is `api.whatsapp.com/send?phone=` (hyphens and spaces are stripped to E.164). JSON-LD `RealEstateAgent` fills office address / geo. HTTP + browser User-Agent; no Playwright.

***

### Support

Contact <corentin@outreacher.fr> if you need a custom luxury-network scraper (Sotheby’s, Knight Frank, …) or a CRM push on top of this dataset.

# Actor input Schema

## `howMany` (type: `string`):

**Quick look** — 25 advisors, a few seconds.

**Call list** — 250 advisors, about a week of outreach.

**All matching advisors** — every person in the country you picked (or the whole network).

## `country` (type: `string`):

BARNES office country as on the public directory. **All countries** covers the whole network (about 189 offices).

## `uniq` (type: `string`):

**One row per advisor** (recommended) — duplicates across offices are merged. Extra offices land in `alsoAtAgencies`.

**Every office listing** — keep one row each time the person is listed, useful if you map coverage by bureau.

## `agencyUrls` (type: `array`):

Optional. One BARNES office URL per line (`/en/contact/{country}/{slug}.html`). **No prefill** — only if you already have pages.

## Actor input object example

```json
{
  "howMany": "preview",
  "country": "france",
  "uniq": "uniquePeople"
}
```

# Actor output Schema

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

Name, role, country, office, WhatsApp

## `outreachCrm` (type: `string`):

First name, last name, WhatsApp, office URL

## `offices` (type: `string`):

Multi-bureau coverage

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

All rows

## `output` (type: `string`):

Advisor counts, WhatsApp fill rate, offices read

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

Plain-text progress (same tone as the live console)

# 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 = {
    "howMany": "preview",
    "country": "france",
    "uniq": "uniquePeople"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/barnes-international-agents").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 = {
    "howMany": "preview",
    "country": "france",
    "uniq": "uniquePeople",
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/barnes-international-agents").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 '{
  "howMany": "preview",
  "country": "france",
  "uniq": "uniquePeople"
}' |
apify call corent1robert/barnes-international-agents --silent --output-dataset

```

## MCP server setup

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

```

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/SClSrBa705IFRqgh8/builds/DfRVGqvOgg74hZF0T/openapi.json
