Retrieve a property
Return one property of the public catalogue by its ID.
/v1/properties/{property_id}Requires the properties:read scope
Returns the same property object as List properties. Use it to render a listing page or to refresh one property after a change.
When a property is not found
404 Property not found is returned when the ID does not exist, but also when the property exists and is not part of the public catalogue: it is not marked as public, it is still a draft, or it belongs to another workspace. Commercial status does not override explicit publication. The response does not say which, so a listing that disappears from your site should simply be removed.
Example request
curl "https://api.vestta.app/v1/properties/1355" \
-H "X-Api-Key: $VESTTA_API_KEY"Authorization
X-Api-KeystringheaderrequiredYour API key,
AC_LIVE_<key_id>.<secret>.Authorization: ApiKey <key>is also accepted.
Path parameters
property_idintegerrequired≥ 1
Response
200 Successful response.
{
"status": "ok",
"data": {
"id": 1355,
"operation": "traspaso,alquiler",
"type": "local",
"subtype": "Local Comercial",
"title": "Local comercial en el centro",
"price": 0,
"size_total": 120,
"bedrooms": 0,
"bathrooms": 1,
"postal_code": "07820",
"description": "<h2>Características del local</h2><p>Superficie total de 120 m² en planta baja…</p>",
"images": [
{
"id": "7eac604ad45147d19c7cedb2a10569aa",
"url": "https://cdn.vestta.app/media/7eac604ad45147d19c7cedb2a10569aa.webp",
"order": 1,
"is_primary": true
}
],
"videos": [],
"specs": {
"holiday_renting": false,
"temporal_renting": false,
"address_privacy": "approximate",
"price_calc": {
"price_alq": 2000,
"price_trasp": 25000
}
},
"features": [
{
"key": "air_conditioning",
"label": "Aire Acondicionado",
"value": "Sí",
"isextra": false
}
],
"status": "disponible",
"address": "San Antonio",
"city": "San Antonio",
"province": "Islas Baleares",
"country": "España",
"lat": 38.98,
"lon": 1.3,
"is_featured": false,
"created_at": "2026-07-21T11:42:51.820440+02:00",
"updated_at": "2026-09-26T19:38:41.390976+02:00"
}
}Response fields
statusstringrequired alwaysokdataExternalPropertyrequiredidintegerrequiredNumeric property ID. Use it with Retrieve a property.
operationstringOperations the property is offered for:
venta,alquiler,traspaso, or several joined by commas (e.g.venta,alquiler).typestringProperty type key, e.g.
apartamento,casa,local,oficina,terrenooredificio.subtypestringSubtype as a Spanish display label (e.g.
Ático,Local Comercial), orSin Especificar.titlestringListing title. May be empty.
pricenumberSale price in euros. Rent and transfer prices are in
specs.price_calc.size_totalnumberTotal size in m².
bedroomsintegerbathroomsintegerpostal_codestringOmitted when the property's location is hidden.
descriptionstringListing description as HTML.
imagesarray of objectsOpaque public copies. New photos are watermarked; legacy copies may remain unmarked. Original paths and IDs are never included.
idstringrequiredurlstringrequiredPermanent opaque public-copy URL. New photos are watermarked; migrated legacy copies may remain unmarked. Never an original or upload URL.
orderinteger default:1is_primaryboolean default:falsetitlestring default:
videosarray of objectsProcessed public videos.
idstringrequiredtitlestringorderintegerurlstringhls_urlstringthumbnail_urlstringembed_urlstring
specsPublicationSpecsListing characteristics. Keys depend on the property type.
price_calc.price_alqandprice_calc.price_trasphold the monthly rent and transfer price;address_privacyispublic,approximateorhidden;building_nameis only present when the address is public.translationsTranslationSpecTraducciones de las descripciones
caTranslatedDescriptionTraduccion en catalán de la descripción
titlestringTítulo de la descripción
descriptionstringDescripción
enTranslatedDescriptionTraduccion en ingles de la descripción
titlestringTítulo de la descripción
descriptionstringDescripción
frTranslatedDescriptionTraduccion en francés de la descripción
titlestringTítulo de la descripción
descriptionstringDescripción
deTranslatedDescriptionTraduccion en alemán de la descripción
titlestringTítulo de la descripción
descriptionstringDescripción
ptTranslatedDescriptionTraduccion en portuges de la descripción
titlestringTítulo de la descripción
descriptionstringDescripción
itTranslatedDescriptionTraduccion en italiano de la descripción
titlestringTítulo de la descripción
descriptionstringDescripción
usable_areanumber≥ 0Metros cuadrados útiles
plot_sizenumber≥ 0Metros cuadrados parcela
size_builtnumber≥ 0Superficie construida
porch_sizenumber≥ 0Metros cuadrados porche
size_terracesnumber≥ 0Metros cuadrados terrazas
attic_sizenumber≥ 0Metros cuadrados ático
storage_dimensionsnumberDimensiones del trastero
doble_bedroomsinteger≥ 0Número de habitaciones dobles
suite_bathroomsinteger≥ 0Número de baños en suite
num_terracesinteger≥ 0Número de terrazas
conservationstringEstado de conservación
floorstringPlanta canónica para portales
house_floorsinteger≥ 1Número de plantas de una casa
elevatorbooleanTiene ascensor (0/1 o Sí/No)
viewsstringVistas de la propiedad
orientationstringOrientación (norte, sur, este, oeste)
energy_certificatestringCertificado energético A-G
emissionsstringEmisiones A-G
energy_consumption_valuenumber≥ 1≤ 999Consumo (kWh/m² año)
emissions_valuenumber≥ 1≤ 999Emisiones (kg CO₂/m² año)
heightnumberAltura del local
facade_metersnumberMetros de fachada
meters_showcasenumberMetros de escaparate
entrace_typestringTipo de entrada de la oficina
positionstring1ª/2ª Linea del mar
officesinteger≥ 0Número de despachos
meeting_roomsinteger≥ 0Número de salas de reuniones
caminostringTipo de suelo
terrain_extensionstringTamaño (Grande/Pequeño)
topographystringTopografía del terreno
num_seatsinteger≥ 0Número de plazas
dimensionsstringDimensiones del aparcamiento
turistic_licensestringLicencia turística
construction_yearintegerAño de construcción
exposurestringInterior o Exterior
stylestringConservación
num_viviendasintegerNúmero de viviendas
num_localesintegerNúmero de locales
num_ascensoresintegerNúmero de ascensores
num_parkingsinteger≥ 0Número de parkings incluidos
num_floorsintegerNúmero de plantas
luxury_propertybooleanPropiedad de lujo
holiday_rentingbooleanAlquiler vacacional
temporal_rentingbooleanAlquiler temporal
purchase_option_rentalbooleanAlquiler con opción a compra
address_privacystringPrivacidad de la ubicación en portales: public | approximate | hidden
activitiesActivitiesSpecActividades permitidas
predefinedarray of stringsActividades predefinidas
customarray of stringsActividades personalizadas
num_entrancesNumEntrancesSpecNúmero de entradas
totalinteger≥ 0 default:0Total de entradas
peaton_entrancesinteger≥ 0 default:0Entradas de peatones
moto_entrancesinteger≥ 0 default:0Entradas de motos
van_entrancesinteger≥ 0 default:0Entradas de furgoneta
car_entrancesinteger≥ 0 default:0Entradas de coche
floor_breakdownFloorBreakdownSpecDesglose de plantas
base_floorinteger default:0Metros ² de la planta baja
first_floorinteger default:0Metros ² de la primera planta
second_floorinteger default:0Metros ² de la segunda planta
price_calcPublicPricesprice_alqnumber≥ 0price_traspnumber≥ 0
building_namestringPublished only when address privacy is public.
featuresarray of objectsTyped amenities.
labelis a display string;keyis stable.keystringrequired1–100 charslabelstringrequired1–200 charsvaluestring | boolean | integer | numberrequiredisextraboolean default:false
statusstringCommercial status of the explicitly published property. Drafts are never returned.
addressstringFollows the property's address privacy: the full address when public, the approximate address when approximate, omitted when hidden.
citystringprovincestringcountrystringlatnumberLatitude in decimal degrees. Exact when the address is public, rounded to 2 decimals (about 1 km) when approximate, omitted when hidden.
lonnumberLongitude in decimal degrees, with the same precision rules as
lat.is_featuredbooleanWhether the business marked the property as featured.
created_atstringISO 8601 timestamp with UTC offset.
updated_atstringISO 8601 timestamp with UTC offset. The default sort key.
Errors
| Status | When |
|---|---|
| 401 Unauthorized | The API key is missing, malformed, unknown, revoked or expired. |
| 403 Forbidden | The API key lacks the required scope. |
| 404 Not Found | The resource does not exist in this business. |
| 409 Conflict | Duplicate contact or idempotency key reused with a different payload. |
| 422 Unprocessable Content | A path parameter, query parameter or body field is invalid. |
| 500 Internal Server Error | Unexpected server error while processing the request. |
Error bodies and how to handle each case: Errors.