> ## 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.

# Rechercher des biens (search PROPERTIES)

> Recherche analytique avec déduplication multi-portails. Filtres riches, géo avancée, pagination cursor.

Cet endpoint est l'**outil principal** pour interroger le catalogue Fluximmo dédupliqué. Une ligne de réponse = un bien physique unique (`flxId`), agrégé à partir d'une ou plusieurs annonces source. Utilisez-le dès que vous avez besoin d'un état du marché propre, sans doublons inter-portails — idéal pour la recherche multi-portail BAAS.

Côté ADVERTS, il n'existe pas d'endpoint de search public : les annonces brutes (1 URL = 1 advert) sont accessibles uniquement via une alerte webhook ADVERT. Le payload de filtres d'une alerte advert est identique à celui d'un search property côté schéma. Voir [Property vs Advert](/concepts/property-vs-advert) pour la décision.

Variante allégée : [`POST /v2/protected/properties/search/lite`](/api-v2-reference/properties-search/lite-search-properties) — schéma de réponse réduit, perf supérieure, filtres restreints. Utilisez-la pour UI temps réel, mobile, autocomplete.

## Cas d'usage

* Cartographier l'offre d'un secteur (zone géographique × type × budget)
* Construire un AVM / peer comparison à partir d'un combo prix + surface + chambres
* Alimenter un dashboard analytique (suivi mensuel, séries temporelles via `meta.firstSeenAt`)
* Sourcer des biens pour un chasseur / mandataire (sortBy `FIRST_SEEN_AT DESC`)
* Backtester une thèse d'investissement (rendement m², rotation de stock)

## Filtres clés

<Tip>
  **Champs déclarés par les annonceurs** — plus tu rajoutes de filtres spécifiques (ex. `numberOfToilets`, `floor`, etc.), plus tu risques de louper des annonces : peu d'annonceurs renseignent les champs très détaillés. En production, démarre avec un set minimal (`location` + `type` + `offer` + `price`) puis affine si besoin.
</Tip>

Le payload se compose de `search.filterProperty` (les filtres) + `size`, `sortBy`, `orderBy`, `searchAfterHash` (pagination & tri) + `search.fullTexts` / `search.keywords` (recherche textuelle, max 20 items chacun).

| Filtre                                                                                  | Rôle                                                                       | Voir                                                       |
| --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ---------------------------------------------------------- |
| `location[]`                                                                            | Champs administratifs + `geoBoundingBox` + `geoDistance` (OR multi-zones)  | [Recherche géographique](/concepts/recherche-geographique) |
| `offer[].type`                                                                          | `OFFER_BUY`, `OFFER_RENT`, etc.                                            | [Filtres communs](/concepts/filtres-communs)               |
| `type[]`                                                                                | Classes de biens : `CLASS_FLAT`, `CLASS_HOUSE`, `CLASS_PROGRAM`, etc.      | [Filtres communs](/concepts/filtres-communs)               |
| `price.{initial,latest}` + `price.{currency,scope,variation,isAuction,warrantyDeposit}` | Prix valeur (`value`), par m² (`valuePerArea`), variation, scope, currency | [Filtres communs](/concepts/filtres-communs)               |
| `habitation`                                                                            | Surface, roomCount, bedroomCount, bathroomCount, EPC, heat                 | [Filtres communs](/concepts/filtres-communs)               |
| `meta.isTotallyOffline`                                                                 | Exclure les biens offline (best practice prod : `false`)                   | [Filtres communs](/concepts/filtres-communs)               |
| `meta.{firstSeenAt,lastSeenAt,lastUpdatedAt}`                                           | Filtres temporels                                                          | [Filtres communs](/concepts/filtres-communs)               |
| `adverts[]` (nested)                                                                    | Filtres sur les annonces source (`isOnline`, `isPro`, `source`...)         | [Filtres communs](/concepts/filtres-communs)               |
| `land`, `parking`, `tags`, `process`, `hasAnomaly`, `isUrgent`                          | Filtres avancés / niches                                                   | DTO référence                                              |

<Warning>
  Le filtre `location[].city` est **ignoré** côté moteur de recherche. Utilisez `postalCode`, `inseeCode` ou `department` pour filtrer par zone administrative — sinon le résultat couvre toute la France.
</Warning>

## Exemples

Tous les payloads ci-dessous utilisent le wrapper officiel `{ size, sortBy, orderBy, search: { filterProperty: { ... } } }` conformément au DTO `SearchPropertyPayloadDto`.

### Exemple 1 — Combo standard dominant (Paris achat appartement)

Le combo prod le plus fréquent : Paris 1er, achat appartement/maison/programme neuf, budget 100-350 k€, surface 30-110 m², 1-3 chambres, biens offline exclus, recherche limitée aux annonces vues à partir du 1er janvier 2025, tri du plus récent au plus ancien.

```json theme={null}
{
  "size": 25,
  "sortBy": "FIRST_SEEN_AT",
  "orderBy": "DESC",
  "search": {
    "filterProperty": {
      "location": [{ "postalCode": "75001" }],
      "type": ["CLASS_FLAT", "CLASS_HOUSE", "CLASS_PROGRAM"],
      "offer": [{ "type": "OFFER_BUY" }],
      "price": { "initial": { "value": { "min": 100000, "max": 350000 } } },
      "habitation": {
        "surface": { "total": { "min": 30, "max": 110 } },
        "bedroomCount": { "min": 1, "max": 3 }
      },
      "meta": {
        "isTotallyOffline": false,
        "firstSeenAt": { "min": "2025-01-01T00:00:00.000Z" }
      }
    }
  }
}
```

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.fluximmo.io/v2/protected/properties/search \
    -H "x-api-key: $FLUXIMMO_API_KEY" \
    -H "Content-Type: application/json" \
    -d @payload.json
  ```

  ```python Python theme={null}
  import requests, os
  resp = requests.post(
      "https://api.fluximmo.io/v2/protected/properties/search",
      headers={"x-api-key": os.environ["FLUXIMMO_API_KEY"]},
      json={
          "size": 25,
          "sortBy": "FIRST_SEEN_AT",
          "orderBy": "DESC",
          "search": {
              "filterProperty": {
                  "location": [{"postalCode": "75001"}],
                  "type": ["CLASS_FLAT", "CLASS_HOUSE", "CLASS_PROGRAM"],
                  "offer": [{"type": "OFFER_BUY"}],
                  "price": {"initial": {"value": {"min": 100000, "max": 350000}}},
                  "habitation": {
                      "surface": {"total": {"min": 30, "max": 110}},
                      "bedroomCount": {"min": 1, "max": 3},
                  },
                  "meta": {
                      "isTotallyOffline": False,
                      "firstSeenAt": {"min": "2025-01-01T00:00:00.000Z"},
                  },
              }
          },
      },
  )
  print(resp.json())
  ```

  ```javascript Node theme={null}
  const resp = await fetch("https://api.fluximmo.io/v2/protected/properties/search", {
    method: "POST",
    headers: {
      "x-api-key": process.env.FLUXIMMO_API_KEY,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      size: 25,
      sortBy: "FIRST_SEEN_AT",
      orderBy: "DESC",
      search: {
        filterProperty: {
          location: [{ postalCode: "75001" }],
          type: ["CLASS_FLAT", "CLASS_HOUSE", "CLASS_PROGRAM"],
          offer: [{ type: "OFFER_BUY" }],
          price: { initial: { value: { min: 100000, max: 350000 } } },
          habitation: {
            surface: { total: { min: 30, max: 110 } },
            bedroomCount: { min: 1, max: 3 },
          },
          meta: {
            isTotallyOffline: false,
            firstSeenAt: { min: "2025-01-01T00:00:00.000Z" },
          },
        },
      },
    }),
  });
  console.log(await resp.json());
  ```
</CodeGroup>

### Exemple 2 — Recherche par département (location maison)

Cas exhaustivité : tout un département en location, maisons uniquement, surface ≥ 80 m² et 3+ chambres. `department` est un champ administratif indexé (code à 2 chiffres), idéal quand `postalCode` est trop fin.

```json theme={null}
{
  "size": 25,
  "sortBy": "FIRST_SEEN_AT",
  "orderBy": "DESC",
  "search": {
    "filterProperty": {
      "location": [{ "department": "13" }],
      "type": ["CLASS_HOUSE"],
      "offer": [{ "type": "OFFER_RENT" }],
      "habitation": {
        "surface": { "total": { "min": 80 } },
        "bedroomCount": { "min": 3 }
      },
      "meta": { "isTotallyOffline": false }
    }
  }
}
```

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.fluximmo.io/v2/protected/properties/search \
    -H "x-api-key: $FLUXIMMO_API_KEY" \
    -H "Content-Type: application/json" \
    -d @payload.json
  ```

  ```python Python theme={null}
  import requests, os
  resp = requests.post(
      "https://api.fluximmo.io/v2/protected/properties/search",
      headers={"x-api-key": os.environ["FLUXIMMO_API_KEY"]},
      json={
          "size": 25,
          "sortBy": "FIRST_SEEN_AT",
          "orderBy": "DESC",
          "search": {
              "filterProperty": {
                  "location": [{"department": "13"}],
                  "type": ["CLASS_HOUSE"],
                  "offer": [{"type": "OFFER_RENT"}],
                  "habitation": {
                      "surface": {"total": {"min": 80}},
                      "bedroomCount": {"min": 3},
                  },
                  "meta": {"isTotallyOffline": False},
              }
          },
      },
  )
  print(resp.json())
  ```

  ```javascript Node theme={null}
  const resp = await fetch("https://api.fluximmo.io/v2/protected/properties/search", {
    method: "POST",
    headers: { "x-api-key": process.env.FLUXIMMO_API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
      size: 25,
      sortBy: "FIRST_SEEN_AT",
      orderBy: "DESC",
      search: {
        filterProperty: {
          location: [{ department: "13" }],
          type: ["CLASS_HOUSE"],
          offer: [{ type: "OFFER_RENT" }],
          habitation: { surface: { total: { min: 80 } }, bedroomCount: { min: 3 } },
          meta: { isTotallyOffline: false },
        },
      },
    }),
  });
  console.log(await resp.json());
  ```
</CodeGroup>

### Exemple 3 — geoDistance rayon 20 km autour de la Tour Eiffel

Cas chasseur urbain : rayon centré sur un point géocodé. Le pin est en `{lat, lon}` (WGS84). Calcul euclidien (DistanceType `Plane`) — fiable jusqu'à \~50 km, au-delà préférer `geoBoundingBox`.

```json theme={null}
{
  "size": 25,
  "sortBy": "FIRST_SEEN_AT",
  "orderBy": "DESC",
  "search": {
    "filterProperty": {
      "location": [
        {
          "locationCoordinate": {
            "location": {
              "geoDistance": {
                "pin": { "lat": 48.858370, "lon": 2.294481 },
                "distanceKm": 20
              }
            }
          }
        }
      ],
      "type": ["CLASS_FLAT"],
      "offer": [{ "type": "OFFER_BUY" }],
      "meta": { "isTotallyOffline": false }
    }
  }
}
```

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.fluximmo.io/v2/protected/properties/search \
    -H "x-api-key: $FLUXIMMO_API_KEY" \
    -H "Content-Type: application/json" \
    -d @payload.json
  ```

  ```python Python theme={null}
  import requests, os
  resp = requests.post(
      "https://api.fluximmo.io/v2/protected/properties/search",
      headers={"x-api-key": os.environ["FLUXIMMO_API_KEY"]},
      json={
          "size": 25,
          "sortBy": "FIRST_SEEN_AT",
          "orderBy": "DESC",
          "search": {
              "filterProperty": {
                  "location": [
                      {
                          "locationCoordinate": {
                              "location": {
                                  "geoDistance": {
                                      "pin": {"lat": 48.858370, "lon": 2.294481},
                                      "distanceKm": 20,
                                  }
                              }
                          }
                      }
                  ],
                  "type": ["CLASS_FLAT"],
                  "offer": [{"type": "OFFER_BUY"}],
                  "meta": {"isTotallyOffline": False},
              }
          },
      },
  )
  print(resp.json())
  ```

  ```javascript Node theme={null}
  const resp = await fetch("https://api.fluximmo.io/v2/protected/properties/search", {
    method: "POST",
    headers: { "x-api-key": process.env.FLUXIMMO_API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
      size: 25,
      sortBy: "FIRST_SEEN_AT",
      orderBy: "DESC",
      search: {
        filterProperty: {
          location: [
            {
              locationCoordinate: {
                location: {
                  geoDistance: {
                    pin: { lat: 48.85837, lon: 2.294481 },
                    distanceKm: 20,
                  },
                },
              },
            },
          ],
          type: ["CLASS_FLAT"],
          offer: [{ type: "OFFER_BUY" }],
          meta: { isTotallyOffline: false },
        },
      },
    }),
  });
  console.log(await resp.json());
  ```
</CodeGroup>

### Exemple 4 — geoBoundingBox Paris (carte interactive)

Cas type : "search in this map area" sur une UI de cartographie. `topLeft.lat` doit être supérieur à `bottomRight.lat` (latitudes décroissantes du nord vers le sud).

```json theme={null}
{
  "size": 25,
  "sortBy": "FIRST_SEEN_AT",
  "orderBy": "DESC",
  "search": {
    "filterProperty": {
      "location": [
        {
          "locationCoordinate": {
            "location": {
              "geoBoundingBox": {
                "topLeft": { "lat": 48.9021, "lon": 2.2241 },
                "bottomRight": { "lat": 48.8156, "lon": 2.4699 }
              }
            }
          }
        }
      ],
      "offer": [{ "type": "OFFER_BUY" }],
      "meta": { "isTotallyOffline": false }
    }
  }
}
```

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.fluximmo.io/v2/protected/properties/search \
    -H "x-api-key: $FLUXIMMO_API_KEY" \
    -H "Content-Type: application/json" \
    -d @payload.json
  ```

  ```python Python theme={null}
  import requests, os
  resp = requests.post(
      "https://api.fluximmo.io/v2/protected/properties/search",
      headers={"x-api-key": os.environ["FLUXIMMO_API_KEY"]},
      json={
          "size": 25,
          "sortBy": "FIRST_SEEN_AT",
          "orderBy": "DESC",
          "search": {
              "filterProperty": {
                  "location": [
                      {
                          "locationCoordinate": {
                              "location": {
                                  "geoBoundingBox": {
                                      "topLeft": {"lat": 48.9021, "lon": 2.2241},
                                      "bottomRight": {"lat": 48.8156, "lon": 2.4699},
                                  }
                              }
                          }
                      }
                  ],
                  "offer": [{"type": "OFFER_BUY"}],
                  "meta": {"isTotallyOffline": False},
              }
          },
      },
  )
  print(resp.json())
  ```

  ```javascript Node theme={null}
  const resp = await fetch("https://api.fluximmo.io/v2/protected/properties/search", {
    method: "POST",
    headers: { "x-api-key": process.env.FLUXIMMO_API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
      size: 25,
      sortBy: "FIRST_SEEN_AT",
      orderBy: "DESC",
      search: {
        filterProperty: {
          location: [
            {
              locationCoordinate: {
                location: {
                  geoBoundingBox: {
                    topLeft: { lat: 48.9021, lon: 2.2241 },
                    bottomRight: { lat: 48.8156, lon: 2.4699 },
                  },
                },
              },
            },
          ],
          offer: [{ type: "OFFER_BUY" }],
          meta: { isTotallyOffline: false },
        },
      },
    }),
  });
  console.log(await resp.json());
  ```
</CodeGroup>

### Exemple 5 — Multi-zones OR (Paris + petite couronne)

Plusieurs entrées dans `location[]` sont combinées en **OR** : au moins une zone doit correspondre. Vous pouvez mixer libellés administratifs (`postalCode`, `department`, `inseeCode`) et modes géo (`geoDistance`, `geoBoundingBox`) dans la même requête — utile pour une agence multi-territoires.

```json theme={null}
{
  "size": 25,
  "sortBy": "FIRST_SEEN_AT",
  "orderBy": "DESC",
  "search": {
    "filterProperty": {
      "location": [
        { "department": "75" },
        { "department": "92" },
        { "department": "93" },
        { "department": "94" }
      ],
      "type": ["CLASS_FLAT"],
      "offer": [{ "type": "OFFER_BUY" }],
      "meta": { "isTotallyOffline": false }
    }
  }
}
```

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.fluximmo.io/v2/protected/properties/search \
    -H "x-api-key: $FLUXIMMO_API_KEY" \
    -H "Content-Type: application/json" \
    -d @payload.json
  ```

  ```python Python theme={null}
  import requests, os
  resp = requests.post(
      "https://api.fluximmo.io/v2/protected/properties/search",
      headers={"x-api-key": os.environ["FLUXIMMO_API_KEY"]},
      json={
          "size": 25,
          "sortBy": "FIRST_SEEN_AT",
          "orderBy": "DESC",
          "search": {
              "filterProperty": {
                  "location": [
                      {"department": "75"},
                      {"department": "92"},
                      {"department": "93"},
                      {"department": "94"},
                  ],
                  "type": ["CLASS_FLAT"],
                  "offer": [{"type": "OFFER_BUY"}],
                  "meta": {"isTotallyOffline": False},
              }
          },
      },
  )
  print(resp.json())
  ```

  ```javascript Node theme={null}
  const resp = await fetch("https://api.fluximmo.io/v2/protected/properties/search", {
    method: "POST",
    headers: { "x-api-key": process.env.FLUXIMMO_API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
      size: 25,
      sortBy: "FIRST_SEEN_AT",
      orderBy: "DESC",
      search: {
        filterProperty: {
          location: [
            { department: "75" },
            { department: "92" },
            { department: "93" },
            { department: "94" },
          ],
          type: ["CLASS_FLAT"],
          offer: [{ type: "OFFER_BUY" }],
          meta: { isTotallyOffline: false },
        },
      },
    }),
  });
  console.log(await resp.json());
  ```
</CodeGroup>

## Pagination

L'API utilise une **pagination cursor** stable plutôt qu'un `offset`. C'est la méthode recommandée pour itérer sur de gros volumes : insertions et suppressions concurrentes ne décalent pas les pages.

**Workflow** :

1. Premier appel : envoyer le payload sans `searchAfterHash`.
2. La réponse contient un champ `searchAfterHash` (string opaque). Conservez-le.
3. Pour la page suivante : renvoyer **le même payload** (mêmes filtres, même `sortBy`/`orderBy`), en ajoutant `searchAfterHash: "<valeur reçue>"`.
4. Quand `searchAfterHash` est absent / null dans la réponse, vous avez atteint la fin des résultats.

**Paramètres** :

* `size` : 1 à 100 (recommandé : **25** pour `search` full ; voir DTO). Plus grand = plus de coût et de latence.
* `sortBy` ∈ `FIRST_SEEN_AT`, `LAST_UPDATED_AT`, `LAST_SEEN_AT`, `PRICE`, `RELEVANCE`. Le tri canonique en prod est `FIRST_SEEN_AT DESC`.
* `orderBy` ∈ `ASC`, `DESC`.
* ⚠️ **Ne changez pas `sortBy`/`orderBy` entre deux pages** — le cursor devient invalide.

```python Pagination Python theme={null}
import requests, os

payload = {
    "size": 25,
    "sortBy": "FIRST_SEEN_AT",
    "orderBy": "DESC",
    "search": {"filterProperty": {"location": [{"department": "75"}], "offer": [{"type": "OFFER_BUY"}]}},
}

cursor = None
while True:
    if cursor:
        payload["searchAfterHash"] = cursor
    resp = requests.post(
        "https://api.fluximmo.io/v2/protected/properties/search",
        headers={"x-api-key": os.environ["FLUXIMMO_API_KEY"]},
        json=payload,
    ).json()
    data = resp.get("data", {}) or {}
    for hit in data.get("items", []):
        print(hit["flxId"])
    cursor = data.get("searchAfterHash")
    if not cursor:
        break
```


## OpenAPI

````yaml post /v2/protected/properties/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/properties/search:
    post:
      tags:
        - Properties Search
      summary: Search properties
      description: Search properties with filters and fulltexts search terms
      operationId: SearchPropertiesController_postSearch
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchPropertyPayloadDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchPropertiesResponseDto'
        '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:
    SearchPropertyPayloadDto:
      type: object
      properties:
        orderBy:
          $ref: '#/components/schemas/EnumSearchRequestOrderByDto'
          example: DESC
        search:
          $ref: '#/components/schemas/SearchPropertyQueryPayloadDto'
        searchAfterHash:
          type: string
          description: >-
            The searchAfterHash parameter allows you to retrieve the next page
            of results by using the searchAfterHash value returned in the
            response from the previous page. This method eliminates the
            complexities of traditional pagination methods and ensures accurate
            results, regardless of insertions or deletions in the dataset.
        size:
          type: number
          example: 10
          default: 10
          minimum: 1
          maximum: 100
        sortBy:
          $ref: '#/components/schemas/EnumSearchRequestSortByDto'
          example: FIRST_SEEN_AT
      required:
        - orderBy
        - search
        - size
        - sortBy
    SearchPropertiesResponseDto:
      properties:
        data:
          type: object
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/PropertyDto'
            searchAfterHash:
              type: string
              description: >-
                The searchAfterHash parameter allows you to retrieve the next
                page of results by using the searchAfterHash value returned in
                the response from the previous page. This method eliminates the
                complexities of traditional pagination methods and ensures
                accurate results, regardless of insertions or deletions in the
                dataset.
            count:
              type: number
          required:
            - items
      required:
        - data
      type: object
    ExceptionDto:
      type: object
      properties:
        error:
          description: Error object
          allOf:
            - $ref: '#/components/schemas/ErrorDto'
      required:
        - error
    EnumSearchRequestOrderByDto:
      type: string
      enum:
        - ASC
        - DESC
    SearchPropertyQueryPayloadDto:
      type: object
      properties:
        filterProperty:
          $ref: '#/components/schemas/FilterPropertyDto'
        fullTexts:
          description: >-
            Search terms for full text search. We'll search in title,
            description, and keywords for terms similar to these (typically,
            we'll use a fuzzy search).
          type: array
          items:
            type: string
        keywords:
          description: >-
            Search terms for keyword search. We'll search in title, description,
            and keywords for exact matches to these terms (typically, we'll use
            a term search).
          type: array
          items:
            type: string
      required:
        - filterProperty
        - fullTexts
        - keywords
    EnumSearchRequestSortByDto:
      type: string
      enum:
        - FIRST_SEEN_AT
        - PRICE
        - LAST_UPDATED_AT
        - LAST_SEEN_AT
        - RELEVANCE
    PropertyDto:
      type: object
      properties:
        adverts:
          description: >-
            List of adverts linked to this property - adverts can be from
            different sources, different prices, different agencies, etc.
          type: array
          items:
            $ref: '#/components/schemas/PropertyAdvertDto'
        description:
          type: string
          description: By default, will be the description of the first advert
        flxId:
          type: string
          description: Unique identifier of the property
        habitation:
          description: Habitation characteristics of the property
          allOf:
            - $ref: '#/components/schemas/TypeHabitationDto'
        hasAnomaly:
          type: boolean
          description: An anomaly or incoherence have been detected
        isUrgent:
          type: boolean
          description: Is the property marked as urgent
        land:
          description: Land details of the property
          allOf:
            - $ref: '#/components/schemas/TypeLandDto'
        location:
          description: Location details of the property
          allOf:
            - $ref: '#/components/schemas/LocationDto'
        medias:
          description: All the medias of the different adverts of the property
          allOf:
            - $ref: '#/components/schemas/MediasDto'
        meta:
          description: Meta data of the property
          allOf:
            - $ref: '#/components/schemas/MetaDto'
        parking:
          description: Parking details of the property
          allOf:
            - $ref: '#/components/schemas/TypeParkingDto'
        price:
          description: Price details of the property
          allOf:
            - $ref: '#/components/schemas/PriceDto'
        tags:
          description: List of unstructured tags of the property
          type: array
          items:
            type: string
        title:
          type: string
          description: By default, will be the title of the first advert
        type:
          $ref: '#/components/schemas/EnumPropertyClassDto'
          example: CLASS_HOUSE
          description: Type of the property
        offer:
          description: Offer information of the property
          allOf:
            - $ref: '#/components/schemas/OfferDto'
    ErrorDto:
      type: object
      properties:
        message:
          type: string
          description: Error message
        code:
          type: number
          description: Error code
      required:
        - message
        - code
    FilterPropertyDto:
      type: object
      properties:
        adverts:
          example: []
          type: array
          items:
            $ref: '#/components/schemas/FilterPropertyAdvertDto'
        habitation:
          $ref: '#/components/schemas/FilterTypeHabitationDto'
        isUrgent:
          type: boolean
        land:
          $ref: '#/components/schemas/FilterTypeLandDto'
        location:
          example: []
          type: array
          items:
            $ref: '#/components/schemas/FilterLocationDto'
        meta:
          $ref: '#/components/schemas/FilterMetaDto'
        parking:
          $ref: '#/components/schemas/FilterTypeParkingDto'
        price:
          $ref: '#/components/schemas/FilterPriceDto'
        process:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumPropertyProcessDto'
        tags:
          type: array
          items:
            type: string
        type:
          type: array
          example:
            - CLASS_HOUSE
          items:
            $ref: '#/components/schemas/EnumPropertyClassDto'
        hasAnomaly:
          type: boolean
          description: An anomaly or incoherence have been detected
        offer:
          example: []
          type: array
          items:
            $ref: '#/components/schemas/FilterOfferDto'
    PropertyAdvertDto:
      type: object
      properties:
        contactInCharge:
          $ref: '#/components/schemas/ContactDto'
        description:
          type: string
        firstSeenAt:
          format: date-time
          type: string
          description: 'Date should be in ISO format (ex: `2022-10-21T11:31:33.593Z`)'
          example: '2022-10-21T11:31:33.593Z'
        flxId:
          type: string
        isOnline:
          type: boolean
        lastSeenAt:
          format: date-time
          type: string
          description: 'Date should be in ISO format (ex: `2022-10-21T11:31:33.593Z`)'
          example: '2022-10-21T11:31:33.593Z'
        location:
          description: >-
            Longitude and latitude as an array of number, first longitude then
            latitude [lng, lat]
          type: array
          items:
            type: number
        medias:
          $ref: '#/components/schemas/MediasDto'
        price:
          $ref: '#/components/schemas/PriceDto'
        source:
          $ref: '#/components/schemas/SourceDto'
        title:
          type: string
        offlineAt:
          format: date-time
          type: string
          description: 'Date should be in ISO format (ex: `2022-10-21T11:31:33.593Z`)'
          example: '2022-10-21T11:31:33.593Z'
        hasAnomaly:
          type: boolean
          description: An anomaly or incoherence have been detected
        isPro:
          type: boolean
        seller:
          $ref: '#/components/schemas/LightSellerDto'
        isExclusive:
          type: boolean
      required:
        - contactInCharge
    TypeHabitationDto:
      type: object
      properties:
        bathroomCount:
          type: number
        bedroomCount:
          type: number
        characteristics:
          $ref: '#/components/schemas/CharacteristicsDto'
        climate:
          description: The energetic classes of the property (DPE/GES)
          allOf:
            - $ref: '#/components/schemas/ClimateDto'
        features:
          $ref: '#/components/schemas/FeaturesDto'
        heatTypes:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumHeatTypeDto'
        heatTypeDetails:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumHeatTypeDetailDto'
        heatings:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumHeatingDto'
        propertyCondition:
          $ref: '#/components/schemas/PropertyConditionDto'
        roomCount:
          type: number
        surface:
          $ref: '#/components/schemas/SurfaceDto'
        type:
          $ref: '#/components/schemas/EnumPropertyTypeHabitationDto'
          example: []
        wcCount:
          type: number
    TypeLandDto:
      type: object
      properties:
        canConstruct:
          type: boolean
        hasBuildingPermit:
          type: boolean
        hasElectricity:
          type: boolean
        hasTelecom:
          type: boolean
        hasWater:
          type: boolean
        isServiced:
          type: boolean
        surface:
          type: number
        surfaceConstructable:
          type: number
        type:
          $ref: '#/components/schemas/EnumLandTypeDto'
          example: null
    LocationDto:
      type: object
      properties:
        city:
          type: string
        cityCoordinate:
          description: The coordinates of the city center
          allOf:
            - $ref: '#/components/schemas/CompleteLatLngDto'
        department:
          type: string
        inseeCode:
          type: string
        irisCode:
          type: string
        locationCoordinate:
          description: >-
            Coordinates of the property - could not be accurate or precise
            enough
          allOf:
            - $ref: '#/components/schemas/CompleteLatLngDto'
        postalCode:
          type: string
    MediasDto:
      type: object
      properties:
        images:
          type: array
          items:
            $ref: '#/components/schemas/ImageDto'
        virtualVisitExternalUrl:
          type: array
          items:
            type: string
    MetaDto:
      type: object
      properties:
        firstSeenAt:
          format: date-time
          type: string
          description: 'Date should be in ISO format (ex: `2022-10-21T11:31:33.593Z`)'
          example: '2022-10-21T11:31:33.593Z'
        isTotallyOffline:
          type: boolean
          description: >-
            All the adverts of this property are offline - Meaning the property
            is not available anymore (sold, rented, etc.)
        lastPublishedAt:
          format: date-time
          type: string
        lastSeenAt:
          format: date-time
          type: string
          description: 'Date should be in ISO format (ex: `2022-10-21T11:31:33.593Z`)'
          example: '2022-10-21T11:31:33.593Z'
        lastUpdatedAt:
          format: date-time
          type: string
          description: 'Date should be in ISO format (ex: `2022-10-21T11:31:33.593Z`)'
          example: '2022-10-21T11:31:33.593Z'
        totallyOfflineAt:
          format: date-time
          type: string
          description: 'Date should be in ISO format (ex: `2022-10-21T11:31:33.593Z`)'
          example: '2022-10-21T11:31:33.593Z'
    TypeParkingDto:
      type: object
      properties:
        count:
          type: number
        numberOfCars:
          type: number
        surface:
          type: number
        type:
          $ref: '#/components/schemas/EnumParkingTypeDto'
          example: null
    PriceDto:
      type: object
      properties:
        charges:
          description: >-
            Breakdown of recurring property-related charges, taxes, rent
            supplements, and annual fees associated with the asset.
          allOf:
            - $ref: '#/components/schemas/ChargesDto'
        currency:
          $ref: '#/components/schemas/EnumCurrencyDto'
          example: null
        initial:
          description: >-
            The initial price of the property - price of the first advert we
            found for this property
          allOf:
            - $ref: '#/components/schemas/PropertyPriceDto'
        isAuction:
          type: boolean
        latest:
          description: >-
            The latest price of the property - price of the last advert we found
            for this property
          allOf:
            - $ref: '#/components/schemas/PropertyPriceDto'
        scope:
          $ref: '#/components/schemas/EnumPricingScopeDto'
          example: null
        warrantyDeposit:
          type: number
        variation:
          description: The variation of the price between two states of the advert
          allOf:
            - $ref: '#/components/schemas/VariationDto'
    EnumPropertyClassDto:
      type: string
      enum:
        - CLASS_UNKNOWN
        - CLASS_HOUSE
        - CLASS_FLAT
        - CLASS_PROGRAM
        - CLASS_SHOP
        - CLASS_PREMISES
        - CLASS_OFFICE
        - CLASS_LAND
        - CLASS_BUILDING
        - CLASS_PARKING
        - CLASS_ROOM
        - CLASS_OTHER
    OfferDto:
      type: object
      properties:
        isCurrentlyOccupied:
          type: boolean
          description: The property is sold with someone living in it
        renting:
          description: Renting contract details
          allOf:
            - $ref: '#/components/schemas/OfferRentingContractDto'
        type:
          $ref: '#/components/schemas/EnumPropertyOfferTypeDto'
          example: OFFER_BUY
    FilterPropertyAdvertDto:
      type: object
      properties:
        firstSeenAt:
          $ref: '#/components/schemas/FilterDateRangeDto'
        flxId:
          type: array
          items:
            type: string
        isOnline:
          type: boolean
        lastSeenAt:
          $ref: '#/components/schemas/FilterDateRangeDto'
        location:
          $ref: '#/components/schemas/FilterLatLngDto'
        price:
          $ref: '#/components/schemas/FilterPriceDto'
        source:
          $ref: '#/components/schemas/FilterSourceDto'
        isPro:
          type: boolean
        seller:
          example: []
          type: array
          items:
            $ref: '#/components/schemas/LightSellerDto'
        hasAnomaly:
          type: boolean
          description: An anomaly or incoherence have been detected
        isExclusive:
          type: boolean
          description: Is the advert exclusive to the seller
    FilterTypeHabitationDto:
      type: object
      properties:
        bathroomCount:
          $ref: '#/components/schemas/FilterIntRangeDto'
        bedroomCount:
          $ref: '#/components/schemas/FilterIntRangeDto'
        characteristics:
          $ref: '#/components/schemas/CharacteristicsDto'
        climate:
          $ref: '#/components/schemas/FilterClimateDto'
        features:
          $ref: '#/components/schemas/FilterFeaturesDto'
        heatTypes:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumHeatTypeDto'
        heatTypeDetails:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumHeatTypeDetailDto'
        heatings:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumHeatingDto'
        propertyCondition:
          type: array
          items:
            $ref: '#/components/schemas/PropertyConditionDto'
        roomCount:
          $ref: '#/components/schemas/FilterIntRangeDto'
        surface:
          $ref: '#/components/schemas/FilterSurfaceDto'
        type:
          $ref: '#/components/schemas/EnumPropertyTypeHabitationDto'
          example: PROPERTY_TYPE_T1_T2
        wcCount:
          $ref: '#/components/schemas/FilterIntRangeDto'
    FilterTypeLandDto:
      type: object
      properties:
        canConstruct:
          type: boolean
        isServiced:
          type: boolean
        surface:
          $ref: '#/components/schemas/FilterIntRangeDto'
        surfaceConstructable:
          $ref: '#/components/schemas/FilterIntRangeDto'
        type:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumLandTypeDto'
        haveBuildingPermit:
          type: boolean
        haveElectricity:
          type: boolean
        haveTelecom:
          type: boolean
        haveWater:
          type: boolean
    FilterLocationDto:
      type: object
      properties:
        cityCoordinate:
          $ref: '#/components/schemas/FilterCompleteLatLngDto'
        department:
          type: string
        inseeCode:
          type: string
        irisCode:
          type: string
        locationCoordinate:
          $ref: '#/components/schemas/FilterCompleteLatLngDto'
        postalCode:
          type: string
    FilterMetaDto:
      type: object
      properties:
        firstSeenAt:
          $ref: '#/components/schemas/FilterDateRangeDto'
        isTotallyOffline:
          type: boolean
        lastPublishedAt:
          $ref: '#/components/schemas/FilterDateRangeDto'
        lastSeenAt:
          $ref: '#/components/schemas/FilterDateRangeDto'
        lastUpdatedAt:
          $ref: '#/components/schemas/FilterDateRangeDto'
    FilterTypeParkingDto:
      type: object
      properties:
        count:
          $ref: '#/components/schemas/FilterIntRangeDto'
        numberOfCars:
          $ref: '#/components/schemas/FilterIntRangeDto'
        surface:
          $ref: '#/components/schemas/FilterIntRangeDto'
        type:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumParkingTypeDto'
    FilterPriceDto:
      type: object
      properties:
        currency:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumCurrencyDto'
        initial:
          $ref: '#/components/schemas/FilterPropertyPriceDto'
        isAuction:
          type: boolean
        latest:
          $ref: '#/components/schemas/FilterPropertyPriceDto'
        scope:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumPricingScopeDto'
        warrantyDeposit:
          $ref: '#/components/schemas/FilterIntRangeDto'
        variation:
          example: []
          type: array
          items:
            $ref: '#/components/schemas/FilterVariationDto'
    EnumPropertyProcessDto:
      type: string
      enum:
        - PROCESS_UNKNOWN
        - PROCESS_AVAILABLE_ON_MARKET
        - PROCESS_UNDER_COMPROMISE
        - PROCESS_RENTED_SOLD
        - PROCESS_REMOVED
        - PROCESS_RESERVED
        - PROCESS_ARCHIVED
    FilterOfferDto:
      type: object
      properties:
        isCurrentlyOccupied:
          type: boolean
        renting:
          $ref: '#/components/schemas/FilterOfferRentingContractDto'
        type:
          $ref: '#/components/schemas/EnumPropertyOfferTypeDto'
          example: OFFER_BUY
    ContactDto:
      type: object
      properties:
        email:
          type: string
        firstName:
          type: string
        lastName:
          type: string
        phoneNumber:
          type: string
        pseudonym:
          type: string
    SourceDto:
      type: object
      properties:
        flxId:
          type: string
        url:
          type: string
        website:
          type: string
    LightSellerDto:
      type: object
      properties:
        flxId:
          type: string
        name:
          type: string
        siren:
          type: string
        type:
          $ref: '#/components/schemas/EnumSellerTypeDto'
          example: SELLER_TYPE_AGENCY
    CharacteristicsDto:
      type: object
      properties:
        hasAlarm:
          type: boolean
        hasBalcony:
          type: boolean
        hasCellar:
          type: boolean
        hasConcierge:
          type: boolean
        hasDigicode:
          type: boolean
        hasFireplace:
          type: boolean
        hasGarage:
          type: boolean
        hasGarden:
          type: boolean
        hasGrenier:
          type: boolean
        hasInterphone:
          type: boolean
        hasJacuzzi:
          type: boolean
        hasLand:
          type: boolean
        hasLift:
          type: boolean
        hasMezzanine:
          type: boolean
        hasParking:
          type: boolean
        hasPool:
          type: boolean
        hasTerrace:
          type: boolean
        hasVisAVis:
          type: boolean
        isPeaceful:
          type: boolean
    ClimateDto:
      type: object
      properties:
        epcClimate:
          $ref: '#/components/schemas/EnumGreenhouseClassificationDto'
          example: GREENHOUSE_CLASSIFICATION_C
          description: >-
            The classification value of the greenhouse gas emission
            classification - GES
        epcClimateScore:
          type: number
          description: >-
            The value of the greenhouse gas emission classification - GES in
            kgCO2/m²/year
        epcEnergy:
          $ref: '#/components/schemas/EnumEnergyClassificationDto'
          example: ENERGY_CLASSIFICATION_C
          description: The classification value of the energy classification - DPE
        epcEnergyScore:
          type: number
          description: The value of the energy classification - DPE in kWhEP/m²/year
        epcClimateDate:
          format: date-time
          type: string
          description: 'Date should be in ISO format (ex: `2022-10-21T11:31:33.593Z`)'
          example: '2022-10-21T11:31:33.593Z'
        epcEnergyDate:
          format: date-time
          type: string
          description: 'Date should be in ISO format (ex: `2022-10-21T11:31:33.593Z`)'
          example: '2022-10-21T11:31:33.593Z'
    FeaturesDto:
      type: object
      properties:
        exposure:
          $ref: '#/components/schemas/EnumExposureDto'
          example: null
        furniture:
          $ref: '#/components/schemas/EnumFurnitureDto'
          example: null
        propertyFloor:
          type: number
        propertyTotalFloor:
          type: number
        viewTypes:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumViewTypeDto'
        constructionMaterials:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumConstructionMaterialDto'
        hasThroughExposure:
          type: boolean
        viewOns:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumViewOnDto'
    EnumHeatTypeDto:
      type: string
      enum:
        - HEAT_TYPE_UNKNOWN
        - HEAT_TYPE_INDIVIDUAL
        - HEAT_TYPE_SHARED
        - HEAT_TYPE_MIX
        - HEAT_TYPE_CITY
        - HEAT_TYPE_CISTERN
    EnumHeatTypeDetailDto:
      type: string
      enum:
        - HEAT_DETAIL_UNKNOWN
        - HEAT_DETAIL_FLOOR
        - HEAT_DETAIL_CEILING
        - HEAT_DETAIL_FIREPLACE
        - HEAT_DETAIL_INSERT
        - HEAT_DETAIL_AIR_CON
        - HEAT_DETAIL_REVERSIBLE_AIR_CON
        - HEAT_DETAIL_RADIANTS_TUBES
        - HEAT_DETAIL_RADIATOR
        - HEAT_DETAIL_SHEAHS
        - HEAT_DETAIL_CONVECTOR
    EnumHeatingDto:
      type: string
      enum:
        - HEATING_UNKNOWN
        - HEATING_FUEL_OIL
        - HEATING_ELECTRICAL
        - HEATING_GAS
        - HEATING_BIOMASS
        - HEATING_SOLAR
        - HEATING_GEOTHERMAL
        - HEATING_WOOD
        - HEATING_HEAT_PUMP
        - HEATING_PELLET
        - HEATING_CANADIAN_WELL
        - HEATING_COAL
    PropertyConditionDto:
      type: object
      properties:
        constructionYear:
          type: number
        interiorCondition:
          $ref: '#/components/schemas/EnumPropertyInteriorConditionDto'
          example: null
        renovationYear:
          type: number
        generalConditions:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumPropertyGeneralConditionDto'
    SurfaceDto:
      type: object
      properties:
        balconies:
          type: number
          description: The surface of the balconies in m² - we rarely have this information
        floorSpace:
          type: number
          description: >-
            The surface of the total floors in m² - we rarely have this
            information
        gardens:
          type: number
          description: The surface of the gardens in m² - we rarely have this information
        groundFloor:
          type: number
          description: >-
            The surface of the ground floor in m² - we rarely have this
            information
        kitchen:
          type: number
          description: The surface of the kitchen in m² - we rarely have this information
        livingSpace:
          type: number
          description: >-
            The surface of the living space in m² - we rarely have this
            information
        livingRoom:
          type: number
          description: >-
            The surface of the living room in m² - we rarely have this
            information
        terraces:
          type: number
          description: The surface of the terraces in m² - we rarely have this information
        total:
          type: number
          description: The total habitable surface of the property in m²
    EnumPropertyTypeHabitationDto:
      type: string
      enum:
        - PROPERTY_TYPE_UNKNOWN
        - PROPERTY_TYPE_STUDIO
        - PROPERTY_TYPE_T1
        - PROPERTY_TYPE_T1_T2
        - PROPERTY_TYPE_T2
        - PROPERTY_TYPE_T2_T3
        - PROPERTY_TYPE_T3
        - PROPERTY_TYPE_T3_4
        - PROPERTY_TYPE_T4
        - PROPERTY_TYPE_T4_5
        - PROPERTY_TYPE_T5_MORE
        - PROPERTY_TYPE_LOFT
        - PROPERTY_TYPE_DUPLEX
        - PROPERTY_TYPE_OTHER_APARTMENT_TYPE
        - PROPERTY_TYPE_INDIVIDUAL
        - PROPERTY_TYPE_ONE_SIDE_TERRACED
        - PROPERTY_TYPE_TWO_SIDE_TERRACED
        - PROPERTY_TYPE_SINGLE_STOREY
        - PROPERTY_TYPE_TRADITIONAL
        - PROPERTY_TYPE_CONTEMPORARY
        - PROPERTY_TYPE_BOURGEOIS
        - PROPERTY_TYPE_VILLA
        - PROPERTY_TYPE_MANOR
        - PROPERTY_TYPE_CASTLE
        - PROPERTY_TYPE_FARM
        - PROPERTY_TYPE_MAS
        - PROPERTY_TYPE_BASTIDE
        - PROPERTY_TYPE_CHALET
        - PROPERTY_TYPE_ANCIENT
        - PROPERTY_TYPE_HERITAGE_LISTED
        - PROPERTY_TYPE_BUNGALOW
    EnumLandTypeDto:
      type: string
      enum:
        - LAND_UNKNOWN
        - LAND_BUILDING_PLOT
        - LAND_AGRICULTURAL
        - LAND_VINEYARD
        - LAND_INDUSTRIAL
        - LAND_POND
        - LAND_FOREST
    CompleteLatLngDto:
      type: object
      properties:
        location:
          example:
            - 2.3522
            - 48.8566
          description: >-
            Longitude and latitude as an array of number, first longitude then
            latitude [lng, lat]
          type: array
          items:
            type: number
    ImageDto:
      type: object
      properties:
        gaussianHash:
          type: string
        imageId:
          type: string
        meanHash:
          type: string
        perceptualHash:
          type: string
        colorHash:
          type: string
        differenceHash:
          type: string
        url:
          type: string
      required:
        - gaussianHash
        - imageId
        - meanHash
        - perceptualHash
        - colorHash
        - differenceHash
    EnumParkingTypeDto:
      type: string
      enum:
        - PARKING_UNKNOWN
        - PARKING_GARAGE
        - PARKING_PARKING
    ChargesDto:
      type: object
      properties:
        yearlyCondoniumFees:
          type: number
          description: Annual condominium charges.
        yearlyElectricityFees:
          type: number
          description: Annual electricity-related charges.
        yearlyHeatingFees:
          type: number
          description: Annual heating-related charges.
        yearlyHousingTax:
          type: number
          description: Annual housing tax amount.
        yearlyLivingTax:
          type: number
          description: Annual residence tax amount.
        yearlyRentalFees:
          type: number
          description: Annual rental-related charges or fees.
        monthlyRentSupplement:
          type: number
          description: Monthly rent supplement amount.
    EnumCurrencyDto:
      type: string
      enum:
        - CURRENCY_EUR
        - CURRENCY_USD
    PropertyPriceDto:
      type: object
      properties:
        source:
          $ref: '#/components/schemas/SourceDto'
        value:
          type: number
        valuePerArea:
          type: number
    EnumPricingScopeDto:
      type: string
      enum:
        - PRICING_ONE_OFF
        - PRICING_MENSUAL
    VariationDto:
      type: object
      properties:
        sinceLastModified:
          type: number
          description: The value of the price variation in %
        sincePublished:
          type: number
          description: The value of the price variation in %
        absoluteSinceLastModified:
          type: number
          description: The absolute value of the price variation in %
        absoluteSincePublished:
          type: number
          description: The absolute value of the price variation in %
    OfferRentingContractDto:
      type: object
      properties:
        isColocation:
          type: boolean
          description: The offer is for a colocation
        isLongTerm:
          type: boolean
          description: The offer is for long term renting (more than 6 months)
        isShortTerm:
          type: boolean
          description: The offer is for short term renting (less than 6 months)
        isSubLease:
          type: boolean
          description: The offer is for a sublease
    EnumPropertyOfferTypeDto:
      type: string
      enum:
        - OFFER_UNKNOWN
        - OFFER_BUY
        - OFFER_RENT
        - OFFER_BUSINESS_TAKE_OVER
        - OFFER_LEASE_BACK
        - OFFER_LIFE_ANNUITY_SALE
        - OFFER_HOLIDAYS
        - OFFER_AUCTION
    FilterDateRangeDto:
      type: object
      properties:
        max:
          format: date-time
          type: string
          description: >-
            Date filter - Date should be in ISO format (ex:
            `2022-10-21T11:31:33.593Z`)
          example: '2022-10-21T11:31:33.593Z'
        min:
          format: date-time
          type: string
          description: >-
            Date filter - Date should be in ISO format (ex:
            `2022-10-21T11:31:33.593Z`)
          example: '2022-10-21T11:31:33.593Z'
    FilterLatLngDto:
      type: object
      properties:
        geoBoundingBox:
          $ref: '#/components/schemas/FilterLatLngGeoBoundingBoxDto'
        geoDistance:
          $ref: '#/components/schemas/FilterLatLngGeoDistanceDto'
        geoInseeCodeDistance:
          $ref: '#/components/schemas/FilterLatLngGeoInseeCodeDistanceDto'
    FilterSourceDto:
      type: object
      properties:
        flxId:
          type: string
        url:
          type: string
        website:
          type: string
    FilterIntRangeDto:
      type: object
      properties:
        max:
          type: number
          description: The maximum value of the range
        min:
          type: number
          description: The minimum value of the range
    FilterClimateDto:
      type: object
      properties:
        epcClimate:
          type: array
          example: []
          description: >-
            The classification value of the greenhouse gas emission
            classification - GES
          items:
            $ref: '#/components/schemas/EnumGreenhouseClassificationDto'
        epcClimateScore:
          description: >-
            The value of the greenhouse gas emission classification - GES in
            kgCO2/m²/year
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
        epcEnergy:
          type: array
          example: []
          description: The classification value of the energy classification - DPE
          items:
            $ref: '#/components/schemas/EnumEnergyClassificationDto'
        epcEnergyScore:
          description: The value of the energy classification - DPE in kWhEP/m²/year
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
        epcClimateDate:
          $ref: '#/components/schemas/FilterDateRangeDto'
        epcEnergyDate:
          $ref: '#/components/schemas/FilterDateRangeDto'
    FilterFeaturesDto:
      type: object
      properties:
        exposure:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumExposureDto'
        furniture:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumFurnitureDto'
        propertyFloor:
          $ref: '#/components/schemas/FilterIntRangeDto'
        propertyTotalFloor:
          $ref: '#/components/schemas/FilterIntRangeDto'
        constructionMaterials:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumConstructionMaterialDto'
        glazingTypes:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumGlazingTypeDto'
        hasThroughExposure:
          type: boolean
        viewOns:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumViewOnDto'
        viewTypes:
          type: array
          example: []
          items:
            $ref: '#/components/schemas/EnumViewTypeDto'
    FilterSurfaceDto:
      type: object
      properties:
        balconies:
          description: The surface of the balconies in m² - we rarely have this information
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
        floorSpace:
          description: >-
            The surface of the total floors in m² - we rarely have this
            information
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
        gardens:
          description: The surface of the gardens in m² - we rarely have this information
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
        groundFloor:
          description: >-
            The surface of the ground floor in m² - we rarely have this
            information
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
        kitchen:
          description: The surface of the kitchen in m² - we rarely have this information
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
        livingSpace:
          description: >-
            The surface of the living space in m² - we rarely have this
            information
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
        livingroom:
          description: >-
            The surface of the living room in m² - we rarely have this
            information
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
        terraces:
          description: The surface of the terraces in m² - we rarely have this information
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
        total:
          description: The total habitable surface of the property in m²
          allOf:
            - $ref: '#/components/schemas/FilterIntRangeDto'
    FilterCompleteLatLngDto:
      type: object
      properties:
        location:
          description: Filter by location geo coordinates
          allOf:
            - $ref: '#/components/schemas/FilterLatLngDto'
    FilterPropertyPriceDto:
      type: object
      properties:
        source:
          $ref: '#/components/schemas/FilterSourceDto'
        value:
          $ref: '#/components/schemas/FilterIntRangeDto'
        valuePerArea:
          $ref: '#/components/schemas/FilterIntRangeDto'
    FilterVariationDto:
      type: object
      properties:
        sinceLastModified:
          description: The value of the price variation in %
          allOf:
            - $ref: '#/components/schemas/FilterDoubleRangeDto'
        sincePublished:
          description: The value of the price variation in %
          allOf:
            - $ref: '#/components/schemas/FilterDoubleRangeDto'
    FilterOfferRentingContractDto:
      type: object
      properties:
        isColocation:
          type: boolean
        isLongTerm:
          type: boolean
        isShortTerm:
          type: boolean
        isSubLease:
          type: boolean
    EnumSellerTypeDto:
      type: string
      enum:
        - SELLER_TYPE_UNKNOWN
        - SELLER_TYPE_AGENCY
        - SELLER_TYPE_NETWORK
    EnumGreenhouseClassificationDto:
      type: string
      enum:
        - GREENHOUSE_CLASSIFICATION_UNKNOWN
        - GREENHOUSE_CLASSIFICATION_G
        - GREENHOUSE_CLASSIFICATION_F
        - GREENHOUSE_CLASSIFICATION_E
        - GREENHOUSE_CLASSIFICATION_D
        - GREENHOUSE_CLASSIFICATION_C
        - GREENHOUSE_CLASSIFICATION_B
        - GREENHOUSE_CLASSIFICATION_A
        - GREENHOUSE_CLASSIFICATION_NC
    EnumEnergyClassificationDto:
      type: string
      enum:
        - ENERGY_CLASSIFICATION_UNKNOWN
        - ENERGY_CLASSIFICATION_G
        - ENERGY_CLASSIFICATION_F
        - ENERGY_CLASSIFICATION_E
        - ENERGY_CLASSIFICATION_D
        - ENERGY_CLASSIFICATION_C
        - ENERGY_CLASSIFICATION_B
        - ENERGY_CLASSIFICATION_A
        - ENERGY_CLASSIFICATION_NC
    EnumExposureDto:
      type: string
      enum:
        - EXPOSURE_UNKNOWN
        - EXPOSURE_NORTH
        - EXPOSURE_NORTH_EAST
        - EXPOSURE_EAST
        - EXPOSURE_SOUTH_EAST
        - EXPOSURE_SOUTH
        - EXPOSURE_SOUTH_WEST
        - EXPOSURE_WEST
        - EXPOSURE_NORTH_WEST
    EnumFurnitureDto:
      type: string
      enum:
        - UNKNOWN_FURNITURE
        - UNFURNISHED
        - PARTIALLY_FURNISHED
        - FULLY_FURNISHED
    EnumViewTypeDto:
      type: string
      enum:
        - VIEW_TYPE_UNKNOWN
        - VIEW_TYPE_GLIMPSE
        - VIEW_TYPE_PANORAMIC
        - VIEW_TYPE_CLEAR
        - VIEW_TYPE_EXCEPTIONAL
        - VIEW_TYPE_DOMINANT
    EnumConstructionMaterialDto:
      type: string
      enum:
        - MATERIAL_UNKNOWN
        - MATERIAL_WOODEN
        - MATERIAL_STEEL
        - MATERIAL_STONE
        - MATERIAL_PVC
        - MATERIAL_CONCRETE
        - MATERIAL_ALUMINIUM
        - MATERIAL_HALF_TIMBERED
        - MATERIAL_MARBLE
        - MATERIAL_BRICK
        - MATERIAL_CINDER_BLOCK
        - MATERIAL_PREFABRICATED
        - MATERIAL_ADOBE
        - MATERIAL_COATING
    EnumViewOnDto:
      type: string
      enum:
        - VIEW_ON_UNKNOWN
        - VIEW_ON_SEA
        - VIEW_ON_HILLS
        - VIEW_ON_RIVERS
        - VIEW_ON_CITY
        - VIEW_ON_PARK
        - VIEW_ON_VERDURE
        - VIEW_ON_STREET
        - VIEW_ON_COURTYARD
        - VIEW_ON_COUNTRYSIDE
        - VIEW_ON_MOUNTAIN
        - VIEW_ON_GARDEN_TERRACE
        - VIEW_ON_LAKE
        - VIEW_ON_SKI_SLOPES
        - VIEW_ON_PORT
        - VIEW_ON_POI
        - VIEW_ON_SKY
        - VIEW_ON_WATER
        - VIEW_ON_VINEYARD
        - VIEW_ON_ROOF
    EnumPropertyInteriorConditionDto:
      type: string
      enum:
        - INTERIOR_CONDITION_UNKNOWN
        - INTERIOR_CONDITION_EXCELLENT
        - INTERIOR_CONDITION_TO_REFRESH
        - INTERIOR_CONDITION_SMALL_WORKS_TO_BE_PLANNED
        - INTERIOR_CONDITION_MAJOR_WORKS_TO_BE_PALLNED
        - INTERIOR_CONDITION_BRAND_NEW
        - INTERIOR_CONDITION_GOOD_CONDITION
        - INTERIOR_CONDITION_TO_BE_RENOVATED
    EnumPropertyGeneralConditionDto:
      type: string
      enum:
        - GENERAL_CONDITION_UNKNOWN
        - GENERAL_CONDITION_TO_BE_RENOVATED
        - GENERAL_CONDITION_BRAND_NEW
        - GENERAL_CONDITION_RENOVATED
        - GENERAL_CONDITION_TO_BE_REFRESHED
        - GENERAL_CONDITION_GOOD
        - GENERAL_CONDITION_EXCELLENT
        - GENERAL_CONDITION_DECREPIT
        - GENERAL_CONDITION_TO_BE_BUILT
    FilterLatLngGeoBoundingBoxDto:
      type: object
      properties:
        bottomRight:
          $ref: '#/components/schemas/LatLngDto'
        topLeft:
          $ref: '#/components/schemas/LatLngDto'
    FilterLatLngGeoDistanceDto:
      type: object
      properties:
        distanceKm:
          type: number
        pin:
          $ref: '#/components/schemas/LatLngDto'
    FilterLatLngGeoInseeCodeDistanceDto:
      type: object
      properties:
        distanceKm:
          type: number
        inseeCode:
          type: string
    EnumGlazingTypeDto:
      type: string
      enum:
        - GLAZING_TYPE_UNKNOWN
        - GLAZING_TYPE_SIMPLE
        - GLAZING_TYPE_DOUBLE
        - GLAZING_TYPE_TRIPLE
    FilterDoubleRangeDto:
      type: object
      properties:
        max:
          type: number
        min:
          type: number
    LatLngDto:
      type: object
      properties:
        lat:
          type: number
          description: Latitude
        lon:
          type: number
          description: Longitude
  securitySchemes:
    x_api_key:
      type: apiKey
      in: header
      name: x-api-key

````