PUT /properties/{paId}
Es REEMPLAZO TOTAL: mandás el objeto completo, igual que en el alta. Lo que no mandes, se vacía.
Por eso la respuesta trae un diff, y los campos que se vaciaron van aparte en cleared.
Resource URL
PUT https://property-api.mapaprop.com/property-v1/properties/{paId}
Autenticación
Authorization: Bearer <tu token>. Requiere el scope property-api-update.
curl -X PUT https://property-api.mapaprop.com/property-v1/properties/01M3PTZ8YBMM5DSNW03WP8VD9E \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d @propiedad.json
El cuerpo
El mismo objeto del alta, completo, en canonical:
{
"canonical": { "…el objeto de la propiedad, entero…" }
}
Los campos están en El objeto JSON de la propiedad.
No es un PATCH. Mandar {"canonical": {"price": 230000}} no cambia sólo el precio: borra todo lo
demás. Si querés cambiar un campo, tomá el objeto que te devuelve el
GET, modificá ese campo y mandá el objeto entero.
La respuesta
La respuesta trae el clientRef, el mismo que mandaste en el sobre. Te lo devolvemos en los seis
caminos (verify, alta, consulta, listado, edición y borrado) para que puedas cruzarlo con tu base sin
tener que recordar con qué clientRef preguntaste.
200 OK. Es la respuesta del alta —object,
portals, summary— más el acuse y el diff:
{
"paId": "01M3PTZ8YBMM5DSNW03WP8VD9E",
"updated": true,
"updatedAt": "2026-09-29T23:41:02.118Z",
"status": "active",
"diff": {
"property": {
"price": { "from": 245000, "to": 230000 },
"description": { "from": "Departamento de 2 ambientes en el corazón…(1240 ch)", "to": "…(1310 ch)" },
"toilettes": { "from": 2, "to": null }
},
"assets": { "added": 2, "removed": 1, "unchanged": 7, "reordered": false },
"cleared": ["toilettes"],
"changed": 6
},
"images": { "status": "processing", "total": 9, "processed": 7 }
}
diff.property — qué campos cambiaron
Uno por campo, con su valor anterior y el nuevo. El texto largo se resume con su largo real
(…(1240 ch)) para que la respuesta siga siendo leíble.
images y blueprint no aparecen acá: tienen su propio bloque.
🔑 diff.cleared — qué se vació
La lista de campos que tenían valor y ahora no. Es la consecuencia del reemplazo total, puesta aparte para que se vea de un golpe.
Si cleared trae algo que no querías vaciar, mandá el PUT otra vez con ese campo incluido. Nada se
publicó todavía.
diff.assets — las fotos
"assets": { "added": 2, "removed": 1, "unchanged": 7, "reordered": false }
Se comparan por URL, no por posición. Reordenar tus fotos sin cambiarlas da unchanged y
reordered: true — no cuenta como fotos nuevas.
| Campo | Qué es |
|---|---|
added | URLs que no estaban antes: son las que bajamos |
removed | URLs que ya no están en el objeto |
unchanged | Las que siguen. No se vuelven a bajar |
reordered | Las mismas fotos en otro orden. Importa: la primera es la principal |
Las imágenes nuevas pasan por el mismo ciclo
Si el PUT trae URLs nuevas, images.status vuelve a processing y la propiedad queda bloqueada
mientras las bajamos — igual que en el alta. Las que ya estaban alojadas no se vuelven a bajar.
Errores
| Código | Cuándo |
|---|---|
400 | Falta canonical en el body |
401 | Token ausente, vencido o inválido |
403 | Falta el scope property-api-update |
404 | Ese paId no existe, o está borrado |
409 | La propiedad está procesando sus imágenes |
Un PUT sobre una propiedad borrada devuelve 404: no la resucita. Para volver a tenerla, dala
de alta de nuevo — te va a dar un paId nuevo.
Lo que el PUT todavía NO hace
No republica en los portales. Guarda la propiedad y te dice qué cambió, pero el aviso que ya esté publicado en un portal no se actualiza solo. Eso llega con el paso de publicación.
Relacionados
- POST /properties — el alta
- GET /properties — de donde sacás el objeto para modificarlo
- DELETE /properties/{paId} — borrar