List properties
Return the public property catalogue, filtered, sorted and paginated.
/v1/ext/propertiesRequires the properties:read scope
Returns a page of the public catalogue and the total number of matching properties. Without filters, it returns every public property, most recently updated first.
Filters
Filters combine with AND and use the same vocabulary as Vestta. operation and city ignore case; the other text filters must match exactly:
Note that subtype filters by key (atico) while responses return a display label (Ático).
Prices
min_price, max_price and sort compare the price of the operation you filter by:
operation=alquiler→ the monthly rent,specs.price_calc.price_alq.operation=traspaso→ the transfer price,specs.price_calc.price_trasp.- any other value, or no
operation→ the sale price,price.
So a rental search in Madrid between 800 and 1,200 € per month, cheapest first, is:
Map areas
locations restricts results to areas drawn on a map. It is a JSON array, URL-encoded into the query string. Each element is one area; a property matches if it falls inside any of them. Three shapes are supported:
- Circle —
centerandradiusin metres. - Polygon — at least three
coordinates;rectangleis accepted as a synonym. Coordinates can also be[lat, lng]pairs, andlonis accepted in place oflng. - Point — a
positionand an optionalradiusin metres, 500 by default.markeris a synonym.
Areas are matched against the published coordinates: rounded ones for approximate locations, none for hidden ones. Approximate properties can match an area up to about 1 km away from their real position, and properties with a hidden location never match an area. Elements without a recognised geometry — for example { "name": "Madrid" } — are ignored, and so is the whole parameter if it is not valid JSON. The filters.locations field of the response echoes the areas that were applied, so you can check what was understood.
Example request
curl "https://api.vestta.app/v1/ext/properties?limit=20" \
-H "X-Api-Key: $VESTTA_API_KEY"Authorization
X-Api-KeystringheaderrequiredYour API key,
AC_LIVE_<key_id>.<secret>.Authorization: ApiKey <key>is also accepted.
Query parameters
limitinteger≥ 1≤ 1000 default:100Maximum number of properties to return.
offsetinteger≥ 0 default:0Number of matching properties to skip before returning results.
statusstringExact status match. Only
disponibleandreservadacan match: sold, rented and withdrawn properties are never returned.operationstringOperation:
venta,alquilerortraspaso. Case-insensitive partial match, so properties offered for several operations match each of them. Also selects which pricemin_price,max_priceandsortuse.rental_typestringRental type:
temporalfor temporary rentals,anualfor long-term rentals that are neither temporary nor holiday rentals.One of
temporalanualtypestringExact property type:
apartamento,casa,local,nave,almacenaje,oficina,terreno,aparcamientooredificio.subtypestringExact subtype key as stored in Vestta, for example
atico,duplex,chaletorvilla. Responses return the subtype as a display label.citystringCity name. Case-insensitive exact match.
locationsstringURL-encoded JSON array of map areas. Supports
circle(center + radius in metres),polygon/rectangle(coordinates) andpoint/marker(500 m default radius). Invalid JSON is ignored.min_pricenumber≥ 0Minimum price, inclusive. Uses the rent or transfer price when
operationisalquilerortraspaso.max_pricenumber≥ 0Maximum price, inclusive. Uses the rent or transfer price when
operationisalquilerortraspaso.min_bedroomsinteger≥ 0Minimum number of bedrooms, inclusive.
is_featuredbooleantruereturns only featured properties;falseonly non-featured ones.sortstringSort by price (properties without a price go last). When omitted, results are ordered by last update, newest first.
One of
price_ascprice_desc
Response
200 Successful response.
Response fields
statusstringrequired alwaysokdataarray of objectsrequiredThe requested page of properties.
countintegerrequiredTotal number of properties matching the filters, across all pages.
limitintegerrequiredThe
limitthat was applied.offsetintegerrequiredThe
offsetthat was applied.filtersobjectrequiredEcho of the filters that were applied;
nullfor filters that were not sent.locationscontains only the areas that were understood.authenticated_asstringName of the business that owns the API key.
Errors
Error bodies and how to handle each case: Errors.