Skip to main content
Search properties
curl --request POST \
  --url https://api.fluximmo.io/v2/protected/properties/search \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <api-key>' \
  --data '
{
  "orderBy": "DESC",
  "search": {
    "filterProperty": {
      "adverts": [],
      "habitation": {
        "bathroomCount": {
          "max": 123,
          "min": 123
        },
        "bedroomCount": {
          "max": 123,
          "min": 123
        },
        "characteristics": {
          "hasAlarm": true,
          "hasBalcony": true,
          "hasCellar": true,
          "hasConcierge": true,
          "hasDigicode": true,
          "hasFireplace": true,
          "hasGarage": true,
          "hasGarden": true,
          "hasGrenier": true,
          "hasInterphone": true,
          "hasJacuzzi": true,
          "hasLand": true,
          "hasLift": true,
          "hasMezzanine": true,
          "hasParking": true,
          "hasPool": true,
          "hasTerrace": true,
          "hasVisAVis": true,
          "isPeaceful": true
        },
        "climate": {
          "epcClimate": [],
          "epcClimateScore": {
            "max": 123,
            "min": 123
          },
          "epcEnergy": [],
          "epcEnergyScore": {
            "max": 123,
            "min": 123
          },
          "epcClimateDate": {
            "max": "2022-10-21T11:31:33.593Z",
            "min": "2022-10-21T11:31:33.593Z"
          },
          "epcEnergyDate": {
            "max": "2022-10-21T11:31:33.593Z",
            "min": "2022-10-21T11:31:33.593Z"
          }
        },
        "features": {
          "exposure": [],
          "furniture": [],
          "propertyFloor": {
            "max": 123,
            "min": 123
          },
          "propertyTotalFloor": {
            "max": 123,
            "min": 123
          },
          "constructionMaterials": [],
          "glazingTypes": [],
          "hasThroughExposure": true,
          "viewOns": [],
          "viewTypes": []
        },
        "heatTypes": [],
        "heatTypeDetails": [],
        "heatings": [],
        "propertyCondition": [
          {
            "constructionYear": 123,
            "interiorCondition": null,
            "renovationYear": 123,
            "generalConditions": []
          }
        ],
        "roomCount": {
          "max": 123,
          "min": 123
        },
        "surface": {
          "balconies": {
            "max": 123,
            "min": 123
          },
          "floorSpace": {
            "max": 123,
            "min": 123
          },
          "gardens": {
            "max": 123,
            "min": 123
          },
          "groundFloor": {
            "max": 123,
            "min": 123
          },
          "kitchen": {
            "max": 123,
            "min": 123
          },
          "livingSpace": {
            "max": 123,
            "min": 123
          },
          "livingroom": {
            "max": 123,
            "min": 123
          },
          "terraces": {
            "max": 123,
            "min": 123
          },
          "total": {
            "max": 123,
            "min": 123
          }
        },
        "type": "PROPERTY_TYPE_T1_T2",
        "wcCount": {
          "max": 123,
          "min": 123
        }
      },
      "isUrgent": true,
      "land": {
        "canConstruct": true,
        "isServiced": true,
        "surface": {
          "max": 123,
          "min": 123
        },
        "surfaceConstructable": {
          "max": 123,
          "min": 123
        },
        "type": [],
        "haveBuildingPermit": true,
        "haveElectricity": true,
        "haveTelecom": true,
        "haveWater": true
      },
      "location": [],
      "meta": {
        "firstSeenAt": {
          "max": "2022-10-21T11:31:33.593Z",
          "min": "2022-10-21T11:31:33.593Z"
        },
        "isTotallyOffline": true,
        "lastPublishedAt": {
          "max": "2022-10-21T11:31:33.593Z",
          "min": "2022-10-21T11:31:33.593Z"
        },
        "lastSeenAt": {
          "max": "2022-10-21T11:31:33.593Z",
          "min": "2022-10-21T11:31:33.593Z"
        },
        "lastUpdatedAt": {
          "max": "2022-10-21T11:31:33.593Z",
          "min": "2022-10-21T11:31:33.593Z"
        }
      },
      "parking": {
        "count": {
          "max": 123,
          "min": 123
        },
        "numberOfCars": {
          "max": 123,
          "min": 123
        },
        "surface": {
          "max": 123,
          "min": 123
        },
        "type": []
      },
      "price": {
        "currency": [],
        "initial": {
          "source": {
            "flxId": "<string>",
            "url": "<string>",
            "website": "<string>"
          },
          "value": {
            "max": 123,
            "min": 123
          },
          "valuePerArea": {
            "max": 123,
            "min": 123
          }
        },
        "isAuction": true,
        "latest": {
          "source": {
            "flxId": "<string>",
            "url": "<string>",
            "website": "<string>"
          },
          "value": {
            "max": 123,
            "min": 123
          },
          "valuePerArea": {
            "max": 123,
            "min": 123
          }
        },
        "scope": [],
        "warrantyDeposit": {
          "max": 123,
          "min": 123
        },
        "variation": []
      },
      "process": [],
      "tags": [
        "<string>"
      ],
      "type": [
        "CLASS_HOUSE"
      ],
      "hasAnomaly": true,
      "offer": []
    },
    "fullTexts": [
      "<string>"
    ],
    "keywords": [
      "<string>"
    ]
  },
  "size": 10,
  "sortBy": "FIRST_SEEN_AT",
  "searchAfterHash": "<string>"
}
'
{
  "data": {
    "items": [
      {
        "adverts": [
          {
            "contactInCharge": {
              "email": "<string>",
              "firstName": "<string>",
              "lastName": "<string>",
              "phoneNumber": "<string>",
              "pseudonym": "<string>"
            },
            "description": "<string>",
            "firstSeenAt": "2022-10-21T11:31:33.593Z",
            "flxId": "<string>",
            "isOnline": true,
            "lastSeenAt": "2022-10-21T11:31:33.593Z",
            "location": [
              123
            ],
            "medias": {
              "images": [
                {
                  "gaussianHash": "<string>",
                  "imageId": "<string>",
                  "meanHash": "<string>",
                  "perceptualHash": "<string>",
                  "colorHash": "<string>",
                  "differenceHash": "<string>",
                  "url": "<string>"
                }
              ],
              "virtualVisitExternalUrl": [
                "<string>"
              ]
            },
            "price": {
              "charges": {
                "yearlyCondoniumFees": 123,
                "yearlyElectricityFees": 123,
                "yearlyHeatingFees": 123,
                "yearlyHousingTax": 123,
                "yearlyLivingTax": 123,
                "yearlyRentalFees": 123,
                "monthlyRentSupplement": 123
              },
              "currency": null,
              "initial": {
                "source": {
                  "flxId": "<string>",
                  "url": "<string>",
                  "website": "<string>"
                },
                "value": 123,
                "valuePerArea": 123
              },
              "isAuction": true,
              "latest": {
                "source": {
                  "flxId": "<string>",
                  "url": "<string>",
                  "website": "<string>"
                },
                "value": 123,
                "valuePerArea": 123
              },
              "scope": null,
              "warrantyDeposit": 123,
              "variation": {
                "sinceLastModified": 123,
                "sincePublished": 123,
                "absoluteSinceLastModified": 123,
                "absoluteSincePublished": 123
              }
            },
            "source": {
              "flxId": "<string>",
              "url": "<string>",
              "website": "<string>"
            },
            "title": "<string>",
            "offlineAt": "2022-10-21T11:31:33.593Z",
            "hasAnomaly": true,
            "isPro": true,
            "seller": {
              "flxId": "<string>",
              "name": "<string>",
              "siren": "<string>",
              "type": "SELLER_TYPE_AGENCY"
            },
            "isExclusive": true
          }
        ],
        "description": "<string>",
        "flxId": "<string>",
        "habitation": {
          "bathroomCount": 123,
          "bedroomCount": 123,
          "characteristics": {
            "hasAlarm": true,
            "hasBalcony": true,
            "hasCellar": true,
            "hasConcierge": true,
            "hasDigicode": true,
            "hasFireplace": true,
            "hasGarage": true,
            "hasGarden": true,
            "hasGrenier": true,
            "hasInterphone": true,
            "hasJacuzzi": true,
            "hasLand": true,
            "hasLift": true,
            "hasMezzanine": true,
            "hasParking": true,
            "hasPool": true,
            "hasTerrace": true,
            "hasVisAVis": true,
            "isPeaceful": true
          },
          "climate": {
            "epcClimate": "GREENHOUSE_CLASSIFICATION_C",
            "epcClimateScore": 123,
            "epcEnergy": "ENERGY_CLASSIFICATION_C",
            "epcEnergyScore": 123,
            "epcClimateDate": "2022-10-21T11:31:33.593Z",
            "epcEnergyDate": "2022-10-21T11:31:33.593Z"
          },
          "features": {
            "exposure": null,
            "furniture": null,
            "propertyFloor": 123,
            "propertyTotalFloor": 123,
            "viewTypes": [],
            "constructionMaterials": [],
            "hasThroughExposure": true,
            "viewOns": []
          },
          "heatTypes": [],
          "heatTypeDetails": [],
          "heatings": [],
          "propertyCondition": {
            "constructionYear": 123,
            "interiorCondition": null,
            "renovationYear": 123,
            "generalConditions": []
          },
          "roomCount": 123,
          "surface": {
            "balconies": 123,
            "floorSpace": 123,
            "gardens": 123,
            "groundFloor": 123,
            "kitchen": 123,
            "livingSpace": 123,
            "livingRoom": 123,
            "terraces": 123,
            "total": 123
          },
          "type": [],
          "wcCount": 123
        },
        "hasAnomaly": true,
        "isUrgent": true,
        "land": {
          "canConstruct": true,
          "hasBuildingPermit": true,
          "hasElectricity": true,
          "hasTelecom": true,
          "hasWater": true,
          "isServiced": true,
          "surface": 123,
          "surfaceConstructable": 123,
          "type": null
        },
        "location": {
          "city": "<string>",
          "cityCoordinate": {
            "location": [
              2.3522,
              48.8566
            ]
          },
          "department": "<string>",
          "inseeCode": "<string>",
          "irisCode": "<string>",
          "locationCoordinate": {
            "location": [
              2.3522,
              48.8566
            ]
          },
          "postalCode": "<string>"
        },
        "medias": {
          "images": [
            {
              "gaussianHash": "<string>",
              "imageId": "<string>",
              "meanHash": "<string>",
              "perceptualHash": "<string>",
              "colorHash": "<string>",
              "differenceHash": "<string>",
              "url": "<string>"
            }
          ],
          "virtualVisitExternalUrl": [
            "<string>"
          ]
        },
        "meta": {
          "firstSeenAt": "2022-10-21T11:31:33.593Z",
          "isTotallyOffline": true,
          "lastPublishedAt": "2023-11-07T05:31:56Z",
          "lastSeenAt": "2022-10-21T11:31:33.593Z",
          "lastUpdatedAt": "2022-10-21T11:31:33.593Z",
          "totallyOfflineAt": "2022-10-21T11:31:33.593Z"
        },
        "parking": {
          "count": 123,
          "numberOfCars": 123,
          "surface": 123,
          "type": null
        },
        "price": {
          "charges": {
            "yearlyCondoniumFees": 123,
            "yearlyElectricityFees": 123,
            "yearlyHeatingFees": 123,
            "yearlyHousingTax": 123,
            "yearlyLivingTax": 123,
            "yearlyRentalFees": 123,
            "monthlyRentSupplement": 123
          },
          "currency": null,
          "initial": {
            "source": {
              "flxId": "<string>",
              "url": "<string>",
              "website": "<string>"
            },
            "value": 123,
            "valuePerArea": 123
          },
          "isAuction": true,
          "latest": {
            "source": {
              "flxId": "<string>",
              "url": "<string>",
              "website": "<string>"
            },
            "value": 123,
            "valuePerArea": 123
          },
          "scope": null,
          "warrantyDeposit": 123,
          "variation": {
            "sinceLastModified": 123,
            "sincePublished": 123,
            "absoluteSinceLastModified": 123,
            "absoluteSincePublished": 123
          }
        },
        "tags": [
          "<string>"
        ],
        "title": "<string>",
        "type": "CLASS_HOUSE",
        "offer": {
          "isCurrentlyOccupied": true,
          "renting": {
            "isColocation": true,
            "isLongTerm": true,
            "isShortTerm": true,
            "isSubLease": true
          },
          "type": "OFFER_BUY"
        }
      }
    ],
    "searchAfterHash": "<string>",
    "count": 123
  }
}

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.

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 pour la décision. Variante allégée : POST /v2/protected/properties/search/lite — 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

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.
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).
FiltreRôleVoir
location[]Champs administratifs + geoBoundingBox + geoDistance (OR multi-zones)Recherche géographique
offer[].typeOFFER_BUY, OFFER_RENT, etc.Filtres communs
type[]Classes de biens : CLASS_FLAT, CLASS_HOUSE, CLASS_PROGRAM, etc.Filtres communs
price.{initial,latest} + price.{currency,scope,variation,isAuction,warrantyDeposit}Prix valeur (value), par m² (valuePerArea), variation, scope, currencyFiltres communs
habitationSurface, roomCount, bedroomCount, bathroomCount, EPC, heatFiltres communs
meta.isTotallyOfflineExclure les biens offline (best practice prod : false)Filtres communs
meta.{firstSeenAt,lastSeenAt,lastUpdatedAt}Filtres temporelsFiltres communs
adverts[] (nested)Filtres sur les annonces source (isOnline, isPro, source…)Filtres communs
land, parking, tags, process, hasAnomaly, isUrgentFiltres avancés / nichesDTO référence
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.

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.
{
  "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" }
      }
    }
  }
}
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

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.
{
  "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 }
    }
  }
}
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

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.
{
  "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 }
    }
  }
}
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

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).
{
  "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 }
    }
  }
}
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

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.
{
  "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 }
    }
  }
}
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

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.
  • sortByFIRST_SEEN_AT, LAST_UPDATED_AT, LAST_SEEN_AT, PRICE, RELEVANCE. Le tri canonique en prod est FIRST_SEEN_AT DESC.
  • orderByASC, DESC.
  • ⚠️ Ne changez pas sortBy/orderBy entre deux pages — le cursor devient invalide.
Pagination Python
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

Authorizations

x-api-key
string
header
required

Body

application/json
orderBy
enum<string>
required
Available options:
ASC,
DESC
Example:

"DESC"

size
number
default:10
required
Required range: 1 <= x <= 100
Example:

10

sortBy
enum<string>
required
Available options:
FIRST_SEEN_AT,
PRICE,
LAST_UPDATED_AT,
LAST_SEEN_AT,
RELEVANCE
Example:

"FIRST_SEEN_AT"

searchAfterHash
string

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.

Response

data
object
required