# prescriptio_dvf

Ventes immobilieres officielles (DVF) : ~8 millions de mutations depuis 2018, dedupliquees par vente (1 resultat = 1 vente, valeur totale de la mutation, biens agreges). Filtrer par localisation.commune (nom, code postal ou code INSEE — arrondissements de Paris/Lyon/Marseille inclus), localisation.dept ou localisation.region, plus annee et type_local (maison, appartement, local, dependance). Une localisation est OBLIGATOIRE (pas de listing national). La plus-value (fields.plus_value_eur/pct) n'est renseignee que sur parcelle unique avec une vente precedente fiable. Pour des prix moyens, médians ou comparaisons annuelles, demander mode=statistiques avec une commune seule : agrégats exhaustifs serveur, jamais une moyenne de la page. Exemple : { "localisation": { "commune": "Lyon" }, "annee": 2025, "type_local": "appartement" }.

État : implémenté ; distribution : historique uniquement ; offre payante : false ; effets : lecture.

## Entrée MCP

```json
{
  "properties": {
    "annee": {
      "description": "Annee des ventes (donnees depuis 2018).",
      "maximum": 2035,
      "minimum": 2014,
      "type": "integer"
    },
    "cursor": {
      "description": "Pagination : repasser tel quel le `next_cursor` de la page precedente. Omettre pour la premiere page.",
      "type": "string"
    },
    "limit": {
      "description": "Resultats par page (defaut 20, max 50).",
      "maximum": 50,
      "minimum": 1,
      "type": "integer"
    },
    "localisation": {
      "description": "Zone geographique. UNE granularite : { region } (couvre tous ses departements en un appel — ne jamais les enumerer) OU { dept } OU { commune } (combinable avec dept pour lever un homonyme). National = OMETTRE localisation (jamais dept:\"all\" ni \"france\").",
      "properties": {
        "commune": {
          "description": "Nom de commune (accents/casse ignores), code postal ou code INSEE. Arrondissements de Paris/Lyon/Marseille inclus automatiquement.",
          "type": "string"
        },
        "dept": {
          "description": "Code departement : 2 chiffres (\"69\"), \"2A\"/\"2B\", ou DOM \"971\"-\"976\".",
          "type": "string"
        },
        "insee": {
          "description": "Code INSEE exact issu de la carte. Prioritaire sur commune; jamais interprété comme code postal.",
          "pattern": "^(?:[0-9]{5}|2[A-Ba-b][0-9]{3})$",
          "type": "string"
        },
        "region": {
          "description": "Nom officiel de region (ex. \"Auvergne-Rhone-Alpes\", \"Ile-de-France\").",
          "type": "string"
        }
      },
      "type": "object"
    },
    "mode": {
      "description": "liste (défaut) renvoie une page. statistiques calcule sur toutes les ventes de la commune les effectifs, médianes et moyennes par année et type. Pour comparer des prix, utiliser statistiques, jamais une moyenne de la page.",
      "enum": [
        "liste",
        "statistiques"
      ],
      "type": "string"
    },
    "query": {
      "description": "Raccourci : code postal 5 chiffres (ex. \"69006\" = Lyon 6e, un arrondissement precis) ou nom de commune. Equivalent a localisation.commune.",
      "type": "string"
    },
    "type_local": {
      "description": "Type de bien principal de la vente.",
      "enum": [
        "maison",
        "appartement",
        "local",
        "dependance"
      ],
      "type": "string"
    }
  },
  "type": "object"
}
```

## Sortie MCP

```json
{
  "properties": {
    "_meta": {
      "type": "object"
    },
    "next_cursor": {
      "description": "À repasser tel quel pour la page suivante ; null s'il n'y en a plus.",
      "type": [
        "string",
        "null"
      ]
    },
    "results": {
      "description": "Résultats de la page courante.",
      "items": {
        "properties": {
          "fields": {
            "description": "Champs propres à la source.",
            "type": "object"
          },
          "id": {
            "description": "Identifiant à citer (SIREN/SIRET, marche_id, réf DECP).",
            "type": "string"
          },
          "resume": {
            "type": "string"
          },
          "titre": {
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "total_estimated": {
      "description": "Total connu ou estimation signalée par la source ; null si le total est inconnu. Ne jamais extrapoler depuis la taille de la page.",
      "type": [
        "integer",
        "null"
      ]
    }
  },
  "required": [
    "results"
  ],
  "type": "object"
}
```

[Contrats externes et limites](/docs/reference/concepts.md).
