API de valuación
Un valor de referencia reproducible para cualquier propiedad de la Ciudad de Buenos Aires, con rango de confianza, comparables y una explicación en lenguaje claro. Base URL: https://api.zavaluo.com/v1. Todas las respuestas son JSON en UTF-8.
country de cada request lo anticipa.POST /valuations valida el request y responde 503 hasta que esté activo. Avisamos por email a las claves emitidas.Autenticación
Cada request lleva tu clave en el header Authorization. Guardamos solo el hash de la clave: si la perdés, emitimos una nueva.
Authorization: Bearer zv_live_9f3c…
Pedí una clave en Acceso a la API. El plan Explorar incluye 100 requests por mes; los demás planes, su cuota correspondiente.
Primer request
# curl curl -X POST https://api.zavaluo.com/v1/valuations \ -H "Authorization: Bearer $ZAVALUO_KEY" \ -H "Content-Type: application/json" \ -d '{"address":"Gorriti 4800, Palermo, CABA","kind":"apartment","m2_total":68,"rooms":3,"floor":2}' // JavaScript (fetch) const r = await fetch("https://api.zavaluo.com/v1/valuations", { method: "POST", headers: { Authorization: `Bearer ${process.env.ZAVALUO_KEY}`, "Content-Type": "application/json" }, body: JSON.stringify({ address: "Gorriti 4800, Palermo, CABA", kind: "apartment", m2_total: 68, rooms: 3, floor: 2 }) }); const v = await r.json(); # Python (requests) r = requests.post("https://api.zavaluo.com/v1/valuations", headers={"Authorization": f"Bearer {KEY}"}, json={"address": "Gorriti 4800, Palermo, CABA", "kind": "apartment", "m2_total": 68, "rooms": 3, "floor": 2})
Crear una valuación
Devuelve el valor estimado para una propiedad. Con la dirección sola alcanza; cada atributo adicional reduce el rango.
Body
| Campo | Tipo | Descripción |
|---|---|---|
address | string | Dirección con barrio o ciudad. Geocodificamos y devolvemos la precisión. Requerido salvo que envíes lat/lng |
lat, lng | number | Coordenadas WGS84. Si las enviás, ignoramos address. |
country | enum | AR (default) · ES |
operation | enum | sale (default) · rent · temporary_rent |
kind | enum | apartment (default) · house · ph · land · office · retail · garage · other |
m2_total, m2_covered | number | Metros totales y cubiertos. |
rooms, bedrooms, bathrooms | integer | Ambientes, dormitorios, baños. |
floor, year_built | integer | Piso (0 = planta baja) y año de construcción. |
parking_spaces | integer | Cocheras incluidas. |
has_balcony, has_terrace, has_pool, has_elevator | boolean | Amenities que más pesan en CABA. |
monthly_fees | number | Expensas mensuales en moneda local. |
locale | string | es-AR (default) · es-ES · en. Idioma de la explicación. |
Respuesta
{
"id": "7a1e…", "model_version": "ar-caba-sale-2026.09.1", "operation": "sale",
"estimate_usd": 231000, "low_usd": 212000, "high_usd": 248000,
"estimate_local": 312000000, "local_currency": "ARS",
"likely_asking_usd": 244000, "likely_closing_usd": 231000, "asking_vs_closing_adj": -0.053,
"confidence": 0.86, "comps_count": 23, "comps_radius_m": 500,
"comps": [ { "listing_id": "…", "distance_m": 120, "price_usd": 239000, "usd_m2": 3414, "m2_total": 70,
"rooms": 3, "days_on_market": 46, "price_cut_pct": -4.0, "source_url": "https://…" }, … ],
"calibrating": true,
"explanation": "Valuado 2% por debajo de la mediana de Palermo por estar en 2º piso al contrafrente…",
"created_at": "2026-09-12T15:04:11-03:00"
}model_version devuelve el mismo número. Guardá model_version junto al resultado si necesitás auditar una valuación más adelante. Mientras calibrating sea true, tratá el rango como la señal principal y no el punto.Recuperar una valuación
Devuelve una valuación previa emitida con tu clave, sin volver a calcular ni consumir cuota.
Estadísticas de mercado
Agregados por barrio, recalculados cada noche: mediana y cuartiles de USD/m², avisos activos, días en mercado, baja de precio mediana y la relación publicación/cierre cuando hay cierres reportados. Sin neighborhood devuelve todos los barrios de la ciudad; el resultado trae hasta 100 filas, las más recientes primero.
{ "stats": [ { "country": "AR", "city": "CABA", "neighborhood": "Palermo", "kind": "apartment", "operation": "sale",
"as_of": "2026-09-11", "n_active": 4812,
"p25_usd_m2": 2980, "median_usd_m2": 3410, "p75_usd_m2": 3890,
"median_days_on_market": 58, "median_price_cut_pct": -4.1, "asking_to_closed_ratio": null } ] }Barrios
Los 48 barrios de CABA con slug, nombre, comuna y centroide, y con include=geometry el polígono oficial del GCBA en GeoJSON (WGS84). Es información pública: no requiere clave ni consume cuota. Usalo para mapas y para resolver el barrio de una coordenada del lado del cliente.
{ "barrios": [ { "slug": "palermo", "name": "Palermo", "comuna": 14, "centroid": { "lng": -58.4245, "lat": -34.5788 } }, … ] }Confianza y rangos
low_usd y high_usd son los cuantiles 10 y 90 del modelo. confidence (0–1) combina la densidad de comparables en el radio, la dispersión de sus precios y cuántos cierres reales reportados tenemos en la zona. Con confianza baja el rango se ensancha hacia la mediana del barrio; no inventamos precisión. Mientras el historial de precios sea corto, calibrating es true.
Publicación vs. cierre
En CABA el precio publicado y el de escritura difieren, y la brecha varía por barrio y por momento del ciclo. estimate_usd y likely_closing_usd son el cierre probable. likely_asking_usd es el precio de publicación que hoy lleva a ese cierre, y asking_vs_closing_adj la brecha aplicada. La brecha se calibra con cierres reportados por dueños y con agregados públicos.
Monedas y tipo de cambio
El mercado de CABA opera en USD; todos los valores del modelo son en USD. estimate_local y local_currency convierten al tipo de cambio MEP del día. Guardamos las series oficial, mep y blue por fecha, así la conversión es auditable.
Errores
| Código | Motivo |
|---|---|
400 Validation failed | Falta address o lat/lng, o un campo tiene un valor fuera de rango. El body incluye issues con el campo y el detalle. |
401 Invalid or revoked API key | Clave ausente, inválida o revocada. |
404 Not found | La valuación no existe o no fue emitida con tu clave. |
429 Monthly quota exceeded | Cuota mensual de la clave superada. Se reinicia el día 1 (UTC). |
503 Calibrando | El modelo de valuación todavía no está activo. Las estadísticas y los barrios siguen disponibles. |
Límites y versiones
La cuota es mensual por clave y cada request consumido cuenta, incluidos los que devuelven 400. La versión de la API va en la URL (/v1); cambios incompatibles salen como /v2 con al menos 6 meses de convivencia. El modelo se reentrena y su model_version cambia sin afectar el contrato; avisamos por email y en el changelog antes de cada versión mayor.
Changelog
2026-09 · /v1 en calibración para CABA. GET /market-stats y GET /barrios (con geometría oficial) activos; POST /valuations valida y responde 503 hasta que el modelo esté calibrado.