Inmuebles
El catálogo, y tu propio inventario dentro de él. Los endpoints de lectura abarcan todo lo que tenemos; los de escritura tocan únicamente las fichas que ha publicado tu organización.
/v1/api/propertiesproperties:readListar inmuebles
Recorre el catálogo por páginas, con filtros.
El endpoint de lectura de uso diario. Los filtros se combinan con AND. Lo que se omite queda sin restringir, así que una llamada sin filtros devuelve todo el catálogo en orden de cursor.
Parámetros de consulta
| Nombre | Tipo | Descripción |
|---|---|---|
city | string | Ciudad a la que restringir, tal como aparece en la dirección de un inmueble. ejemplo: Berlin |
district | string | Barrio dentro de la ciudad. ejemplo: Kreuzberg |
postal_code | string | Código postal al que restringir. ejemplo: 10999 |
type | enum | Clase de inmueble. apartment | house | studio | villa | penthouse | loft | townhouse | other ejemplo: apartment |
transaction_type | enum | Restringir a ventas o a alquileres. sale | rent ejemplo: sale |
status | enum | Estado del anuncio. Omítelo para obtener todos los estados y no solo los activos. active | archived | sold | flagged ejemplo: active |
external_id | string | Tu propio identificador de una ficha, para encontrar lo que ha creado una importación. ejemplo: OBJ-10041 |
min_price | number | Cota inferior inclusive del precio de oferta. ejemplo: 250000 |
max_price | number | Cota superior inclusive del precio de oferta. ejemplo: 750000 |
min_living_area | number | Cota inferior inclusive de la superficie habitable, en metros cuadrados. ejemplo: 60 |
min_bedrooms | integer | Cota inferior inclusive del número de habitaciones. ejemplo: 2 |
limit | integer | Fichas por página. por defecto: 50ejemplo: 50 |
cursor | string | Puntero opaco de la respuesta anterior. Omítelo para la primera página. Los cursores son estables frente a inserciones, así que la paginación nunca se salta ni repite una ficha como sí hace un desplazamiento. ejemplo: eyJpZCI6InByb3BfMWI3N2UwYTRmMiJ9 |
sort | string | Campo por el que ordenar. Antepón un signo menos para orden descendente. ejemplo: -created_at |
expand | enum | Fichas relacionadas que incluir en línea en lugar de pedirlas aparte. images | price_history | market | translations ejemplo: images |
language | string | Responder en este idioma cuando el inmueble lo tenga, como código ISO 639-1. Un inmueble que no tenga el idioma conserva su propio texto en lugar de responderse en otro, y la respuesta indica en qué idioma se ha devuelto. Lo alimentan los feeds que traen varios idiomas. ejemplo: es |
Respuesta
{
"data": [
{ "id": "prop_8f2a41c9d0", "title": "Top-floor apartment…", "price": 42900000 },
{ "id": "prop_1b77e0a4f2", "title": "Garden flat…", "price": 38500000 }
],
"meta": {
"has_more": true,
"next_cursor": "eyJpZCI6InByb3BfMWI3N2UwYTRmMiJ9",
"limit": 50
}
}https://api.skautik.com/v1/api/properties
GET /v1/api/properties?city=Berlin&district=Kreuzberg&postal_code=10999 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/properties/searchproperties:readBuscar inmuebles
Búsqueda semántica y geográfica demasiado compleja para una cadena de consulta.
Acepta una consulta en lenguaje natural, un polígono dibujado, o ambos. Los resultados vuelven ordenados por relevancia y no por una columna ordenable, así que este endpoint ignora el parámetro sort. Es un POST porque un polígono no cabe en una URL, no porque cambie nada.
Campos del cuerpo
| Nombre | Tipo | Descripción |
|---|---|---|
query | string | Descripción en lenguaje llano de lo que se busca. ejemplo: "quiet two bedroom near a park, needs a home office" |
polygon | array | Anillo cerrado de pares [longitud, latitud], en orden GeoJSON. ejemplo: [[13.3702, 52.4812], [13.4791, 52.4812], [13.4791, 52.5401], [13.3702, 52.5401], [13.3702, 52.4812]] |
bounds | object | Rectángulo con sw_lat, sw_lng, ne_lat, ne_lng. Mutuamente excluyente con polygon. ejemplo: {"north": 52.5401, "south": 52.4812, "east": 13.4791, "west": 13.3702} |
filters | object | Las mismas claves que el endpoint de listado acepta como parámetros de consulta. ejemplo: {"property_type": "apartment", "price_max": 60000000} |
limit | integer | Resultados a devolver, de 1 a 200. por defecto: 50ejemplo: 50 |
Cuerpo de la petición
{
"query": "quiet two bedroom near a park, needs a home office",
"filters": {
"market": "berlin-de",
"transaction_type": "sale",
"price_max": 50000000
},
"limit": 20
}Respuesta
{
"data": [
{
"id": "prop_8f2a41c9d0",
"title": "Top-floor apartment…",
"relevance": 0.87,
"matched_on": ["quiet street", "park within 300m", "study alcove"]
}
],
"meta": { "has_more": false, "limit": 20 }
}https://api.skautik.com/v1/api/properties/search
POST /v1/api/properties/search HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"query": "quiet two bedroom near a park, needs a home office",
"filters": {
"market": "berlin-de",
"transaction_type": "sale",
"price_max": 50000000
},
"limit": 20
}/v1/api/properties/{property_id}properties:readObtener un inmueble
Un inmueble con su conjunto completo de atributos.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
property_idobligatorio | string | Identificador devuelto por cualquier endpoint de colección. ejemplo: prop_8f2a41c9d0 |
Parámetros de consulta
| Nombre | Tipo | Descripción |
|---|---|---|
expand | enum | Fichas relacionadas que incluir en línea en lugar de pedirlas aparte. images | price_history | market | translations ejemplo: images |
language | string | Responder en este idioma cuando el inmueble lo tenga, como código ISO 639-1. Un inmueble que no tenga el idioma conserva su propio texto en lugar de responderse en otro, y la respuesta indica en qué idioma se ha devuelto. Lo alimentan los feeds que traen varios idiomas. ejemplo: es |
Respuesta
{
"data": {
"id": "prop_8f2a41c9d0",
"title": "Top-floor apartment with a south-facing balcony",
"property_type": "apartment",
"transaction_type": "sale",
"price": 42900000,
"currency": "EUR",
"price_period": null,
"price_per_area": 579700,
"bedrooms": 2,
"bathrooms": 1,
"rooms": 3,
"living_area": 74,
"floor": 4,
"total_floors": 4,
"year_built": 1908,
"energy_label": "C",
"address": {
"street": "Oranienstrasse",
"postal_code": "10999",
"district": "Kreuzberg",
"city": "Berlin",
"country": "DE"
},
"location": {
"latitude": 52.4993,
"longitude": 13.4184,
"precision": "street"
},
"status": "active",
"listed_at": "2026-07-28T09:12:04Z",
"last_verified_at": "2026-08-11T04:00:00Z",
"updated_at": "2026-08-11T04:00:00Z"
}
}Respuestas destacadas
- 404
- Identificador desconocido, o una ficha que tu clave no puede ver. Trátalo como ausencia.
https://api.skautik.com/v1/api/properties/{property_id}
GET /v1/api/properties/prop_8f2a41c9d0?expand=images&language=es HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/properties/{property_id}/price-historyproperties:readHistorial de precios
Todos los precios de oferta que hemos observado mientras seguíamos el anuncio.
Son precios anunciados, no de operaciones cerradas. Un inmueble bien puede haberse vendido por algo bastante distinto de su último precio de oferta.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
property_idobligatorio | string | Identificador del inmueble. ejemplo: prop_8f2a41c9d0 |
Respuesta
{
"data": [
{ "price": 44900000, "currency": "EUR", "observed_at": "2026-07-28T09:12:04Z" },
{ "price": 42900000, "currency": "EUR", "observed_at": "2026-08-09T06:31:11Z" }
]
}https://api.skautik.com/v1/api/properties/{property_id}/price-history
GET /v1/api/properties/prop_8f2a41c9d0/price-history HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/properties/{property_id}/similarGrowth and aboveproperties:readInmuebles parecidos
Fichas comparables, para dar contexto o apoyar una valoración.
La similitud combina ubicación, tamaño, tipo y estado. Es una comodidad, no una tasación, y los comparables escasean enseguida en zonas con poca oferta.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
property_idobligatorio | string | Inmueble con el que comparar. ejemplo: prop_8f2a41c9d0 |
Parámetros de consulta
| Nombre | Tipo | Descripción |
|---|---|---|
limit | integer | Comparables a devolver, de 1 a 50. ejemplo: 10 |
https://api.skautik.com/v1/api/properties/{property_id}/similar
GET /v1/api/properties/prop_8f2a41c9d0/similar?limit=10 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/propertiesproperties:writeCrear un inmueble
Publica una ficha de tu propio inventario.
Envía una Idempotency-Key para que una petición reintentada no pueda crear un anuncio duplicado. Las fichas creadas así pertenecen a tu organización y son las únicas que tu clave puede modificar.
Campos del cuerpo
| Nombre | Tipo | Descripción |
|---|---|---|
external_id | string | Tu identificador para este inmueble. Es opcional, pero conviene ponerlo si la ficha puede llegar más adelante por una importación: sin él, la importación no tiene con qué emparejar y crea un duplicado. ejemplo: AG-4471-0812 |
titleobligatorio | string | Titular del anuncio. ejemplo: Top-floor apartment with a south-facing balcony |
property_typeobligatorio | enum | Uno de los tipos de inmueble admitidos. ejemplo: apartment |
transaction_typeobligatorio | enum | sale o rent. ejemplo: sale |
priceobligatorio | integer | Importe en unidades menores. ejemplo: 48900000 |
currencyobligatorio | string | Código ISO 4217. ejemplo: EUR |
addressobligatorio | object | Como mínimo una ciudad y un país; cuanto más se indique, mejor será la precisión de la geocodificación. ejemplo: {"street": "Oranienstrasse 12", "postal_code": "10999", "city": "Berlin", "country": "DE"} |
Cabeceras
| Nombre | Tipo | Descripción |
|---|---|---|
Idempotency-Key | string | Única por creación lógica. Repetir la misma clave devuelve el resultado original en lugar de crear una segunda ficha. ejemplo: a2f1c7e4-… |
Cuerpo de la petición
{
"title": "Top-floor apartment with a south-facing balcony",
"property_type": "apartment",
"transaction_type": "sale",
"price": 42900000,
"currency": "EUR",
"living_area": 74,
"bedrooms": 2,
"address": {
"street": "Oranienstrasse",
"postal_code": "10999",
"city": "Berlin",
"country": "DE"
}
}Respuestas destacadas
- 201
- Creado. La cabecera Location lleva la URL del nuevo recurso.
- 409
- Se ha reutilizado una Idempotency-Key con un cuerpo distinto.
- 422
- El cuerpo se ha analizado pero no ha pasado la validación. Consulta el array errors.
https://api.skautik.com/v1/api/properties
POST /v1/api/properties HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"title": "Top-floor apartment with a south-facing balcony",
"property_type": "apartment",
"transaction_type": "sale",
"price": 42900000,
"currency": "EUR",
"living_area": 74,
"bedrooms": 2,
"address": {
"street": "Oranienstrasse",
"postal_code": "10999",
"city": "Berlin",
"country": "DE"
}
}/v1/api/properties/{property_id}properties:writeActualizar un inmueble
Cambia campos de una ficha que has publicado.
Es una actualización parcial: envía solo lo que cambia. Envía If-Match con el ETag de tu última lectura para no pisar una edición simultánea. Una ficha que pertenece a una fuente de importación se rechaza aquí, porque la siguiente pasada revertiría lo que escribieras: cámbiala en el sistema que alimenta la importación.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
property_idobligatorio | string | Inmueble a actualizar. ejemplo: prop_8f2a41c9d0 |
Cabeceras
| Nombre | Tipo | Descripción |
|---|---|---|
If-Match | string | ETag de tu última lectura. Se rechaza con 412 si la ficha ha cambiado desde entonces. ejemplo: "3f8a2c1d9b" |
Cuerpo de la petición
{
"title": "Top-floor apartment with a south-facing balcony and new windows",
"listing": {
"price": 419000,
"status": "active"
}
}Respuestas destacadas
- 403
- La ficha existe pero no la ha publicado tu organización.
- 409
- managed_by_import. La ficha pertenece a una fuente de importación, que es la autoridad sobre ella. El cuerpo indica cuál es la fuente.
- 412
- El If-Match no ha coincidido. Vuelve a leer y aplica de nuevo tu cambio.
https://api.skautik.com/v1/api/properties/{property_id}
PATCH /v1/api/properties/prop_8f2a41c9d0 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"title": "Top-floor apartment with a south-facing balcony and new windows",
"listing": {
"price": 419000,
"status": "active"
}
}/v1/api/properties/{property_id}properties:writeRetirar un inmueble
Saca del mercado una de tus fichas.
Retirar no es borrar. La ficha pasa a estado retirado, desaparece de la búsqueda y conserva su historial de precios para que los análisis pasados sigan teniendo sentido. Una ficha que pertenece a una fuente de importación se rechaza, porque la siguiente pasada la traería de vuelta: retírala en la fuente.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
property_idobligatorio | string | Inmueble a retirar. ejemplo: prop_8f2a41c9d0 |
Respuestas destacadas
- 204
- Retirado. Sin cuerpo.
- 409
- managed_by_import. Retíralo en la fuente, o elimina antes la fuente.
https://api.skautik.com/v1/api/properties/{property_id}
DELETE /v1/api/properties/prop_8f2a41c9d0 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/properties/{property_id}/imagesproperties:readListar imágenes
Las fichas de imagen de un inmueble, en orden de presentación.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
property_idobligatorio | string | Identificador del inmueble. ejemplo: prop_8f2a41c9d0 |
https://api.skautik.com/v1/api/properties/{property_id}/images
GET /v1/api/properties/prop_8f2a41c9d0/images HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/properties/{property_id}/imagesimages:writeSubir una imagen
Adjunta una imagen a una ficha que has publicado.
Subida multipart. JPEG, PNG o WebP de hasta 12 MB. Sube solo imágenes cuyos derechos tengas: la fotografía inmobiliaria suele estar licenciada a una agencia y no ser de su propiedad.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
property_idobligatorio | string | Inmueble al que adjuntarla. ejemplo: prop_8f2a41c9d0 |
Parámetros de consulta
| Nombre | Tipo | Descripción |
|---|---|---|
room_type | string | Qué muestra la fotografía; sirve para agrupar imágenes y para elegir un origen de ambientación. ejemplo: living_room |
primary | boolean | Pasa true para convertirla en la imagen principal, lo que degrada a la actual. ejemplo: true |
Campos del cuerpo
| Nombre | Tipo | Descripción |
|---|---|---|
fileobligatorio | binary | Contenido de la imagen. ejemplo: listings.csv |
position | integer | Orden de presentación. La imagen en la posición 0 es la principal. ejemplo: 1 |
Respuestas destacadas
- 413
- El archivo supera el límite de tamaño.
- 415
- Formato de imagen no admitido.
https://api.skautik.com/v1/api/properties/{property_id}/images
POST /v1/api/properties/prop_8f2a41c9d0/images?room_type=living_room&primary=true HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"file": "listings.csv",
"position": 1
}/v1/api/properties/{property_id}/images/{image_id}images:writeEliminar una imagen
Quita una imagen de una ficha que has publicado.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
property_idobligatorio | string | Identificador del inmueble. ejemplo: prop_8f2a41c9d0 |
image_idobligatorio | string | Identificador de la imagen. ejemplo: img_2b7d4f1908 |
https://api.skautik.com/v1/api/properties/{property_id}/images/{image_id}
DELETE /v1/api/properties/prop_8f2a41c9d0/images/img_2b7d4f1908 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…