# HelloAsso · Association Emails by Cause (`corent1robert/helloasso-scraper`) Actor

Paste a HelloAsso search or pick a cause. Turn Collect emails on for public mailboxes from the HelloAsso profile and the association website (contact / mentions légales). Directory-only is cheaper. No login.

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

## Pricing

from $3.50 / 1,000 association 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

## HelloAsso · Association Emails by Cause

Export **French associations** from the public [HelloAsso](https://www.helloasso.com) directory. Two jobs:

| Job | Console | You get |
|-----|---------|---------|
| **Emails (CRM)** | **Collect emails = on** | Public mailbox from the HelloAsso profile, then from the association website (homepage, contact, mentions légales). Plus name, city, phone, SIREN when published. |
| **Directory only** | Collect emails = off | Name, city, category, campaigns, HelloAsso URL. Cheaper. No mailbox. |

Paste a **HelloAsso search URL**, or pick a **cause** and a city (**All France** = every city).

**No login. No API key. No HelloAsso account.**

Built for: outbound / SDR to associations · grant desks · CSR / local partners

***

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| Outbound / SDR to associations | CRM list with mailboxes | **Collect emails on** · Max 24 first |
| Grant / foundation desk | Nonprofits in one cause | Cause + Max 50 · emails on if you will write |
| CSR / corporate foundation | Local partners in a city | Cause + city · emails on |
| Market research / ops | Mix of causes nationwide | Any cause + All France · emails **off** |

**Typical fill rates** (measured 2026-08-23):

| Field | Directory only (50, Education + courses, all France) | Collect emails on — profile + website (20) |
|-------|------------------------------------------------------|--------------------------------------------|
| Name / city / postal / category / URL | ~100% | ~100% |
| Description | ~98% | ~100% |
| Website | — | ~55% |
| Email | **~0%** (not on listing cards) | **~20%** |
| Phone | ~0% | ~0% |
| Instagram / Facebook / LinkedIn | — | ~10% / ~5% / ~5% |
| RNA / SIREN | — | ~0% (HelloAsso rarely publishes them) |

In that 20-row sample, all 4 mailboxes came from the **HelloAsso profile**. The website crawl added none. Listing cards stay at ~0% email.

***

### How emails are collected

**Collect emails** must be **on**. Then two sources, in order:

| Source | What we read | `emailSource` |
|--------|----------------|---------------|
| **HelloAsso profile** | Public association page: `mailto:` links + visible page text | `helloasso-profile` |
| **Association website** | Homepage, then contact / mentions légales, over HTTP | `association-website` |

**Also scan the association website** (`enrichFromWebsite`) is **on by default**, but it only runs when Collect emails is on and the profile listed a site.

We open the public profile and parse what is **already in the page**. We do **not** click a “see email” / “voir l’email” button. If HelloAsso only reveals the address after that click, we can miss it.

***

### Quick start — emails

1. Open this Actor on Apify.
2. Turn **Collect emails** **on**. Leave **Also scan the association website** on (default).
3. Paste a HelloAsso **search URL**, or pick a **cause** (e.g. Education) and leave **All France**.
4. Set Max **24**. Click **Start**. Export CSV / Excel from the dataset (**Outreach / CRM** view).

### Quick start — directory only

Same, but leave **Collect emails** off. Faster and cheaper (name / city / URL).

### Ready-made examples (published tasks)

| Example | Best for |
|---------|----------|
| [Find Lyon sports associations on HelloAsso](https://apify.com/corent1robert/helloasso-scraper/examples/lyon-sport-associations) | Local sport / club lists |
| [Export Paris culture associations](https://apify.com/corent1robert/helloasso-scraper/examples/paris-culture-associations) | Culture / events partners |
| [List environment associations in France](https://apify.com/corent1robert/helloasso-scraper/examples/france-environment-associations) | CSR / climate grants |
| [France education associations offering courses](https://apify.com/corent1robert/helloasso-scraper/examples/france-education-courses) | Education + courses, all France |
| [HelloAsso directory sample](https://apify.com/corent1robert/helloasso-scraper/examples/helloasso-directory-sample) | Try the Actor cheaply |

Those examples leave Collect emails **off**. For mailboxes, duplicate a task and turn Collect emails on.

### What it extracts

| Category | Fields |
|----------|--------|
| Identity | `name`, `description`, `category`, `categoryTag`, `helloassoId` |
| Location | `city`, `postalCode`, `department`, `country` (`FR`) |
| Activity | `activityType`, `activitiesCount` |
| Profile | `url`, `website`, `logoUrl`, `imageUrl` |
| Contacts (Collect emails on) | `email`, `emailSource` (`helloasso-profile` or `association-website`), `phone` |
| Company IDs (Collect emails on) | `siren`, `siret`, `rna` |
| Social (Collect emails on) | `facebookUrl`, `instagramUrl`, `linkedinUrl` |

Missing values are omitted (not invented). Listing cards almost never include a mailbox.

### Input

| Field | Console | Default | Notes |
|-------|---------|---------|--------|
| `cause` | Cause | Sport | HelloAsso category (`category_tags`). **Any cause** = no category filter. |
| `activityType` | What they organise | All activities | e.g. Courses = `activity_type=cours`. |
| `city` | City | All France | **All France** = every city. Pick a city only to restrict. |
| `maxItems` | Max associations | 24 | **0** = all matching results. **Free plan: 20 / run** |
| `collectContacts` | Collect emails | Off | Profile + website. Off = directory only. |
| `enrichFromWebsite` | Also scan their website | On | Homepage + contact / mentions légales. Ignored if Collect emails is off. |
| `searchUrl` | HelloAsso search URL | — | Paste a search; we read `activity_type` and `category_tags`. |

```json
{
  "searchUrl": "https://www.helloasso.com/e/recherche/associations?activity_type=cours&category_tags=education",
  "maxItems": 24,
  "collectContacts": true,
  "enrichFromWebsite": true
}
```

### Output example (Collect emails on)

```json
{
  "name": "Association Sportive Lyon",
  "description": "Promotion du sport pour tous",
  "city": "Lyon",
  "postalCode": "69001",
  "category": "Sport",
  "activitiesCount": 12,
  "url": "https://www.helloasso.com/associations/association-sportive-lyon",
  "website": "https://as-lyon.fr",
  "email": "contact@as-lyon.fr",
  "emailSource": "helloasso-profile",
  "phone": null,
  "scrapedAt": "2026-08-23T14:00:00.000Z"
}
```

`email` is omitted when the association published no public mailbox.

### How much does it cost?

Browser run (HelloAsso is a public web directory behind a bot check). Actor start is **$0.00005** per GB (negligible). Totals below include that start.

| Scenario (FREE) | Approx. total |
|-----------------|---------------|
| 24 without email | **~$0.05** |
| 1,000 without email | **~$2.00** |
| 1,000 with email | **~$5.00** |

| Event | FREE | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| Association with email | $5.00 / 1k | $4.50 | $4.00 | $3.50 |
| Association without email | $2.00 / 1k | $1.80 | $1.60 | $1.40 |

Rows **with** a public mailbox bill `association-with-email`. Rows **without** still bill `association-without-email` when Collect emails is on (you paid for the profile visit).

Default memory is **2048 MB**. Timeout **6 hours** (large France dumps).

### How long for 33,000 associations?

HelloAsso sits behind a bot check, so **listing still uses a browser**. The Actor does **not** open 33,000 profile pages unless Collect emails is on.

| Job | What it does | Ballpark |
|-----|----------------|----------|
| 33k **directory only** (Collect emails **off**) | Listing pages in parallel (~4 tabs) | **~45–90 min** (not days) |
| 33k **with emails** | One browser visit per association | **~1–3 days** — don’t. Export the directory first, then enrich a sample |
| 1k with emails | Profiles + website scan | **~1–3 hours** |

PPE (FREE): directory-only 33k ≈ **$66**; with email (if every row had a mailbox) ≈ **$165**, plus compute.

### Is it legal to scrape HelloAsso?

This Actor only reads data HelloAsso and the association already publish without an account. Treat names, emails and phones as personal data: your use must comply with GDPR and your own purpose limitation.

### Also available

- [JOAFE · French Association Notices](https://apify.com/corent1robert/joafe-associations-scraper) — official gazette creations, RNA, object, city
- [French Companies · Search & SIREN Enrich](https://apify.com/corent1robert/recherche-entreprises-scraper)
- [Actulegales Scraper](https://apify.com/corent1robert/actulegales-scraper)

### FAQ

**Why are emails empty?** Collect emails is **off** by default. Listing cards are ~0% email. With Collect emails on, about **1 in 5** associations in a 20-row Education sample had a public mailbox — all four from the HelloAsso profile; the website crawl added none.

**Do you click “voir l’email”?** No. We open the public profile and parse mailto links and text already in the page. If HelloAsso hides the address behind that button, we can miss it.

**Does the website scan replace Collect emails?** No. It only runs when Collect emails is on (`enrichFromWebsite` is on by default in that case).

**Why a browser?** HelloAsso’s public directory sits behind a bot check. Association **websites** are fetched over plain HTTP.

**How many associations per page?** Typically about 12 cards. The Actor stops when it reaches Max associations.

**Can I take one category for all of France?** Yes. Set the cause (e.g. Education), city **All France**, Max **0** if you want every matching card (6-hour run cap).

**Can I run it on a schedule?** Yes. Use Apify Schedules for a weekly city or cause watch.

### Local development

```bash
npm install
npm test
apify run -p
```

**Having issues?** Contact corentin@outreacher.fr

# Actor input Schema

## `cause` (type: `string`):

HelloAsso category (same as category\_tags on the site). **Education** + **All France** = education associations nationwide. **Any cause** = no category filter.

## `activityType` (type: `string`):

HelloAsso activity filter. **Courses / classes** is the same as helloasso.com/e/recherche/associations?activity\_type=cours. **All activities** = no activity filter.

## `city` (type: `string`):

**All France** = every city in the results (no city filter). Pick a city only if you want that city or département.

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

Stop after this many unique associations. **0 = all matching results** (keeps paging until HelloAsso has no more cards, or the 6-hour run limit). **Free plan: 20 / run.**

## `collectContacts` (type: `boolean`):

When on, open each public HelloAsso profile and keep mailto / phone / website already visible on the page (we do not click a “see email” button). Then, if **Also scan the association website** is on, fetch the homepage, contact and mentions légales. Sets `emailSource` to `helloasso-profile` or `association-website`. A mailbox from either source is billed as **with email**. About 1 in 5 associations publish one.

## `enrichFromWebsite` (type: `boolean`):

Used only when Collect emails is on. After the HelloAsso profile, fetch the public website (homepage, contact, mentions légales) for **email**, **phone**, **SIREN** and **SIRET**. Sets `emailSource` to `association-website` when the mailbox comes from the site. A mailbox found this way is billed as **with email**.

## `searchUrl` (type: `string`):

Example: https://www.helloasso.com/e/recherche/associations?activity\_type=cours\&category\_tags=education

## Actor input object example

```json
{
  "cause": "sport",
  "activityType": "",
  "city": "",
  "maxItems": 24,
  "collectContacts": false,
  "enrichFromWebsite": true
}
```

# Actor output Schema

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

One row per association — identity, city, email (when Collect emails is on), profile URL.

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

Name, city, category, campaigns, profile URL.

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

Email, phone and website from the HelloAsso profile or the association website.

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

Plain-text log of the run phases and progress.

# 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 = {
    "cause": "sport",
    "activityType": "",
    "city": "",
    "maxItems": 24
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/helloasso-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 = {
    "cause": "sport",
    "activityType": "",
    "city": "",
    "maxItems": 24,
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/helloasso-scraper").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 '{
  "cause": "sport",
  "activityType": "",
  "city": "",
  "maxItems": 24
}' |
apify call corent1robert/helloasso-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/dSXKRGD5pigo0Et1A/builds/nM0w2PEkBcLEngHzy/openapi.json
