Skip to content

Propiedades

Las propiedades son el núcleo de la plataforma. Pueden ser publicadas por agency_admin, agent, broker o developer, y asignadas a un agente específico.

Estados de una propiedad

Estado (propertyStatus)Descripción
draftBorrador, no visible públicamente
publishedPublicada y visible
soldVendida / arrendada
inactiveDesactivada temporalmente
Estado (listingStatus)Descripción
activeDisponible para compradores/arrendatarios
inactiveNo disponible actualmente
rentedArrendada

Listar propiedades (público)

Solo devuelve propiedades con propertyStatus = published y listingStatus = active.

http
GET /api/properties

Query params opcionales:

ParámetroTipoDescripción
pagenumberPágina (default: 1)
limitnumberResultados por página (default: 10)
listing_typestringsale o rent
categorystringCasa, Departamento, Terreno, Oficina, etc.
citystringFiltrar por ciudad
min_pricenumberPrecio mínimo
max_pricenumberPrecio máximo
bedroomsnumberNúmero de recámaras
bathroomsnumberNúmero de baños
featuredbooleanSolo propiedades destacadas
agent_iduuidPropiedades de un agente específico
agency_iduuidPropiedades de una agencia específica

Respuesta 200:

json
{
  "success": true,
  "data": {
    "data": [
      {
        "id": "uuid-propiedad",
        "title": "Departamento en Polanco",
        "price": 4500000,
        "currency": "MXN",
        "listingType": "sale",
        "categories": ["Departamento"],
        "bedrooms": 3,
        "bathrooms": 2,
        "constructionArea": 120,
        "city": "Ciudad de México",
        "state": "CDMX",
        "address": "Calle Masaryk 45, Polanco",
        "propertyStatus": "published",
        "listingStatus": "active",
        "isFeatured": false,
        "viewsCount": 148,
        "agentId": "uuid-agente",
        "agencyId": "uuid-agencia",
        "user": { "firstName": "Carlos", "lastName": "Mendoza" },
        "agent": { "company": "Inmobiliaria Centro MX" },
        "assets": [
          {
            "id": "uuid-asset",
            "url": "https://cdn.havi.app/properties/foto1.jpg",
            "type": "image",
            "sortOrder": 1
          }
        ],
        "createdAt": "2026-05-13T10:00:00.000Z"
      }
    ],
    "meta": {
      "total": 250,
      "perPage": 10,
      "currentPage": 1,
      "lastPage": 25
    }
  }
}

Buscar propiedades

http
GET /api/properties/search

Acepta los mismos parámetros que el listado.


Detalle de propiedad

http
GET /api/properties/:id

Incrementa el contador de vistas (viewsCount) en cada llamada.


Propiedades similares

http
GET /api/properties/:id/similar

Devuelve hasta 6 propiedades similares en la misma ciudad y categoría.


Crear propiedad

Requiere autenticación

agency_admin, agent, broker o developer.

http
POST /api/properties
Authorization: Bearer {token}
Content-Type: application/json

Body:

json
{
  "title": "Departamento en Polanco",
  "description": "Hermoso departamento de 3 recámaras con vista a Masaryk. Acabados de lujo, cocina integral, 2 cajones de estacionamiento.",
  "price": 4500000,
  "currency": "MXN",
  "listingType": "sale",
  "categories": ["Departamento"],
  "bedrooms": 3,
  "bathrooms": 2,
  "halfBaths": 1,
  "parkingSpaces": 2,
  "constructionArea": 120,
  "landArea": 0,
  "yearBuilt": 2021,
  "floors": 1,
  "city": "Ciudad de México",
  "state": "CDMX",
  "zipCode": "11560",
  "address": "Calle Masaryk 45, Polanco",
  "latitude": 19.4313,
  "longitude": -99.1893,
  "amenities": ["gimnasio", "rooftop", "seguridad_24h", "pet_friendly"],
  "agentId": "uuid-del-agente",
  "propertyStatus": "draft",
  "listingStatus": "inactive",
  "isFeatured": false
}

Comportamiento al asignar agente:

  • Si incluyes agentId, la propiedad queda asignada a ese agente y a su agencia automáticamente.
  • Si el usuario autenticado tiene rol agent y no especificas agentId, se asigna a sí mismo.

Respuesta 201:

json
{
  "success": true,
  "data": {
    "id": "uuid-propiedad",
    "title": "Departamento en Polanco",
    "propertyStatus": "draft",
    "listingStatus": "inactive",
    "agentId": "uuid-agente",
    "agencyId": "uuid-agencia",
    "userId": "uuid-usuario"
  }
}

Subir imágenes (URL pre-firmada S3)

El proceso de subida de imágenes se hace en dos pasos: obtener URLs pre-firmadas y subir directamente a S3.

Paso 1 — Solicitar URLs pre-firmadas:

http
POST /api/upload/presigned
Authorization: Bearer {token}
Content-Type: application/json
json
{
  "files": [
    { "filename": "fachada.jpg", "contentType": "image/jpeg" },
    { "filename": "sala.jpg",    "contentType": "image/jpeg" },
    { "filename": "recamara.jpg","contentType": "image/jpeg" }
  ],
  "propertyId": "uuid-propiedad"
}

Respuesta:

json
{
  "success": true,
  "data": [
    {
      "filename": "fachada.jpg",
      "uploadUrl": "https://s3.amazonaws.com/bucket/...",
      "publicUrl": "https://cdn.havi.app/properties/fachada.jpg"
    }
  ]
}

Paso 2 — Subir cada archivo directamente a S3:

javascript
await fetch(uploadUrl, {
  method: 'PUT',
  headers: { 'Content-Type': 'image/jpeg' },
  body: fileBlob
})

Publicar propiedad

Cambia el estado de borrador a publicado:

http
PUT /api/properties/:id
Authorization: Bearer {token}
Content-Type: application/json

{
  "propertyStatus": "published",
  "listingStatus": "active"
}

Actualizar propiedad

http
PUT /api/properties/:id
Authorization: Bearer {token}
Content-Type: application/json

Acepta los mismos campos que la creación. Todos son opcionales.


Asignar agente a propiedad

http
PUT /api/properties/:id/assign-agent
Authorization: Bearer {token}
Content-Type: application/json

{
  "agentId": "uuid-del-agente"
}

Respuesta 200:

json
{
  "success": true,
  "message": "Agent assigned successfully",
  "data": {
    "id": "uuid-propiedad",
    "agentId": "uuid-agente",
    "agencyId": "uuid-agencia"
  }
}

Eliminar propiedad

http
DELETE /api/properties/:id
Authorization: Bearer {token}

Mis propiedades

http
GET /api/my-properties
Authorization: Bearer {token}

Incluye propiedades en todos los estados (drafts, publicadas, inactivas).


Campos de propiedad

CampoTipoRequeridoDescripción
titlestringTítulo de la propiedad
descriptionstringNoDescripción detallada
pricenumberPrecio
currencystringNoMXN (default), USD, COP, PEN, CLP
listingTypestringsale o rent
categoriesarray["Casa", "Departamento", "Terreno", "Oficina", ...]
bedroomsnumberNoNúmero de recámaras
bathroomsnumberNoBaños completos
halfBathsnumberNoMedios baños
parkingSpacesnumberNoCajones de estacionamiento
constructionAreanumberNoÁrea construida en m²
landAreanumberNoÁrea de terreno en m²
yearBuiltnumberNoAño de construcción
floorsnumberNoNúmero de pisos
citystringNoCiudad
statestringNoEstado/Departamento/Provincia
zipCodestringNoCódigo postal
addressstringNoDirección completa
latitudenumberNoLatitud para mapa
longitudenumberNoLongitud para mapa
amenitiesarrayNoLista de amenidades
agentIduuidNoAsignar a un agente
propertyStatusstringNodraft, published, sold, inactive
listingStatusstringNoactive, inactive, rented
isFeaturedbooleanNoMarcar como propiedad destacada

HAVI API · Documentación Oficial