# France Property Valuation & Sold Prices (DVF) (`kris_fili/france-property-valuation-dvf`) Actor

Value any apartment or house in France from official DVF sale prices (notarial deeds): estimate, price per m², range, comparable sales, or a market report for any address or commune.

- **URL**: https://apify.com/kris_fili/france-property-valuation-dvf.md
- **Developed by:** [Krzysztof Filipiak](https://apify.com/kris_fili) (community)
- **Categories:** Real estate, AI, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $150.00 / 1,000 property valuations

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

## France Property Valuation & Sold Prices (DVF) – AVM API

**How much is this apartment or house in France worth?** Give an address and the living area – get an automated valuation based on **official sale prices from notarial deeds (DVF)** nearby, with a value range, a confidence level and the comparable sales used. Or ask for a **market report** for any address, commune or postcode.

The data comes from **DVF – Demandes de valeurs foncières**, the register of property sales recorded by the French tax administration (DGFiP) from notarial deeds, in the geolocated version published by Etalab. Addresses are located with the official IGN Géoplateforme (Base Adresse Nationale).

### What you get

**Valuation** (one record per property):

- **estimated value** in € and **price per m²**, with a **range** (25th–75th percentile of similar sales)
- **confidence** (high / medium / low) and the number of comparable sales used
- the **10 most similar sales**: date, price, area, rooms, price per m², street and number, distance
- the **local market**: median price per m² within 500 m, sales per year, year-on-year change
- the **price level date** – DVF is published twice a year, so every result says which quarter it reflects

**Market report** (one record per area): number of sales, median and quartiles of the price per m² for apartments and houses, prices by number of rooms and by year, year-on-year change, share of new builds – for a radius around an address or a whole commune (Paris, Lyon and Marseille arrondissements included). Optionally the list of individual sales.

### Example – valuation

Input:

```json
{ "address": "12 rue de la Roquette, Paris", "areaM2": 45, "rooms": 2 }
```

Output (shortened, real run from October 2026):

```json
{
  "recordType": "valuation",
  "location": { "matched": "12 Rue de la Roquette 75011 Paris", "matchType": "housenumber", "communeCode": "75111" },
  "estimatedValueEur": 480000,
  "estimatedPricePerM2Eur": 10673,
  "valueRangeEur": { "low": 431000, "high": 541000 },
  "confidence": "high",
  "priceLevelAsOf": "2025-Q4",
  "comparablesUsed": 234,
  "searchRadiusM": 300,
  "period": { "from": "2023-01", "to": "2025-12" },
  "localMarket": { "sales": 1016, "radiusM": 500, "medianPricePerM2Eur": 10718, "yearOverYearPct": 2.0,
    "byYear": [ { "year": "2023", "medianPricePerM2Eur": 11228 }, { "year": "2024", "medianPricePerM2Eur": 10439 }, { "year": "2025", "medianPricePerM2Eur": 10652 } ] },
  "comparables": [
    { "date": "2025-10-07", "priceEur": 698000, "areaM2": 50, "rooms": 2, "pricePerM2Eur": 13960, "street": "Rue De La Roquette", "number": "18", "distanceM": 31 }
  ]
}
```

More real results from the same day:

| Property | Estimate | € / m² | Confidence |
|---|---|---|---|
| Bordeaux, 25 cours de l'Intendance · apartment 80 m² · 3 rooms | 405,000 € | 5,065 | medium |
| Toulouse, 8 boulevard Lazare Carnot · apartment 62 m² · 3 rooms | 288,000 € | 4,643 | medium |
| Mérignac, rue Camille Goillot · house 110 m² · 5 rooms | 420,000 € | 3,815 | medium |

### Example – market report

```json
{ "mode": "market_report", "address": "Lyon 6e" }
```

Real result: **Lyon 6e arrondissement – 1,789 apartment sales from January 2023 to December 2025, median 5,511 €/m², +4.5% year on year.** For the commune of Bordeaux (`"address": "33000"`): 9,576 apartment sales, median 4,281 €/m² (−2.4% year on year), and 2,986 house sales, median 5,053 €/m².

### Value many properties at once

Put up to 100 properties in `properties`:

```json
{
  "properties": [
    { "address": "25 cours de l'Intendance, Bordeaux", "areaM2": 80, "rooms": 3 },
    { "address": "8 boulevard Carnot, Toulouse", "areaM2": 62, "rooms": 3 },
    { "address": "10 rue Camille Goillot, Mérignac", "areaM2": 110, "rooms": 5, "propertyType": "house" }
  ]
}
```

Each successful valuation is a separate record and charge; addresses that cannot be valued get an error record and are **not charged**.

### Use it from an AI assistant (MCP)

Connect the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) to Claude, ChatGPT, Cursor or your own agent and ask, for example: *"What is a 45 m² two-room flat at 12 rue de la Roquette in Paris worth, based on DVF sales?"* The assistant calls this Actor and answers with the estimate, the range and the comparable sales.

### How the estimate is calculated

1. **Comparable sales** – DVF sales of a single apartment or a single house (outbuildings such as a cellar or parking allowed) within 300 m, extended to 700 m, 1.5 km, 3 km or 8 km when there are too few; the last 36 months of data by default. Exchanges, auctions, sales of several dwellings at once and sales including commercial premises are excluded, as are implausible prices.
2. **Time adjustment** – each sale is moved to the price level of the newest quarter in DVF with the local quarterly trend (smoothed, at most ±15%).
3. **Similarity weights** – distance, living area (±30% weighs most), number of rooms and recency.
4. **Estimate** – the weighted median price per m² × your living area; the range is the weighted 25th–75th percentile.
5. **Confidence** – high with many consistent sales; lower when sales are few, prices vary a lot, or only the street or the commune of the address was found.

This is an automated valuation model (AVM), not a formal appraisal. It does not see the condition, floor, view or energy rating (DPE) of the property – the range shows how much similar properties differ. DVF uses the built area from the land registry (*surface réelle bâtie*), which can differ slightly from the Carrez area in listings.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Property valuation (only when an estimate is produced) | $0.15 |
| Market report (only when sales are found) | $0.10 |
| Sale listed in a market report (optional) | $0.001 |

### Inputs

| Field | Description |
|---|---|
| `mode` | `valuation` (default) or `market_report`. |
| `address` | French address; for a market report also a commune or postcode. |
| `propertyType` | `apartment` (default) or `house`. |
| `areaM2` | Living area in m² (9–1000), required for a valuation. |
| `rooms` | Main rooms (*pièces*), optional. |
| `market` | `resale` (default), `new` (VEFA) or `any`. |
| `monthsBack` | Months of DVF data to use, 12–60 (default 36). |
| `properties` | Optional list for a batch valuation. |
| `areaScope`, `radiusMeters` | Market report area: auto, a radius (default 500 m) or the whole commune. |
| `includeTransactions`, `maxTransactions` | Market report: also list the sales. |

### Data sources, coverage and privacy

- **DVF** (Demandes de valeurs foncières), DGFiP, geolocated by Etalab – Licence Ouverte 2.0. Updated twice a year (April and October) with a delay of about six months; each result shows the newest month used.
- **Not covered by DVF:** Alsace-Moselle (departments 57, 67, 68) and Mayotte – their land registry is kept differently.
- DVF has no names of buyers or sellers. Results are delivered only to you and are not published or indexed.

### Related Actors

- [SeLoger & Leboncoin Listing Deal Checker](https://apify.com/kris_fili/seloger-leboncoin-deal-checker) – compare whole listing datasets with DVF sale prices and find the bargains.
- [Poland Apartment Valuation (AVM)](https://apify.com/kris_fili/poland-apartment-valuation) – the same approach for Poland, on notarial deeds from the RCN register.

***

#### En français – estimation immobilière à partir des prix de vente DVF

Estimez la valeur d'un appartement ou d'une maison partout en France à partir des **prix de vente réels (DVF – Demandes de valeurs foncières)** : prix estimé, prix au m², fourchette, indice de confiance et ventes comparables à proximité (adresse, date, surface, prix). Le mode **rapport de marché** donne le prix médian au m² des appartements et des maisons pour une adresse, une commune ou un code postal (arrondissements de Paris, Lyon et Marseille compris), par nombre de pièces et par année. Données officielles DVF de la DGFiP, géolocalisées par Etalab.

# Actor input Schema

## `mode` (type: `string`):

Valuation = value of one property (or a list). Market report = sale price statistics for an address or a whole commune.

## `address` (type: `string`):

A French address, e.g. '12 rue de la Roquette, Paris' or '25 cours de l'Intendance, Bordeaux'. For a market report a commune or postcode also works ('Lyon 6e', '33000').

## `propertyType` (type: `string`):

Apartment (appartement) or house (maison).

## `areaM2` (type: `number`):

Living area in square metres (9–1000). Required for a valuation.

## `rooms` (type: `integer`):

Main rooms as in French listings – a 'T2' or '2 pièces' = 2. Optional, improves the match.

## `market` (type: `string`):

Resale (ancien) for most valuations; new = bought off-plan from a developer (VEFA); any = both.

## `monthsBack` (type: `integer`):

How many months of DVF sales to use (12–60), counted back from the newest data. Older sales are adjusted with the local trend.

## `properties` (type: `array`):

Value up to 100 properties in one run, e.g. \[{"address": "10 rue Sainte-Catherine, Bordeaux", "areaM2": 60, "rooms": 3, "propertyType": "apartment"}]. When set, the single-property fields above are ignored. Each successful valuation is charged separately.

## `includeComparables` (type: `boolean`):

List the comparable DVF sales used for the estimate (no extra charge).

## `areaScope` (type: `string`):

Auto = a radius around a street address, the whole commune for a commune or postcode.

## `radiusMeters` (type: `integer`):

Radius around the address for a market report (100–10,000 m).

## `includeTransactions` (type: `boolean`):

Also write the individual sales (newest first) to the dataset – charged per sale.

## `maxTransactions` (type: `integer`):

1–5,000.

## Actor input object example

```json
{
  "mode": "valuation",
  "address": "12 rue de la Roquette, Paris",
  "propertyType": "apartment",
  "areaM2": 45,
  "market": "resale",
  "monthsBack": 36,
  "properties": [],
  "includeComparables": true,
  "areaScope": "auto",
  "radiusMeters": 500,
  "includeTransactions": false,
  "maxTransactions": 100
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "address": "12 rue de la Roquette, Paris",
    "areaM2": 45,
    "properties": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("kris_fili/france-property-valuation-dvf").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 = {
    "address": "12 rue de la Roquette, Paris",
    "areaM2": 45,
    "properties": [],
}

# Run the Actor and wait for it to finish
run = client.actor("kris_fili/france-property-valuation-dvf").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 '{
  "address": "12 rue de la Roquette, Paris",
  "areaM2": 45,
  "properties": []
}' |
apify call kris_fili/france-property-valuation-dvf --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kris_fili/france-property-valuation-dvf"
        }
    }
}
```

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/d12kv2iT8KdJWczmZ/builds/LSoJn9Iv3C7w5Wd6O/openapi.json
