{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/stream-estate/json-schema/stream-estate-search-input-schema.json",
  "title": "SearchInput",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/stream-estate-openapi.json#/components/schemas/SearchInput",
  "type": "object",
  "required": [
    "propertyTypes",
    "title",
    "transactionType"
  ],
  "properties": {
    "bedroomMin": {
      "type": "integer",
      "description": "Minimum number of bedrooms in the property."
    },
    "bedroomMax": {
      "type": "integer",
      "description": "Maximum number of bedrooms in the property."
    },
    "budgetMax": {
      "type": "number",
      "description": "Maximum budget for the property."
    },
    "budgetMin": {
      "type": "number",
      "description": "Minimum budget for the property."
    },
    "endpointRecipient": {
      "type": "string",
      "format": "uri",
      "description": "HTTPS webhook that receives `match` payloads whenever a property satisfies the search. Requires `notificationEnabled=true`."
    },
    "eventEndpoint": {
      "type": "string",
      "format": "uri",
      "description": "HTTPS webhook that receives advert `event` payloads (price changes, expirations, etc.). Requires `notificationEnabled=true` and at least one entry in `subscribedEvents`."
    },
    "excludedCities": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Cities to be excluded."
    },
    "excludedSites": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Source sites to be excluded."
    },
    "excludedSiteCategories": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Site categories to be excluded."
    },
    "expressions": {
      "type": "array",
      "description": "Full text matching including/excluding words & phrases in the title or the description of the property.",
      "items": {}
    },
    "furnished": {
      "type": "boolean",
      "description": "Whether the property is furnished or not."
    },
    "geoAccuracy": {
      "type": "number",
      "description": "Geocoding confidence level. Use `1` to keep only house-number level matches and `2` to include neighborhood-level approximations. Leave empty to allow both."
    },
    "geoShapes": {
      "type": "array",
      "items": {},
      "description": "Filters properties within specified geographic areas (arrays of `[lon, lat]` points forming polygons)."
    },
    "hidePropertyContact": {
      "type": "boolean",
      "description": "Whether to hide property contact information or not."
    },
    "includedCities": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Included cities. Use the location autocomplete endpoint to get the desired city IRIs."
    },
    "includedDepartments": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Included departments. Use the location autocomplete endpoint to get the desired department IRIs."
    },
    "includedSiteCategories": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Included site categories."
    },
    "includedSites": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Source sites to be included."
    },
    "includedZipcodes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Included zipcodes."
    },
    "includedZipcodesInsee": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Included INSEE codes (used to infer the cities associated with the search)."
    },
    "landSurfaceMax": {
      "type": "number",
      "description": "Maximum land surface."
    },
    "landSurfaceMin": {
      "type": "number",
      "description": "Minimum land surface."
    },
    "lat": {
      "type": "number",
      "description": "Latitude of the center point used for radial filtering. Provide together with `lon`."
    },
    "lon": {
      "type": "number",
      "description": "Longitude of the center point used for radial filtering. Provide together with `lat`."
    },
    "notificationEnabled": {
      "type": "boolean",
      "default": false,
      "description": "Enables delivery of matches and events either by webhook (`endpointRecipient`, `eventEndpoint`) or by email (`notificationRecipient`)."
    },
    "notificationRecipient": {
      "type": "string",
      "description": "Email address that receives alert summaries when `notificationEnabled=true`."
    },
    "pricePerMeterMax": {
      "type": "number",
      "description": "Maximum price per meter."
    },
    "pricePerMeterMin": {
      "type": "number",
      "description": "Minimum price per meter."
    },
    "propertyTypes": {
      "type": "array",
      "description": "Type of property. Apartment `0`, House `1`, Building `2`, Parking `3`, Office `4`, Land `5`, Shop `6`.",
      "items": {
        "type": "integer",
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6
        ]
      }
    },
    "publisherTypes": {
      "type": "array",
      "description": "Type of publisher. Individual `0`, Professional `1`.",
      "items": {
        "type": "integer",
        "enum": [
          0,
          1
        ]
      }
    },
    "radius": {
      "type": "number",
      "description": "Distance in kilometers around the provided `lat`/`lon`."
    },
    "roomMin": {
      "type": "integer",
      "description": "Minimum number of rooms."
    },
    "roomMax": {
      "type": "integer",
      "description": "Maximum number of rooms."
    },
    "subscribedEvents": {
      "type": "array",
      "description": "Event codes you want to receive on the `eventEndpoint`.",
      "items": {
        "type": "string",
        "enum": [
          "ad.update.price",
          "ad.update.surface",
          "ad.update.pictures",
          "ad.update.expired",
          "property.ad.create",
          "property.ad.update"
        ]
      }
    },
    "surfaceMax": {
      "type": "number",
      "description": "Maximum property surface area."
    },
    "surfaceMin": {
      "type": "number",
      "description": "Minimum property surface area."
    },
    "title": {
      "type": "string",
      "description": "Title of the created search."
    },
    "transactionType": {
      "type": "integer",
      "description": "Type of transaction. Sell `0`, Rent `1`.",
      "enum": [
        0,
        1
      ]
    },
    "withCoherentPrice": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "Price coherence filter. `true` returns adverts whose price passes our coherence checks; `false` returns adverts flagged as incoherent — both also include adverts whose price has not been assessed. Set to `null` (or send an empty value) to disable filtering. If omitted, defaults to `true`."
    },
    "withVirtualTour": {
      "type": "boolean",
      "description": "Whether the property includes a virtual tour."
    }
  }
}