French Property Sales Summary by Commune and Year (DVF)
dvfgeo/commune-sales
A summary of the property sales recorded in one French commune in one year, from the geolocated DVF open files: the number of sales, the date range, the count of sales per nature (such as Vente), the median and quartile price per square metre for apartments and for houses, and the 100 newest sales with address, declared value, coordinates and up to 8 detail lines (property type, built area, rooms, land use, land area). Give the sale year (2021 to 2025), the 5-character INSEE commune code and its department folder (the first two characters of the code, or three for overseas communes such as 971). A year or commune with no file is refused as invalid input. Paris, Lyon and Marseille are filed by district code (Paris 75101 to 75120). Source: Ministères économiques et financiers (DGFiP), Demandes de valeurs foncières, Licence Ouverte 2.0, via data.gouv.fr; served by Eden Engine; not an official DGFiP or data.gouv.fr product. Refreshed twice a year; sales only, no lookup by a person's name.
Price
$0.0026 per call
You pay the price shown. If a call turns out to cost more than its quote, you pay the actual price, capped at twice the quote. No monthly minimum. Top-ups start at $0.50.
Data source
Demandes de valeurs foncières (DVF), data.gouv.fr
Source: Ministères économiques et financiers (DGFiP), Demandes de valeurs foncières (DVF), geolocated files published on data.gouv.fr under Licence Ouverte 2.0; the date of each sale is in the response, and the files are refreshed twice a year. Served by Eden Engine; not an official DGFiP or data.gouv.fr product.
Use it
Five steps: search, inspect, learn, run, settle. No per-tool setup; your agent reaches this tool through the meta-tools it already has.
Connect once and your AI can find and run this tool, and any other it needs.
// 1. search: find the tool
omnial_search({ query: "what you need" })
// 2. inspect: price and input schema
omnial_inspect({ tool: "dvfgeo/commune-sales" })
// 3. learn: read the usage guide at runtime
omnial_learn({ tool: "dvfgeo/commune-sales" })
// 4. run: price the exact call first, then run it
omnial_execute({ tool: "dvfgeo/commune-sales", input: { /* see input_schema */ }, dry_run: true })
omnial_execute({ tool: "dvfgeo/commune-sales", input: { /* ... */ } })
// 5. settle: the call is charged when it finishes, nothing to doNot connected yet? Point your MCP client at https://mcp.eden-engine.com/mcp, then copy a config for your client.
Pricing
Every charge this tool can incur.
| Charge | Price |
|---|---|
Per call | $0.0026 |
- Updated
- Oct 24, 2026
Input and output schemas
Input schema
{
"type": "object",
"required": [
"year",
"departement",
"commune"
],
"properties": {
"year": {
"type": "integer",
"maximum": 2100,
"minimum": 2021,
"description": "Year of the sales, for example 2024. The files cover 2021 to 2025 at the last check."
},
"commune": {
"type": "string",
"pattern": "^([0-9]{2}|2A|2B)[0-9]{3}$",
"description": "The 5-character INSEE commune code, for example 75101 (Paris 1er arrondissement) or 31555 (Toulouse). Paris, Lyon and Marseille use their district codes. Keep leading zeros."
},
"departement": {
"type": "string",
"pattern": "^(0[1-9]|[1-8][0-9]|9[0-5]|2A|2B|97[1-6])$",
"description": "Department folder of the commune: the first two characters of its INSEE code (75 for Paris, 2A or 2B for Corsica), or three for an overseas commune (971 to 976). Keep leading zeros."
}
},
"additionalProperties": false
}Output schema
{
"type": "object",
"required": [
"commune",
"rows",
"sales",
"first_sale",
"last_sale",
"by_nature",
"price_per_m2_eur",
"newest_sales"
],
"properties": {
"rows": {
"type": "integer",
"description": "Lines in the file (parcels and premises of every sale)."
},
"sales": {
"type": "integer",
"description": "Distinct sales (sale id and disposition) in the file."
},
"commune": {
"type": "object",
"required": [
"code",
"name",
"departement"
],
"properties": {
"code": {
"type": [
"string",
"null"
],
"description": "INSEE commune code."
},
"name": {
"type": [
"string",
"null"
],
"description": "Commune name."
},
"departement": {
"type": [
"string",
"null"
],
"description": "Department code."
}
},
"additionalProperties": false
},
"by_nature": {
"type": "object",
"description": "Sales per nature of transaction, such as Vente, Echange, Adjudication.",
"additionalProperties": {
"type": "integer"
}
},
"last_sale": {
"type": [
"string",
"null"
],
"description": "Date of the latest sale, YYYY-MM-DD."
},
"first_sale": {
"type": [
"string",
"null"
],
"description": "Date of the earliest sale, YYYY-MM-DD."
},
"newest_sales": {
"type": "array",
"items": {
"type": "object",
"required": [
"id_mutation",
"disposition",
"date",
"lines"
],
"properties": {
"date": {
"type": "string",
"description": "Date of the sale, YYYY-MM-DD."
},
"lines": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": [
"string",
"null"
],
"description": "Property type, for example Appartement; null for bare land."
},
"rooms": {
"type": [
"number",
"null"
],
"description": "Main rooms."
},
"land_use": {
"type": [
"string",
"null"
],
"description": "Land use, for example sols."
},
"land_area_m2": {
"type": [
"number",
"null"
]
},
"built_area_m2": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
"description": "The first 8 lines of the sale."
},
"nature": {
"type": [
"string",
"null"
],
"description": "Nature, for example Vente."
},
"address": {
"type": [
"string",
"null"
],
"description": "Street number and street name."
},
"latitude": {
"type": [
"number",
"null"
]
},
"longitude": {
"type": [
"number",
"null"
]
},
"value_eur": {
"type": [
"number",
"null"
],
"description": "Declared value of the whole sale in euros; null when blank."
},
"line_count": {
"type": "integer",
"description": "File lines of this sale."
},
"disposition": {
"type": "string",
"description": "Disposition number within the sale."
},
"id_mutation": {
"type": "string",
"description": "Sale identifier in the file."
},
"postal_code": {
"type": [
"string",
"null"
]
},
"parcel_count": {
"type": "integer",
"description": "Distinct cadastral parcels."
}
},
"additionalProperties": false
},
"description": "Up to 100 sales, newest first."
},
"price_per_m2_eur": {
"type": "object",
"required": [
"apartments",
"houses"
],
"properties": {
"houses": {
"type": "object",
"required": [
"sales",
"median",
"p25",
"p75"
],
"properties": {
"p25": {
"type": [
"integer",
"null"
],
"description": "First quartile, euros per square metre."
},
"p75": {
"type": [
"integer",
"null"
],
"description": "Third quartile, euros per square metre."
},
"sales": {
"type": "integer",
"description": "Sales that qualify for this property type."
},
"median": {
"type": [
"integer",
"null"
],
"description": "Median price per square metre of built area, euros; null when no sale qualifies."
}
},
"additionalProperties": false
},
"apartments": {
"type": "object",
"required": [
"sales",
"median",
"p25",
"p75"
],
"properties": {
"p25": {
"type": [
"integer",
"null"
],
"description": "First quartile, euros per square metre."
},
"p75": {
"type": [
"integer",
"null"
],
"description": "Third quartile, euros per square metre."
},
"sales": {
"type": "integer",
"description": "Sales that qualify for this property type."
},
"median": {
"type": [
"integer",
"null"
],
"description": "Median price per square metre of built area, euros; null when no sale qualifies."
}
},
"additionalProperties": false
}
},
"description": "Price per square metre of built area over qualifying sales: nature Vente, positive value, one apartment or house line.",
"additionalProperties": false
}
},
"description": "The commune-year file summarised as JSON.",
"additionalProperties": false
}