> ## Documentation Index
> Fetch the complete documentation index at: https://doc.fluximmo.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Recherche DVF — transactions immobilières notariales

> Recherche filtrée et paginée des transactions immobilières DVF (prix de vente notariaux) en France.

## À quoi ça sert

`POST /v2/protected/opendata/dvf/search` interroge la base DVF (Demandes de Valeurs Foncières), qui recense les transactions immobilières issues des actes notariés. Vous fournissez des `filters` (localisation, type de bien, type de mutation, fourchettes de prix et de surface, date) et l'endpoint retourne les mutations correspondantes, triées et paginées.

C'est un endpoint de **recherche brute** : il renvoie les transactions telles qu'elles existent dans DVF, sans scoring ni pondération. Si vous cherchez les ventes les plus comparables à un bien donné (avec un score de similarité), utilisez plutôt [`/dvf/match`](/api-v2-reference/dvf-match/match-dvf-à-un-bien-immobilier).

La pagination est par curseur : reprenez le champ `cursor` de la réponse pour obtenir la page suivante.

## Payload

| Champ       | Type    | Obligatoire | Sens                                                                                                                    |
| ----------- | ------- | ----------- | ----------------------------------------------------------------------------------------------------------------------- |
| `filters`   | objet   | Non         | Critères de recherche (voir ci-dessous). Sans `filters`, la recherche porte sur l'ensemble des transactions.            |
| `sortBy`    | enum    | Non         | Champ de tri : `id`, `transaction_date`, `price_eur`, `price_per_m2_living_eur`, `price_per_m2_land_eur`, `surface_m2`. |
| `sortOrder` | enum    | Non         | `asc` ou `desc`.                                                                                                        |
| `size`      | integer | Non         | Taille de page, entre `1` et `100` (défaut `20`).                                                                       |
| `cursor`    | string  | Non         | Curseur de pagination renvoyé par la réponse précédente.                                                                |

### Champs de `filters`

| Champ                     | Type                     | Sens                                                                                                                              |
| ------------------------- | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------- |
| `id`                      | string                   | Identifiant unique d'une mutation DVF.                                                                                            |
| `transaction_date`        | `{ from, to }`           | Plage de dates (ISO). `from` = date minimale, `to` = date maximale ; les deux sont optionnelles.                                  |
| `transaction_type`        | string\[]                | Nature de la mutation. Valeurs : `Vente`, `Vente en l'etat futur d'achevement`, `Vente terrain a batir`, `Echange`.               |
| `price_eur`               | `{ min, max }`           | Fourchette du prix de transaction en euros.                                                                                       |
| `price_per_m2_living_eur` | `{ min, max }`           | Fourchette du prix au m² de surface habitable.                                                                                    |
| `price_per_m2_land_eur`   | `{ min, max }`           | Fourchette du prix au m² de terrain.                                                                                              |
| `location`                | `{ lat, lon, distance }` | Recherche géographique autour d'un point. `distance` au format `10km`, `500m`, `2mi`, etc. Les trois champs sont requis ensemble. |
| `departement_code`        | string                   | Code département (2-3 caractères, ex : `75`, `2A`, `974`).                                                                        |
| `insee_code`              | string                   | Code INSEE de la commune (5 caractères).                                                                                          |
| `postal_code`             | string                   | Code postal (5 chiffres).                                                                                                         |
| `iris_code`               | string                   | Code IRIS (9 chiffres).                                                                                                           |
| `iris_type`               | string\[]                | Type d'IRIS : `H` (habitat), `Z` (zone), `A` (activité), `D` (divers).                                                            |
| `property_type`           | string\[]                | Type de bien : `Appartement`, `Maison`, `Autre`, `Terrain`, `Tertiaire`, `Dépendance`, `Volume`.                                  |
| `surface_m2`              | `{ min, max }`           | Fourchette de surface habitable principale en m².                                                                                 |
| `main_rooms`              | `{ min, max }`           | Fourchette du nombre de pièces principales.                                                                                       |
| `land_surface_m2`         | `{ min, max }`           | Fourchette de surface de terrain en m².                                                                                           |
| `is_new_build`            | boolean                  | Logement neuf (VEFA ou première vente).                                                                                           |
| `is_open_market`          | boolean                  | Transaction sur le marché libre (hors adjudication/expropriation).                                                                |
| `carrez_surface_m2`       | `{ min, max }`           | Fourchette de surface loi Carrez en m².                                                                                           |
| `soil_surface_m2`         | `{ min, max }`           | Fourchette de surface au sol du bâti en m².                                                                                       |
| `garden_surface_m2`       | `{ min, max }`           | Fourchette de surface de jardin en m².                                                                                            |

## Réponse

L'API retourne une enveloppe paginée :

| Champ     | Type     | Sens                                                                          |
| --------- | -------- | ----------------------------------------------------------------------------- |
| `data`    | objet\[] | Liste des mutations DVF correspondant aux filtres.                            |
| `total`   | integer  | Nombre total de transactions correspondant à la recherche.                    |
| `size`    | integer  | Taille de page effective.                                                     |
| `hasMore` | boolean  | `true` s'il reste des résultats à paginer.                                    |
| `cursor`  | string   | Curseur à réinjecter dans le champ `cursor` du payload pour la page suivante. |

Chaque élément de `data` contient notamment `id`, `transaction_date`, `transaction_type`, `price_eur`, `price_per_m2_living_eur`, `property_type`, `surface_m2`, `main_rooms`, `departement_code`, `insee_code`, `postal_code`, `location` et `is_new_build`. Le contrat exact est documenté plus bas par le bloc OpenAPI.

## Exemple

### Appartements vendus à Toulon, du plus cher au moins cher

```bash theme={null}
curl -X POST https://api.fluximmo.io/v2/protected/opendata/dvf/search \
  -H "x-api-key: $FLUXIMMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "departement_code": "83",
      "postal_code": "83000",
      "property_type": ["Appartement"],
      "transaction_type": ["Vente"],
      "transaction_date": { "from": "2023-01-01", "to": "2024-12-31" }
    },
    "sortBy": "price_eur",
    "sortOrder": "desc",
    "size": 5
  }'
```

### Appartements neufs en VEFA, triés par prix au m² habitable

```bash theme={null}
curl -X POST https://api.fluximmo.io/v2/protected/opendata/dvf/search \
  -H "x-api-key: $FLUXIMMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "departement_code": "83",
      "transaction_type": ["Vente en l'\''etat futur d'\''achevement"],
      "is_new_build": true,
      "property_type": ["Appartement"]
    },
    "sortBy": "price_per_m2_living_eur",
    "sortOrder": "asc",
    "size": 20
  }'
```

<Note>
  La valeur `Vente en l'etat futur d'achevement` contient deux apostrophes. En shell, échappez-les comme dans l'exemple (`'\''`) ou utilisez un fichier JSON via `-d @payload.json`.
</Note>

### Recherche géographique autour d'un point

```bash theme={null}
curl -X POST https://api.fluximmo.io/v2/protected/opendata/dvf/search \
  -H "x-api-key: $FLUXIMMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "location": { "lat": 43.1242, "lon": 5.928, "distance": "5km" },
      "property_type": ["Maison"],
      "surface_m2": { "min": 80, "max": 200 },
      "price_eur": { "min": 200000, "max": 600000 }
    },
    "sortBy": "transaction_date",
    "sortOrder": "desc",
    "size": 10
  }'
```

## Liens utiles

* [Match DVF à un bien immobilier](/api-v2-reference/dvf-match/match-dvf-à-un-bien-immobilier) — pour obtenir les transactions les plus comparables à un bien, avec score de similarité.
* [DVF vs Fluximmo](/concepts/dvf-vs-fluximmo) — différences entre les transactions notariées DVF et les annonces du marché Fluximmo.

<Card title="Clé test gratuite — 1 semaine" icon="key" href="https://my.fluximmo.io">
  Créez un compte sur **my.fluximmo.io** pour récupérer une clé API test gratuite (1 semaine, accès limité). Aucun paiement requis.
</Card>


## OpenAPI

````yaml post /v2/protected/opendata/dvf/search
openapi: 3.0.0
info:
  title: Real-estate data API - Fluximmo V2
  description: >+
    ## Fluximmo

    ##### Real-time real estate data: Power workflows, business applications and
    decision-making.


    Real estate expert since 2017, Fluximmo aggregates, exploits, enriches &
    analyzes the 


    real-estate market in real time to offer data flows, APIs and innovative
    services to real estate professionals.


    ## Authentification

    You'll need to be authenticated with an active subscription to access our
    REST endpoints.


    To get an API-KEY please contact us at contact@fluximmo.com or book a call
    with our team: https://calendly.com/fluximmo/meet-fluximmo

    ##### How to use your API KEY

    Simply add to your HTTP request your API KEY in the headers:
    `{'x_api_key':'randomApiKey'}`


    ## Properties and Adverts

    Real-estate market can be conceptualized in different ways. We offer two
    different conceptualization depending on your needs: Properties & Adverts.

    #### Properties (BAAS)

    A property is a real-estate habitation/land/commercial/building to which is
    attached adverts.


    We gather all the adverts offering (selling or renting) this real-estate
    asset and consolidate all the information into one Property.


    A Property is by definition `de-duplicated` and can gather 1 to x adverts:
    these adverts are either duplicates from different portals or with mandates
    from different agencies or republication of the same advertising with a
    price update or not.


    The concept of property is in constant mutation until the real-estate asset
    is sold: We'll keep merging new adverts within the Property concept and
    update the price if needed.


    By it's nature in constant mutation, we do not offer the possibility to
    receive these Properties on webhooks. You'll need to use our APIs as a
    Backend As A Service (BaaS).


    #### Adverts (BAAS and WEBHOOK)

    Adverts are advertising of a real-estate property. Adverts can come from
    many sources: Agencies websites, Aggregation real-estate portals,
    Social-Networks, NewsPaper etc...


    After gathering all these adverts our proprietary AI algorithms will
    de-duplicate these adverts and associate them to a Property


    An advert have a unique URL. Meaning that the same advertising re-published
    twice (with our without any change, on the same website or not, by the same
    agency or not) is considered as 2 ads.


    You can choose either to retrieve all the Adverts or only the non duplicated
    ones. Adverts can be retrieved either by API (Search or Alerts) or Webhook

    ## Webhooks

    We offer the possibility to receive our real-estate Adverts data in
    real-time using webhooks. As soon as we gather the data, you'll receive it
    few moments later.


    Using ALERTS, you can receive new adverts matching your criteria on a
    webhook.


    ##### Webhook differences between Adverts and Properties

    As Properties are by nature in perpetual evolutions (new duplicated ads will
    be merged, new data to be consolidated etc..), we do not offer the
    possibility to receive through Webhooks the full body of the properties.
    Properties webhook will only send you the list of the properties FlxIds
    matching your search.


    You'll find below the schema of the data you would receive on your webhook
    (`/v2/sample/webhook/properties`, `/v2/sample/webhook/adverts`)

    ##### What is a webhook

    A webhook can be thought of as a type of API that is driven by events rather
    than requests


    .Instead of one application making a request to another to receive a
    response, a webhook is a service that allows one program to send data to
    another as soon as a particular event takes place.


    Webhooks are sometimes referred to as “reverse APIs,” because communication
    is initiated by the application sending the data rather than the one
    receiving it.


    With web services becoming increasingly interconnected, webhooks are seeing
    more action as a lightweight solution for enabling real-time notifications
    and data updates without the need to develop a full-scale API.

    ##### When to use a webhook instead of the REST API

    You're supposed to receive a high volume of data (frequently or not), you're
    looking for real-time data, you just have to relax and wait (no cron, no
    call on our API etc..)

    ##### Webhook implementation examples

    A webhook is simply a POST endpoint we can request

    * Python:
    https://gist.github.com/aloysius-tim/293772256526efa20d5c625c6ace036a

    * Node:
    https://gist.github.com/aloysius-tim/ea1d9feb2c527b5b09ffc356b662d14b

  version: 2.0.0
  contact: {}
  x-logo:
    url: https://www.fluximmo.com/assets/images/logo_text.png
    backgroundColor: '#F31051'
    altText: Fluximmo logo
servers:
  - url: https://api.fluximmo.io
security: []
tags:
  - name: PropertyModel
    description: <SchemaDefinition schemaRef="#/components/schemas/PropertyDto" />
  - name: AdvertModel
    description: <SchemaDefinition schemaRef="#/components/schemas/AdvertDto" />
paths:
  /v2/protected/opendata/dvf/search:
    post:
      tags:
        - DVF Search
      summary: Recherche DVF
      description: >-
        Recherche DVF (Demandes de Valeurs Foncières) avec filtres auto-générés
        depuis le schéma
      operationId: SearchDvfController_postSearch
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DvfInheritSearchDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                  - total
                  - size
                  - hasMore
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: Identifiant unique de la mutation DVF
                          example: 2014-871319
                        transaction_date:
                          type: string
                          description: Date de la transaction immobilière
                          example: '2023-09-15'
                          format: date-time
                        transaction_type:
                          type: string
                          description: >-
                            Nature de la mutation (vente, adjudication, échange,
                            etc.)
                          example: Vente
                        price_eur:
                          type: number
                          description: Prix de la transaction en euros
                          example: 265788
                        price_per_m2_living_eur:
                          type: number
                          description: Prix au m² de surface habitable en euros
                          example: 3819
                        price_per_m2_land_eur:
                          type: number
                          description: Prix au m² de terrain en euros
                          example: 171
                        location:
                          type: object
                          properties:
                            lat:
                              type: number
                            lon:
                              type: number
                          description: >-
                            Coordonnées géographiques du bien (latitude,
                            longitude)
                          example:
                            lat: 48.8566
                            lon: 2.3522
                        departement_code:
                          type: string
                          description: >-
                            Code du département (2-3 caractères, ex : 75, 2A,
                            974)
                          example: '83'
                        insee_code:
                          type: string
                          description: Code INSEE de la commune (5 caractères)
                          example: '83137'
                        postal_code:
                          type: string
                          description: Code postal (5 chiffres)
                          example: '83000'
                        city_name:
                          type: string
                          description: Nom de la commune
                        street_number:
                          type: string
                          description: Numéro de voie
                          example: '9001'
                        street_name:
                          type: string
                          description: Nom de la voie
                        address:
                          type: string
                          description: Adresse complète du bien
                        iris_code:
                          type: string
                          description: >-
                            Code IRIS (Ilots Regroupés pour l'Information
                            Statistique, 9 chiffres)
                          example: '830680000'
                        iris_name:
                          type: string
                          description: Nom de l'IRIS
                        iris_type:
                          type: string
                          description: >-
                            Type d'IRIS (H = habitat, A = activité, D = divers,
                            Z = zone)
                          example: H
                        property_type:
                          type: string
                          description: Type de bien principal de la transaction
                          example: Appartement
                        surface_m2:
                          type: number
                          description: Surface habitable principale du bien en m²
                          example: 476
                        main_rooms:
                          type: integer
                          description: Nombre de pièces principales
                          example: 3
                        transaction_class:
                          type: string
                          description: Classe de la transaction
                          example: logement_sans_terrain
                        land_surface_m2:
                          type: number
                          description: Surface totale du terrain en m²
                          example: 1288
                        parcel_count:
                          type: integer
                          description: Nombre de parcelles cadastrales dans la transaction
                          example: 1
                        housing_count:
                          type: integer
                          description: >-
                            Nombre total de lots d'habitation dans la
                            transaction
                          example: 1
                        house_count:
                          type: integer
                          description: Nombre de maisons dans la transaction
                          example: 0
                        apartment_count:
                          type: integer
                          description: Nombre d'appartements dans la transaction
                          example: 0
                        outbuilding_count:
                          type: integer
                          description: >-
                            Nombre de dépendances (cave, parking, etc.) dans la
                            transaction
                          example: 1
                        commercial_count:
                          type: integer
                          description: Nombre de locaux commerciaux dans la transaction
                          example: 0
                        is_new_build:
                          type: boolean
                          description: >-
                            Indique si le bien est un logement neuf (VEFA ou
                            première vente)
                          example: false
                        is_open_market:
                          type: boolean
                          description: >-
                            Indique si la transaction s'est effectuée sur le
                            marché libre (hors adjudication/expropriation)
                          example: true
                        carrez_surface_m2:
                          type: number
                          description: Surface loi Carrez en m² (pour les copropriétés)
                          example: 57.8
                        soil_surface_m2:
                          type: number
                          description: Surface au sol du bâti en m²
                          example: 185
                        garden_surface_m2:
                          type: number
                          description: Surface du jardin en m²
                          example: 164
                  total:
                    type: integer
                  size:
                    type: integer
                  hasMore:
                    type: boolean
                  cursor:
                    type: string
                  from:
                    type: integer
        '400':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExceptionDto'
        '401':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExceptionDto'
      security:
        - x_api_key: []
components:
  schemas:
    DvfInheritSearchDto:
      type: object
      properties:
        filters:
          $ref: '#/components/schemas/DvfInheritFiltersDto'
        sortBy:
          type: string
          enum:
            - id
            - transaction_date
            - price_eur
            - price_per_m2_living_eur
            - price_per_m2_land_eur
            - surface_m2
          description: Sort field
        sortOrder:
          type: string
          enum:
            - asc
            - desc
          description: Sort order
        size:
          type: integer
          minimum: 1
          maximum: 100
          default: 20
          description: Page size
        cursor:
          type: string
          description: Cursor for pagination
    ExceptionDto:
      type: object
      properties:
        error:
          description: Error object
          allOf:
            - $ref: '#/components/schemas/ErrorDto'
      required:
        - error
    DvfInheritFiltersDto:
      type: object
      properties:
        id:
          type: string
          description: Identifiant unique de la mutation DVF
          example: 2014-871319
          maxLength: 32
        transaction_date:
          description: Date de la transaction immobilière
          example:
            from: '2023-09-15'
          allOf:
            - $ref: '#/components/schemas/DateRangeFilter'
        transaction_type:
          type: array
          description: >-
            Nature de la mutation (vente, adjudication, échange, etc.). Possible
            values: Vente, Vente en l'etat futur d'achevement, Vente terrain a
            batir, Echange
          example:
            - Vente
          items:
            type: string
            enum:
              - Vente
              - Vente en l'etat futur d'achevement
              - Vente terrain a batir
              - Echange
        price_eur:
          description: Prix de la transaction en euros
          example:
            min: 265788
          allOf:
            - $ref: '#/components/schemas/NumberRangeFilter'
        price_per_m2_living_eur:
          description: Prix au m² de surface habitable en euros
          example:
            min: 3819
          allOf:
            - $ref: '#/components/schemas/NumberRangeFilter'
        price_per_m2_land_eur:
          description: Prix au m² de terrain en euros
          example:
            min: 171
          allOf:
            - $ref: '#/components/schemas/NumberRangeFilter'
        location:
          description: Coordonnées géographiques du bien (latitude, longitude)
          example:
            lat: 48.8566
            lon: 2.3522
            distance: 10km
          allOf:
            - $ref: '#/components/schemas/GeoDistanceFilter'
        departement_code:
          type: string
          description: 'Code du département (2-3 caractères, ex : 75, 2A, 974)'
          example: '83'
          maxLength: 3
        insee_code:
          type: string
          description: Code INSEE de la commune (5 caractères)
          example: '83137'
          maxLength: 5
        postal_code:
          type: string
          description: Code postal (5 chiffres)
          example: '83000'
          maxLength: 5
        iris_code:
          type: string
          description: >-
            Code IRIS (Ilots Regroupés pour l'Information Statistique, 9
            chiffres)
          example: '830680000'
          maxLength: 9
        iris_type:
          type: array
          description: >-
            Type d'IRIS (H = habitat, A = activité, D = divers, Z = zone).
            Possible values: H, Z, A, D
          example:
            - H
          items:
            type: string
            enum:
              - H
              - Z
              - A
              - D
        property_type:
          type: array
          description: >-
            Type de bien principal de la transaction. Possible values:
            Appartement, Maison, Autre, Terrain, Tertiaire, Dépendance, Volume
          example:
            - Appartement
          items:
            type: string
            enum:
              - Appartement
              - Maison
              - Autre
              - Terrain
              - Tertiaire
              - Dépendance
              - Volume
        surface_m2:
          description: Surface habitable principale du bien en m²
          example:
            min: 476
          allOf:
            - $ref: '#/components/schemas/NumberRangeFilter'
        main_rooms:
          description: Nombre de pièces principales
          example:
            min: 3
          allOf:
            - $ref: '#/components/schemas/NumberRangeFilter'
        land_surface_m2:
          description: Surface totale du terrain en m²
          example:
            min: 1288
          allOf:
            - $ref: '#/components/schemas/NumberRangeFilter'
        is_new_build:
          type: boolean
          description: Indique si le bien est un logement neuf (VEFA ou première vente)
          example: false
        is_open_market:
          type: boolean
          description: >-
            Indique si la transaction s'est effectuée sur le marché libre (hors
            adjudication/expropriation)
          example: true
        carrez_surface_m2:
          description: Surface loi Carrez en m² (pour les copropriétés)
          example:
            min: 57.8
          allOf:
            - $ref: '#/components/schemas/NumberRangeFilter'
        soil_surface_m2:
          description: Surface au sol du bâti en m²
          example:
            min: 185
          allOf:
            - $ref: '#/components/schemas/NumberRangeFilter'
        garden_surface_m2:
          description: Surface du jardin en m²
          example:
            min: 164
          allOf:
            - $ref: '#/components/schemas/NumberRangeFilter'
    ErrorDto:
      type: object
      properties:
        message:
          type: string
          description: Error message
        code:
          type: number
          description: Error code
      required:
        - message
        - code
    DateRangeFilter:
      type: object
      properties:
        from:
          type: string
          format: date-time
          description: Start date (gte)
        to:
          type: string
          format: date-time
          description: End date (lte)
    NumberRangeFilter:
      type: object
      properties:
        min:
          type: number
          description: Minimum value (gte)
        max:
          type: number
          description: Maximum value (lte)
    GeoDistanceFilter:
      type: object
      properties:
        lat:
          type: number
          minimum: -90
          maximum: 90
          description: Latitude
        lon:
          type: number
          minimum: -180
          maximum: 180
          description: Longitude
        distance:
          type: string
          pattern: ^\d+(\.\d+)?(m|km|mi|ft|yd|nmi)$
          example: 10km
          description: Distance with unit
      required:
        - lat
        - lon
        - distance
  securitySchemes:
    x_api_key:
      type: apiKey
      in: header
      name: x-api-key

````