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

# Search properties with filters

> Returns a paginated list of properties based on searchable fields



## OpenAPI

````yaml /immoteur-api-public-v1.spec.yaml post /properties/search
openapi: 3.1.0
info:
  title: Immoteur Public API
  version: 1.1.0
  description: >-
    Public API for the Immoteur service.


    ## Authentication

    Use a **Personal Access Token** from your Immoteur dashboard and send it in
    the `Authorization` header:


    ```

    Authorization: Bearer YOUR_TOKEN_HERE

    ```


    ### cURL example

    ```bash

    curl -sS https://api.immoteur.com/public/v1/auth \
      -H "Authorization: Bearer $IMMOTEUR_TOKEN"
    ```


    ## Environments

    - **Production:** `https://api.immoteur.com/public/v1`


    ## Errors & Rate Limiting

    - `400 Bad Request`: malformed request or invalid syntax.

    - `401 Unauthorized`: missing or invalid token.

    - `403 Forbidden`: token valid but not permitted for this resource.

    - `429 Too Many Requests`: back off and retry with exponential delay.

    - `422 Validation Error`: payload is syntactically correct but fails
    validation.


    ## Pagination

    - Requests specify `page` (1..500). Responses include `page`, `nextPage`,
    `perPage`, `total`, `totalPages`.


    ## Data Access Limits

    The `meta.dataAccessLimit` block shows **implicit filters** tied to your
    plan (e.g., whitelisted departments/SIREN/SIRET). Your effective result set
    equals **your filters ∩ requested filters**.


    ## Using AI/LLMs

    - Always include the `Authorization` header.

    - Prefer explicit filters (departments, INSEE, postcodes) with **existing**
    French codes/names.

    - Follow the examples below as canonical payload shapes.


    ## Contact & Docs

    - Website: https://immoteur.com

    - Support: Use your customer portal or contact listed on the website.
  contact:
    url: https://immoteur.com
    name: Immoteur
    email: support@immoteur.com
servers:
  - url: https://api.immoteur.com/public/v1
    description: Production server
security:
  - BearerAuth: []
tags:
  - name: Info
    description: Token/account info
  - name: Property
    description: Property operations
  - name: Classified
    description: Classified operations
  - name: Issue
    description: User-submitted issue reports
externalDocs:
  description: Full product documentation
  url: https://docs.immoteur.com
paths:
  /properties/search:
    post:
      tags:
        - Property
      summary: Search properties with filters
      description: Returns a paginated list of properties based on searchable fields
      operationId: propertySearch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - page
                - transactionType
                - propertyTypes
              properties:
                energyDpeLabels:
                  type: array
                  description: >-
                    Filter results to properties whose DPE label matches one of
                    the provided letters.
                  items:
                    $ref: '#/components/schemas/EnergyDpeLabel'
                  example:
                    - a
                    - b
                energyGesLabels:
                  type: array
                  description: >-
                    Filter results to properties whose greenhouse-gas (GES)
                    label matches one of the provided letters.
                  items:
                    $ref: '#/components/schemas/EnergyGesLabel'
                  example:
                    - a
                    - b
                locationDepartments:
                  type: array
                  items:
                    type: string
                  description: List of French department codes (e.g., "75" for Paris).
                  example:
                    - '75'
                    - '92'
                locationGeoBbox:
                  $ref: '#/components/schemas/LocationGeoBbox'
                locationGeoCircle:
                  $ref: '#/components/schemas/LocationGeoCircle'
                locationInseeCodes:
                  type: array
                  items:
                    type: string
                  description: List of INSEE city codes.
                  example:
                    - '75056'
                    - '92050'
                locationPostcodes:
                  type: array
                  items:
                    type: string
                  description: List of French postcodes.
                  example:
                    - '75001'
                    - '92000'
                orderBy:
                  $ref: '#/components/schemas/PropertySearchOrder'
                page:
                  type: integer
                  minimum: 1
                  maximum: 500
                  default: 1
                  description: 1-based page index.
                  example: 1
                propertyAreaMax:
                  type: integer
                  description: Maximum property area (m²).
                  example: 100
                propertyAreaMin:
                  type: integer
                  description: Minimum property area (m²).
                  example: 40
                propertyBalconyExists:
                  type: boolean
                  description: Filter results to properties that have a balcony.
                  example: true
                propertyBedroomCountMin:
                  type: integer
                  minimum: 0
                  description: Minimum number of bedrooms.
                  example: 2
                propertyCellarExists:
                  type: boolean
                  description: Filter results to properties that have a cellar.
                  example: false
                propertyElevatorExists:
                  type: boolean
                  description: Filter results to properties that have an elevator.
                  example: true
                propertyGarageExists:
                  type: boolean
                  description: Filter results to properties that have a garage.
                  example: false
                propertyGardenExists:
                  type: boolean
                  description: Filter results to properties that have a garden.
                  example: false
                propertyIsProgram:
                  type: boolean
                  description: Limit to new-build/off-plan programs.
                  example: false
                propertyParkingExists:
                  type: boolean
                  description: Filter results to properties that have parking.
                  example: true
                propertyRoomCountMin:
                  type: integer
                  minimum: 0
                  description: Minimum total room count.
                  example: 3
                propertySwimmingPoolExists:
                  type: boolean
                  description: Filter results to properties that have a swimming pool.
                  example: false
                propertyTerraceExists:
                  type: boolean
                  description: Filter results to properties that have a terrace.
                  example: true
                propertyTypes:
                  type: array
                  items:
                    $ref: '#/components/schemas/PropertyType'
                  description: One or more property types to include.
                  example:
                    - apartment
                    - house
                searchQuery:
                  type: string
                  maxLength: 400
                  description: >-
                    Optional full-text query. When omitted, an empty query is
                    used.
                  example: terrasse ascenseur
                searchThreshold:
                  type: number
                  format: float
                  minimum: 0
                  maximum: 1
                  default: 0.2
                  description: Minimum relevance score required for a hit to be kept.
                  example: 0.2
                sortBy:
                  $ref: '#/components/schemas/PropertySearchSortBy'
                sourceDomains:
                  type: array
                  items:
                    type: string
                  description: >-
                    Limit results to classifieds originating from the provided
                    domains.
                  example:
                    - bienici.com
                    - orpi.com
                sourceDomainsCountMax:
                  type: integer
                  description: >-
                    Maximum number of distinct source domains attached to each
                    property.
                  example: 3
                sourceDomainsCountMin:
                  type: integer
                  description: >-
                    Minimum number of distinct source domains attached to each
                    property.
                  example: 1
                transactionPriceHasChanged:
                  type: boolean
                  description: Only properties whose price has changed recently.
                  example: false
                transactionPriceMax:
                  type: integer
                  description: Maximum current price.
                  example: 1000000
                transactionPriceMin:
                  type: integer
                  description: Minimum current price.
                  example: 200000
                transactionType:
                  $ref: '#/components/schemas/TransactionType'
            example:
              page: 1
              transactionType: sale
              propertyTypes:
                - apartment
                - house
              searchQuery: terrasse ascenseur
              searchThreshold: 0.2
              locationDepartments:
                - '75'
                - '92'
              locationInseeCodes:
                - '75056'
                - '92050'
              locationPostcodes:
                - '75001'
                - '92000'
              locationGeoBbox:
                sw:
                  lat: 48.8156
                  lng: 2.2241
                ne:
                  lat: 48.9021
                  lng: 2.4699
              locationGeoCircle:
                center:
                  lat: 48.8566
                  lng: 2.3522
                radiusMeters: 5000
              transactionPriceMin: 200000
              transactionPriceMax: 1000000
              propertyBedroomCountMin: 2
              propertyAreaMin: 40
              propertyElevatorExists: true
              propertyTerraceExists: true
              propertyParkingExists: true
              sourceDomains:
                - bienici.com
                - orpi.com
              sourceDomainsCountMin: 1
              sourceDomainsCountMax: 3
      responses:
        '200':
          description: List of properties matching the filters
          content:
            application/json:
              schema:
                type: object
                required:
                  - items
                  - meta
                properties:
                  items:
                    type: array
                    items:
                      type: object
                      required:
                        - classifieds
                        - id
                        - property
                        - location
                        - media
                        - transaction
                        - meta
                        - status
                      properties:
                        classifieds:
                          description: Classifieds currently associated with the property.
                          type: array
                          items:
                            $ref: '#/components/schemas/PropertyClassified'
                        description:
                          description: Description of the property.
                          type: string
                          nullable: true
                        energy:
                          $ref: '#/components/schemas/Energy'
                          description: Energy information for the classified.
                        id:
                          type: string
                          format: uuid
                          example: 3a8f1d72-3d0b-4ee6-9a83-a7a9a73ae6c2
                        location:
                          $ref: '#/components/schemas/Location'
                          description: Location information.
                        media:
                          $ref: '#/components/schemas/Media'
                        meta:
                          $ref: '#/components/schemas/PropertyMeta'
                        property:
                          $ref: '#/components/schemas/PropertyAttributes'
                        status:
                          $ref: '#/components/schemas/ClassifiedStatus'
                          description: Current lifecycle status of the property.
                        transaction:
                          $ref: '#/components/schemas/PropertyTransaction'
                  meta:
                    type: object
                    required:
                      - subscriptionPlan
                      - dataAccessLimit
                      - page
                      - nextPage
                      - perPage
                      - total
                      - totalPages
                    properties:
                      dataAccessLimit:
                        $ref: '#/components/schemas/DataAccessLimit'
                      nextPage:
                        type: integer
                        nullable: true
                        example: 2
                      page:
                        type: integer
                        example: 1
                      perPage:
                        type: integer
                        example: 20
                      subscriptionPlan:
                        $ref: '#/components/schemas/SubscriptionPlan'
                      total:
                        type: integer
                        example: 240
                      totalPages:
                        type: integer
                        example: 12
              example:
                items:
                  - id: 3a8f1d72-3d0b-4ee6-9a83-a7a9a73ae6c2
                    status:
                      current: available
                    description: Appartement lumineux de 3 pièces avec balcon.
                    location:
                      city:
                        name: Paris
                        inseeCode: '75056'
                      country: france
                      department: '75'
                      postcode: '75001'
                      latitude: 48.8606
                      longitude: 2.3376
                    media:
                      images:
                        - id: 2f6bb0f5-1e2f-4dc9-8f46-8fd0c1f7cafe
                          position: 1
                          url: https://images.immoteur.com/sample/apt-paris-1.jpg
                    property:
                      type: apartment
                      area: 52.5
                      bedroomCount: 2
                      roomCount: 3
                      balconyExists: true
                    classifieds:
                      - id: 75caa436-207a-4f06-b0d1-3c1a3508dbbb
                        status:
                          current: available
                        source:
                          domain: seloger.com
                          url: >-
                            https://www.seloger.com/annonces/achat/appartement/paris-1er-75/5-pieces/0.htm
                        publisher:
                          isProfessional: true
                          type: agency
                          email: contact@agence-paris.fr
                          phone: '+33123456789'
                          feesUrl: https://www.agence-paris.fr/honoraires
                          siren: '123456789'
                        transaction:
                          current: 650000
                          history:
                            - id: 0aa4bc4b-7db0-4bf2-9a4a-f2e6f8d4f99a
                              value: 680000
                              timestamp: '2025-06-20T10:23:00Z'
                            - id: 4d4744d6-d7f1-4f8b-8c3c-fb8a1e3c0f8a
                              value: 650000
                              timestamp: '2025-06-25T07:45:00Z'
                          initial: 680000
                          perSquareUnit: 12500
                    transaction:
                      type: sale
                      price:
                        current: 650000
                        history:
                          - id: 0aa4bc4b-7db0-4bf2-9a4a-f2e6f8d4f99a
                            value: 680000
                            timestamp: '2025-06-20T10:23:00Z'
                          - id: 4d4744d6-d7f1-4f8b-8c3c-fb8a1e3c0f8a
                            value: 650000
                            timestamp: '2025-06-25T07:45:00Z'
                        initial: 680000
                        perSquareUnit: 12500
                    meta:
                      firstSeenAt: '2025-05-10T08:00:00Z'
                      lastSeenAt: '2025-06-20T11:00:00Z'
                    energy:
                      dpe:
                        date: '2023-05-10'
                        label: d
                        value: 180
                      ges:
                        date: '2023-05-10'
                        label: e
                        value: 45
                      heating:
                        source: gas
                        system: radiator
                        type: individual
                meta:
                  subscriptionPlan: pro200
                  dataAccessLimit:
                    departments:
                      - '75'
                      - '92'
                    sirens:
                      - '123456789'
                    sirets:
                      - '12345678900011'
                  page: 1
                  nextPage: 2
                  perPage: 20
                  total: 240
                  totalPages: 12
        '400':
          $ref: '#/components/responses/BadRequestError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '409':
          $ref: '#/components/responses/MissConfigurationError'
        '422':
          $ref: '#/components/responses/ValidationError'
        '429':
          $ref: '#/components/responses/RateLimitError'
        default:
          $ref: '#/components/responses/DefaultError'
components:
  schemas:
    EnergyDpeLabel:
      type: string
      enum:
        - a
        - b
        - c
        - d
        - e
        - f
        - g
    EnergyGesLabel:
      type: string
      enum:
        - a
        - b
        - c
        - d
        - e
        - f
        - g
    LocationGeoBbox:
      type: object
      description: >-
        Bounding box filter built from south-west and north-east corners in
        EPSG:4326.
      additionalProperties: false
      required:
        - sw
        - ne
      properties:
        ne:
          $ref: '#/components/schemas/LocationLatLng'
        sw:
          $ref: '#/components/schemas/LocationLatLng'
    LocationGeoCircle:
      type: object
      description: Circular geo filter defined by a center and radius in meters.
      additionalProperties: false
      required:
        - center
        - radiusMeters
      properties:
        center:
          $ref: '#/components/schemas/LocationLatLng'
        radiusMeters:
          type: integer
          minimum: 10
          maximum: 50000
          description: Radius in meters (10m to 50km) for the geo circle filter.
          example: 1500
    PropertySearchOrder:
      type: string
      description: Direction applied to `sortBy`. Defaults to `desc`.
      default: desc
      enum:
        - asc
        - desc
    PropertyType:
      description: >-
        *   **House**: Residential building sold as an entire unit (e.g., a
        single-family home, villa, or full residence).

        *   **Apartment**: A single residential unit within a larger building.

        *   **Shop**: Commercial property with public access, such as boutiques,
        barbers, or butcher shops.

        *   **Premises**: Non-residential units like cellars, attics, or general
        storage/local spaces.

        *   **Office**: Properties intended for professional work environments.

        *   **Land**: Plots of terrain, undeveloped or partially developed.

        *   **Building**: An entire non-residential building sold as a unit,
        such as a hotel or hangar.

        *   **Parking**: Spaces or boxes designed for vehicle storage.
      type: string
      enum:
        - apartment
        - building
        - house
        - land
        - office
        - other
        - parking
        - premises
        - shop
    PropertySearchSortBy:
      type: string
      description: >-
        Field used to sort results. Set `orderBy` to switch between ascending or
        descending order. Defaults to `firstSeenAt` with `desc`.
      default: firstSeenAt
      enum:
        - firstSeenAt
        - lastSeenAt
        - lastUpdatedAt
        - price
        - priceChangeDate
        - pricePerSquareMeter
        - relevance
    TransactionType:
      type: string
      enum:
        - rent
        - sale
    PropertyClassified:
      type: object
      required:
        - id
        - publisher
        - source
        - status
        - transaction
      properties:
        description:
          description: Description of the classified.
          type: string
          nullable: true
          example: Appartement lumineux avec terrasse et vue dégagée.
        id:
          description: Unique identifier of the classified.
          type: string
          format: uuid
          example: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
        publisher:
          $ref: '#/components/schemas/ClassifiedPublisher'
          description: Publisher information for the classified.
        source:
          $ref: '#/components/schemas/ClassifiedSource'
          description: Source information for the classified.
        status:
          $ref: '#/components/schemas/ClassifiedStatus'
          description: Current lifecycle status of the classified.
        transaction:
          $ref: '#/components/schemas/TransactionPrice'
          description: Transaction information for the classified.
    Energy:
      type: object
      properties:
        dpe:
          $ref: '#/components/schemas/EnergyDpe'
          description: DPE energy information.
        ges:
          $ref: '#/components/schemas/EnergyGes'
          description: GES energy information.
        heating:
          $ref: '#/components/schemas/EnergyHeating'
          description: Heating energy information.
    Location:
      type: object
      required:
        - city
        - country
        - department
        - postcode
      properties:
        city:
          $ref: '#/components/schemas/LocationCity'
          description: City of the location.
        country:
          description: Country of the location.
          type: string
          enum:
            - france
          example: france
        department:
          type: string
          description: French department code (e.g., "75").
          example: '75'
        district:
          description: >-
            District, neighborhood, or arrondissement within the city when
            available.
          type: string
          example: Canclaux
        irisCode:
          description: IRIS code of the location when available.
          type: string
          example: '441090308'
        latitude:
          description: Latitude of the location.
          type: number
          format: double
          minimum: -90
          maximum: 90
          example: 48.8606
        longitude:
          description: Longitude of the location.
          type: number
          format: double
          minimum: -180
          maximum: 180
          example: 2.3376
        postcode:
          description: Postcode of the location.
          type: string
          example: '75001'
    Media:
      type: object
      required:
        - images
      properties:
        images:
          description: Images of the classified.
          type: array
          items:
            $ref: '#/components/schemas/MediaImage'
          example:
            - id: cb6cbd86-5d14-48bd-a566-613e9dfc91d0
              position: 1
              url: https://images.immoteur.com/sample/apt-paris-1.jpg
    PropertyMeta:
      type: object
      required:
        - firstSeenAt
        - lastSeenAt
      properties:
        firstSeenAt:
          description: Timestamp when the property was first seen.
          type: string
          format: date-time
          example: '2025-05-10T08:00:00Z'
        lastSeenAt:
          description: Timestamp when the property was last seen.
          type: string
          format: date-time
          example: '2025-06-20T11:00:00Z'
    PropertyAttributes:
      type: object
      required:
        - type
      properties:
        airConditioningExists:
          description: Indicates if the property has air conditioning.
          type: boolean
          example: false
        alarmExists:
          description: Indicates if the property has an alarm system.
          type: boolean
          example: false
        area:
          description: Area of the property.
          type: number
          format: float
          minimum: 0
          example: 50
        atticExists:
          description: Indicates if the property has an attic.
          type: boolean
          example: false
        balconyArea:
          description: Area of the balcony.
          type: number
          format: float
          minimum: 0
          example: 6
        balconyCount:
          description: Number of balconies.
          type: integer
          minimum: 0
          example: 1
        balconyExists:
          description: Indicates if the property has a balcony.
          type: boolean
          example: false
        bathroomCount:
          description: Number of bathrooms.
          type: integer
          minimum: 0
          example: 1
        bedroomCount:
          description: Number of bedrooms in the property.
          type: integer
          minimum: 0
          example: 2
        caretakerExists:
          description: Indicates if the property has a caretaker.
          type: boolean
          example: false
        ceilingHeight:
          description: Ceiling height of the property in meters.
          type: number
          format: float
          minimum: 0
          example: 3.2
        cellarExists:
          description: Indicates if the property has a cellar.
          type: boolean
          example: false
        constructionYear:
          description: Year of construction for the property.
          type: integer
          minimum: 0
          example: 1975
        doorCodeExists:
          description: Indicates if the property has a door code.
          type: boolean
          example: true
        elevatorExists:
          description: Indicates if the property has an elevator.
          type: boolean
          example: true
        fireplaceExists:
          description: Indicates if the property has a fireplace.
          type: boolean
          example: false
        floor:
          description: Floor of the property (Apartment only).
          type: integer
          minimum: 0
          example: 3
        floorCount:
          description: Total number of floors in the property (Apartment only).
          type: integer
          minimum: 0
          example: 6
        garageExists:
          description: Indicates if the property has a garage.
          type: boolean
          example: false
        gardenExists:
          description: Indicates if the property has a garden.
          type: boolean
          example: false
        intercomExists:
          description: Indicates if the property has an intercom.
          type: boolean
          example: true
        isCondominium:
          description: Indicates if the property is part of a condominium.
          type: boolean
          example: true
        isDisabledFriendly:
          description: Indicates if the property is disabled friendly.
          type: boolean
          example: false
        isDualAspect:
          description: Indicates if the property has dual aspect.
          type: boolean
          example: false
        isNew:
          description: Indicates if the property is new.
          type: boolean
          example: false
        isOccupied:
          description: Indicates if the property is occupied.
          type: boolean
          example: false
        landArea:
          description: >-
            Land area of the property (including house, garden, terrace,
            entrance, etc.).
          type: number
          format: float
          minimum: 0
          example: 0
        livingRoomArea:
          description: Area of the living room.
          type: number
          format: float
          minimum: 0
          example: 20
        orientation:
          description: Orientation of the property.
          type: string
          enum:
            - east
            - north
            - northEast
            - northWest
            - south
            - southEast
            - southWest
            - west
          example: south
        parkingExists:
          description: Indicates if the property has parking.
          type: boolean
          example: true
        renovationIsNeeded:
          description: Indicates if renovation is needed.
          type: boolean
          example: false
        renovationYear:
          description: Year of renovation for the property.
          type: integer
          minimum: 0
          example: 2018
        roomCount:
          description: Number of rooms in the property.
          type: integer
          minimum: 0
          example: 3
        showerRoomCount:
          description: Number of shower rooms in the property.
          type: integer
          minimum: 0
          example: 1
        swimmingPoolExists:
          description: Indicates if the property has a swimming pool.
          type: boolean
          example: false
        terraceArea:
          description: Area of the terrace.
          type: number
          format: float
          minimum: 0
          example: 8
        terraceCount:
          description: Number of terraces.
          type: integer
          minimum: 0
          example: 1
        terraceExists:
          description: Indicates if the property has a terrace.
          type: boolean
          example: true
        toiletCount:
          description: Number of toilets.
          type: integer
          minimum: 0
          example: 1
        toiletSeparateExists:
          description: Indicates if the property has a separate toilet.
          type: boolean
          example: true
        type:
          $ref: '#/components/schemas/PropertyType'
          description: Type of property.
    ClassifiedStatus:
      description: Lifecycle status details of the classified.
      type: object
      required:
        - current
      properties:
        current:
          $ref: '#/components/schemas/ClassifiedStatusValue'
          description: Current lifecycle status of the classified.
    PropertyTransaction:
      type: object
      required:
        - price
        - type
      properties:
        price:
          $ref: '#/components/schemas/TransactionPrice'
          description: Price information for the transaction.
        type:
          $ref: '#/components/schemas/TransactionType'
          description: Type of transaction.
    DataAccessLimit:
      description: >-
        Inner filters applied to your search, see
        `https://immoteur.com/en/dashboard/billing`
      type: object
      required:
        - departments
        - sirens
        - sirets
      properties:
        departments:
          type: array
          description: Departments implicitly whitelisted for this account.
          items:
            type: string
          example:
            - '75'
            - '92'
        sirens:
          type: array
          description: SIREN identifiers implicitly whitelisted for this account.
          items:
            type: string
          example:
            - '123456789'
        sirets:
          type: array
          description: SIRET identifiers implicitly whitelisted for this account.
          items:
            type: string
          example:
            - '12345678900011'
    SubscriptionPlan:
      type: string
      description: Active plan that governs rate limits and pagination caps for this token.
      enum:
        - enterprise500
        - free
        - growth100
        - pro200
        - starter30
      example: pro200
    LocationLatLng:
      type: object
      additionalProperties: false
      required:
        - lat
        - lng
      properties:
        lat:
          type: number
          format: double
          minimum: -90
          maximum: 90
          description: Latitude in decimal degrees, WGS-84.
          example: 48.8566
        lng:
          type: number
          format: double
          minimum: -180
          maximum: 180
          description: Longitude in decimal degrees, WGS-84.
          example: 2.3522
    ClassifiedPublisher:
      type: object
      required:
        - isProfessional
      properties:
        commercialName:
          description: >-
            Commercial name of the publisher resolved from SIREN/SIRET (if
            professional).
          type: string
          example: SAS HD IMMOBILIER
        email:
          description: Email address of the publisher (if professional).
          type: string
          format: email
          example: contact@agence-paris.fr
        feesUrl:
          description: URL to the fee information of the publisher (if professional).
          type: string
          format: uri
          example: https://www.agence-paris.fr/honoraires
        isProfessional:
          description: Indicates if the publisher is a professional.
          type: boolean
          example: true
        phone:
          description: Phone number of the publisher (if professional).
          type: string
          format: phone
          pattern: ^\+?[1-9]\d{1,14}$
          example: '+33123456789'
        siren:
          description: SIREN number of the publisher (if professional).
          type: string
          example: '123456789'
        siret:
          description: SIRET number of the publisher (if professional).
          type: string
          example: '12345678900011'
        type:
          description: Type of publisher (if professional).
          type: string
          enum:
            - agency
            - mandatary
          example: agency
    ClassifiedSource:
      type: object
      required:
        - domain
        - url
      properties:
        domain:
          description: Domain of the source.
          type: string
          example: seloger.com
        url:
          description: URL of the source.
          type: string
          format: uri
          example: >-
            https://www.seloger.com/annonces/achat/appartement/paris-1er-75/5-pieces/0.htm
    TransactionPrice:
      type: object
      required:
        - current
        - initial
        - history
      properties:
        current:
          description: Current price of the transaction.
          type: integer
          minimum: 0
          example: 650000
        history:
          description: Historical price records observed for the transaction.
          type: array
          items:
            $ref: '#/components/schemas/TransactionPriceHistoryEntry'
        initial:
          description: Initial price observed for the transaction.
          type: integer
          minimum: 0
          example: 680000
        perSquareUnit:
          description: Price per square unit (only for sale).
          type: integer
          minimum: 0
          example: 12500
    EnergyDpe:
      type: object
      properties:
        date:
          type: string
          format: date
          example: '2023-05-10'
        label:
          $ref: '#/components/schemas/EnergyDpeLabel'
        value:
          type: integer
          example: 180
    EnergyGes:
      type: object
      properties:
        date:
          type: string
          format: date
          example: '2023-05-10'
        label:
          $ref: '#/components/schemas/EnergyGesLabel'
        value:
          type: integer
          example: 45
    EnergyHeating:
      type: object
      properties:
        source:
          description: Source of heating energy.
          type: string
          enum:
            - aerothermal
            - biomass
            - coal
            - electricity
            - fuel
            - gas
            - geothermal
            - pellet
            - solar
            - wood
          example: gas
        system:
          description: Heating system type.
          type: string
          enum:
            - fireplace
            - floor
            - radiator
            - reversibleAirConditioning
            - stove
          example: radiator
        type:
          description: Type of heating system.
          type: string
          enum:
            - city
            - individual
            - mixed
            - shared
          example: individual
    LocationCity:
      type: object
      required:
        - name
        - inseeCode
      properties:
        inseeCode:
          description: INSEE code of the city.
          type: string
          example: '75056'
        name:
          description: Name of the city.
          type: string
          example: Paris
    MediaImage:
      type: object
      required:
        - id
        - position
        - url
      properties:
        averageHash:
          description: Average hash (aHash) bitstring of the image.
          type: string
          example: '1111000011110000111100001111000011110000111100001111000011110000'
        differenceHash:
          description: Difference hash (dHash) bitstring of the image.
          type: string
          example: '0101010100101010010101001010100101010010101001010100101010010101'
        id:
          description: Identifier of the image.
          type: string
          format: uuid
          example: cb6cbd86-5d14-48bd-a566-613e9dfc91d0
        perceptualHash:
          description: Perceptual hash (pHash) bitstring of the image.
          type: string
          example: '1010101001010100101010010101001010100101010010101010010101010010'
        position:
          description: Order of the image in the gallery.
          type: integer
          example: 1
        url:
          description: URL of the image.
          type: string
          format: uri
          example: https://images.immoteur.com/sample/apt-paris-1.jpg
    ClassifiedStatusValue:
      description: Supported lifecycle statuses for classifieds.
      type: string
      enum:
        - available
        - removed
        - rented
        - sold
        - underOffer
    ProblemDetails:
      type: object
      required:
        - type
        - title
        - status
        - detail
        - instance
        - code
        - traceId
      properties:
        code:
          type: string
          description: Stable machine-readable error code.
          example: resource_not_found
        detail:
          type: string
          description: Human-readable explanation specific to this occurrence.
          example: The requested resource could not be found.
        instance:
          type: string
          description: Request URI identifying the specific occurrence.
          example: /public/v1/properties/019c12dc-339f-72ce-98db-663b44c0d924
        status:
          type: integer
          format: int32
          minimum: 400
          maximum: 599
          description: HTTP status code generated for this occurrence.
          example: 404
        title:
          type: string
          description: Short, human-readable summary of the problem type.
          example: Resource not found
        traceId:
          type: string
          format: uuid
          description: Trace identifier to correlate client errors with server logs.
          example: b94f4db5-2f5e-4b8f-9dd0-f2fe5c7a7a4f
        type:
          type: string
          format: uri
          description: URI reference identifying the problem type.
          example: https://docs.immoteur.com/problems/resource_not_found
    ValidationProblemDetails:
      type: object
      required:
        - type
        - title
        - status
        - detail
        - instance
        - code
        - traceId
        - violations
      properties:
        code:
          type: string
          description: Stable machine-readable error code.
          example: validation_error
        detail:
          type: string
          description: Human-readable explanation specific to this occurrence.
          example: One or more request fields are invalid.
        instance:
          type: string
          description: Request URI identifying the specific occurrence.
          example: /public/v1/properties/search
        status:
          type: integer
          format: int32
          minimum: 400
          maximum: 599
          description: HTTP status code generated for this occurrence.
          example: 422
        title:
          type: string
          description: Short, human-readable summary of the problem type.
          example: Validation error
        traceId:
          type: string
          format: uuid
          description: Trace identifier to correlate client errors with server logs.
          example: 4bdb0c23-53fc-4d14-a300-c63eb420ec5e
        type:
          type: string
          format: uri
          description: URI reference identifying the problem type.
          example: https://docs.immoteur.com/problems/validation_error
        violations:
          type: array
          description: Per-field validation issues.
          items:
            $ref: '#/components/schemas/ProblemViolation'
    TransactionPriceHistoryEntry:
      type: object
      required:
        - id
        - timestamp
        - value
      properties:
        id:
          description: Stable unique identifier for the price history entry.
          type: string
          format: uuid
          example: 0aa4bc4b-7db0-4bf2-9a4a-f2e6f8d4f99a
        timestamp:
          description: Timestamp when the price was recorded.
          type: string
          format: date-time
          example: '2025-09-10T08:10:00Z'
        value:
          description: Price recorded at the given timestamp.
          type: integer
          minimum: 0
          example: 650000
    ProblemViolation:
      type: object
      required:
        - field
        - message
        - code
      properties:
        code:
          type: string
          description: Stable machine-readable violation code.
          example: validation
        field:
          type: string
          description: Path or field name that failed validation.
          example: id
        message:
          type: string
          description: Human-readable validation message.
          example: The id field must be a valid UUID.
  responses:
    BadRequestError:
      description: >-
        Bad request — the request could not be understood or was missing
        required information.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    UnauthorizedError:
      description: Authentication required / invalid token
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    ForbiddenError:
      description: Authenticated but not allowed for this resource
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    NotFoundError:
      description: Resource not found
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    MissConfigurationError:
      description: Data access (SIREN / SIRET / Department) not configured for example.
      content:
        application/json:
          schema:
            type: object
            required:
              - message
            properties:
              configurationUrl:
                type: string
                format: uri
                example: https://immoteur.com/en/dashboard/billing#data-access
              documentationUrl:
                type: string
                format: uri
                example: https://docs.immoteur.com/pages/en/introduction
              message:
                type: string
                example: Data access (SIREN / SIRET / Department) not configured.
    ValidationError:
      description: Validation error response
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ValidationProblemDetails'
    RateLimitError:
      description: Too many requests. Rate limit headers are returned on all responses.
      headers:
        RateLimit-Policy:
          $ref: '#/components/headers/RateLimitPolicy'
        RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
        Retry-After:
          $ref: '#/components/headers/RateLimitRetryAfter'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
    DefaultError:
      description: Undocumented error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
  headers:
    RateLimitPolicy:
      description: Comma-separated policy values ordered as second, minute, day.
      schema:
        type: string
        example: 1;w=1, 20;w=60, 250;w=86400
    RateLimitLimit:
      description: Comma-separated limit values ordered as second, minute, day.
      schema:
        type: string
        example: 1, 20, 250
    RateLimitRemaining:
      description: Comma-separated remaining request counts ordered as second, minute, day.
      schema:
        type: string
        example: 0, 18, 240
    RateLimitReset:
      description: >-
        Comma-separated seconds until the current windows reset (second, minute,
        day).
      schema:
        type: string
        example: 1, 45, 8200
    RateLimitRetryAfter:
      description: Seconds to wait before retrying after a rate limit response.
      schema:
        type: integer
        format: int32
        minimum: 1
        example: 1
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Personal Access Token
      description: |-
        Send your Immoteur Personal Access Token in the `Authorization` header:
        `Authorization: Bearer <token>`

        You can create and manage your Personal Access Tokens here:
        https://immoteur.com/dashboard/settings
                                    status:
                                        current: available

````