{
  "components": {
    "schemas": {
      "AgentResponseDto": {
        "properties": {
          "additionalInfo": {
            "description": "Free-form extra data.",
            "example": {
              "languages": [
                "en",
                "es"
              ]
            },
            "nullable": true,
            "type": "object"
          },
          "avatarThumbnailUrl": {
            "description": "Small avatar image URL.",
            "example": "https://img.clerk.com/avatar-thumb.png",
            "nullable": true,
            "type": "string"
          },
          "avatarUrl": {
            "description": "Avatar image URL.",
            "example": "https://img.clerk.com/avatar.png",
            "nullable": true,
            "type": "string"
          },
          "clerkUserId": {
            "description": "The Fondaro user behind the row; null for a standalone agent.",
            "example": "user_2abcDEF",
            "nullable": true,
            "type": "string"
          },
          "createdAt": {
            "description": "Created.",
            "example": "2026-01-10T09:00:00.000Z",
            "format": "date-time",
            "type": "string"
          },
          "description": {
            "description": "Short biography.",
            "example": "Twelve years selling villas on the Golden Mile.",
            "nullable": true,
            "type": "string"
          },
          "displayEmail": {
            "description": "Public email shown on listings and brochures.",
            "example": "ana@agency.example",
            "nullable": true,
            "type": "string"
          },
          "firstName": {
            "description": "First name (for a Fondaro member, their account name).",
            "example": "Ana",
            "nullable": true,
            "type": "string"
          },
          "first_name": {
            "description": "Legacy spelling of `firstName`.",
            "example": "Ana",
            "nullable": true,
            "type": "string"
          },
          "id": {
            "description": "Agent id; the only identifier any endpoint accepts for an agent.",
            "example": "6f1c2b3a-4d5e-4f60-8a7b-9c0d1e2f3a4b",
            "type": "string"
          },
          "image_url": {
            "description": "Legacy spelling of `avatarUrl`.",
            "example": "https://img.clerk.com/avatar.png",
            "type": "string"
          },
          "isActive": {
            "description": "Active on the roster (inactive agents are hidden from listing pickers).",
            "example": true,
            "type": "boolean"
          },
          "isClerkLinked": {
            "description": "True for a Fondaro member's row.",
            "example": true,
            "type": "boolean"
          },
          "lastName": {
            "description": "Last name.",
            "example": "García",
            "nullable": true,
            "type": "string"
          },
          "last_name": {
            "description": "Legacy spelling of `lastName`.",
            "example": "García",
            "nullable": true,
            "type": "string"
          },
          "organizationId": {
            "description": "The agency the row belongs to.",
            "example": "0b8e3f4a-1c2d-4e5f-8a9b-0c1d2e3f4a5b",
            "type": "string"
          },
          "phoneNumber": {
            "description": "Public phone number.",
            "example": "+34 600 000 000",
            "nullable": true,
            "type": "string"
          },
          "shareContactOnNetwork": {
            "description": "Show this card's email, phone and WhatsApp to other agencies on network listings (a member sets their own; an admin any).",
            "example": false,
            "type": "boolean"
          },
          "title": {
            "description": "Job title.",
            "example": "Senior agent",
            "nullable": true,
            "type": "string"
          },
          "updatedAt": {
            "description": "Last change.",
            "example": "2026-09-01T09:00:00.000Z",
            "format": "date-time",
            "type": "string"
          },
          "whatsappNumber": {
            "description": "WhatsApp number.",
            "example": "+34 600 000 000",
            "nullable": true,
            "type": "string"
          }
        },
        "required": [
          "id",
          "clerkUserId",
          "isClerkLinked",
          "first_name",
          "last_name",
          "image_url",
          "firstName",
          "lastName",
          "avatarUrl",
          "avatarThumbnailUrl",
          "organizationId",
          "displayEmail",
          "phoneNumber",
          "whatsappNumber",
          "description",
          "title",
          "isActive",
          "shareContactOnNetwork",
          "additionalInfo",
          "createdAt",
          "updatedAt"
        ],
        "type": "object"
      },
      "BoundingBoxDto": {
        "properties": {
          "northEast": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CoordinateDto"
              }
            ],
            "description": "North-east corner of the map view."
          },
          "southWest": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CoordinateDto"
              }
            ],
            "description": "South-west corner of the map view."
          }
        },
        "required": [
          "northEast",
          "southWest"
        ],
        "type": "object"
      },
      "CoordinateDto": {
        "properties": {
          "lat": {
            "description": "Latitude.",
            "example": 36.55,
            "type": "number"
          },
          "lon": {
            "description": "Longitude.",
            "example": -4.85,
            "type": "number"
          }
        },
        "required": [
          "lat",
          "lon"
        ],
        "type": "object"
      },
      "CreatePropertyDto": {
        "properties": {
          "additionalFeatures": {
            "description": "Free-form extra facts, as key/value pairs.",
            "example": {
              "views": "panoramic"
            },
            "type": "object"
          },
          "addressLine1": {
            "description": "Street address. Shared with other agencies on the network for ACTIVE listings.",
            "example": "Calle Sierra Blanca 12",
            "type": "string"
          },
          "addressLine2": {
            "description": "Second address line (building, floor, door).",
            "example": "Urbanización Sierra Blanca",
            "type": "string"
          },
          "agentId": {
            "description": "The listing agent (an id from `GET /agents`).",
            "example": "6f1c2b3a-4d5e-4f60-8a7b-9c0d1e2f3a4b",
            "format": "uuid",
            "type": "string"
          },
          "areaUnit": {
            "description": "Unit of `livingArea` and `plotArea`. Values: `sqm` (square metres); `sqft` (square feet).",
            "enum": [
              "sqm",
              "sqft"
            ],
            "example": "sqm",
            "type": "string"
          },
          "autoRenewEnabled": {
            "description": "Renew the listing automatically when it reaches `expiresAt`.",
            "example": true,
            "type": "boolean"
          },
          "availableFrom": {
            "description": "Date the property is available (`YYYY-MM-DD`).",
            "example": "2026-11-01",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "basuraPerYear": {
            "description": "Refuse collection tax per year.",
            "example": 180,
            "nullable": true,
            "type": "number"
          },
          "bathrooms": {
            "description": "Number of bathrooms (one decimal, so 2.5 is allowed).",
            "example": 4,
            "type": "number"
          },
          "bedrooms": {
            "description": "Number of bedrooms.",
            "example": 5,
            "type": "integer"
          },
          "city": {
            "description": "Town or city, up to 100 characters.",
            "example": "Marbella",
            "type": "string"
          },
          "co2Emissions": {
            "description": "CO₂ emissions in kg per m² per year.",
            "example": 18.2,
            "nullable": true,
            "type": "number"
          },
          "commission": {
            "description": "Your private commission percentage (0-100). Never shown to other agencies; the offer to the network is `sharedCommission`. Own listings only: absent from other agencies' rows.",
            "example": 5,
            "type": "number"
          },
          "community": {
            "description": "Neighbourhood, urbanisation or community name.",
            "example": "Sierra Blanca",
            "type": "string"
          },
          "communityFeesPerYear": {
            "description": "Community fees per year in `currency`.",
            "example": 3600,
            "nullable": true,
            "type": "number"
          },
          "completionDate": {
            "description": "Completion date of a new build (`YYYY-MM-DD`).",
            "example": "2027-06-30",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "condition": {
            "description": "State of the property. Values: `new` (newly built, never lived in); `excellent` (excellent); `good` (good); `needs_renovation` (needs renovation); `under_construction` (still being built).",
            "enum": [
              "new",
              "excellent",
              "good",
              "needs_renovation",
              "under_construction"
            ],
            "example": "excellent",
            "nullable": true,
            "type": "string"
          },
          "countryCode": {
            "description": "ISO 3166-1 alpha-2 country code, upper case.",
            "example": "ES",
            "type": "string"
          },
          "currency": {
            "description": "ISO 4217 currency code, upper case.",
            "example": "EUR",
            "type": "string"
          },
          "description": {
            "description": "Main description, plain text with line breaks.",
            "example": "South-facing villa with sea views, a heated pool and a guest apartment.",
            "type": "string"
          },
          "energyConsumptionKwh": {
            "description": "Energy consumption in kWh per m² per year.",
            "example": 85.5,
            "nullable": true,
            "type": "number"
          },
          "energyRating": {
            "description": "EU energy performance certificate letter. Values: `A+` (best); `A` (very efficient); `B` (efficient); `C` (fairly efficient); `D` (average); `E` (below average); `F` (inefficient); `G` (least efficient); `exempt` (no certificate required); `in_progress` (certificate being issued).",
            "enum": [
              "A+",
              "A",
              "B",
              "C",
              "D",
              "E",
              "F",
              "G",
              "exempt",
              "in_progress"
            ],
            "example": "B",
            "nullable": true,
            "type": "string"
          },
          "energyRatingDetails": {
            "description": "Free-text energy certificate details.",
            "example": "Certificate issued 2024, consumption rating B.",
            "type": "string"
          },
          "features": {
            "description": "Amenity slugs from the shared catalogue (the canonical amenity list; wins over the legacy `has*` flags). Omit to keep, never null.",
            "example": [
              "pool",
              "sea_view",
              "garage"
            ],
            "items": {
              "enum": [
                "pool",
                "sea_view",
                "garage",
                "terrace",
                "garden",
                "air_conditioning",
                "lift",
                "beachfront",
                "frontline_golf",
                "panoramic_views",
                "gated_complex",
                "storage_room",
                "built_in_wardrobes",
                "luxury"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "floor": {
            "description": "Floor the unit is on (-20 to 300; 0 is the ground floor).",
            "example": 3,
            "nullable": true,
            "type": "integer"
          },
          "floorPlans": {
            "description": "Floor plan images in display order; uploaded like photos. Omit to keep, never null.",
            "items": {
              "$ref": "#/components/schemas/PropertyFloorPlanDto"
            },
            "type": "array"
          },
          "furnished": {
            "description": "Furnishing. Values: `no` (unfurnished); `partly` (partly furnished); `fully` (fully furnished).",
            "enum": [
              "no",
              "partly",
              "fully"
            ],
            "example": "partly",
            "nullable": true,
            "type": "string"
          },
          "hasAirConditioning": {
            "description": "Legacy amenity flag; `features` holds `air_conditioning` too.",
            "example": true,
            "type": "boolean"
          },
          "hasGarage": {
            "description": "Legacy amenity flag; `features` holds `garage` too.",
            "example": true,
            "type": "boolean"
          },
          "hasGarden": {
            "description": "Legacy amenity flag; `features` holds `garden` too.",
            "example": true,
            "type": "boolean"
          },
          "hasLift": {
            "description": "Legacy amenity flag; `features` holds `lift` too.",
            "example": false,
            "type": "boolean"
          },
          "hasPool": {
            "description": "Legacy amenity flag; `features` holds `pool` too.",
            "example": true,
            "type": "boolean"
          },
          "hasSeaView": {
            "description": "Legacy amenity flag; `features` holds `sea_view` too.",
            "example": true,
            "type": "boolean"
          },
          "hasTerrace": {
            "description": "Legacy amenity flag; `features` holds `terrace` too.",
            "example": true,
            "type": "boolean"
          },
          "ibiPerYear": {
            "description": "IBI (Spanish property tax) per year.",
            "example": 2100,
            "nullable": true,
            "type": "number"
          },
          "images": {
            "description": "Photos in display order. Every URL must come from `POST /properties/media/upload` (or already be on the listing). `width`/`height` are set by the server from the upload.",
            "items": {
              "$ref": "#/components/schemas/PropertyImageDto"
            },
            "type": "array"
          },
          "isExterior": {
            "description": "The unit faces the street or outside (not an inner patio).",
            "example": true,
            "nullable": true,
            "type": "boolean"
          },
          "isFurnished": {
            "description": "Legacy flag, true when `furnished` is `partly` or `fully`.",
            "example": false,
            "type": "boolean"
          },
          "isNewConstruction": {
            "description": "A new-build property.",
            "example": false,
            "type": "boolean"
          },
          "latitude": {
            "description": "Latitude in decimal degrees (-90 to 90).",
            "example": 36.5201,
            "type": "number"
          },
          "leadGroupId": {
            "description": "Internal lead plan the listing belongs to. Own listings only: absent from other agencies' rows.",
            "example": 12,
            "type": "integer"
          },
          "listingType": {
            "description": "How the property is offered. Values: `sale` (for sale; `price` is the asking price); `rent` (for rent; see `rentalPrice` and `rentalPeriod`); `sale_or_rent` (for sale or for rent); `fraction` (a fractional ownership share).",
            "enum": [
              "sale",
              "rent",
              "sale_or_rent",
              "fraction"
            ],
            "example": "sale",
            "type": "string"
          },
          "livingArea": {
            "description": "Built living area in `areaUnit`.",
            "example": 420,
            "type": "number"
          },
          "longitude": {
            "description": "Longitude in decimal degrees (-180 to 180).",
            "example": -4.9112,
            "type": "number"
          },
          "orientation": {
            "description": "Direction the main facade faces. Values: `N` (north); `NE` (north-east); `E` (east); `SE` (south-east); `S` (south); `SW` (south-west); `W` (west); `NW` (north-west).",
            "enum": [
              "N",
              "NE",
              "E",
              "SE",
              "S",
              "SW",
              "W",
              "NW"
            ],
            "example": "S",
            "nullable": true,
            "type": "string"
          },
          "parkingSpaces": {
            "description": "Number of parking spaces included.",
            "example": 2,
            "nullable": true,
            "type": "integer"
          },
          "parkingType": {
            "description": "Kind of parking. Values: `garage` (private garage); `underground` (underground space); `covered` (covered space or carport); `open` (open private space); `street` (on the street); `communal` (shared community parking).",
            "enum": [
              "garage",
              "underground",
              "covered",
              "open",
              "street",
              "communal"
            ],
            "example": "garage",
            "nullable": true,
            "type": "string"
          },
          "plotArea": {
            "description": "Plot size in `areaUnit`.",
            "example": 1500,
            "type": "number"
          },
          "postalCode": {
            "description": "Postal code, up to 20 characters.",
            "example": "29602",
            "type": "string"
          },
          "price": {
            "description": "Asking price in `currency` (two decimals).",
            "example": 2450000,
            "type": "number"
          },
          "propertyCategory": {
            "description": "Broad kind of property; `propertyType` must belong to it (`other` fits every category). Values: `residential` (homes); `commercial` (offices, shops and other business premises); `industrial` (warehouses and industrial premises); `land` (plots and land).",
            "enum": [
              "residential",
              "commercial",
              "industrial",
              "land"
            ],
            "example": "residential",
            "type": "string"
          },
          "propertyType": {
            "description": "Specific kind of property (category: meaning). Values: `apartment` (residential: flat); `condominium` (residential: condominium unit); `house_detached` (residential: detached house or villa); `house_semi_detached` (residential: semi-detached house); `house_terraced` (residential: terraced house); `townhouse` (residential: townhouse); `multi_family_home` (residential: building of several homes); `penthouse` (residential: top-floor apartment); `studio` (residential: studio apartment); `land_residential` (land: plot zoned for homes); `land_commercial` (land: plot zoned for business); `land_agricultural` (land: rural or agricultural land); `land_other` (land: other); `office` (commercial: office); `retail` (commercial: shop or retail unit); `commercial_other` (commercial: other); `industrial_warehouse` (industrial: warehouse); `industrial_other` (industrial: other); `hospitality` (commercial: hotel, restaurant or similar); `other` (any category: other).",
            "enum": [
              "apartment",
              "condominium",
              "house_detached",
              "house_semi_detached",
              "house_terraced",
              "townhouse",
              "multi_family_home",
              "penthouse",
              "studio",
              "land_residential",
              "land_commercial",
              "land_agricultural",
              "land_other",
              "office",
              "retail",
              "commercial_other",
              "industrial_warehouse",
              "industrial_other",
              "hospitality",
              "other"
            ],
            "example": "house_detached",
            "type": "string"
          },
          "provinceState": {
            "description": "Province or state.",
            "example": "Málaga",
            "type": "string"
          },
          "region": {
            "description": "Region or area (a coast, a valley).",
            "example": "Costa del Sol",
            "type": "string"
          },
          "rentalPeriod": {
            "description": "What `rentalPrice` is charged per. Values: `day` (per night or day); `week` (per week); `month` (per month); `year` (per year).",
            "enum": [
              "day",
              "week",
              "month",
              "year"
            ],
            "example": "month",
            "nullable": true,
            "type": "string"
          },
          "rentalPrice": {
            "description": "Rent in `currency` per `rentalPeriod`.",
            "example": 6500,
            "nullable": true,
            "type": "number"
          },
          "rentalPriceHighSeason": {
            "description": "High-season rent per `rentalPeriod`.",
            "example": 9000,
            "nullable": true,
            "type": "number"
          },
          "rentalPriceLowSeason": {
            "description": "Low-season rent per `rentalPeriod`.",
            "example": 4500,
            "nullable": true,
            "type": "number"
          },
          "sharedCommission": {
            "description": "Commission percentage your agency offers another agency that sells the property (0-100). Visible to every agency on the network.",
            "example": 2.5,
            "nullable": true,
            "type": "number"
          },
          "sharedCommissionNotes": {
            "description": "Terms of the shared commission, visible to the network.",
            "example": "50/50 split on the agreed fee, paid on completion.",
            "nullable": true,
            "type": "string"
          },
          "thumbnails": {
            "description": "Small versions of `images` (the upload returns one per photo); `originalImageIndex` points at the image.",
            "items": {
              "$ref": "#/components/schemas/PropertyThumbnailDto"
            },
            "type": "array"
          },
          "title": {
            "description": "Headline shown above the price, up to 140 characters.",
            "example": "Modern villa with sea views in Sierra Blanca",
            "nullable": true,
            "type": "string"
          },
          "totalFloors": {
            "description": "Floors in the building.",
            "example": 6,
            "nullable": true,
            "type": "integer"
          },
          "translatedDescriptions": {
            "description": "The description in other languages, keyed by language code (`es`, `de`, `fr`...).",
            "example": {
              "es": "Villa orientada al sur con vistas al mar."
            },
            "type": "object"
          },
          "translatedTitles": {
            "description": "The title in other languages, keyed by language code.",
            "example": {
              "es": "Villa moderna con vistas al mar en Sierra Blanca"
            },
            "nullable": true,
            "type": "object"
          },
          "videoUrls": {
            "description": "Video links (http or https). Omit to keep, never null.",
            "example": [
              "https://www.youtube.com/watch?v=abc123"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "viewingInstructions": {
            "description": "Private notes for arranging viewings. Never shared. Own listings only: absent from other agencies' rows.",
            "example": "Keys at the office; call the owner a day ahead.",
            "nullable": true,
            "type": "string"
          },
          "virtualTourUrls": {
            "description": "Virtual tour links (http or https). Omit to keep, never null.",
            "example": [
              "https://my.matterport.com/show/?m=abc123"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "yearBuilt": {
            "description": "Year of construction (1801 up to a few years ahead).",
            "example": 2018,
            "type": "integer"
          }
        },
        "required": [
          "listingType",
          "propertyCategory",
          "propertyType",
          "city",
          "countryCode",
          "currency"
        ],
        "type": "object"
      },
      "CreateStandaloneAgentDto": {
        "properties": {
          "additionalInfo": {
            "description": "Free-form extra data.",
            "example": {
              "languages": [
                "en",
                "es"
              ]
            },
            "type": "object"
          },
          "description": {
            "description": "Short biography.",
            "example": "Twelve years selling villas on the Golden Mile.",
            "type": "string"
          },
          "displayEmail": {
            "description": "Public email shown on listings and brochures.",
            "example": "ana@agency.example",
            "type": "string"
          },
          "firstName": {
            "description": "First name (for a Fondaro member, their account name).",
            "example": "Ana",
            "type": "string"
          },
          "isActive": {
            "description": "Active on the roster (inactive agents are hidden from listing pickers).",
            "example": true,
            "type": "boolean"
          },
          "lastName": {
            "description": "Last name.",
            "example": "García",
            "type": "string"
          },
          "phoneNumber": {
            "description": "Public phone number.",
            "example": "+34 600 000 000",
            "type": "string"
          },
          "title": {
            "description": "Job title.",
            "example": "Senior agent",
            "type": "string"
          },
          "whatsappNumber": {
            "description": "WhatsApp number.",
            "example": "+34 600 000 000",
            "type": "string"
          }
        },
        "required": [
          "firstName"
        ],
        "type": "object"
      },
      "FeaturesDto": {
        "properties": {
          "hasAirConditioning": {
            "description": "Has air conditioning. `true` requires it.",
            "example": true,
            "type": "boolean"
          },
          "hasGarage": {
            "description": "Has a garage. `true` requires it.",
            "example": true,
            "type": "boolean"
          },
          "hasGarden": {
            "description": "Has a garden. `true` requires it.",
            "example": true,
            "type": "boolean"
          },
          "hasLift": {
            "description": "Has a lift. `true` requires it.",
            "example": true,
            "type": "boolean"
          },
          "hasPool": {
            "description": "Has a pool. `true` requires it.",
            "example": true,
            "type": "boolean"
          },
          "hasSeaView": {
            "description": "Has sea views. `true` requires it.",
            "example": true,
            "type": "boolean"
          },
          "hasTerrace": {
            "description": "Has a terrace. `true` requires it.",
            "example": true,
            "type": "boolean"
          },
          "isFurnished": {
            "description": "Is furnished. `true` requires it.",
            "example": true,
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "ListingAgentCardDto": {
        "properties": {
          "clerkUserId": {
            "description": "The Fondaro user behind the card, when there is one (used for in-app messages).",
            "example": "user_2abcDEF",
            "nullable": true,
            "type": "object"
          },
          "displayEmail": {
            "description": "Public email. On another agency's listing only when that agent shares contact details with the network.",
            "example": "ana@agency.example",
            "type": "string"
          },
          "firstName": {
            "description": "First name.",
            "example": "Ana",
            "type": "string"
          },
          "id": {
            "description": "Agent id (the roster row).",
            "example": "6f1c2b3a-4d5e-4f60-8a7b-9c0d1e2f3a4b",
            "type": "string"
          },
          "imageUrl": {
            "description": "Avatar URL.",
            "example": "https://img.clerk.com/avatar.png",
            "type": "string"
          },
          "lastName": {
            "description": "Last name.",
            "example": "García",
            "type": "string"
          },
          "phoneNumber": {
            "description": "Phone, under the same sharing rule as `displayEmail`.",
            "example": "+34 600 000 000",
            "type": "string"
          },
          "title": {
            "description": "Job title.",
            "example": "Senior agent",
            "type": "string"
          },
          "whatsappNumber": {
            "description": "WhatsApp number, under the same sharing rule.",
            "example": "+34 600 000 000",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "ListingOrganizationBrandingDto": {
        "properties": {
          "description": {
            "description": "Agency description.",
            "example": "Independent agency on the Costa del Sol since 2004.",
            "type": "string"
          },
          "email": {
            "description": "Agency email.",
            "example": "hello@agency.example",
            "type": "string"
          },
          "logoDarkUrl": {
            "description": "Logo for dark backgrounds.",
            "example": "https://cdn.example/logo-dark.png",
            "type": "string"
          },
          "logoLightUrl": {
            "description": "Logo for light backgrounds.",
            "example": "https://cdn.example/logo-light.png",
            "type": "string"
          },
          "name": {
            "description": "Agency name.",
            "example": "Example Estates",
            "type": "string"
          },
          "phone": {
            "description": "Agency phone.",
            "example": "+34 952 000 000",
            "type": "string"
          },
          "website": {
            "description": "Agency website.",
            "example": "https://www.agency.example",
            "type": "string"
          }
        },
        "type": "object"
      },
      "ListingResponseDto": {
        "properties": {
          "additionalFeatures": {
            "description": "Free-form extra facts, as key/value pairs.",
            "example": {
              "views": "panoramic"
            },
            "type": "object"
          },
          "addressLine1": {
            "description": "Street address. Shared with other agencies on the network for ACTIVE listings.",
            "example": "Calle Sierra Blanca 12",
            "type": "string"
          },
          "addressLine2": {
            "description": "Second address line (building, floor, door).",
            "example": "Urbanización Sierra Blanca",
            "type": "string"
          },
          "agent": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ListingAgentCardDto"
              }
            ],
            "description": "The listing agent, with `includeBranding=true`."
          },
          "agentId": {
            "description": "The listing agent (an id from `GET /agents`).",
            "example": "6f1c2b3a-4d5e-4f60-8a7b-9c0d1e2f3a4b",
            "format": "uuid",
            "type": "string"
          },
          "areaUnit": {
            "description": "Unit of `livingArea` and `plotArea`. Values: `sqm` (square metres); `sqft` (square feet).",
            "enum": [
              "sqm",
              "sqft"
            ],
            "example": "sqm",
            "type": "string"
          },
          "autoRenewEnabled": {
            "description": "Renew the listing automatically when it reaches `expiresAt`.",
            "example": true,
            "type": "boolean"
          },
          "availableFrom": {
            "description": "Date the property is available (`YYYY-MM-DD`).",
            "example": "2026-11-01",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "basuraPerYear": {
            "description": "Refuse collection tax per year.",
            "example": 180,
            "nullable": true,
            "type": "number"
          },
          "bathrooms": {
            "description": "Number of bathrooms (one decimal, so 2.5 is allowed).",
            "example": 4,
            "type": "number"
          },
          "bedrooms": {
            "description": "Number of bedrooms.",
            "example": 5,
            "type": "integer"
          },
          "city": {
            "description": "Town or city, up to 100 characters.",
            "example": "Marbella",
            "type": "string"
          },
          "co2Emissions": {
            "description": "CO₂ emissions in kg per m² per year.",
            "example": 18.2,
            "nullable": true,
            "type": "number"
          },
          "commission": {
            "description": "Your private commission percentage (0-100). Never shown to other agencies; the offer to the network is `sharedCommission`. Own listings only: absent from other agencies' rows.",
            "example": 5,
            "type": "number"
          },
          "community": {
            "description": "Neighbourhood, urbanisation or community name.",
            "example": "Sierra Blanca",
            "type": "string"
          },
          "communityFeesPerYear": {
            "description": "Community fees per year in `currency`.",
            "example": 3600,
            "nullable": true,
            "type": "number"
          },
          "completionDate": {
            "description": "Completion date of a new build (`YYYY-MM-DD`).",
            "example": "2027-06-30",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "condition": {
            "description": "State of the property. Values: `new` (newly built, never lived in); `excellent` (excellent); `good` (good); `needs_renovation` (needs renovation); `under_construction` (still being built).",
            "enum": [
              "new",
              "excellent",
              "good",
              "needs_renovation",
              "under_construction"
            ],
            "example": "excellent",
            "nullable": true,
            "type": "string"
          },
          "countryCode": {
            "description": "ISO 3166-1 alpha-2 country code, upper case.",
            "example": "ES",
            "type": "string"
          },
          "createdAt": {
            "description": "When the listing was created.",
            "example": "2026-09-01T10:15:00.000Z",
            "format": "date-time",
            "type": "string"
          },
          "currency": {
            "description": "ISO 4217 currency code, upper case.",
            "example": "EUR",
            "type": "string"
          },
          "description": {
            "description": "Main description, plain text with line breaks.",
            "example": "South-facing villa with sea views, a heated pool and a guest apartment.",
            "type": "string"
          },
          "energyConsumptionKwh": {
            "description": "Energy consumption in kWh per m² per year.",
            "example": 85.5,
            "nullable": true,
            "type": "number"
          },
          "energyRating": {
            "description": "EU energy performance certificate letter. Values: `A+` (best); `A` (very efficient); `B` (efficient); `C` (fairly efficient); `D` (average); `E` (below average); `F` (inefficient); `G` (least efficient); `exempt` (no certificate required); `in_progress` (certificate being issued).",
            "enum": [
              "A+",
              "A",
              "B",
              "C",
              "D",
              "E",
              "F",
              "G",
              "exempt",
              "in_progress"
            ],
            "example": "B",
            "nullable": true,
            "type": "string"
          },
          "energyRatingDetails": {
            "description": "Free-text energy certificate details.",
            "example": "Certificate issued 2024, consumption rating B.",
            "type": "string"
          },
          "expiresAt": {
            "description": "When the listing expires unless renewed.",
            "example": "2026-11-02T09:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "features": {
            "description": "Amenity slugs from the shared catalogue (the canonical amenity list; wins over the legacy `has*` flags). Omit to keep, never null.",
            "example": [
              "pool",
              "sea_view",
              "garage"
            ],
            "items": {
              "enum": [
                "pool",
                "sea_view",
                "garage",
                "terrace",
                "garden",
                "air_conditioning",
                "lift",
                "beachfront",
                "frontline_golf",
                "panoramic_views",
                "gated_complex",
                "storage_room",
                "built_in_wardrobes",
                "luxury"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "floor": {
            "description": "Floor the unit is on (-20 to 300; 0 is the ground floor).",
            "example": 3,
            "nullable": true,
            "type": "integer"
          },
          "floorPlans": {
            "description": "Floor plan images in display order; uploaded like photos. Omit to keep, never null.",
            "items": {
              "$ref": "#/components/schemas/PropertyFloorPlanDto"
            },
            "type": "array"
          },
          "furnished": {
            "description": "Furnishing. Values: `no` (unfurnished); `partly` (partly furnished); `fully` (fully furnished).",
            "enum": [
              "no",
              "partly",
              "fully"
            ],
            "example": "partly",
            "nullable": true,
            "type": "string"
          },
          "hasAirConditioning": {
            "description": "Legacy amenity flag; `features` holds `air_conditioning` too.",
            "example": true,
            "type": "boolean"
          },
          "hasGarage": {
            "description": "Legacy amenity flag; `features` holds `garage` too.",
            "example": true,
            "type": "boolean"
          },
          "hasGarden": {
            "description": "Legacy amenity flag; `features` holds `garden` too.",
            "example": true,
            "type": "boolean"
          },
          "hasLift": {
            "description": "Legacy amenity flag; `features` holds `lift` too.",
            "example": false,
            "type": "boolean"
          },
          "hasPool": {
            "description": "Legacy amenity flag; `features` holds `pool` too.",
            "example": true,
            "type": "boolean"
          },
          "hasSeaView": {
            "description": "Legacy amenity flag; `features` holds `sea_view` too.",
            "example": true,
            "type": "boolean"
          },
          "hasTerrace": {
            "description": "Legacy amenity flag; `features` holds `terrace` too.",
            "example": true,
            "type": "boolean"
          },
          "ibiPerYear": {
            "description": "IBI (Spanish property tax) per year.",
            "example": 2100,
            "nullable": true,
            "type": "number"
          },
          "id": {
            "description": "Listing id. Use it for detail, update and delete.",
            "example": "2b9d6c1e-8f7a-4c3b-9e21-5a4d3c2b1a09",
            "format": "uuid",
            "type": "string"
          },
          "images": {
            "description": "Photos in display order. Every URL must come from `POST /properties/media/upload` (or already be on the listing). `width`/`height` are set by the server from the upload.",
            "items": {
              "$ref": "#/components/schemas/PropertyImageDto"
            },
            "type": "array"
          },
          "isExterior": {
            "description": "The unit faces the street or outside (not an inner patio).",
            "example": true,
            "nullable": true,
            "type": "boolean"
          },
          "isFurnished": {
            "description": "Legacy flag, true when `furnished` is `partly` or `fully`.",
            "example": false,
            "type": "boolean"
          },
          "isNewConstruction": {
            "description": "A new-build property.",
            "example": false,
            "type": "boolean"
          },
          "latitude": {
            "description": "Latitude in decimal degrees (-90 to 90).",
            "example": 36.5201,
            "type": "number"
          },
          "leadGroupId": {
            "description": "Internal lead plan the listing belongs to. Own listings only: absent from other agencies' rows.",
            "example": 12,
            "type": "integer"
          },
          "listingType": {
            "description": "How the property is offered. Values: `sale` (for sale; `price` is the asking price); `rent` (for rent; see `rentalPrice` and `rentalPeriod`); `sale_or_rent` (for sale or for rent); `fraction` (a fractional ownership share).",
            "enum": [
              "sale",
              "rent",
              "sale_or_rent",
              "fraction"
            ],
            "example": "sale",
            "type": "string"
          },
          "livingArea": {
            "description": "Built living area in `areaUnit`.",
            "example": 420,
            "type": "number"
          },
          "longitude": {
            "description": "Longitude in decimal degrees (-180 to 180).",
            "example": -4.9112,
            "type": "number"
          },
          "organizationBranding": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ListingOrganizationBrandingDto"
              }
            ],
            "description": "The listing agency, with `includeBranding=true`."
          },
          "organizationId": {
            "description": "The agency that owns the listing.",
            "example": "0b8e3f4a-1c2d-4e5f-8a9b-0c1d2e3f4a5b",
            "format": "uuid",
            "type": "string"
          },
          "orientation": {
            "description": "Direction the main facade faces. Values: `N` (north); `NE` (north-east); `E` (east); `SE` (south-east); `S` (south); `SW` (south-west); `W` (west); `NW` (north-west).",
            "enum": [
              "N",
              "NE",
              "E",
              "SE",
              "S",
              "SW",
              "W",
              "NW"
            ],
            "example": "S",
            "nullable": true,
            "type": "string"
          },
          "parkingSpaces": {
            "description": "Number of parking spaces included.",
            "example": 2,
            "nullable": true,
            "type": "integer"
          },
          "parkingType": {
            "description": "Kind of parking. Values: `garage` (private garage); `underground` (underground space); `covered` (covered space or carport); `open` (open private space); `street` (on the street); `communal` (shared community parking).",
            "enum": [
              "garage",
              "underground",
              "covered",
              "open",
              "street",
              "communal"
            ],
            "example": "garage",
            "nullable": true,
            "type": "string"
          },
          "plotArea": {
            "description": "Plot size in `areaUnit`.",
            "example": 1500,
            "type": "number"
          },
          "postalCode": {
            "description": "Postal code, up to 20 characters.",
            "example": "29602",
            "type": "string"
          },
          "price": {
            "description": "Asking price in `currency` (two decimals).",
            "example": 2450000,
            "type": "number"
          },
          "propertyCategory": {
            "description": "Broad kind of property; `propertyType` must belong to it (`other` fits every category). Values: `residential` (homes); `commercial` (offices, shops and other business premises); `industrial` (warehouses and industrial premises); `land` (plots and land).",
            "enum": [
              "residential",
              "commercial",
              "industrial",
              "land"
            ],
            "example": "residential",
            "type": "string"
          },
          "propertyType": {
            "description": "Specific kind of property (category: meaning). Values: `apartment` (residential: flat); `condominium` (residential: condominium unit); `house_detached` (residential: detached house or villa); `house_semi_detached` (residential: semi-detached house); `house_terraced` (residential: terraced house); `townhouse` (residential: townhouse); `multi_family_home` (residential: building of several homes); `penthouse` (residential: top-floor apartment); `studio` (residential: studio apartment); `land_residential` (land: plot zoned for homes); `land_commercial` (land: plot zoned for business); `land_agricultural` (land: rural or agricultural land); `land_other` (land: other); `office` (commercial: office); `retail` (commercial: shop or retail unit); `commercial_other` (commercial: other); `industrial_warehouse` (industrial: warehouse); `industrial_other` (industrial: other); `hospitality` (commercial: hotel, restaurant or similar); `other` (any category: other).",
            "enum": [
              "apartment",
              "condominium",
              "house_detached",
              "house_semi_detached",
              "house_terraced",
              "townhouse",
              "multi_family_home",
              "penthouse",
              "studio",
              "land_residential",
              "land_commercial",
              "land_agricultural",
              "land_other",
              "office",
              "retail",
              "commercial_other",
              "industrial_warehouse",
              "industrial_other",
              "hospitality",
              "other"
            ],
            "example": "house_detached",
            "type": "string"
          },
          "provinceState": {
            "description": "Province or state.",
            "example": "Málaga",
            "type": "string"
          },
          "publishedAt": {
            "description": "When the listing first became ACTIVE.",
            "example": "2026-09-02T09:00:00.000Z",
            "format": "date-time",
            "nullable": true,
            "type": "string"
          },
          "referenceNumber": {
            "description": "Human reference shown to buyers (`FDR-` + 8 characters).",
            "example": "FDR-7K2M9QXA",
            "type": "string"
          },
          "region": {
            "description": "Region or area (a coast, a valley).",
            "example": "Costa del Sol",
            "type": "string"
          },
          "rentalPeriod": {
            "description": "What `rentalPrice` is charged per. Values: `day` (per night or day); `week` (per week); `month` (per month); `year` (per year).",
            "enum": [
              "day",
              "week",
              "month",
              "year"
            ],
            "example": "month",
            "nullable": true,
            "type": "string"
          },
          "rentalPrice": {
            "description": "Rent in `currency` per `rentalPeriod`.",
            "example": 6500,
            "nullable": true,
            "type": "number"
          },
          "rentalPriceHighSeason": {
            "description": "High-season rent per `rentalPeriod`.",
            "example": 9000,
            "nullable": true,
            "type": "number"
          },
          "rentalPriceLowSeason": {
            "description": "Low-season rent per `rentalPeriod`.",
            "example": 4500,
            "nullable": true,
            "type": "number"
          },
          "sharedCommission": {
            "description": "Commission percentage your agency offers another agency that sells the property (0-100). Visible to every agency on the network.",
            "example": 2.5,
            "nullable": true,
            "type": "number"
          },
          "sharedCommissionNotes": {
            "description": "Terms of the shared commission, visible to the network.",
            "example": "50/50 split on the agreed fee, paid on completion.",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "description": "Publication state. Values: `active` (published and visible to every agency on the network); `inactive` (draft or paused, visible only to your agency); `pending` (under offer or awaiting approval, yours only); `sold` (sold, yours only); `rented` (let, yours only); `deleted` (removed, yours only).",
            "enum": [
              "active",
              "inactive",
              "pending",
              "sold",
              "rented",
              "deleted"
            ],
            "example": "active",
            "type": "string"
          },
          "thumbnails": {
            "description": "Small versions of `images` (the upload returns one per photo); `originalImageIndex` points at the image.",
            "items": {
              "$ref": "#/components/schemas/PropertyThumbnailDto"
            },
            "type": "array"
          },
          "title": {
            "description": "Headline shown above the price, up to 140 characters.",
            "example": "Modern villa with sea views in Sierra Blanca",
            "nullable": true,
            "type": "string"
          },
          "totalFloors": {
            "description": "Floors in the building.",
            "example": 6,
            "nullable": true,
            "type": "integer"
          },
          "translatedDescriptions": {
            "description": "The description in other languages, keyed by language code (`es`, `de`, `fr`...).",
            "example": {
              "es": "Villa orientada al sur con vistas al mar."
            },
            "type": "object"
          },
          "translatedTitles": {
            "description": "The title in other languages, keyed by language code.",
            "example": {
              "es": "Villa moderna con vistas al mar en Sierra Blanca"
            },
            "nullable": true,
            "type": "object"
          },
          "updatedAt": {
            "description": "Last change.",
            "example": "2026-09-20T08:00:00.000Z",
            "format": "date-time",
            "type": "string"
          },
          "videoUrls": {
            "description": "Video links (http or https). Omit to keep, never null.",
            "example": [
              "https://www.youtube.com/watch?v=abc123"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "viewingInstructions": {
            "description": "Private notes for arranging viewings. Never shared. Own listings only: absent from other agencies' rows.",
            "example": "Keys at the office; call the owner a day ahead.",
            "nullable": true,
            "type": "string"
          },
          "virtualTourUrls": {
            "description": "Virtual tour links (http or https). Omit to keep, never null.",
            "example": [
              "https://my.matterport.com/show/?m=abc123"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "yearBuilt": {
            "description": "Year of construction (1801 up to a few years ahead).",
            "example": 2018,
            "type": "integer"
          }
        },
        "required": [
          "id",
          "referenceNumber",
          "organizationId",
          "status",
          "listingType",
          "propertyCategory",
          "propertyType",
          "city",
          "countryCode",
          "currency"
        ],
        "type": "object"
      },
      "LocationDto": {
        "properties": {
          "distance": {
            "default": "10km",
            "description": "Radius with unit (`km` or `m`).",
            "example": "5km",
            "type": "string"
          },
          "lat": {
            "description": "Centre latitude.",
            "example": 36.5101,
            "type": "number"
          },
          "lon": {
            "description": "Centre longitude.",
            "example": -4.8825,
            "type": "number"
          }
        },
        "required": [
          "lat",
          "lon"
        ],
        "type": "object"
      },
      "PriceDistributionDto": {
        "properties": {
          "interval": {
            "default": 50000,
            "description": "Histogram bucket width in the listing currency.",
            "example": 50000,
            "type": "number"
          },
          "max": {
            "description": "Highest price of the histogram.",
            "example": 5000000,
            "type": "number"
          },
          "min": {
            "description": "Lowest price of the histogram.",
            "example": 0,
            "type": "number"
          }
        },
        "type": "object"
      },
      "PriceDistributionResultDto": {
        "properties": {
          "buckets": {
            "description": "Listings per bucket; `key` is the bucket start.",
            "example": [
              {
                "count": 4,
                "key": 250000
              },
              {
                "count": 7,
                "key": 300000
              }
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "interval": {
            "description": "Bucket width.",
            "example": 50000,
            "type": "number"
          },
          "maxPrice": {
            "description": "Highest price among the matches.",
            "example": 4950000,
            "type": "number"
          },
          "minPrice": {
            "description": "Lowest price among the matches.",
            "example": 250000,
            "type": "number"
          }
        },
        "required": [
          "interval",
          "minPrice",
          "maxPrice",
          "buckets"
        ],
        "type": "object"
      },
      "PropertyAggregationsResponseDto": {
        "properties": {
          "availableCities": {
            "description": "Towns with at least one match.",
            "example": [
              "Benahavís",
              "Marbella"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "availableCountries": {
            "description": "Country codes with at least one match.",
            "example": [
              "ES"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "availablePropertyCategories": {
            "description": "Categories with at least one match.",
            "example": [
              "residential"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "availablePropertyTypes": {
            "description": "Property types with at least one match.",
            "example": [
              "apartment",
              "house_detached"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "availableRegions": {
            "description": "Regions with at least one match.",
            "example": [
              "Costa del Sol"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "byCity": {
            "additionalProperties": {
              "properties": {
                "byType": {
                  "additionalProperties": {
                    "type": "integer"
                  },
                  "type": "object"
                },
                "total": {
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "description": "Listings per town, with a breakdown by property type.",
            "example": {
              "Marbella": {
                "byType": {
                  "apartment": 30,
                  "house_detached": 12
                },
                "total": 45
              }
            },
            "type": "object"
          },
          "byCountry": {
            "additionalProperties": {
              "properties": {
                "byType": {
                  "additionalProperties": {
                    "type": "integer"
                  },
                  "type": "object"
                },
                "total": {
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "description": "Listings per ISO country code, with a breakdown by property type.",
            "example": {
              "ES": {
                "byType": {
                  "apartment": 37,
                  "house_detached": 20
                },
                "total": 60
              }
            },
            "type": "object"
          },
          "byPropertyCategory": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Listings per category.",
            "example": {
              "commercial": 3,
              "residential": 65
            },
            "type": "object"
          },
          "byPropertyType": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Listings per property type.",
            "example": {
              "apartment": 45,
              "house_detached": 20,
              "penthouse": 3
            },
            "type": "object"
          },
          "byRegion": {
            "additionalProperties": {
              "properties": {
                "byType": {
                  "additionalProperties": {
                    "type": "integer"
                  },
                  "type": "object"
                },
                "total": {
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "description": "Listings per region, with a breakdown by property type.",
            "example": {
              "Costa del Sol": {
                "byType": {
                  "apartment": 37,
                  "house_detached": 20
                },
                "total": 60
              }
            },
            "type": "object"
          },
          "communities": {
            "description": "Only with `q`: communities whose name, town or region contains it, most listings first.",
            "example": [
              {
                "city": "Marbella",
                "name": "Sierra Blanca",
                "region": "Costa del Sol",
                "total": 6
              }
            ],
            "items": {
              "properties": {
                "city": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "region": {
                  "type": "string"
                },
                "total": {
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "type": "array"
          },
          "totalProperties": {
            "description": "Listings matching the filters.",
            "example": 68,
            "type": "integer"
          }
        },
        "required": [
          "byCity",
          "byRegion",
          "byCountry",
          "byPropertyType",
          "byPropertyCategory",
          "availableCities",
          "availableRegions",
          "availableCountries",
          "availablePropertyTypes",
          "availablePropertyCategories",
          "totalProperties"
        ],
        "type": "object"
      },
      "PropertyFloorPlanDto": {
        "properties": {
          "alt": {
            "description": "Alternative text.",
            "example": "Ground floor",
            "type": "string"
          },
          "order": {
            "description": "Display position, 0 first.",
            "example": 0,
            "type": "number"
          },
          "url": {
            "description": "Floor plan image URL, uploaded like a photo.",
            "example": "https://fondaro.fra1.cdn.digitaloceanspaces.com/properties/images/7a1b2c3d.jpg",
            "type": "string"
          }
        },
        "required": [
          "url",
          "order"
        ],
        "type": "object"
      },
      "PropertyImageDto": {
        "properties": {
          "alt": {
            "description": "Alternative text for screen readers.",
            "example": "Pool terrace at sunset",
            "type": "string"
          },
          "height": {
            "description": "Pixel height, set by the server from the upload.",
            "example": 1080,
            "type": "number"
          },
          "isFeatured": {
            "description": "The cover photo.",
            "example": true,
            "type": "boolean"
          },
          "order": {
            "description": "Display position, 0 first.",
            "example": 0,
            "type": "number"
          },
          "url": {
            "description": "Full-size photo URL (JPEG, up to 1920x1080) from `POST /properties/media/upload` `images.fullSize`.",
            "example": "https://fondaro.fra1.cdn.digitaloceanspaces.com/properties/images/0f8c2d1e.jpg",
            "type": "string"
          },
          "width": {
            "description": "Pixel width, set by the server from the upload (a sent value is ignored).",
            "example": 1920,
            "type": "number"
          }
        },
        "required": [
          "url",
          "order"
        ],
        "type": "object"
      },
      "PropertySearchDto": {
        "properties": {
          "agentId": {
            "description": "Your listings assigned to this agent (an `id` from `GET /agents`). Needs `scope: own`: with network scope it is a 400 `PROPERTY_FILTER_UNSUPPORTED`; an id not on your roster is a 400 `PROPERTY_FILTER_VALUE_INVALID`.",
            "example": "5f1c2a9e-3b7d-4e8a-9c21-0d4b6a7e8f10",
            "format": "uuid",
            "type": "string"
          },
          "agentUserIds": {
            "description": "Your listings assigned to any of these people (Clerk user ids). Needs `scope: own`: with network scope it is a 400 `PROPERTY_FILTER_UNSUPPORTED`.",
            "example": [
              "user_2abc"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "bathrooms": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RangeDto"
              }
            ],
            "description": "Bathrooms between `min` and `max`."
          },
          "bedrooms": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RangeDto"
              }
            ],
            "description": "Bedrooms between `min` and `max`."
          },
          "boundingBox": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BoundingBoxDto"
              }
            ],
            "description": "Listings inside a map rectangle (up to 1,000 slim rows; takes precedence over `polygon` and `location`)."
          },
          "city": {
            "description": "Towns, as `stats/aggregations` lists them.",
            "example": [
              "Marbella",
              "Benahavís"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "commission": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RangeDto"
              }
            ],
            "description": "Your private commission percentage; own listings only (a 400 with `scope: network`)."
          },
          "countryCode": {
            "description": "ISO 3166-1 alpha-2 country codes.",
            "example": [
              "ES"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "cursor": {
            "description": "Keyset paging: send `*` for the first page, then each response's `nextCursor` with the same criteria. Never together with `page`.",
            "example": "*",
            "maxLength": 4096,
            "type": "string"
          },
          "features": {
            "description": "Required amenities: a list of 1 to 30 feature slugs (every one required), or the legacy object of eight booleans.",
            "example": [
              "pool",
              "sea_view"
            ],
            "oneOf": [
              {
                "items": {
                  "enum": [
                    "pool",
                    "sea_view",
                    "garage",
                    "terrace",
                    "garden",
                    "air_conditioning",
                    "lift",
                    "beachfront",
                    "frontline_golf",
                    "panoramic_views",
                    "gated_complex",
                    "storage_room",
                    "built_in_wardrobes",
                    "luxury"
                  ],
                  "type": "string"
                },
                "type": "array"
              },
              {
                "$ref": "#/components/schemas/FeaturesDto"
              }
            ]
          },
          "ids": {
            "description": "Fetch these listing ids (other filters still apply).",
            "example": [
              "2b9d6c1e-8f7a-4c3b-9e21-5a4d3c2b1a09"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "limit": {
            "default": 20,
            "description": "Listings per page (1-100).",
            "example": 24,
            "maximum": 100,
            "minimum": 1,
            "type": "number"
          },
          "listingType": {
            "description": "Values: `sale`, `rent`, `sale_or_rent`, `fraction`.",
            "example": [
              "sale"
            ],
            "items": {
              "enum": [
                "sale",
                "rent",
                "sale_or_rent",
                "fraction"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "livingArea": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RangeDto"
              }
            ],
            "description": "Living area between `min` and `max`."
          },
          "location": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LocationDto"
              }
            ],
            "description": "Listings within a radius of a point."
          },
          "organizationId": {
            "deprecated": true,
            "description": "Ignored on this route (the organization always comes from the key or session).",
            "example": null,
            "type": "string"
          },
          "page": {
            "default": 1,
            "description": "Legacy page number (1-indexed) when `cursor` is not sent.",
            "example": 1,
            "minimum": 1,
            "type": "number"
          },
          "plotArea": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RangeDto"
              }
            ],
            "description": "Plot area between `min` and `max`."
          },
          "polygon": {
            "description": "Drawn area: a GeoJSON ring of at least three `[longitude, latitude]` pairs.",
            "example": [
              [
                -4.95,
                36.5
              ],
              [
                -4.85,
                36.5
              ],
              [
                -4.85,
                36.55
              ]
            ],
            "items": {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "type": "array"
          },
          "price": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RangeDto"
              }
            ],
            "description": "Price between `min` and `max`, in the listing currency.",
            "example": {
              "max": 2000000,
              "min": 500000
            }
          },
          "priceDistribution": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PriceDistributionDto"
              }
            ],
            "description": "Also return a price histogram of every match (all filters but price)."
          },
          "propertyCategory": {
            "description": "Any of these categories.",
            "example": [
              "residential"
            ],
            "items": {
              "enum": [
                "residential",
                "commercial",
                "industrial",
                "land"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "propertyType": {
            "description": "Any of these property types (see the listing `propertyType` field for meanings).",
            "example": [
              "house_detached",
              "penthouse"
            ],
            "items": {
              "enum": [
                "apartment",
                "condominium",
                "house_detached",
                "house_semi_detached",
                "house_terraced",
                "townhouse",
                "multi_family_home",
                "penthouse",
                "studio",
                "land_residential",
                "land_commercial",
                "land_agricultural",
                "land_other",
                "office",
                "retail",
                "commercial_other",
                "industrial_warehouse",
                "industrial_other",
                "hospitality",
                "other"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "query": {
            "description": "Free text in web-search syntax: words (all must match, accents ignored), \"quoted phrases\", -exclusion and OR. Matches reference, title, places, type, description, amenities and street address. Numbers are not read as bedrooms or prices: use the filters.",
            "example": "villa \"sea views\" -golf",
            "type": "string"
          },
          "referenceNumbers": {
            "description": "Exact listing references.",
            "example": [
              "FDR-7K2M9QXA"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "region": {
            "description": "Regions, as `stats/aggregations` lists them.",
            "example": [
              "Costa del Sol"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "scope": {
            "description": "Whose listings to search. Values: `network` (every agency's ACTIVE listings; other agencies' rows without private fields); `own` (your agency's listings in any status); `partners` (the ACTIVE listings of your agency's partners; dashboard sessions only, an API key gets a 400 `PROPERTY_FILTER_UNSUPPORTED`); `followed` (the ACTIVE listings of the agencies you follow; dashboard sessions only, same 400 for an API key). Omitted: `network`, or `own` when `status` asks for a non-active status.",
            "enum": [
              "own",
              "network",
              "partners",
              "followed"
            ],
            "example": "network",
            "type": "string"
          },
          "sort": {
            "description": "Order of results. With a `query` and no sort, results are ranked by relevance.",
            "example": [
              {
                "field": "price",
                "order": "asc"
              }
            ],
            "items": {
              "$ref": "#/components/schemas/SortDto"
            },
            "type": "array"
          },
          "sortBy": {
            "deprecated": true,
            "description": "Legacy single sort field; prefer `sort`.",
            "enum": [
              "price",
              "createdAt",
              "updatedAt",
              "publishedAt",
              "bedrooms",
              "bathrooms",
              "livingArea",
              "plotArea",
              "commission",
              "yearBuilt",
              "city",
              "countryCode",
              "referenceNumber",
              "status",
              "propertyType",
              "propertyCategory",
              "listingType",
              "relevance"
            ],
            "example": "price",
            "type": "string"
          },
          "sortOrder": {
            "deprecated": true,
            "description": "Legacy sort order for `sortBy`.",
            "enum": [
              "asc",
              "desc"
            ],
            "example": "asc",
            "type": "string"
          },
          "status": {
            "description": "Listing statuses. Anything but `active` searches your own listings only.",
            "example": [
              "active"
            ],
            "items": {
              "enum": [
                "active",
                "inactive",
                "pending",
                "sold",
                "rented",
                "deleted"
              ],
              "type": "string"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "PropertySearchPageDto": {
        "properties": {
          "nextCursor": {
            "description": "Send as `cursor` with the same criteria for the next page; absent on the last page.",
            "example": "eyJ2IjoxLCJpdiI6Ii4uLiJ9",
            "type": "string"
          },
          "priceDistribution": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PriceDistributionResultDto"
              }
            ],
            "description": "Only when `priceDistribution` was requested."
          },
          "relaxedFilters": {
            "description": "Filters loosened because the exact search found nothing (network searches only).",
            "example": [
              "bedrooms"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "results": {
            "description": "One page of listings. Other agencies' rows are the network projection.",
            "items": {
              "$ref": "#/components/schemas/ListingResponseDto"
            },
            "type": "array"
          },
          "total": {
            "description": "Number of matches, counted up to 10,000; first page only; absent on map (boundingBox) searches.",
            "example": 142,
            "type": "number"
          },
          "totalIsLowerBound": {
            "description": "True when more than 10,000 listings match (`total` is then 10,000).",
            "example": false,
            "type": "boolean"
          }
        },
        "required": [
          "results"
        ],
        "type": "object"
      },
      "PropertySearchResponseDto": {
        "properties": {
          "priceDistribution": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PriceDistributionResultDto"
              }
            ],
            "description": "Only when `priceDistribution` was requested."
          },
          "relaxedFilters": {
            "description": "Filters loosened because the exact search found nothing (network searches only).",
            "example": [
              "bedrooms"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "results": {
            "description": "One page of listings. Other agencies' rows are the network projection.",
            "items": {
              "$ref": "#/components/schemas/ListingResponseDto"
            },
            "type": "array"
          },
          "total": {
            "description": "Exact number of matches (page-based envelope).",
            "example": 142,
            "type": "number"
          }
        },
        "required": [
          "results",
          "total"
        ],
        "type": "object"
      },
      "PropertyThumbnailDto": {
        "properties": {
          "alt": {
            "description": "Alternative text.",
            "example": "Pool terrace at sunset",
            "type": "string"
          },
          "order": {
            "description": "Display position, 0 first.",
            "example": 0,
            "type": "number"
          },
          "originalImageIndex": {
            "description": "Index in `images` of the photo this thumbnail shows.",
            "example": 0,
            "type": "number"
          },
          "url": {
            "description": "Thumbnail URL (WebP, up to 400x225) from `POST /properties/media/upload` `images.thumbnail`.",
            "example": "https://fondaro.fra1.cdn.digitaloceanspaces.com/properties/thumbnails/0f8c2d1e.webp",
            "type": "string"
          }
        },
        "required": [
          "url",
          "order",
          "originalImageIndex"
        ],
        "type": "object"
      },
      "RangeDto": {
        "properties": {
          "max": {
            "description": "Upper bound, inclusive.",
            "example": 4,
            "type": "number"
          },
          "min": {
            "description": "Lower bound, inclusive.",
            "example": 2,
            "type": "number"
          }
        },
        "type": "object"
      },
      "SetListingPublicationsDto": {
        "properties": {
          "portals": {
            "description": "The complete set of portals the listing should be published to (replaces the current set; `[]` unpublishes everywhere). `GET /properties/portals` lists the portals and what each needs.",
            "example": [
              "kyero"
            ],
            "items": {
              "enum": [
                "jamesedition",
                "kyero",
                "thinkspain",
                "a_place_in_the_sun",
                "properstar",
                "spain_property_portal",
                "spainhouses",
                "indomio",
                "arkadia",
                "trovit",
                "mitula",
                "nestoria",
                "nuroa",
                "green_acres",
                "homesgofast",
                "idealista",
                "fotocasa",
                "habitaclia",
                "pisos_com",
                "rightmove",
                "zoopla"
              ],
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "portals"
        ],
        "type": "object"
      },
      "SortDto": {
        "properties": {
          "field": {
            "description": "Field to order by. `relevance` ranks by the `query` match (exact reference first); without a query it is newest first.",
            "enum": [
              "price",
              "createdAt",
              "updatedAt",
              "publishedAt",
              "bedrooms",
              "bathrooms",
              "livingArea",
              "plotArea",
              "commission",
              "yearBuilt",
              "city",
              "countryCode",
              "referenceNumber",
              "status",
              "propertyType",
              "propertyCategory",
              "listingType",
              "relevance"
            ],
            "example": "price",
            "type": "string"
          },
          "order": {
            "default": "desc",
            "description": "Values: `asc` (smallest or oldest first); `desc` (largest or newest first).",
            "enum": [
              "asc",
              "desc"
            ],
            "example": "asc",
            "type": "string"
          }
        },
        "required": [
          "field"
        ],
        "type": "object"
      },
      "UpdateAgentDto": {
        "properties": {
          "additionalInfo": {
            "description": "Free-form extra data.",
            "example": {
              "languages": [
                "en",
                "es"
              ]
            },
            "type": "object"
          },
          "avatarThumbnailUrl": {
            "description": "Small avatar image URL.",
            "example": "https://img.clerk.com/avatar-thumb.png",
            "type": "string"
          },
          "avatarUrl": {
            "description": "Avatar image URL.",
            "example": "https://img.clerk.com/avatar.png",
            "type": "string"
          },
          "description": {
            "description": "Short biography.",
            "example": "Twelve years selling villas on the Golden Mile.",
            "type": "string"
          },
          "displayEmail": {
            "description": "Public email shown on listings and brochures.",
            "example": "ana@agency.example",
            "type": "string"
          },
          "firstName": {
            "description": "First name (for a Fondaro member, their account name).",
            "example": "Ana",
            "type": "string"
          },
          "isActive": {
            "description": "Active on the roster (inactive agents are hidden from listing pickers).",
            "example": true,
            "type": "boolean"
          },
          "lastName": {
            "description": "Last name.",
            "example": "García",
            "type": "string"
          },
          "phoneNumber": {
            "description": "Public phone number.",
            "example": "+34 600 000 000",
            "type": "string"
          },
          "shareContactOnNetwork": {
            "description": "Show this card's email, phone and WhatsApp to other agencies on network listings (a member sets their own; an admin any).",
            "example": false,
            "type": "boolean"
          },
          "title": {
            "description": "Job title.",
            "example": "Senior agent",
            "type": "string"
          },
          "whatsappNumber": {
            "description": "WhatsApp number.",
            "example": "+34 600 000 000",
            "type": "string"
          }
        },
        "type": "object"
      },
      "UpdatePropertyDto": {
        "properties": {
          "additionalFeatures": {
            "description": "Free-form extra facts, as key/value pairs.",
            "example": {
              "views": "panoramic"
            },
            "type": "object"
          },
          "addressLine1": {
            "description": "Street address. Shared with other agencies on the network for ACTIVE listings.",
            "example": "Calle Sierra Blanca 12",
            "type": "string"
          },
          "addressLine2": {
            "description": "Second address line (building, floor, door).",
            "example": "Urbanización Sierra Blanca",
            "type": "string"
          },
          "agentId": {
            "description": "The listing agent (an id from `GET /agents`).",
            "example": "6f1c2b3a-4d5e-4f60-8a7b-9c0d1e2f3a4b",
            "format": "uuid",
            "type": "string"
          },
          "areaUnit": {
            "description": "Unit of `livingArea` and `plotArea`. Values: `sqm` (square metres); `sqft` (square feet).",
            "enum": [
              "sqm",
              "sqft"
            ],
            "example": "sqm",
            "type": "string"
          },
          "autoRenewEnabled": {
            "description": "Renew the listing automatically when it reaches `expiresAt`.",
            "example": true,
            "type": "boolean"
          },
          "availableFrom": {
            "description": "Date the property is available (`YYYY-MM-DD`).",
            "example": "2026-11-01",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "basuraPerYear": {
            "description": "Refuse collection tax per year.",
            "example": 180,
            "nullable": true,
            "type": "number"
          },
          "bathrooms": {
            "description": "Number of bathrooms (one decimal, so 2.5 is allowed).",
            "example": 4,
            "type": "number"
          },
          "bedrooms": {
            "description": "Number of bedrooms.",
            "example": 5,
            "type": "integer"
          },
          "city": {
            "description": "Town or city, up to 100 characters.",
            "example": "Marbella",
            "type": "string"
          },
          "co2Emissions": {
            "description": "CO₂ emissions in kg per m² per year.",
            "example": 18.2,
            "nullable": true,
            "type": "number"
          },
          "commission": {
            "description": "Your private commission percentage (0-100). Never shown to other agencies; the offer to the network is `sharedCommission`. Own listings only: absent from other agencies' rows.",
            "example": 5,
            "type": "number"
          },
          "community": {
            "description": "Neighbourhood, urbanisation or community name.",
            "example": "Sierra Blanca",
            "type": "string"
          },
          "communityFeesPerYear": {
            "description": "Community fees per year in `currency`.",
            "example": 3600,
            "nullable": true,
            "type": "number"
          },
          "completionDate": {
            "description": "Completion date of a new build (`YYYY-MM-DD`).",
            "example": "2027-06-30",
            "format": "date",
            "nullable": true,
            "type": "string"
          },
          "condition": {
            "description": "State of the property. Values: `new` (newly built, never lived in); `excellent` (excellent); `good` (good); `needs_renovation` (needs renovation); `under_construction` (still being built).",
            "enum": [
              "new",
              "excellent",
              "good",
              "needs_renovation",
              "under_construction"
            ],
            "example": "excellent",
            "nullable": true,
            "type": "string"
          },
          "countryCode": {
            "description": "ISO 3166-1 alpha-2 country code, upper case.",
            "example": "ES",
            "type": "string"
          },
          "currency": {
            "description": "ISO 4217 currency code, upper case.",
            "example": "EUR",
            "type": "string"
          },
          "description": {
            "description": "Main description, plain text with line breaks.",
            "example": "South-facing villa with sea views, a heated pool and a guest apartment.",
            "type": "string"
          },
          "energyConsumptionKwh": {
            "description": "Energy consumption in kWh per m² per year.",
            "example": 85.5,
            "nullable": true,
            "type": "number"
          },
          "energyRating": {
            "description": "EU energy performance certificate letter. Values: `A+` (best); `A` (very efficient); `B` (efficient); `C` (fairly efficient); `D` (average); `E` (below average); `F` (inefficient); `G` (least efficient); `exempt` (no certificate required); `in_progress` (certificate being issued).",
            "enum": [
              "A+",
              "A",
              "B",
              "C",
              "D",
              "E",
              "F",
              "G",
              "exempt",
              "in_progress"
            ],
            "example": "B",
            "nullable": true,
            "type": "string"
          },
          "energyRatingDetails": {
            "description": "Free-text energy certificate details.",
            "example": "Certificate issued 2024, consumption rating B.",
            "type": "string"
          },
          "features": {
            "description": "Amenity slugs from the shared catalogue (the canonical amenity list; wins over the legacy `has*` flags). Omit to keep, never null.",
            "example": [
              "pool",
              "sea_view",
              "garage"
            ],
            "items": {
              "enum": [
                "pool",
                "sea_view",
                "garage",
                "terrace",
                "garden",
                "air_conditioning",
                "lift",
                "beachfront",
                "frontline_golf",
                "panoramic_views",
                "gated_complex",
                "storage_room",
                "built_in_wardrobes",
                "luxury"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "floor": {
            "description": "Floor the unit is on (-20 to 300; 0 is the ground floor).",
            "example": 3,
            "nullable": true,
            "type": "integer"
          },
          "floorPlans": {
            "description": "Floor plan images in display order; uploaded like photos. Omit to keep, never null.",
            "items": {
              "$ref": "#/components/schemas/PropertyFloorPlanDto"
            },
            "type": "array"
          },
          "furnished": {
            "description": "Furnishing. Values: `no` (unfurnished); `partly` (partly furnished); `fully` (fully furnished).",
            "enum": [
              "no",
              "partly",
              "fully"
            ],
            "example": "partly",
            "nullable": true,
            "type": "string"
          },
          "hasAirConditioning": {
            "description": "Legacy amenity flag; `features` holds `air_conditioning` too.",
            "example": true,
            "type": "boolean"
          },
          "hasGarage": {
            "description": "Legacy amenity flag; `features` holds `garage` too.",
            "example": true,
            "type": "boolean"
          },
          "hasGarden": {
            "description": "Legacy amenity flag; `features` holds `garden` too.",
            "example": true,
            "type": "boolean"
          },
          "hasLift": {
            "description": "Legacy amenity flag; `features` holds `lift` too.",
            "example": false,
            "type": "boolean"
          },
          "hasPool": {
            "description": "Legacy amenity flag; `features` holds `pool` too.",
            "example": true,
            "type": "boolean"
          },
          "hasSeaView": {
            "description": "Legacy amenity flag; `features` holds `sea_view` too.",
            "example": true,
            "type": "boolean"
          },
          "hasTerrace": {
            "description": "Legacy amenity flag; `features` holds `terrace` too.",
            "example": true,
            "type": "boolean"
          },
          "ibiPerYear": {
            "description": "IBI (Spanish property tax) per year.",
            "example": 2100,
            "nullable": true,
            "type": "number"
          },
          "images": {
            "description": "Photos in display order. Every URL must come from `POST /properties/media/upload` (or already be on the listing). `width`/`height` are set by the server from the upload.",
            "items": {
              "$ref": "#/components/schemas/PropertyImageDto"
            },
            "type": "array"
          },
          "isExterior": {
            "description": "The unit faces the street or outside (not an inner patio).",
            "example": true,
            "nullable": true,
            "type": "boolean"
          },
          "isFurnished": {
            "description": "Legacy flag, true when `furnished` is `partly` or `fully`.",
            "example": false,
            "type": "boolean"
          },
          "isNewConstruction": {
            "description": "A new-build property.",
            "example": false,
            "type": "boolean"
          },
          "latitude": {
            "description": "Latitude in decimal degrees (-90 to 90).",
            "example": 36.5201,
            "type": "number"
          },
          "leadGroupId": {
            "description": "Internal lead plan the listing belongs to. Own listings only: absent from other agencies' rows.",
            "example": 12,
            "type": "integer"
          },
          "listingType": {
            "description": "How the property is offered. Values: `sale` (for sale; `price` is the asking price); `rent` (for rent; see `rentalPrice` and `rentalPeriod`); `sale_or_rent` (for sale or for rent); `fraction` (a fractional ownership share).",
            "enum": [
              "sale",
              "rent",
              "sale_or_rent",
              "fraction"
            ],
            "example": "sale",
            "type": "string"
          },
          "livingArea": {
            "description": "Built living area in `areaUnit`.",
            "example": 420,
            "type": "number"
          },
          "longitude": {
            "description": "Longitude in decimal degrees (-180 to 180).",
            "example": -4.9112,
            "type": "number"
          },
          "orientation": {
            "description": "Direction the main facade faces. Values: `N` (north); `NE` (north-east); `E` (east); `SE` (south-east); `S` (south); `SW` (south-west); `W` (west); `NW` (north-west).",
            "enum": [
              "N",
              "NE",
              "E",
              "SE",
              "S",
              "SW",
              "W",
              "NW"
            ],
            "example": "S",
            "nullable": true,
            "type": "string"
          },
          "parkingSpaces": {
            "description": "Number of parking spaces included.",
            "example": 2,
            "nullable": true,
            "type": "integer"
          },
          "parkingType": {
            "description": "Kind of parking. Values: `garage` (private garage); `underground` (underground space); `covered` (covered space or carport); `open` (open private space); `street` (on the street); `communal` (shared community parking).",
            "enum": [
              "garage",
              "underground",
              "covered",
              "open",
              "street",
              "communal"
            ],
            "example": "garage",
            "nullable": true,
            "type": "string"
          },
          "plotArea": {
            "description": "Plot size in `areaUnit`.",
            "example": 1500,
            "type": "number"
          },
          "postalCode": {
            "description": "Postal code, up to 20 characters.",
            "example": "29602",
            "type": "string"
          },
          "price": {
            "description": "Asking price in `currency` (two decimals).",
            "example": 2450000,
            "type": "number"
          },
          "propertyCategory": {
            "description": "Broad kind of property; `propertyType` must belong to it (`other` fits every category). Values: `residential` (homes); `commercial` (offices, shops and other business premises); `industrial` (warehouses and industrial premises); `land` (plots and land).",
            "enum": [
              "residential",
              "commercial",
              "industrial",
              "land"
            ],
            "example": "residential",
            "type": "string"
          },
          "propertyType": {
            "description": "Specific kind of property (category: meaning). Values: `apartment` (residential: flat); `condominium` (residential: condominium unit); `house_detached` (residential: detached house or villa); `house_semi_detached` (residential: semi-detached house); `house_terraced` (residential: terraced house); `townhouse` (residential: townhouse); `multi_family_home` (residential: building of several homes); `penthouse` (residential: top-floor apartment); `studio` (residential: studio apartment); `land_residential` (land: plot zoned for homes); `land_commercial` (land: plot zoned for business); `land_agricultural` (land: rural or agricultural land); `land_other` (land: other); `office` (commercial: office); `retail` (commercial: shop or retail unit); `commercial_other` (commercial: other); `industrial_warehouse` (industrial: warehouse); `industrial_other` (industrial: other); `hospitality` (commercial: hotel, restaurant or similar); `other` (any category: other).",
            "enum": [
              "apartment",
              "condominium",
              "house_detached",
              "house_semi_detached",
              "house_terraced",
              "townhouse",
              "multi_family_home",
              "penthouse",
              "studio",
              "land_residential",
              "land_commercial",
              "land_agricultural",
              "land_other",
              "office",
              "retail",
              "commercial_other",
              "industrial_warehouse",
              "industrial_other",
              "hospitality",
              "other"
            ],
            "example": "house_detached",
            "type": "string"
          },
          "provinceState": {
            "description": "Province or state.",
            "example": "Málaga",
            "type": "string"
          },
          "region": {
            "description": "Region or area (a coast, a valley).",
            "example": "Costa del Sol",
            "type": "string"
          },
          "rentalPeriod": {
            "description": "What `rentalPrice` is charged per. Values: `day` (per night or day); `week` (per week); `month` (per month); `year` (per year).",
            "enum": [
              "day",
              "week",
              "month",
              "year"
            ],
            "example": "month",
            "nullable": true,
            "type": "string"
          },
          "rentalPrice": {
            "description": "Rent in `currency` per `rentalPeriod`.",
            "example": 6500,
            "nullable": true,
            "type": "number"
          },
          "rentalPriceHighSeason": {
            "description": "High-season rent per `rentalPeriod`.",
            "example": 9000,
            "nullable": true,
            "type": "number"
          },
          "rentalPriceLowSeason": {
            "description": "Low-season rent per `rentalPeriod`.",
            "example": 4500,
            "nullable": true,
            "type": "number"
          },
          "sharedCommission": {
            "description": "Commission percentage your agency offers another agency that sells the property (0-100). Visible to every agency on the network.",
            "example": 2.5,
            "nullable": true,
            "type": "number"
          },
          "sharedCommissionNotes": {
            "description": "Terms of the shared commission, visible to the network.",
            "example": "50/50 split on the agreed fee, paid on completion.",
            "nullable": true,
            "type": "string"
          },
          "status": {
            "description": "Publication state. Values: `active` (published and visible to every agency on the network); `inactive` (draft or paused, visible only to your agency); `pending` (under offer or awaiting approval, yours only); `sold` (sold, yours only); `rented` (let, yours only); `deleted` (removed, yours only).",
            "enum": [
              "active",
              "inactive",
              "pending",
              "sold",
              "rented",
              "deleted"
            ],
            "example": "active",
            "type": "string"
          },
          "thumbnails": {
            "description": "Small versions of `images` (the upload returns one per photo); `originalImageIndex` points at the image.",
            "items": {
              "$ref": "#/components/schemas/PropertyThumbnailDto"
            },
            "type": "array"
          },
          "title": {
            "description": "Headline shown above the price, up to 140 characters.",
            "example": "Modern villa with sea views in Sierra Blanca",
            "nullable": true,
            "type": "string"
          },
          "totalFloors": {
            "description": "Floors in the building.",
            "example": 6,
            "nullable": true,
            "type": "integer"
          },
          "translatedDescriptions": {
            "description": "The description in other languages, keyed by language code (`es`, `de`, `fr`...).",
            "example": {
              "es": "Villa orientada al sur con vistas al mar."
            },
            "type": "object"
          },
          "translatedTitles": {
            "description": "The title in other languages, keyed by language code.",
            "example": {
              "es": "Villa moderna con vistas al mar en Sierra Blanca"
            },
            "nullable": true,
            "type": "object"
          },
          "videoUrls": {
            "description": "Video links (http or https). Omit to keep, never null.",
            "example": [
              "https://www.youtube.com/watch?v=abc123"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "viewingInstructions": {
            "description": "Private notes for arranging viewings. Never shared. Own listings only: absent from other agencies' rows.",
            "example": "Keys at the office; call the owner a day ahead.",
            "nullable": true,
            "type": "string"
          },
          "virtualTourUrls": {
            "description": "Virtual tour links (http or https). Omit to keep, never null.",
            "example": [
              "https://my.matterport.com/show/?m=abc123"
            ],
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "yearBuilt": {
            "description": "Year of construction (1801 up to a few years ahead).",
            "example": 2018,
            "type": "integer"
          }
        },
        "type": "object"
      }
    },
    "securitySchemes": {
      "ApiKeyAuthorization": {
        "description": "The value `ApiKey fondaro_pk_…`.",
        "in": "header",
        "name": "Authorization",
        "type": "apiKey"
      },
      "ApiKeyHeader": {
        "description": "Your property API key (`fondaro_pk_…`).",
        "in": "header",
        "name": "X-API-Key",
        "type": "apiKey"
      }
    }
  },
  "info": {
    "contact": {},
    "description": "Read and manage Fondaro MLS listings, upload listing photos, read your agent roster and browse your connected property sources.\n\n**Authentication.** Send your key as `X-API-Key: fondaro_pk_…` or `Authorization: ApiKey fondaro_pk_…`. Never send a key as a Bearer token. Keys are created by an organization admin under Integrations → API keys.\n\n**Scopes.** Each operation names the scope an API key needs (`x-required-scopes`); a key without it gets 403 `API_KEY_SCOPE_MISSING`.\n\n- `properties:read`: Search and read Fondaro MLS listings, counts, aggregations and themes.\n- `properties:write`: Create, update, renew and delete your own listings, set their portal publications and generate listing descriptions.\n- `media:write`: Upload listing images (POST /properties/media/upload) to reference from a listing.\n- `agents:read`: Reserved for reading your organization's agent roster (`/agents` accepts dashboard sessions only today).\n- `sources:read`: Browse connected property sources through /property-sources (Fondaro MLS and every source your organization has connected).\n\n**Browser use.** A key with allowed origins answers 403 `API_KEY_ORIGIN_NOT_ALLOWED` to a browser request from any other origin. Only put a read-only key with allowed origins in client-side code.\n\n**Rate limits.** Per key and endpoint: 120 requests a minute, 600 per 10 minutes and 3,000 an hour unless your key has a raised limit. A 429 carries `Retry-After`.\n\n**Network listings.** Another agency's ACTIVE listing is returned without its private commission, viewing instructions or lead plan, and its agent card shows contact details only when the agent shares them.",
    "title": "Fondaro MLS API",
    "version": "v1"
  },
  "openapi": "3.0.0",
  "paths": {
    "/agents": {
      "get": {
        "description": "Clerk session only: not available to API keys.",
        "operationId": "Agents_findAll",
        "parameters": [
          {
            "description": "Only active (`true`) or inactive (`false`) agents.",
            "in": "query",
            "name": "isActive",
            "required": false,
            "schema": {
              "example": true,
              "type": "boolean"
            }
          },
          {
            "description": "Case-insensitive match on name or email.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "example": "ana",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/AgentResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "List your organization's agents",
        "tags": [
          "Agents"
        ]
      }
    },
    "/agents/standalone": {
      "post": {
        "description": "An agent card with no Fondaro account (for example an external collaborator). Members of your organization get their row automatically. Clerk session only: not available to API keys.",
        "operationId": "Agents_createStandalone",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateStandaloneAgentDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Create a standalone agent",
        "tags": [
          "Agents"
        ]
      }
    },
    "/agents/{id}": {
      "delete": {
        "description": "Clerk session only: not available to API keys.",
        "operationId": "Agents_remove",
        "parameters": [
          {
            "description": "Agent id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "`{ \"success\": true }`"
          }
        },
        "summary": "Delete an agent",
        "tags": [
          "Agents"
        ]
      },
      "get": {
        "description": "Clerk session only: not available to API keys.",
        "operationId": "Agents_findOne",
        "parameters": [
          {
            "description": "Agent id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Get one agent",
        "tags": [
          "Agents"
        ]
      },
      "put": {
        "description": "Name, photo and network contact sharing of a Fondaro member's card can be changed only by an organization admin or that member. Clerk session only: not available to API keys.",
        "operationId": "Agents_update",
        "parameters": [
          {
            "description": "Agent id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateAgentDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Update an agent",
        "tags": [
          "Agents"
        ]
      }
    },
    "/agents/{id}/avatar": {
      "delete": {
        "description": "Clerk session only: not available to API keys.",
        "operationId": "Agents_deleteAvatar",
        "parameters": [
          {
            "description": "Agent id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Remove an agent's photo",
        "tags": [
          "Agents"
        ]
      },
      "post": {
        "description": "Clerk session only: not available to API keys.",
        "operationId": "Agents_uploadAvatar",
        "parameters": [
          {
            "description": "Agent id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "properties": {
                  "avatar": {
                    "description": "JPEG, PNG, WebP or GIF.",
                    "format": "binary",
                    "type": "string"
                  }
                },
                "required": [
                  "avatar"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Upload an agent's photo (up to 5 MB)",
        "tags": [
          "Agents"
        ]
      }
    },
    "/agents/{id}/from-email": {
      "put": {
        "description": "Any valid address. Email is sent from the person's connected mailbox, not this address. Clerk session only: not available to API keys.",
        "operationId": "Agents_setFromEmail",
        "parameters": [
          {
            "description": "Agent id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "displayEmail": {
                    "description": "The public contact address.",
                    "example": "ana@youragency.com",
                    "nullable": true,
                    "type": "string"
                  }
                },
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgentResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "summary": "Set an agent's public contact address (admins)",
        "tags": [
          "Agents"
        ]
      }
    },
    "/properties": {
      "post": {
        "description": "Upload photos first (`POST /properties/media/upload`) and reference the returned URLs. API keys need the `properties:write` scope.",
        "operationId": "Properties_create",
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreatePropertyDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListingResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Create a listing",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:write"
        ]
      }
    },
    "/properties/expiring/soon": {
      "get": {
        "description": "API keys need the `properties:read` scope.",
        "operationId": "Properties_getExpiringProperties",
        "parameters": [
          {
            "description": "Only listings assigned to any of these people (Clerk user ids, repeat the key). Each id is matched to the roster row in your own agency. Absent means every listing.",
            "in": "query",
            "name": "agentUserIds",
            "required": false,
            "schema": {
              "example": [
                "user_2abc"
              ],
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Window in days (default 30).",
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "example": 30,
              "type": "number"
            }
          },
          {
            "description": "Also list listings that have already expired (inactive, expired within the last 90 days), so they can be renewed. Default false.",
            "in": "query",
            "name": "includeExpired",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ListingResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "List your listings expiring soon",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:read"
        ]
      }
    },
    "/properties/media/upload": {
      "post": {
        "description": "Multipart upload of one image (field `file`, up to 20 MB). Returns a full-size JPEG (up to 1920x1080) and a WebP thumbnail (up to 400x225) hosted by Fondaro; put `images.fullSize` in a listing `images[].url` and `images.thumbnail` in `thumbnails[].url`. Listings accept only uploaded image URLs. API keys need the `media:write` scope.",
        "operationId": "Media_uploadPropertyImage",
        "parameters": [],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "properties": {
                  "file": {
                    "description": "The image (any image/* type).",
                    "format": "binary",
                    "type": "string"
                  }
                },
                "required": [
                  "file"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "images": {
                      "properties": {
                        "fullSize": {
                          "example": "https://fondaro.fra1.cdn.digitaloceanspaces.com/properties/images/0f8c2d1e.jpg",
                          "type": "string"
                        },
                        "thumbnail": {
                          "example": "https://fondaro.fra1.cdn.digitaloceanspaces.com/properties/thumbnails/0f8c2d1e.webp",
                          "type": "string"
                        }
                      },
                      "type": "object"
                    },
                    "metadata": {
                      "description": "Upload id, original file name and size, and original, full-size and thumbnail dimensions.",
                      "type": "object"
                    },
                    "success": {
                      "example": true,
                      "type": "boolean"
                    }
                  },
                  "type": "object"
                }
              }
            },
            "description": "The hosted image URLs and their dimensions."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Upload one listing photo",
        "tags": [
          "Media"
        ],
        "x-required-scopes": [
          "media:write"
        ]
      }
    },
    "/properties/portals": {
      "get": {
        "description": "API keys need the `properties:read` scope.",
        "operationId": "Properties_getPortalCatalog",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Portal catalogue: id, name, what each portal requires."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "List the portals a listing can be published to",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:read"
        ]
      }
    },
    "/properties/search": {
      "post": {
        "description": "Structured filters plus ranked free text. Send `cursor: \"*\"` for keyset pages (`nextCursor`, total capped at 10,000); without `cursor` the legacy `page`/`total` envelope is returned. Other agencies' rows are the network projection. API keys need the `properties:read` scope.",
        "operationId": "Properties_search",
        "parameters": [
          {
            "deprecated": true,
            "description": "Legacy spelling of `scope: \"own\"`.",
            "in": "query",
            "name": "filterByOrganization",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "includeAdCount",
            "required": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "includeAdCreatives",
            "required": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Add `organizationBranding` and the `agent` card to each row.",
            "in": "query",
            "name": "includeBranding",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PropertySearchDto"
              }
            }
          },
          "required": false
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/PropertySearchPageDto"
                    },
                    {
                      "$ref": "#/components/schemas/PropertySearchResponseDto"
                    }
                  ]
                }
              }
            },
            "description": "A page of listings: `PropertySearchPageDto` when `cursor` was sent, else `PropertySearchResponseDto`."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Search Fondaro MLS listings",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:read"
        ]
      }
    },
    "/properties/stats/aggregations": {
      "get": {
        "description": "Builds location menus and filter dropdowns. Network-wide ACTIVE counts unless `filterByOrganization=true` or a non-active `status`; cached 5 minutes. `q` narrows towns and regions and adds matching communities. API keys need the `properties:read` scope.",
        "operationId": "Properties_getPropertyAggregations",
        "parameters": [
          {
            "description": "Limit to these towns.",
            "in": "query",
            "name": "city",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Limit to these country codes.",
            "in": "query",
            "name": "countryCode",
            "required": false,
            "schema": {
              "example": "ES",
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Count only your own listings.",
            "in": "query",
            "name": "filterByOrganization",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Place picker text (accents ignored).",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "example": "sierra",
              "type": "string"
            }
          },
          {
            "description": "Limit to these regions.",
            "in": "query",
            "name": "region",
            "required": false,
            "schema": {
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          {
            "description": "Default `active`; any other status counts your own listings only.",
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "enum": [
                "active",
                "inactive",
                "pending",
                "sold",
                "rented",
                "deleted"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PropertyAggregationsResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Count listings per town, region, country and type",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:read"
        ]
      }
    },
    "/properties/stats/counts": {
      "get": {
        "description": "API keys need the `properties:read` scope.",
        "operationId": "Properties_getStatusCounts",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Listings per status, e.g. `{ \"active\": 12, \"inactive\": 3 }`."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Count your listings per status",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:read"
        ]
      }
    },
    "/properties/themes": {
      "get": {
        "description": "API keys need the `properties:read` scope.",
        "operationId": "Properties_getAvailableThemes",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Theme name, label, description, preview colours and font."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "List the brochure themes",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:read"
        ]
      }
    },
    "/properties/{id}": {
      "delete": {
        "description": "API keys need the `properties:write` scope.",
        "operationId": "Properties_remove",
        "parameters": [
          {
            "description": "Your listing id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "`{ \"success\": true }`"
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Delete one of your listings",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:write"
        ]
      },
      "get": {
        "description": "Your own listing in any status, or another agency's ACTIVE listing (network projection). Anything else is a 404. API keys need the `properties:read` scope.",
        "operationId": "Properties_findOne",
        "parameters": [
          {
            "description": "Listing id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "filterByOrganization",
            "required": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "includeAdCount",
            "required": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "includeAdCreatives",
            "required": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Add agency branding and the agent card.",
            "in": "query",
            "name": "includeBranding",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListingResponseDto"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": "No such listing visible to you."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Get one listing",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:read"
        ]
      },
      "put": {
        "description": "Send only the fields to change. API keys need the `properties:write` scope.",
        "operationId": "Properties_update",
        "parameters": [
          {
            "description": "Your listing id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdatePropertyDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListingResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Update one of your listings",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:write"
        ]
      }
    },
    "/properties/{id}/ad-creatives": {
      "get": {
        "description": "API keys need the `properties:read` scope.",
        "operationId": "Properties_getPropertyAdCreatives",
        "parameters": [
          {
            "description": "Your listing id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ad creative summaries."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "List the ad creatives of one of your listings",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:read"
        ]
      }
    },
    "/properties/{id}/publications": {
      "put": {
        "description": "Replaces the whole set. Returns the publication state per portal. API keys need the `properties:write` scope.",
        "operationId": "Properties_setListingPublications",
        "parameters": [
          {
            "description": "Your listing id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetListingPublicationsDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Publication state per portal."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Set the portals one of your listings is published to",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:write"
        ]
      }
    },
    "/properties/{id}/renew": {
      "put": {
        "description": "API keys need the `properties:write` scope.",
        "operationId": "Properties_renewProperty",
        "parameters": [
          {
            "description": "Your listing id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListingResponseDto"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Renew one of your listings for two more months",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:write"
        ]
      }
    },
    "/properties/{id}/similar": {
      "get": {
        "description": "Seven progressively broader tiers (same town, type, bedrooms and price band first). Other agencies' rows are projected. API keys need the `properties:read` scope.",
        "operationId": "Properties_findSimilar",
        "parameters": [
          {
            "description": "Listing id.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "filterByOrganization",
            "required": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "includeAdCount",
            "required": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "includeAdCreatives",
            "required": true,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "Add agency branding and the agent card.",
            "in": "query",
            "name": "includeBranding",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "description": "How many (default 5).",
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "example": 6,
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ListingResponseDto"
                  },
                  "type": "array"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Find listings similar to one listing",
        "tags": [
          "Fondaro MLS listings"
        ],
        "x-required-scopes": [
          "properties:read"
        ]
      }
    },
    "/property-sources": {
      "get": {
        "description": "Every source with its descriptor (filters it supports, view modes, detail and brochure flags) and whether your organization is connected. `internal` is Fondaro MLS. API keys need the `sources:read` scope.",
        "operationId": "PropertySources_list",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Source catalogue."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "List property sources",
        "tags": [
          "Property sources"
        ],
        "x-required-scopes": [
          "sources:read"
        ]
      }
    },
    "/property-sources/{source}/detail/{id}": {
      "get": {
        "description": "Detail by the `ref.id` a search returned (for Fondaro MLS, the listing uuid). API keys need the `sources:read` scope.",
        "operationId": "PropertySources_detail",
        "parameters": [
          {
            "description": "The `ref.id` from a search row.",
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Source id: `internal` (Fondaro MLS), `resales_online`, `zoddak`, `inmobalia` or a portal id. All: `internal`, `resales_online`, `zoddak`, `inmobalia`, `idealista`, `rightmove`, `immobiliare`, `immoscout`, `funda`, `zoopla`, `seloger`, `otodom`, `immowelt`, `realtor`, `homes`, `trulia`, `propertyfinder`, `dubizzle`, `centris`, `loopnet`, `zillow`, `redfin`, `bayut`.",
            "in": "path",
            "name": "source",
            "required": true,
            "schema": {
              "example": "internal",
              "type": "string"
            }
          },
          {
            "description": "The `ref.country` from the search row, when it has one.",
            "in": "query",
            "name": "country",
            "required": false,
            "schema": {}
          }
        ],
        "responses": {
          "200": {
            "description": "The unified listing."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Get one listing from a property source",
        "tags": [
          "Property sources"
        ],
        "x-required-scopes": [
          "sources:read"
        ]
      }
    },
    "/property-sources/{source}/locations": {
      "get": {
        "description": "Type-ahead places. Send the returned opaque location ids back as `locationIds` in a search. Each row names its `type`; Fondaro MLS returns `region`, `city` and `community` rows (a community names its town as `parent`). API keys need the `sources:read` scope.",
        "operationId": "PropertySources_locations",
        "parameters": [
          {
            "description": "Source id: `internal` (Fondaro MLS), `resales_online`, `zoddak`, `inmobalia` or a portal id. All: `internal`, `resales_online`, `zoddak`, `inmobalia`, `idealista`, `rightmove`, `immobiliare`, `immoscout`, `funda`, `zoopla`, `seloger`, `otodom`, `immowelt`, `realtor`, `homes`, `trulia`, `propertyfinder`, `dubizzle`, `centris`, `loopnet`, `zillow`, `redfin`, `bayut`.",
            "in": "path",
            "name": "source",
            "required": true,
            "schema": {
              "example": "internal",
              "type": "string"
            }
          },
          {
            "description": "ISO country code, for sources that cover several countries.",
            "in": "query",
            "name": "country",
            "required": false,
            "schema": {}
          },
          {
            "description": "Text to match.",
            "in": "query",
            "name": "q",
            "required": true,
            "schema": {
              "example": "marb"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching locations with opaque ids."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Look up locations in a property source",
        "tags": [
          "Property sources"
        ],
        "x-required-scopes": [
          "sources:read"
        ]
      }
    },
    "/property-sources/{source}/options/{facet}": {
      "get": {
        "description": "For example the property types a source understands. API keys need the `sources:read` scope.",
        "operationId": "PropertySources_options",
        "parameters": [
          {
            "description": "Filter name, e.g. `propertyType`.",
            "in": "path",
            "name": "facet",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Source id: `internal` (Fondaro MLS), `resales_online`, `zoddak`, `inmobalia` or a portal id. All: `internal`, `resales_online`, `zoddak`, `inmobalia`, `idealista`, `rightmove`, `immobiliare`, `immoscout`, `funda`, `zoopla`, `seloger`, `otodom`, `immowelt`, `realtor`, `homes`, `trulia`, `propertyfinder`, `dubizzle`, `centris`, `loopnet`, `zillow`, `redfin`, `bayut`.",
            "in": "path",
            "name": "source",
            "required": true,
            "schema": {
              "example": "internal",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The facet values."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "List the values of one filter of a property source",
        "tags": [
          "Property sources"
        ],
        "x-required-scopes": [
          "sources:read"
        ]
      }
    },
    "/property-sources/{source}/search": {
      "post": {
        "description": "Strict search: a filter the source cannot apply is a 400, never silently dropped. Continue with the returned `nextCursor`; reset it when the source or criteria change. Page size at most 20. API keys need the `sources:read` scope.",
        "operationId": "PropertySources_search",
        "parameters": [
          {
            "description": "Source id: `internal` (Fondaro MLS), `resales_online`, `zoddak`, `inmobalia` or a portal id. All: `internal`, `resales_online`, `zoddak`, `inmobalia`, `idealista`, `rightmove`, `immobiliare`, `immoscout`, `funda`, `zoopla`, `seloger`, `otodom`, `immowelt`, `realtor`, `homes`, `trulia`, `propertyfinder`, `dubizzle`, `centris`, `loopnet`, `zillow`, `redfin`, `bayut`.",
            "in": "path",
            "name": "source",
            "required": true,
            "schema": {
              "example": "internal",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "agentUserId": {
                    "description": "Fondaro MLS, dashboard sessions only: one agent's network listings (their user id). Narrows `network`; `own` refuses it.",
                    "maxLength": 200,
                    "minLength": 1,
                    "type": "string"
                  },
                  "country": {
                    "description": "ISO country code for sources that cover several countries.",
                    "maxLength": 10,
                    "minLength": 1,
                    "type": "string"
                  },
                  "cursor": {
                    "description": "The `nextCursor` of the previous page; same criteria.",
                    "maxLength": 4000,
                    "minLength": 1,
                    "type": "string"
                  },
                  "features": {
                    "description": "Required amenities, as the source names them.",
                    "items": {
                      "maxLength": 160,
                      "minLength": 1,
                      "type": "string"
                    },
                    "maxItems": 30,
                    "minItems": 1,
                    "type": "array"
                  },
                  "geo": {
                    "anyOf": [
                      {
                        "oneOf": [
                          {
                            "additionalProperties": false,
                            "properties": {
                              "kind": {
                                "enum": [
                                  "circle"
                                ],
                                "type": "string"
                              },
                              "latitude": {
                                "maximum": 90,
                                "minimum": -90,
                                "type": "number"
                              },
                              "longitude": {
                                "maximum": 180,
                                "minimum": -180,
                                "type": "number"
                              },
                              "radiusKm": {
                                "exclusiveMinimum": true,
                                "minimum": 0,
                                "type": "number"
                              }
                            },
                            "required": [
                              "kind",
                              "latitude",
                              "longitude",
                              "radiusKm"
                            ],
                            "type": "object"
                          },
                          {
                            "additionalProperties": false,
                            "properties": {
                              "coordinates": {
                                "items": {
                                  "items": {
                                    "type": "number"
                                  },
                                  "maxItems": 2,
                                  "minItems": 2,
                                  "type": "array"
                                },
                                "maxItems": 200,
                                "minItems": 3,
                                "type": "array"
                              },
                              "kind": {
                                "enum": [
                                  "polygon"
                                ],
                                "type": "string"
                              }
                            },
                            "required": [
                              "kind",
                              "coordinates"
                            ],
                            "type": "object"
                          }
                        ]
                      },
                      {
                        "additionalProperties": false,
                        "properties": {
                          "kind": {
                            "enum": [
                              "boundingBox"
                            ],
                            "type": "string"
                          },
                          "northEast": {
                            "additionalProperties": false,
                            "properties": {
                              "latitude": {
                                "maximum": 90,
                                "minimum": -90,
                                "type": "number"
                              },
                              "longitude": {
                                "maximum": 180,
                                "minimum": -180,
                                "type": "number"
                              }
                            },
                            "required": [
                              "latitude",
                              "longitude"
                            ],
                            "type": "object"
                          },
                          "southWest": {
                            "additionalProperties": false,
                            "properties": {
                              "latitude": {
                                "maximum": 90,
                                "minimum": -90,
                                "type": "number"
                              },
                              "longitude": {
                                "maximum": 180,
                                "minimum": -180,
                                "type": "number"
                              }
                            },
                            "required": [
                              "latitude",
                              "longitude"
                            ],
                            "type": "object"
                          }
                        },
                        "required": [
                          "kind",
                          "northEast",
                          "southWest"
                        ],
                        "type": "object"
                      }
                    ],
                    "description": "A circle (`kind: circle`, `radiusKm`), a drawn polygon (`kind: polygon`) or a map box (`kind: boundingBox`)."
                  },
                  "limit": {
                    "description": "Rows per page, 1 to 20.",
                    "maximum": 20,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "listingTypes": {
                    "description": "Values: `sale`, `rent`, `sale_or_rent`, `fraction`.",
                    "items": {
                      "enum": [
                        "sale",
                        "rent",
                        "sale_or_rent",
                        "fraction"
                      ],
                      "type": "string"
                    },
                    "maxItems": 20,
                    "minItems": 1,
                    "type": "array"
                  },
                  "locationIds": {
                    "description": "Opaque location ids from `GET /property-sources/{source}/locations`.",
                    "items": {
                      "maxLength": 1200,
                      "minLength": 1,
                      "type": "string"
                    },
                    "maxItems": 20,
                    "minItems": 1,
                    "type": "array"
                  },
                  "locations": {
                    "description": "Dashboard sessions only (API keys send `locationIds`).",
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "country": {
                          "maxLength": 10,
                          "minLength": 1,
                          "type": "string"
                        },
                        "kind": {
                          "maxLength": 60,
                          "minLength": 1,
                          "type": "string"
                        },
                        "label": {
                          "maxLength": 300,
                          "minLength": 1,
                          "type": "string"
                        },
                        "parent": {
                          "maxLength": 300,
                          "minLength": 1,
                          "type": "string"
                        },
                        "value": {
                          "maxLength": 1200,
                          "minLength": 1,
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "value",
                        "label"
                      ],
                      "type": "object"
                    },
                    "maxItems": 20,
                    "minItems": 1,
                    "type": "array"
                  },
                  "maxBathrooms": {
                    "description": "Most bathrooms.",
                    "minimum": 0,
                    "type": "number"
                  },
                  "maxBedrooms": {
                    "description": "Most bedrooms.",
                    "minimum": 0,
                    "type": "number"
                  },
                  "maxBuildSize": {
                    "description": "Largest built area (m²).",
                    "minimum": 0,
                    "type": "number"
                  },
                  "maxPlotSize": {
                    "description": "Largest plot (m²).",
                    "minimum": 0,
                    "type": "number"
                  },
                  "maxPrice": {
                    "description": "Highest price.",
                    "minimum": 0,
                    "type": "number"
                  },
                  "maxRooms": {
                    "description": "Most rooms.",
                    "minimum": 0,
                    "type": "number"
                  },
                  "minBathrooms": {
                    "description": "Fewest bathrooms.",
                    "minimum": 0,
                    "type": "number"
                  },
                  "minBedrooms": {
                    "description": "Fewest bedrooms.",
                    "minimum": 0,
                    "type": "number"
                  },
                  "minBuildSize": {
                    "description": "Smallest built area (m²).",
                    "minimum": 0,
                    "type": "number"
                  },
                  "minPlotSize": {
                    "description": "Smallest plot (m²).",
                    "minimum": 0,
                    "type": "number"
                  },
                  "minPrice": {
                    "description": "Lowest price.",
                    "minimum": 0,
                    "type": "number"
                  },
                  "minRooms": {
                    "description": "Fewest rooms (sources that count rooms, not bedrooms).",
                    "minimum": 0,
                    "type": "number"
                  },
                  "newDevelopments": {
                    "description": "Only new developments (sources that support it).",
                    "type": "boolean"
                  },
                  "openHouseWithinDays": {
                    "description": "Fondaro MLS, dashboard sessions only: only listings with an open house starting within the next N days (1 to 14). Narrows any scope.",
                    "maximum": 14,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "operation": {
                    "description": "Source-specific operation (for example sale or rent).",
                    "maxLength": 100,
                    "minLength": 1,
                    "type": "string"
                  },
                  "organizationId": {
                    "description": "Fondaro MLS, dashboard sessions only: one agency's network listings (its organization id). Narrows `network`; `own` refuses it.",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                    "type": "string"
                  },
                  "propertyTypes": {
                    "description": "Property types from `GET /property-sources/{source}/options/propertyType`.",
                    "items": {
                      "maxLength": 160,
                      "minLength": 1,
                      "type": "string"
                    },
                    "maxItems": 20,
                    "minItems": 1,
                    "type": "array"
                  },
                  "query": {
                    "description": "Free text, where the source supports it.",
                    "maxLength": 200,
                    "minLength": 1,
                    "type": "string"
                  },
                  "referenceNumbers": {
                    "description": "Exact listing references.",
                    "items": {
                      "maxLength": 160,
                      "minLength": 1,
                      "type": "string"
                    },
                    "maxItems": 50,
                    "minItems": 1,
                    "type": "array"
                  },
                  "scope": {
                    "description": "Fondaro MLS only. Values: `network` (every agency's ACTIVE listings, the default); `own` (your listings, any status); `partners` (your partner agencies' ACTIVE listings; dashboard sessions only, an API key gets a 400 `PROPERTY_FILTER_UNSUPPORTED`); `followed` (the ACTIVE listings of the agencies you follow; dashboard sessions only, same 400 for an API key).",
                    "enum": [
                      "own",
                      "network",
                      "partners",
                      "followed"
                    ],
                    "type": "string"
                  },
                  "sort": {
                    "description": "One of the sort options the source lists in `GET /property-sources`.",
                    "maxLength": 100,
                    "minLength": 1,
                    "type": "string"
                  },
                  "source": {
                    "description": "Optional; must equal the route source.",
                    "enum": [
                      "internal",
                      "resales_online",
                      "zoddak",
                      "inmobalia",
                      "idealista",
                      "rightmove",
                      "immobiliare",
                      "immoscout",
                      "funda",
                      "zoopla",
                      "seloger",
                      "otodom",
                      "immowelt",
                      "realtor",
                      "homes",
                      "trulia",
                      "propertyfinder",
                      "dubizzle",
                      "centris",
                      "loopnet",
                      "zillow",
                      "redfin",
                      "bayut"
                    ],
                    "type": "string"
                  },
                  "sources": {
                    "description": "Reserved for multi-source search; more than one entry is a 400.",
                    "items": {
                      "enum": [
                        "internal",
                        "resales_online",
                        "zoddak",
                        "inmobalia",
                        "idealista",
                        "rightmove",
                        "immobiliare",
                        "immoscout",
                        "funda",
                        "zoopla",
                        "seloger",
                        "otodom",
                        "immowelt",
                        "realtor",
                        "homes",
                        "trulia",
                        "propertyfinder",
                        "dubizzle",
                        "centris",
                        "loopnet",
                        "zillow",
                        "redfin",
                        "bayut"
                      ],
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "stages": {
                    "description": "Development stages (sources with new developments).",
                    "items": {
                      "maxLength": 160,
                      "minLength": 1,
                      "type": "string"
                    },
                    "maxItems": 20,
                    "minItems": 1,
                    "type": "array"
                  },
                  "statuses": {
                    "description": "Listing statuses the source understands.",
                    "items": {
                      "maxLength": 160,
                      "minLength": 1,
                      "type": "string"
                    },
                    "maxItems": 20,
                    "minItems": 1,
                    "type": "array"
                  }
                },
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Rows with a `ref` ({ source, id, country? }), `nextCursor`, optional `total` and a receipt of the filters applied. `total` is exact unless `totalIsLowerBound` is true (at least that many; Fondaro MLS stops counting at 10,000, first page only); no `total` means unknown, and `nextCursor` alone says whether more rows exist."
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyAuthorization": []
          }
        ],
        "summary": "Search one property source",
        "tags": [
          "Property sources"
        ],
        "x-required-scopes": [
          "sources:read"
        ]
      }
    }
  },
  "servers": [
    {
      "url": "https://api.fondaro.com"
    }
  ],
  "tags": [
    {
      "description": "Search, read and manage listings.",
      "name": "Fondaro MLS listings"
    },
    {
      "description": "Upload listing photos.",
      "name": "Media"
    },
    {
      "description": "Your organization's agent roster.",
      "name": "Agents"
    },
    {
      "description": "Unified search, detail, locations and options across Fondaro MLS and your connected sources.",
      "name": "Property sources"
    }
  ]
}
