# JOAFE · French Association Notices by Keyword or Dept (`corent1robert/joafe-associations-scraper`) Actor

Export official French association gazette notices — creations, amendments, dissolutions. Name, RNA, object, city, website when published. Daily presets or paste a JO URL. One row per notice. No API key.

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

## Pricing

from $3.49 / 1,000 association notice retrieveds

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

## JOAFE · French Association Notices

**Export official association gazette notices from the [Journal officiel](https://www.journal-officiel.gouv.fr) (JOAFE) — creations, amendments and dissolutions, with RNA number, object, city and website when published.**

Pick a daily preset, add keywords or a department, get **one row per notice**. JSON, CSV, or Excel from Apify Console.

**No login. No API key. No account on journal-officiel.gouv.fr.**

**Built for grant desks, local BD, and civic data teams** — see [Who is this for?](#who-is-this-for) below.

***

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| **Grant / foundation desk** | New associations in a cause | **Keyword watch** · `environnement` |
| **Local business BD** | Clubs and parent associations in a department | **Daily new associations** · Departments `75` |
| **Municipality / prefecture ops** | Dissolutions on your territory | **Recent dissolutions** |
| **Agency / data** | Scheduled master table | Daily preset · `maxResults: 0` |
| **KYB / research** | History for a known RNA | API JSON · `rnaNumbers` |

**What you get by default:** notice type, publication date, association name, RNA, legal form, seat (address, city, postal code, department), object (short + full on creations), and a PDF link.

**Typical fill rates** (50 recent gazette notices each, measured 2026-08-23):

| Field | Creations | Dissolutions | Amendments |
|-------|-----------|--------------|------------|
| RNA | ~100% | ~96% | ~100% |
| City / postal / address | ~100% | ~94–96% | ~100% |
| Object | ~100% | ~0% (not published) | ~22% |
| Website | ~4% | ~0% | ~2% |
| Email | ~0% | ~0% | ~0% |
| Official PDF | ~100% | ~100% | ~100% |

Email is almost never in the gazette text — empty is expected. Websites are more common on **annual-account** rows (`sources: ["dca"]`, ~50% in a recent sample, plus SIREN).

***

### Quick start

#### Console (2 clicks)

1. Leave **What do you need?** on **Daily new associations**.
2. Click **Start** — export from the **Dataset** tab.

If yesterday is empty (weekend / holiday), the Actor retries the **last 7 days**. Set `maxResults` to `0` for an uncapped daily job.

*Optional:* add **Keywords** (`sport`, `culture`) or a department (`75`).

#### Already searched on journal-officiel.gouv.fr?

1. Copy the URL from [Associations search](https://www.journal-officiel.gouv.fr/pages/associations-recherche/) (example: `…/pages/associations-recherche/?q=football`).
2. Paste into **Journal officiel search URL**.
3. Click **Start**.

***

### Ready-made examples (published tasks)

| Example | Best for |
|---------|----------|
| [Daily new French associations](https://apify.com/corent1robert/joafe-associations-scraper/examples/daily-new-french-associations) | Morning grant / BD list |
| [French association dissolutions](https://apify.com/corent1robert/joafe-associations-scraper/examples/french-association-dissolutions) | Territory watch |
| [New associations in Paris (75)](https://apify.com/corent1robert/joafe-associations-scraper/examples/new-associations-paris-75) | Île-de-France pipeline |
| [Football association creations](https://apify.com/corent1robert/joafe-associations-scraper/examples/football-association-creations) | Keyword vertical |

***

### What does this Actor do?

JOAFE is the official gazette for French associations, foundations and endowment funds. This Actor lists **creations**, **amendments** and **dissolutions**, then flattens each notice into one export row. The **RNA number** (Waldec) is included when the gazette published it.

| Preset | What it does |
|--------|----------------|
| **Daily new associations** | Yesterday→today · creations only |
| **Recent dissolutions** | Yesterday→today · dissolutions |
| **Creations — last 7 days** | Wider window · creations |
| **Keyword watch** | Last 7 days of creations · use with keywords |

Annual-account filings (`source: dca`, often with SIREN + website) are available via **API JSON** (`sources: ["dca"]`).

***

### What data does it extract?

| Category | Fields |
|----------|--------|
| Notice | ID, type (EN + FR), status, source (joafe / dca), issue + notice numbers |
| Association | Name, previous name, RNA, SIREN (accounts), legal form |
| Object | Full object, short object (~300 chars), activity domain |
| Contacts | Website, email when present in the notice text |
| Geo | Address, postal code, city, department, region, prefecture, coordinates |
| Link | Official PDF when published |

***

### How it works

1. Apply the preset (notice type + date window).
2. Optionally narrow by keywords, department, or a pasted Journal officiel URL.
3. List matching notices from the public gazette.
4. Flatten each notice into one row immediately.

***

### How much does it cost to scrape JOAFE?

HTTP-only gazette feed. **Pay per notice row**, plus a one-time actor-start charge.

| Scenario | Rows billed | FREE | Bronze | Silver | Gold |
|----------|-------------|------|--------|--------|------|
| 10 notices (Try) | 10 | ~$0.05 | ~$0.04 | ~$0.04 | ~$0.03 |
| 25 notices | 25 | ~$0.12 | ~$0.11 | ~$0.10 | ~$0.09 |
| 500 notices | 500 | ~$2.50 | ~$2.25 | ~$2.00 | ~$1.75 |
| 5,000 notices | 5,000 | ~$25.00 | ~$22.45 | ~$19.95 | ~$17.45 |

*Includes actor-start (~$0.00005). Row prices fall on higher Apify plans. About **$5 / 1,000 notices** on Free.*

Residential proxy is **not** required.

***

### Is it legal to scrape JOAFE?

This Actor only reads notices the DILA publishes as **open data** (Licence Ouverte). Rows may include names and, rarely, emails. Ensure your use complies with GDPR.

***

### Input

| Field | Console | Description |
|-------|---------|-------------|
| `runPreset` | Yes | Daily creations · Dissolutions · Last 7 days · Keyword watch |
| `keywords` | Yes | Optional OR terms |
| `departments` | Yes | Optional department codes (`75`, `69`…) |
| `searchUrl` | Yes | Paste a Journal officiel associations URL |
| `maxResults` | Yes | Row cap; **0** = no numerical cap |
| `dateFrom` / `dateTo` | API | Override the preset window (`YYYY-MM-DD`) |
| `noticeTypes` | API | `Création`, `Modification`, `Dissolution` |
| `sources` | API | `joafe` (gazette) or `dca` (annual accounts) |
| `rnaNumbers` | API | RNA identifiers (`W751234567`) |
| `verboseLogs` | API | Technical debug lines |

#### Example — daily creations, sport, 25 rows

```json
{
  "runPreset": "daily_creations",
  "keywords": ["sport"],
  "maxResults": 25
}
```

***

### Output example

```json
{
  "notice_id": "202600311021",
  "publication_date": "2026-08-22",
  "notice_type": "Creation",
  "notice_type_fr": "Création",
  "association_name": "IN TOM THE WILD",
  "rna_number": "W513011084",
  "legal_form": "Associations loi du 1er juillet 1901",
  "object_short": "soutenir et développer des projets liés à l'handicap…",
  "department_code": "51",
  "city": "Sonnac",
  "postal_code": "17160",
  "address": "32 rue des Chails",
  "url": "https://fr.ftp.opendatasoft.com/datadila/JO/ASSOCIATIONS/JOAFE/PDF/2026/20260031/JOAFE_PDF_Unitaire_20260031_01021.pdf"
}
```

Dataset views: **Overview**, **Contacts**, **Dissolutions**.

***

### FAQ

**Why is email empty?** JOAFE almost never stores a mailbox (~0% on recent gazette samples). Website is uncommon on creations (~4%) and more common on account filings (~50%).

**Is this the full RNA directory?** No — this is the **gazette** (events). The RNA number on each row is the join key to the national register.

**Do I need a Journal officiel account?** No.

***

### Local development

```bash
npm install
npm test
apify run --input-file=./input.json
```

On local runs, repo `input.json` is merged first; **CLI / KV input overwrites** the same keys.

***

### Also available

**[BODACC · French Legal Announcements](https://apify.com/corent1robert/bodacc-announcements-scraper)** — company creations and insolvency.\
**[BOAMP · French Public Tenders](https://apify.com/corent1robert/boamp-announcements-scraper)** — calls for tenders and awards.\
**[French Companies · Search & SIREN Enrich](https://apify.com/corent1robert/recherche-entreprises-scraper)** — directors and VAT from a SIREN (use with DCA `siren`).

***

### Support

Custom JOAFE watches or CRM push: **<corentin@outreacher.fr>**

# Actor input Schema

## `runPreset` (type: `string`):

**Daily new associations** — creations published yesterday (best for a morning schedule).

**Recent dissolutions** — associations wound up yesterday.

**Creations — last 7 days** — a wider window.

**Keyword watch** — last 7 days of creations, meant to be used with keywords below.

## `keywords` (type: `array`):

Filter by name or object — **one term per line**, OR logic (e.g. `sport`, `environnement`). Leave blank to export **all** notices matching the preset.

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

Keep notices for these French departments (e.g. `75`, `69`, `13`). Leave blank for nationwide.

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

Paste a search from [Associations — Journal officiel](https://www.journal-officiel.gouv.fr/pages/associations-recherche/) (or the dataset explorer). Keywords, notice type, dates, and department are applied when present.

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

**25** = quick preview. **0** = no numerical cap (the date window and gazette size still apply).

## Actor input object example

```json
{
  "runPreset": "daily_creations",
  "maxResults": 10
}
```

# Actor output Schema

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

Full export — every field from this run.

## `datasetOverview` (type: `string`):

Name, RNA, type, city, object.

## `datasetContacts` (type: `string`):

Website and email when the gazette published them, plus RNA.

## `datasetDissolutions` (type: `string`):

Wound-up associations — name, RNA, city, date.

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

Plain-text progress summary from this 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 = {
    "runPreset": "daily_creations",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/joafe-associations-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 = {
    "runPreset": "daily_creations",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/joafe-associations-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 '{
  "runPreset": "daily_creations",
  "maxResults": 10
}' |
apify call corent1robert/joafe-associations-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/joafe-associations-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/qoHzf0KMkSVutz6Mn/builds/UMnfbQJbCepdPozhP/openapi.json
