Search and map privacy

Source-reviewed draft; deployment and release verification pending.

Draft — source-reviewed on 22 October 2026. Bounds and limits below are source defaults, not confirmed deployment configuration.

Search requires destination, top-level geometric area and filters.operation. Destination is currently only TENERIFE. Load destination.extent from the public reference before constructing the initial search viewport.

Bounds and polygon requests

{
  "destination": "TENERIFE",
  "area": {"kind": "BOUNDS", "south": 28.0, "west": -16.9, "north": 28.6, "east": -16.1},
  "filters": {"operation": "SALES", "bedrooms": {"min": 2}},
  "page": 1,
  "page_size": 24,
  "sort": "PUBLIC_ID_ASC"
}

This synthetic example is inside the source default extent: south 27.9, west -17.0, north 28.7, east -16.0. Both bounds corners must lie within the configured extent, with south less than north and west less than east. Coordinates must be finite. No antimeridian-wrapping bounds are supported.

For a polygon use {"kind":"POLYGON","vertices":[{"lat":28.1,"lng":-16.8},{"lat":28.4,"lng":-16.7},{"lat":28.2,"lng":-16.3}]}. Each vertex must be within coverage. Source defaults allow 3–100 distinct vertices; repeating the first vertex as a closing point is accepted and normalized away. The ring must have nonzero area and no duplicate vertices or intersecting/touching nonadjacent edges. Holes and multipolygons are not implemented. Bounds and polygon boundary matching are inclusive.

Supported filters

Different populated filter fields combine with AND. Within array selections, matching uses OR. Empty selection arrays impose no constraint; duplicate selections are invalid. Omit unused fields: explicit null and unknown keys are rejected, including nested objects.

FilterSemantics
operationRequired SALES (sale or transfer) or RENTAL.
rental_typeSHORT_TERM, TEMPORAL, LONG_TERM; exact selection.
city, area, complex_nameExact text matching, not substring or normalized search.
ubicacionOR over LocalArea keys.
property_type, features_type, property_detail_typeOR within each classification level; AND between levels. Detail selections must fit at least one selected parent/subtype tuple.
catalogsOR over active membership keys; unknown/inactive key returns 422. No descendant expansion.
bedrooms, bathroomsInclusive min/max, nonnegative strict integers.
total_area_m2Inclusive nonnegative finite numeric min/max.
priceInclusive decimal min/max, at most two fractional places; compares the displayed operation price. Rental price filtering requires rental_type.
is_new_construction, has_terrace, has_liftStrict booleans; unknown values do not match true or false selections.
has_pool, has_parkingTrue matches known non-absence type; false matches NO_POOL/NO_PARKING. Unknown is excluded.
sea_viewTrue matches a known sea-bearing view. False requires a known view and no sea-bearing view. Empty/unknown view sets do not match false.
view_typesOR overlap with supplied view values.
updated_atInclusive timezone-aware from and/or to timestamps, normalized for comparison. Not a public response timestamp or deletion/change feed.

Ranges reject reversed min/max and explicit null bounds. updated_at rejects reversed timestamps and explicit null values. There is no free-text search query, arbitrary sort, radius filter or public investment filter.

PENTHOUSE and DUPLEX detail searches expand to include PENTHOUSE_DUPLEX. Sea-bearing values are SEA, SEA_AND_COAST, PANORAMIC_SEA, PANORAMIC_SEA_AND_ISLANDS and MOUNTAIN_AND_SEA. Read Classifications and catalogs and Marketing and characteristics.

Match and render only public points

Search uses the same approved public point it returns. Exact private coordinates are never substituted to decide whether a hidden/approximate listing matches a drawn shape. STREET points are fixed 500-metre grid-cell centres in the Tenerife UTM zone, without random jitter or per-property clamping. A boundary may consequently include/exclude an approximate listing differently from its private exact location; that is intended privacy behavior.

HIDDEN properties and invalid/stale public points do not appear in search. Eligible hidden properties may still be read by public identifier on detail, without a point/address. Never geocode another field to reconstruct a prohibited exact marker.

For React: debounce map changes, reset pagination, cancel stale requests and distinguish no matches from geometry validation or temporary failure. Label approximate markers accordingly; do not imply building-level precision.

Related operations

POST /api/v1/public/properties/search; GET /api/v1/public/property-reference for coverage and values; GET /api/v1/public/properties/{public_id} for a selected listing. See Errors and pagination.


Did this page help you?