# French DPE F/G · Property Owner SIRENs (`corent1robert/dpe-fg-proprietaires-siren`) Actor

Export SCI / property companies sitting on ADEME DPE class F or G dwellings (passoires). Unique SIREN, directors, DPE stats. Open data, no login, no invented emails.

- **URL**: https://apify.com/corent1robert/dpe-fg-proprietaires-siren.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 siren owner of f/g dwellings

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/platform/actors/running/actors-in-store#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

## French DPE F/G · SIREN Property Owners (passoires)

Build a **CRM list of professional property owners** sitting on **energy class F or G dwellings** — the French *passoires thermiques*.

The Actor reads the official **ADEME DPE** open data (existing homes since July 2021) and matches each BAN address to **INSEE SIRENE** companies. Default keepers are **SCI** and **foncières** (NAF 68.10 / 68.20). Private individuals without a company SIREN are out of scope.

**HTTP only. No login. No API key. No browser. No invented emails.**

> ADEME never publishes the owner of a dwelling. Fichiers fonciers / MAJIC are not open. This Actor is the public-data path: **DPE F/G signal → company at the same address**. Match rate is not 100% — that is expected.

### Who is this for?

| You are… | Typical goal | Suggested setup |
|---|---|---|
| RGE contractor / renovation sales | Warm territory of passoires with a reachable legal entity | Dept 75 or 69 · SCI / foncières |
| CEE broker / energy SaaS | Buildings that must be renovated under French law | Class **G** only · raise Max addresses |
| Lead agency (rénovation énergie) | Unique SIREN file, not a dump of apartments | Max items 500 · Outreach view |
| Data / ops | Monthly refresh of a department | Schedule · Max DPE 5,000 |

**What you get by default:** SIREN, SIRET, company name, legal form, NAF, siège address, public directors (name + role), count of F/G DPE at that address, worst class, surfaces, sample DPE ids.

**What you do not get:** emails, phones, or websites. Those fields are **always null**. We do not guess them.

**When to switch match mode:** use **SCI + syndics / copropriété** when you sell building-level works (toiture, chauffage collectif). Use **any company at the address** only if you accept shops and liberal practices in the same street number.

### How to extract DPE F/G owners

1. Open the Actor in Apify Console.
2. Keep **Department = 75 (Paris)** and **Max items = 50** for a first run — or pick your market.
3. Optional: postal codes (`75002`), city, building type, min DPE date.
4. Click **Start**. Export JSON / CSV / Excel.

**Max items = 0** → all matches until the DPE / address caps (Free plan still capped at **100** rows / run).

Paris alone has **150k+** F/G certificates. Always set a department (or postal / city). The Actor streams the ADEME API with `etiquette_dpe_in=F,G` and never downloads the nationwide dump.

### What data can this Actor extract?

| Category | Fields |
|---|---|
| Company | `companyName`, `siren`, `siret`, `legalForm`, `nafCode`, `companyStatus`, `tvaNumber` |
| Owner kind | `isSci`, `ownerKind` (`sci` / `real_estate_company` / `syndicat_copropriete`) |
| People | `directors`, `directorNames` (INSEE, no dates of birth) |
| Location | `address`, `postalCode`, `city`, `department`, `inseeUrl` |
| DPE signal | `dpeCount`, `dpeClassFCount`, `dpeClassGCount`, `worstDpeClass`, `totalSurfaceM2`, `latestDpeDate`, `dpeShared` |
| DPE sample | `dpeIds`, `dpeAddresses`, nested `dpes[]` |
| Co-located SCI | `sciCountAtAddress`, `otherSciAtAddress`, `otherSciText` |
| Meta | `source`, `scrapedAt` |

### How much will it cost?

**HTTP-only open data** — default **1024 MB**, 4-hour timeout, no residential proxy.

This is priced as a **SIREN file** ($2 / 1,000 unique companies), not as a cadastral-owner lead. Another Store Actor charges ~**$36 / 1,000** when it claims a DGFiP / fichiers-fonciers owner match. We do **not** have that source — we match INSEE companies at the same BAN address. You pay for unique SIREN rows, not per DPE apartment.

| | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Per SIREN owner (PPE) | $0.002 | $0.0018 | $0.0016 | $0.0014 | $0.0012 | $0.001 |
| 50 owners | **$0.10** | $0.09 | $0.08 | $0.07 | $0.06 | $0.05 |
| 1,000 owners | **$2.00** | $1.80 | $1.60 | $1.40 | $1.20 | $1.00 |

Free plan: **100 rows / run** to test.

A 0-row run is still a success (and not billed per item): those addresses had no SCI in SIRENE.

### Input

See the **Input** tab for the full form.

| Field | Default | Notes |
|---|---|---|
| `departments` | `75` | Multi-select. Applied if you leave geo empty. |
| `postalCodes` / `cities` | — | Optional extra geo |
| `energyClasses` | `F`, `G` | Add `E` only if you want the next band |
| `ownerMatchMode` | SCI / property companies | Or + syndics, or any company |
| `maxItems` | `50` | Unique SIREN ceiling (`0` = uncapped) |
| `maxDpeToScan` | `400` | ADEME rows read |
| `maxAddressesToMatch` | `120` | SIRENE lookups |

### Output

You can download the dataset as JSON, HTML, CSV, or Excel.

```json
{
  "siren": "951936004",
  "companyName": "Beleza Greneta",
  "legalForm": "SCI",
  "nafCode": "68.20B",
  "companyStatus": "active",
  "ownerKind": "sci",
  "directorNames": ["Charlotte de Ascencao"],
  "address": "47 Rue Greneta 75002 Paris",
  "city": "Paris",
  "department": "75",
  "inseeUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/951936004",
  "dpeCount": 1,
  "worstDpeClass": "G",
  "dpeShared": true,
  "dpeAddresses": ["47 Rue Greneta 75002 Paris"],
  "sciCountAtAddress": 3,
  "otherSciText": "SCI Sevigne (320420169); Les Amis de Krousar Thmey (414799239)",
  "email": null,
  "scrapedAt": "2026-08-19T12:00:00.000Z"
}
```

**One row = one unique SIREN**, with F/G DPE aggregated at that company’s matched address(es).

### Tips

- Start with one department. Raise `maxAddressesToMatch` before `maxDpeToScan` if you want more owners — several apartments share one BAN address.
- SCI match rate is far below 100%. Many passoires are owned by private individuals (no SIREN). That is the product, not a bug.
- Several SCI can sit at the **same BAN address** as one DPE (a building with several lots). **Every SCI is exported** as its own row. `dpeShared`, `sciCountAtAddress`, `otherSciAtAddress` and `otherSciText` list the neighbours so a CRM does not treat them as duplicates. Max items never cuts a building in half.
- Combine with a separate SIREN → dirigeants / enrichment Actor if you need emails from another source.

### Is it legal to reuse ADEME DPE + SIRENE?

This Actor uses:

- [ADEME DPE logements existants (depuis juillet 2021)](https://data.ademe.fr/datasets/dpe03existant) via the Data Fair API, also listed on [data.gouv.fr](https://www.data.gouv.fr/datasets/dpe-logements-existants-depuis-juillet-2021)
- [Recherche d’entreprises](https://recherche-entreprises.api.gouv.fr) (INSEE SIRENE)

Both are public open data. Company dirigeants are published by INSEE. As with any file that can contain personal data, ensure your use complies with GDPR (B2B legitimate interest, opt-out, etc.).

Our Actors do not extract private user emails from these sources. We only keep what the administrations have published. You should still treat company officer names as personal data.

### FAQ

#### Is this the cadastral owner (DGFiP / fichiers fonciers)?

No. ADEME never publishes the owner. MAJIC is not open. We keep **companies whose établissement sits at the same BAN address** as the DPE (SCI / NAF 68 by default). That is a **signal for outreach**, not a proof of title. If you need the legal owner, you need fichiers fonciers — and you will pay Store prices in that range (~$36 / 1k company-owner leads).

#### Why are emails always empty?

SIRENE and ADEME do not publish emails. Inventing them would be both useless and non-compliant. Enrich elsewhere if you have a lawful basis.

#### Why so few SIREN vs DPE count?

Most French dwellings are owned by individuals. This Actor is built for the **professional owner** slice (SCI, foncières, optional syndics).

#### Does it work outside Paris?

Yes — pick any department. Defaults are Paris so a first Console run stays cheap.

### Support

Issues tab for bugs and geo edge cases. API tab for programmatic runs. Custom lists: corentin@outreacher.fr

# Actor input Schema

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

ADEME department codes. Default **75 (Paris)**. Always set a geo filter — nationwide F/G is millions of rows.

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

Optional. e.g. `75002`, `69001`. Applied both on ADEME and on SIRENE.

## `cities` (type: `array`):

Optional contains-match on ADEME city (BAN). e.g. `Lyon`, `Bordeaux`.

## `energyClasses` (type: `array`):

**F** and **G** are the regulatory passoires. Add **E** only if you also want the next band.

## `buildingTypes` (type: `array`):

Optional. Leave empty for all.

## `minDpeDate` (type: `string`):

Optional ISO date (`YYYY-MM-DD`). Keep recent certificates only.

## `ownerMatchMode` (type: `string`):

**SCI / foncières (default):** legal form SCI or NAF 68.10 / 68.20 at the dwelling address. **+ syndics / copro:** also syndicat de copropriété (9110) and 68.32. **Any company at address:** any non-EI SIREN at that street number (noisier).

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

Row ceiling (unique SIREN). Default **50**. **0** = no ceiling (still bounded by Max DPE / Max addresses). If an address has several SCI, **all of them are exported** even if that slightly exceeds the ceiling — we never cut a building in half. Free plans capped at 100 / run.

## `maxDpeToScan` (type: `integer`):

Hard cap on ADEME rows read (not exported). Default **400**. Protects memory/time — Paris alone has 150k+ F/G.

## `maxAddressesToMatch` (type: `integer`):

Cap on SIRENE lookups (one per BAN address). Default **120**.

## Actor input object example

```json
{
  "departments": [
    "75"
  ],
  "energyClasses": [
    "F",
    "G"
  ],
  "ownerMatchMode": "propertyCompanies",
  "maxItems": 50,
  "maxDpeToScan": 400,
  "maxAddressesToMatch": 120
}
```

# Actor output Schema

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

Company, SIREN, city, DPE counts

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

Directors + SIREN for CRM import

## `dpeStats` (type: `string`):

F/G counts, surface, worst class

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

All rows

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

No description

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

No description

# 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 = {
    "departments": [
        "75"
    ],
    "energyClasses": [
        "F",
        "G"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/dpe-fg-proprietaires-siren").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 = {
    "departments": ["75"],
    "energyClasses": [
        "F",
        "G",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/dpe-fg-proprietaires-siren").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 '{
  "departments": [
    "75"
  ],
  "energyClasses": [
    "F",
    "G"
  ]
}' |
apify call corent1robert/dpe-fg-proprietaires-siren --silent --output-dataset

```

## MCP server setup

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

```

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/g3BUpLaNBg9GlCeXk/builds/UQDb0cvnHEfNLWEXy/openapi.json
