Espaces Atypiques · Full profiles infos (emails, phones) avatar

Espaces Atypiques · Full profiles infos (emails, phones)

Under maintenance

Pricing

from $9.99 / 1,000 results

Go to Apify Store
Espaces Atypiques · Full profiles infos (emails, phones)

Espaces Atypiques · Full profiles infos (emails, phones)

Under maintenance

Export Espaces Atypiques team members from public agency pages: names, emails, phones, photos, job titles, and bios. Director vs staff grouping for CRM. Run all French agencies from the sitemap or paste specific agency URLs. No login or API key.

Pricing

from $9.99 / 1,000 results

Rating

0.0

(0)

Developer

Corentin Robert

Corentin Robert

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Espaces Atypiques — agency team export

Who it’s for: sales, recruiters, and analysts who need a single CRM-ready table of everyone published on Espaces Atypiques agency “team” pages — no login, no API key (public website only).

What you get per person: name, job title, director vs staff band, email, phone, photo URL, long biography text, office label, and the agency page URL you can cite or revisit. Rows without an email are not exported (dataset / CSV), so you only get contactable leads.

Why one Actor: the site lists many agencies; this scraper starts from the public agency sitemap (same kind of list search engines use), fetches each French agency page, and reads the team block. You can also paste a handful of agency URLs for a quick test or a sub-region.


How to run (Apify Console)

  1. Choose Sitemap (full France) or URLs (your list).
  2. Optional: in Input JSON, set maxAgencies to a small number (e.g. 5) for a quick test; or pass maxResults (API) when maxAgencies is 0 to mirror the France realty hub — sitemap only. Defaults are no cap on agencies and on listing fiches in fallback mode.
  3. Start the run; open the Dataset or Run log when it finishes.

Input

KeyTypeDefaultPurpose
modesitemap | urlssitemapFull sitemap vs pasted agency pages
startUrlsarray of { "url": "…" }[]French agency page URLs (URLs mode)
maxAgenciesinteger0Sitemap: cap office pages; 0 = use maxResults if set, else no cap. URLs: 0 = all pasted URLs; 1+ caps the list.
maxResultsinteger(none)API / automation only (not in Console schema). Sitemap: when maxAgencies is 0, caps how many agency pages to load (same as hub Max rows). Ignored in URLs mode.
maxListingPagesinteger0Listings fallback: max ventes/… pages per agency (0 = no cap; 1200 to limit)
listingConcurrencyinteger6Parallel ventes/… fetches per agency in fallback
concurrencyinteger25Parallel agency page fetches (bounded)
fetchTimeoutinteger60000Per-request timeout (ms)
proxyConfigurationobject(Apify)Optional proxy; same pattern as other Actors on the Apify platform

additionalProperties: true — you can pass extra keys from the API if you automate runs.

Example (quick test, Input JSON):

{
"mode": "sitemap",
"maxAgencies": 5,
"concurrency": 10
}

Example (specific agencies):

{
"mode": "urls",
"startUrls": [{ "url": "https://www.espaces-atypiques.com/paris-rive-gauche/" }],
"concurrency": 5
}

Output fields (main)

FieldMeaning
sourceKeyStable id (email-based, or path + name if email missing)
firstName / lastName / fullNameNormalized for export: prénom in title case (fr-FR), nom in MAJUSCULES; fullName is Prénom NOM
jobTitleRaw line under the name on the site
roleCategorydirector, associate_director, advisor, support, other, unknown (heuristic)
banddirector (management) vs employee (includes advisors and unknown titles)
isDirector / isEmployeeBooleans derived from band
email / phoneWhen shown on the card; phone is normalized to +33 X XX XX XX XX (French numbers, 0…+33 …)
agencyNameOffice label to use in exports: from the page h1 when specific; otherwise from the last URL segment (city slug) when the heading is generic (e.g. Nos collaborateurs)
agencyNameRawFirst h1 / header text used before resolution (for debugging)
agencyPathPath on the site, e.g. /grand-est/strasbourg/
agencyUrlRegionFirst path segment (area). On single-segment agency URLs (/blois/), it is the same slug as the city column so the field is never empty.
agencyUrlCitySlugLast path segment (city slug as on the site)
agencyLabelSub-label on the card (e.g. office name)
agencyPageUrlSitemap / input agency URL (stable office id)
dataFetchedFromSet when cards were read from …/collaborateurs/ instead of the home page
photoUrl / bioImage and biography text when present

Role detection uses French titles (normalized): e.g. Directeur d’agence → director band; Conseiller → staff. Titles the parser does not recognise are kept in jobTitle and classified as other.


Local development

cd espaces-atypiques-agents-scraper
npm install
echo '{"mode":"sitemap","maxAgencies":2,"concurrency":3}' > input.json
apify run --input-file=./input.json

If the CLI expects storage/key_value_stores/default/INPUT.json, use --input-file as above, or add a valid INPUT.json that matches the schema. After a run with a non-empty dataset, a semicolon CSV (UTF-8 BOM) is written to output.csv in the project root. Rows are sorted by agency path, then last name, first name, email. Columns are fixed (no dynamic Extra: fields); sourceKey is the last column; roleCategory remains on the dataset record but is omitted from the CSV to avoid overlap with band / jobTitle.


How it works (technical)

  1. Sitemap mode: GET /sitemap_index.xml → find agence-sitemap.xmlGET that file → keep <loc> URLs that are not under /en/ (French pages only).
  2. Fetch each agency home page (bounded concurrency, retries; redirects are followed).
  3. Parse the team from .preview-collaborateur (prefer #equipe-trombi) when a mailto is present.
  4. If the home page has no team block, do not call /collaborateurs/ (it often redirects to a national page). Instead, collect ventes/… URLs from the home grid (#annonces-localisations, #biens, .biens-localisation) and from the CTA that points to /ventes/?pl=… (hidden pl in the form): the Actor follows paginated search results (/ventes/page/2/?pl=…, etc.) until it has enough links or there is no next page. Then it opens each listing and parses the negotiator card (name, phone, email — including mailto in HTML comments). Total opened listings are capped by maxListingPages (default 0 = no cap; set 1200 to limit each office — useful for smoke tests). Large full runs use more time and Apify resources. Internal safety still stops after many WordPress list pages per pl filter. listingConcurrency controls parallel listing fetches per agency.
  5. Dedupe rows by sourceKey (email) and push to the default dataset. agencyPageUrl is always the sitemap office URL; dataFetchedFrom points at the listing URL when the row came from the listings fallback.

Compliance

Data is taken from public pages. You are responsible for using it in line with applicable law, the site’s terms, and GDPR (prospecting rules, contact preferences).


Support & custom work

corentin@outreacher.fr