# France Condominium Registry - Syndics & Mandate End Dates (`eurodata-lab/france-condominium-registry`) Actor

Search the official French condominium registry (RNIC): condominiums with their professional syndic, mandate end date, lots and age. Daily data, no scraping.

- **URL**: https://apify.com/eurodata-lab/france-condominium-registry.md
- **Developed by:** [Cyril Naets](https://apify.com/eurodata-lab) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 condominium returneds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does France Condominium Registry do?

**France Condominium Registry** searches the official **French condominium registry** (Registre national d'immatriculation des copropriétés, RNIC, run by Anah) and returns each condominium with its **professional syndic** (company name and SIRET), the **end date of the syndic's mandate**, the number of lots, the construction period, the cadastral parcels and public-aid flags. It reads the registry file published **every day** on data.gouv.fr, so you get today's data in seconds instead of downloading and filtering a 400 MB CSV yourself.

Typical question it answers: *"Which condominiums of more than 50 lots, built before 1975 in the Rhône, have a syndic contract ending in the next 6 months, and who is their syndic?"*

It covers the 650,000+ registered condominiums in France. No scraping, no proxy, no login: only the official open-data API of data.gouv.fr.

### Why use France Condominium Registry?

- **Syndics and property managers**: find buildings whose syndic contract ends soon, or that have no syndic at all, and prepare your offer before the general meeting.
- **Energy renovation, façade, roofing and lift companies**: target large pre-1975 buildings, buildings already aided by Anah, or buildings in priority neighbourhoods.
- **Insurers and brokers**: build a list of buildings by size and age in your area, and see who manages them.
- **Proptech, data and market studies**: market share of each syndic by commune or department, portfolio of a competitor (filter by its SIREN), mandate renewal calendar.
- **CRM enrichment**: refresh a list of registration numbers you already follow and detect syndic changes.

What you get that the raw file does not give you: server-side filters (area, syndic, mandate dates, size, age, aid), relative dates for scheduled runs ("contracts ending in the next 90 days"), clean English field names, construction periods normalised across the two codings used by the registry, the days left before the mandate ends, and **no personal data** (see the FAQ).

### What data can France Condominium Registry extract?

One row per condominium:

| Field | Description |
|---|---|
| `registrationNumber` | Registry number of the condominium (2 letters and 7 digits) |
| `condominiumName` | Usual name of the condominium as declared in the registry |
| `address` | Reference address of the building |
| `streetAddress` | Street number and name of the reference address |
| `postalCode` | Postal code of the reference address |
| `city` | City of the reference address, as declared |
| `additionalAddresses` | Other addresses of the building listed in the bylaws (up to 3) |
| `communeCode` | INSEE code of the commune (arrondissement code for Paris, Lyon and Marseille) |
| `communeName` | Official name of the commune |
| `districtName` | Official name of the arrondissement, or of the commune elsewhere |
| `epciName` | Intercommunal authority (EPCI or metropolis) |
| `departmentCode` | Department code |
| `departmentName` | Department name |
| `regionName` | Region name |
| `latitude` | Latitude of the reference address (WGS84) |
| `longitude` | Longitude of the reference address (WGS84) |
| `syndicType` | `professional`, `volunteer` (a co-owner, never named) or `none` (no syndic declared) |
| `syndicName` | Company name of the professional syndic |
| `syndicSiret` | SIRET of the professional syndic (14 digits) |
| `syndicSiren` | SIREN of the professional syndic (9 digits) |
| `syndicApeCode` | Activity code (APE/NAF) of the professional syndic |
| `syndicCity` | City of the professional syndic |
| `syndicNameWithheld` | `true` when a syndic exists but its identity is not returned (volunteer co-owner or sole proprietor) |
| `mandateStatus` | `active`, `expiredNoSuccessor`, `expiredWithSuccessor`, `noMandate` or `unknown` |
| `mandateEndDate` | End date of the last declared syndic mandate |
| `mandateDaysLeft` | Days between the run date and the mandate end date (negative when already ended) |
| `totalLots` | Total number of lots |
| `residentialCommercialLots` | Lots used as housing, offices or shops |
| `residentialLots` | Lots used (fully or partly) as housing |
| `parkingLots` | Parking lots |
| `constructionPeriod` | Construction period, for example `before 1949`, `1949-1960`, `2011 or later` or `unknown` |
| `constructionYearFrom` | First year of the construction period |
| `constructionYearTo` | Last year of the construction period |
| `bylawsDate` | Date of the condominium bylaws |
| `registrationDate` | Date of first registration in the registry |
| `lastUpdatedAt` | Date of the last update of this condominium in the registry |
| `isMainSyndicate` | `false` for a secondary syndicate (part of a larger estate) |
| `mainSyndicateRegistrationNumber` | Registration number of the main syndicate, when declared |
| `isServicedResidence` | Serviced residence (résidence-services) |
| `isCooperativeSyndicate` | Cooperative syndicate (syndicat coopératif) |
| `cadastralReferences` | Cadastral parcel references (up to 3) |
| `parcelCount` | Total number of cadastral parcels |
| `anahAided` | Received an Anah grant since 2014 |
| `inActionCoeurDeVille` | In an "Action cœur de ville" town-centre programme |
| `inPetitesVillesDeDemain` | In a "Petites villes de demain" programme |
| `priorityNeighbourhoodCode` | Code of the priority urban neighbourhood (2024 boundaries) |
| `priorityNeighbourhoodName` | Name of the priority urban neighbourhood (2024 boundaries) |
| `sourceFileDate` | Date and time of the registry file used for the run |
| `sourceUrl` | Page of the official dataset on data.gouv.fr |

You can download the results as JSON, CSV, Excel, XML or HTML, or read them through the Apify API.

### How to find condominiums whose syndic contract ends soon

1. Open the **Input** tab.
2. In **Where**, enter one or more **Commune INSEE codes** (for example `74010` for Annecy), **Postal codes** or **Department codes**.
3. Set **Syndic type** to **Professional** and **Mandate status** to **Active mandate**.
4. Set **Mandate ends on or after** to `today` and **Mandate ends on or before** to `in 6 months`.
5. Choose **Sort by** = **Mandate end date (soonest first)**, set **Maximum number of results**, and click **Start**.

Schedule the same input every month: thanks to the relative dates, each run returns the contracts ending in the next six months at that date.

### How much does it cost to search the French condominium registry?

This Actor uses **pay-per-event** pricing: you pay only for the condominiums returned.

| Event | Price | Equivalent |
|---|---|---|
| `result`: one condominium returned | $0.015 | **$15 per 1,000 condominiums** |
| `apify-actor-start`: run started (charged by Apify) | $0.00005 | $0.05 per 1,000 runs |

- Registration numbers not found, rows left out because the syndic is a private individual, and empty searches cost nothing.
- **Maximum number of results** caps every run, and Apify's maximum cost per run setting is respected: the run stops cleanly when your limit is reached.
- Example: the 1,000 buildings of a department with a professional syndic cost $15.

### Input

All the filters you fill in are combined (a condominium must match all of them). Leave the three area fields empty to search the whole of France.

| Field | Type | Default | Description |
|---|---|---|---|
| `communeCodes` | array of strings | `[]` (prefill `["74010"]`) | INSEE codes of the communes (not postal codes). Paris `75056`, Lyon `69123` and Marseille `13055` are expanded to their arrondissements. |
| `postalCodes` | array of strings | `[]` | Postal codes of the reference address |
| `departmentCodes` | array of strings | `[]` | Department codes, for example `69`, `2A`, `974` |
| `registrationNumbers` | array of strings | `[]` | Registration numbers to look up (format `AA2099810`) |
| `syndicType` | string | `any` (prefill `professional`) | `any`, `professional`, `volunteer` or `none` |
| `syndicNameContains` | string | `""` | Part of the professional syndic's company name, case-insensitive (at least 3 characters) |
| `syndicSiren` | string | `""` | SIREN (9 digits) or SIRET (14 digits) of a professional syndic |
| `mandateStatus` | string | `any` (prefill `active`) | `any`, `active`, `expiredNoSuccessor`, `expiredWithSuccessor` or `noMandate` |
| `mandateEndFrom` | string | `""` (prefill `today`) | Mandate ends on or after: a date (`2026-12-31`), `today`, or a relative period (`+30 days`, `30 days ago`) |
| `mandateEndTo` | string | `""` | Mandate ends on or before: a date or a relative period (`in 6 months`, `+180 days`) |
| `minLots` | integer | `0` | Minimum total number of lots (0 = no minimum) |
| `maxLots` | integer | `0` | Maximum total number of lots (0 = no maximum) |
| `builtBefore` | string | `any` | `any`, `1949`, `1975` or `2001` (unknown periods are left out) |
| `anahAidedOnly` | boolean | `false` | Only condominiums that received an Anah grant |
| `priorityNeighbourhoodOnly` | boolean | `false` | Only condominiums in a priority urban neighbourhood |
| `sortBy` | string | `sourceOrder` (prefill `mandateEndDate`) | `sourceOrder`, `mandateEndDate` (soonest first) or `totalLotsDesc` (largest first) |
| `maxResults` | integer | `100` (prefill `10`) | Maximum number of condominiums returned (1 to 100,000) |

Example input (the prefilled one): the 10 professional syndic contracts of Annecy that end first from today.

```json
{
    "communeCodes": ["74010"],
    "syndicType": "professional",
    "mandateStatus": "active",
    "mandateEndFrom": "today",
    "sortBy": "mandateEndDate",
    "maxResults": 10
}
```

Example input for prospecting: large pre-1975 buildings of the Rhône whose contract ends in the next 6 months.

```json
{
    "departmentCodes": ["69"],
    "builtBefore": "1975",
    "minLots": 20,
    "mandateEndFrom": "today",
    "mandateEndTo": "in 6 months",
    "sortBy": "totalLotsDesc",
    "maxResults": 300
}
```

### Output

Example of one condominium (real record, run of 26 October 2026):

```json
{
    "registrationNumber": "AC6068308",
    "condominiumName": "GRIVES - LE JOURDIL - MS20757",
    "address": "3 Rue Moussy 74960 Annecy",
    "streetAddress": "3 Rue Moussy",
    "postalCode": "74960",
    "city": "Annecy",
    "additionalAddresses": ["3 RUE MOUSSY 74960 ANNECY", "5 RUE MOUSSY 74960 ANNECY", "7 RUE MOUSSY 74960 ANNECY"],
    "communeCode": "74010",
    "communeName": "Annecy",
    "districtName": "Annecy",
    "epciName": "Ca Du Grand Annecy",
    "departmentCode": "74",
    "departmentName": "Haute-Savoie",
    "regionName": "Auvergne Rhône-Alpes",
    "latitude": 45.90566,
    "longitude": 6.099656,
    "syndicType": "professional",
    "syndicName": "MATERA",
    "syndicSiret": "82518857600052",
    "syndicSiren": "825188576",
    "syndicApeCode": "6201Z",
    "syndicCity": "PARIS",
    "syndicNameWithheld": false,
    "mandateStatus": "active",
    "mandateEndDate": "2026-05-28",
    "mandateDaysLeft": -151,
    "totalLots": 48,
    "residentialCommercialLots": 24,
    "residentialLots": 24,
    "parkingLots": 0,
    "constructionPeriod": "1961-1974",
    "constructionYearFrom": 1961,
    "constructionYearTo": 1974,
    "bylawsDate": "1972-10-05",
    "registrationDate": "2018-05-31",
    "lastUpdatedAt": "2025-08-23",
    "isMainSyndicate": true,
    "mainSyndicateRegistrationNumber": null,
    "isServicedResidence": false,
    "isCooperativeSyndicate": false,
    "cadastralReferences": [],
    "parcelCount": 0,
    "anahAided": true,
    "inActionCoeurDeVille": false,
    "inPetitesVillesDeDemain": false,
    "priorityNeighbourhoodCode": null,
    "priorityNeighbourhoodName": null,
    "sourceFileDate": "2026-10-26T07:05:58.168000+00:00",
    "sourceUrl": "https://www.data.gouv.fr/datasets/registre-national-dimmatriculation-des-coproprietes"
}
```

Here the registry still says "active" although the declared end date has passed (`mandateDaysLeft` is negative): the syndic has not yet declared the renewal. Such buildings are often worth a call.

The dataset has three table views: **Overview**, **Syndic mandates** and **Buildings and location**.

### Tips

- **INSEE code, not postal code**: Annecy is `74010` (INSEE) but `74000` (postal). Use **Postal codes** if that is what you have.
- **Recurring prospecting**: use relative dates (`today`, `in 3 months`) and a monthly schedule.
- **Competitor portfolio**: put the competitor's SIREN in **Syndic SIREN** and its department in **Department codes**.
- **No syndic at all**: set **Syndic type** to **No syndic declared**; more than 40% of registered condominiums have none.
- Large searches (a whole region) are fine: results come in pages of 200 rows, about 1,000 condominiums per minute.

### FAQ

#### Where does the data come from, and can I reuse it?

From the Registre national d'immatriculation des copropriétés, kept by Anah (the French national housing agency) and published every day on [data.gouv.fr](https://www.data.gouv.fr/datasets/registre-national-dimmatriculation-des-coproprietes) under the Licence Ouverte 2.0 (Etalab), which allows commercial reuse when the source is cited. This Actor is not affiliated with Anah or data.gouv.fr.

#### How fresh is the data?

Each run reads the latest daily file (its date is in `sourceFileDate`). The registry itself is filled in by the syndics: a mandate renewal that the syndic has not declared yet will appear later.

#### Does the output contain personal data?

No. Volunteer syndics are co-owners: the registry does not publish their identity and the Actor returns neither their name nor their city. Professional syndics are named only when the official company register (Recherche d'entreprises, French government API) confirms they are a company; sole proprietors, whose business name is a person's name, are withheld (`syndicNameWithheld` = `true`). A search by syndic name or SIREN never returns the buildings of a withheld syndic. The Actor returns no contact details (no e-mail, no phone) and no names of company officers. Addresses are those of residential buildings, not of individuals. If you contact syndics or building councils, you do so under your own responsibility (GDPR, anti-spam rules).

#### Why do some buildings have no syndic or no construction period?

Because the registry does not have them: more than 40% of registered condominiums have no syndic declared, and many small buildings have an unknown construction period. The `builtBefore` filter leaves out unknown periods.

#### Does it include the safety or unfit-housing orders of a building?

No. The current open-data file of the registry no longer contains these columns, so the Actor does not return them.

#### Why are some registration numbers not found?

The number may be mistyped (2 letters and 7 digits) or the condominium may have left the registry. Numbers not found are listed in the run log and are not billed.

#### Something looks wrong, or I need another field?

Open an issue on the Actor's **Issues** tab with an example registration number: we usually answer within a few days.

# Actor input Schema

## `communeCodes` (type: `array`):

INSEE codes of the communes to search (5 characters, not the postal code), for example 74010 for Annecy or 33063 for Bordeaux. Paris (75056), Lyon (69123) and Marseille (13055) are expanded to all their arrondissements. Leave empty to search without a commune filter.

## `postalCodes` (type: `array`):

Postal codes of the building's reference address (5 digits), for example 75011. Leave empty to search without a postal code filter.

## `departmentCodes` (type: `array`):

French department codes, for example 69, 2A or 974. Leave empty to search without a department filter.

## `registrationNumbers` (type: `array`):

Registry numbers of specific condominiums (2 letters and 7 digits, for example AA2099810). Use it to refresh a list you already follow. Numbers not found are listed in the run log and are not billed.

## `syndicType` (type: `string`):

<b>Professional</b>: managed by a professional property manager (company name and SIRET returned). <b>Volunteer</b>: managed by a co-owner (identity never returned). <b>No syndic declared</b>: no syndic recorded in the registry.

## `syndicNameContains` (type: `string`):

Keep only condominiums whose professional syndic's company name contains this text (at least 3 characters, case-insensitive), for example FONCIA or NEXITY. Leave empty for all syndics.

## `syndicSiren` (type: `string`):

Keep only condominiums managed by this professional syndic: 9-digit SIREN (or 14-digit SIRET). Handy to list a competitor's portfolio. Leave empty for all syndics.

## `mandateStatus` (type: `string`):

Status of the syndic's mandate in the registry. <b>Expired, no successor declared</b> is a strong lead: the building may be looking for a new syndic.

## `mandateEndFrom` (type: `string`):

Keep only condominiums whose last syndic mandate ends on or after this date. Enter a date (2026-12-31), "today", or a period relative to the run date such as "+30 days" or "30 days ago". Leave empty for no lower bound.

## `mandateEndTo` (type: `string`):

Keep only condominiums whose last syndic mandate ends on or before this date. Enter a date (2027-06-30) or a relative period such as "in 6 months" or "+180 days". Example: "today" to "in 6 months" lists contracts up for renewal in the next six months. Leave empty for no upper bound.

## `minLots` (type: `integer`):

Keep only condominiums with at least this many lots in total (flats, shops, parking spaces...). 0 = no minimum.

## `maxLots` (type: `integer`):

Keep only condominiums with at most this many lots in total. 0 = no maximum.

## `builtBefore` (type: `string`):

Keep only buildings whose construction period ends before this year (buildings with an unknown period are left out). Before 1975 is the usual target for energy renovation, façade and lift work.

## `anahAidedOnly` (type: `boolean`):

Keep only condominiums that received a grant from Anah, the national housing agency (MaPrimeRénov' Copropriété and similar schemes, since 2014).

## `priorityNeighbourhoodOnly` (type: `boolean`):

Keep only condominiums located in a priority urban neighbourhood (quartier prioritaire de la politique de la ville, 2024 boundaries).

## `sortBy` (type: `string`):

Order of the results. <b>Mandate end date</b> puts the contracts that end first at the top.

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

Safety cap on the number of condominiums returned. The run stops once it is reached, so you never pay for more than this.

## Actor input object example

```json
{
  "communeCodes": [
    "74010"
  ],
  "postalCodes": [],
  "departmentCodes": [],
  "registrationNumbers": [],
  "syndicType": "professional",
  "syndicNameContains": "",
  "syndicSiren": "",
  "mandateStatus": "active",
  "mandateEndFrom": "today",
  "mandateEndTo": "",
  "minLots": 0,
  "maxLots": 0,
  "builtBefore": "any",
  "anahAidedOnly": false,
  "priorityNeighbourhoodOnly": false,
  "sortBy": "mandateEndDate",
  "maxResults": 10
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset with all the condominiums returned

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

Condominiums in the overview table view

# 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 = {
    "communeCodes": [
        "74010"
    ],
    "syndicType": "professional",
    "mandateStatus": "active",
    "mandateEndFrom": "today",
    "sortBy": "mandateEndDate",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("eurodata-lab/france-condominium-registry").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 = {
    "communeCodes": ["74010"],
    "syndicType": "professional",
    "mandateStatus": "active",
    "mandateEndFrom": "today",
    "sortBy": "mandateEndDate",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("eurodata-lab/france-condominium-registry").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 '{
  "communeCodes": [
    "74010"
  ],
  "syndicType": "professional",
  "mandateStatus": "active",
  "mandateEndFrom": "today",
  "sortBy": "mandateEndDate",
  "maxResults": 10
}' |
apify call eurodata-lab/france-condominium-registry --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eurodata-lab/france-condominium-registry"
        }
    }
}
```

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/KNbIKj73gXzHZxtaP/builds/KSvRhZyVs7aSGFRkk/openapi.json
