Skip to main content
PlaceAnalyzer - Logo completo
PlaceAnalyzer - Logo completoAPI ReferenceGuías

Flujo Básico de Avalúo

Este tutorial te lleva desde cero hasta obtener tu primera tasación inmobiliaria. Es el

"Hola Mundo" de Place Analyzer API.

Los 3 Endpoints Principales

Este flujo utiliza los endpoints del

API Reference:

#MétodoEndpointDescripción
1POST/valuation-requestCrear solicitud → obtienes requestCode
2GET/valuation-request/[code]Consultar estado → verificas si está READY
3GET/valuation-request/[code]/resultObtener resultado → recibes priceLand y priceBuild

El Ciclo de Vida de un Avalúo

Los avalúos en Place Analyzer son asíncronos. Esto significa que:

  1. Envías una solicitud de tasación (toma segundos) → Recibes un requestCode
  2. Consultas el estado periódicamente (cada 5-10 segundos) → Verificas si está READY
  3. Obtienes el resultado completo cuando está listo → Recibes priceLand y priceBuild

Paso 1: Crear la Solicitud de Avalúo

Estructura del Request

El cuerpo de la solicitud tiene la siguiente estructura:

{
  "latitude": number,        // Requerido: Latitud GPS
  "longitude": number,       // Requerido: Longitud GPS
  "property": {              // Requerido: Datos de la propiedad
    "propertyType": string,      // Requerido: Casa, Departamento, Terreno, etc.
    "propertyAge": string,       // Requerido según tipo de propiedad: Nuevo, Semi nuevo, Antiguo, etc.
    "propertyCondition": string, // Requerido según tipo de propiedad: Excelente, Bueno, Regular, Malo
    "m2Land": number,            // Requerido según tipo de propiedad: Metros² de terreno
    "m2Built": number,           // Requerido según tipo de propiedad: Metros² construidos
    "m2Covered": number,         // Requerido para Departamento: Metros² cubiertos
    "m2SemiCovered": number,     // Requerido para Departamento: Metros² semicubiertos
    "numberOfBedrooms": integer, // Opcional: Número de dormitorios
    "numberOfBathrooms": integer,// Opcional: Número de baños
    "garageSpaces": integer,     // Opcional: Espacios de garage
    "hasServiceArea": boolean,   // Opcional: Tiene área de servicio
    "hasBalcony": boolean,       // Opcional: Tiene balcón
    "hasGym": boolean,           // Opcional: Tiene gimnasio
    "hasPool": boolean,          // Opcional: Tiene piscina
    "isLuxury": boolean          // Opcional: Es propiedad de lujo
  }
}

Campos Requeridos

CampoTipoDescripciónEjemploObs
latitudenumberLatitud GPS de la propiedad-34.603722
longitudenumberLongitud GPS de la propiedad-58.381592
property.propertyTypestringTipo de propiedadCasa, Departamento, TerrenoSiempre requerido
property.m2LandnumberMetros² de terreno360Requerido para Terreno y demás tipos (no Departamento)
property.m2BuiltnumberMetros² construidos120Requerido para demás tipos (no Terreno ni Departamento)
property.m2CoverednumberMetros² cubiertos80Requerido para Departamento
property.m2SemiCoverednumberMetros² semicubiertos10Requerido para Departamento
property.propertyAgestringAntigüedad del inmuebleNuevo, Semi nuevo, AntiguoRequerido para Departamento y demás tipos
property.propertyConditionstringEstado de conservaciónExcelente, Bueno, Regular, MaloRequerido para demás tipos (no Terreno ni Departamento)

Encontrar las coordenadas

Puedes obtener las coordenadas de varias formas:

📍 Opción 1: Google Maps

  1. Busca la dirección en Google Maps
  2. Haz clic derecho en el punto
  3. Selecciona "Qué hay aquí"
  4. Copia las coordenadas del formato "lat, lng"

📍 Opción 2: Herramientas online

📍 Opción 3: API de geocodificación

// Ejemplo con Google Geocoding API
const geocodeResponse = await fetch(
  `https://maps.googleapis.com/maps/api/geocode/json?address=${encodeURIComponent(address)}`
);

Hacer la petición

Envía una petición POST al endpoint /valuation-request con los datos de la propiedad:

Ejemplo con curl:

curl -X POST "https://api.placeanalyzer.com/valuation-request" \
-H "X-API-KEY: tu_api_key_aqui" \
-H "Content-Type: application/json" \
-d '{
  "latitude": -25.2821,
  "longitude": -57.6353,
  "property": {
    "propertyType": "Casa",
    "propertyAge": "Semi nuevo",
    "propertyCondition": "Bueno",
    "m2Land": 300,
    "m2Built": 200,
    "numberOfBedrooms": 3,
    "numberOfBathrooms": 2,
    "garageSpaces": 1
  }
}'

Respuesta exitosa (200):

{
  "id": 12345,
  "requestCode": "abc-123-xyz-456",
  "requestDate": "2025-01-15T10:30:00Z",
  "status": "CREATED"
}

Paso 2: Consultar el Estado

Los avalúos toman tiempo para procesar (2-5 minutos). Debes consultar el estado periódicamente hasta que cambie a READY.

Ejemplo con curl:

curl -X GET "https://api.placeanalyzer.com/valuation-request/abc-123-xyz-456" \
-H "X-API-KEY: tu_api_key_aqui"

Respuesta completa:

{
  "requestCode": "abc-123-xyz-456",
  "requestDate": "2025-01-15T10:30:00Z",
  "status": "READY",
  "currency": "USD",
  "mlModelCode": "V1",
  "latitude": -25.2821,
  "longitude": -57.6353,
  "region": "PY",
  "property": {
    "propertyId": 67890,
    "propertyType": "Casa",
    "m2Land": 300,
    "m2Built": 200,
    "numberOfBedrooms": 3,
    "numberOfBathrooms": 2,
    "garageSpaces": 1,
    "propertyAge": "Semi nuevo",
    "propertyCondition": "Bueno",
    "hasServiceArea": false,
    "hasBalcony": false,
    "hasGym": false,
    "hasPool": false,
    "isLuxury": false
  },
  "reportSettings": {
    "nearbySales": true,
    "nearbyRentals": true,
    "graphicActivity": true
  },
  "user": {
    "name": "Juan",
    "lastname": "Pérez",
    "username": "[email protected]",
    "company": "Mi Empresa S.A."
  }
}

Estados posibles

EstadoDescripción¿Resultado disponible?
CREATEDEn cola para procesar❌ No
READYProcesamiento terminado✅ Sí
ERROR_VALUATIONError durante el procesamiento❌ No (ver failedMessage)

Estrategia de Polling

JavaScript:

// requestCode obtenido del Paso 1: "abc-123-xyz-456"
const requestCode = "abc-123-xyz-456";
const apiKey = "tu_api_key_aqui";

async function waitForCompletion(requestCode, apiKey) {
  while (true) {
    const response = await fetch(
      `{API_BASE_URL}/valuation-request/${requestCode}`,
      {
        headers: { 'X-API-KEY': apiKey }
      }
    );

    const data = await response.json();

    if (data.status === 'READY') {
      return data;
    } else if (data.status === 'ERROR_VALUATION') {
      throw new Error(`El avalúo falló: ${data.failedMessage}`);
    }

    // Esperar 5 segundos antes de consultar de nuevo
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
}

// Usar la función
waitForCompletion(requestCode, apiKey).then(data => {
  console.log('Avalúo completado:', data);
});

Python:

import time
import requests

# requestCode obtenido del Paso 1
request_code = "abc-123-xyz-456"
api_key = "tu_api_key_aqui"

def wait_for_completion(request_code, api_key):
    while True:
        response = requests.get(
            f'{API_BASE_URL}/valuation-request/{request_code}',
            headers={'X-API-KEY': api_key}
        )

        data = response.json()

        if data['status'] == 'READY':
            return data
        elif data['status'] == 'ERROR_VALUATION':
            raise Exception(f"El avalúo falló: {data.get('failedMessage', 'Error desconocido')}")

        # Esperar 5 segundos
        time.sleep(5)

# Usar la función
result = wait_for_completion(request_code, api_key)
print('Avalúo completado:', result)

Paso 3: Obtener el Resultado Completo

Una vez que el estado es READY, solicita el resultado de la tasación:

Ejemplo con curl:

curl -X GET "{API_BASE_URL}/valuation-request/abc-123-xyz-456/result" \
-H "X-API-KEY: tu_api_key_aqui"

Respuesta exitosa (200):

{
  "requestCode": "abc-123-xyz-456",
  "requestDate": "2025-01-15T10:30:00Z",
  "status": "READY",
  "currency": "USD",
  "mlModelCode": "V1",
  "priceLand": 150000.00,
  "priceBuild": 200000.00
}

¿Qué significa cada campo?

CampoDescripciónEjemplo
requestCodeCódigo único de la solicitudabc-123-xyz-456
requestDateFecha y hora de la solicitud2025-01-15T10:30:00Z
statusEstado final del avalúoREADY
currencyMoneda de los valoresUSD
mlModelCodeCódigo del modelo ML utilizadoV1
priceLandValor estimado del terreno150000.00
priceBuildValor estimado de la construcción200000.00

📋 Resumen: Diferencia entre los 3 endpoints

PasoEndpointMétodoQué devuelveCuándo llamarlo
1/valuation-requestPOSTid, requestCode, requestDate, statusUna vez al inicio
2/valuation-request/{code}GETEstado completo + detallesMúltiples veces hasta READY
3/valuation-request/{code}/resultGETpriceLand, priceBuildUna vez cuando status = READY

💡 Tip: El Paso 2 es para monitoreo, el Paso 3 es para obtener los valores de tasación.

Ejemplo Completo en JavaScript

Aquí tienes un ejemplo completo que integra los tres pasos:

const API_BASE = '{API_BASE_URL}';
const API_KEY = 'tu_api_key_aqui';

async function createValuation() {
  // Función auxiliar para esperar a que el avalúo se complete
  async function waitForCompletion(requestCode) {
    while (true) {
      const response = await fetch(
        `${API_BASE}/valuation-request/${requestCode}`,
        {
          headers: { 'X-API-KEY': API_KEY }
        }
      );

      const data = await response.json();

      if (data.status === 'READY') {
        return data;
      } else if (data.status === 'ERROR_VALUATION') {
        throw new Error(`El avalúo falló: ${data.failedMessage || 'Error desconocido'}`);
      }

      console.log(`⏳ Estado: ${data.status} - Esperando 5 segundos...`);
      await new Promise(resolve => setTimeout(resolve, 5000));
    }
  }

  try {
    // ============================================================
    // PASO 1: Crear solicitud (POST /valuation-request)
    // ============================================================
    console.log('🚀 Paso 1: Creando solicitud de avalúo...');
    
    const createResponse = await fetch(`${API_BASE}/valuation-request`, {
      method: 'POST',
      headers: {
        'X-API-KEY': API_KEY,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        "latitude": -25.2821,
        "longitude": -57.6353,
        property: {
          propertyType: 'Casa',
          propertyAge: 'Semi nuevo',
          propertyCondition: 'Bueno',
          m2Land: 300,
          m2Built: 200,
          numberOfBedrooms: 3,
          numberOfBathrooms: 2,
          garageSpaces: 1
        }
      })
    });

    const createResult = await createResponse.json();
    const requestCode = createResult.requestCode;

    console.log(`✅ Solicitud creada: ${requestCode}`);
    console.log(`   ID: ${createResult.id}`);
    console.log(`   Estado: ${createResult.status}`);

    // ============================================================
    // PASO 2: Consultar estado (GET /valuation-request/[code])
    // ============================================================
    console.log('⏳ Paso 2: Esperando a que el estado sea READY...');
    
    const valuationDetails = await waitForCompletion(requestCode);
    
    console.log('✅ Estado: READY');
    console.log(`   Región: ${valuationDetails.region}`);
    console.log(`   Modelo ML: ${valuationDetails.mlModelCode}`);

    // ============================================================
    // PASO 3: Obtener resultado (GET /valuation-request/[code]/result)
    // ============================================================
    console.log('📊 Paso 3: Obteniendo resultado completo...');
    
    const resultResponse = await fetch(
      `${API_BASE}/valuation-request/${requestCode}/result`,
      {
        headers: { 'X-API-KEY': API_KEY }
      }
    );

    const result = await resultResponse.json();
    const totalValue = result.priceLand + result.priceBuild;

    console.log('🎉 ¡Avalúo completado!');
    console.log(`💰 Valor del terreno: $${result.priceLand.toLocaleString()} ${result.currency}`);
    console.log(`🏠 Valor construcción: $${result.priceBuild.toLocaleString()} ${result.currency}`);
    console.log(`📊 Valor total: $${totalValue.toLocaleString()} ${result.currency}`);

    return result;

  } catch (error) {
    console.error('❌ Error:', error.message);
  }
}

// Ejecutar el ejemplo
createValuation();

Ejemplo Completo en Python

import time
import requests

API_BASE = '{API_BASE_URL}'
API_KEY = 'tu_api_key_aqui'

def create_valuation():
    try:
        # ============================================================
        # PASO 1: Crear solicitud (POST /valuation-request)
        # ============================================================
        print('🚀 Paso 1: Creando solicitud de avalúo...')
        
        create_response = requests.post(
            f'{API_BASE}/valuation-request',
            headers={
                'X-API-KEY': API_KEY,
                'Content-Type': 'application/json'
            },
            json={
                "latitude": -25.2821,
                "longitude": -57.6353,
                'property': {
                    'propertyType': 'Casa',
                    'propertyAge': 'Semi nuevo',
                    'propertyCondition': 'Bueno',
                    'm2Land': 300,
                    'm2Built': 200,
                    'numberOfBedrooms': 3,
                    'numberOfBathrooms': 2,
                    'garageSpaces': 1
                }
            }
        )
        
        create_result = create_response.json()
        request_code = create_result['requestCode']
        
        print(f"✅ Solicitud creada: {request_code}")
        print(f"   ID: {create_result['id']}")
        print(f"   Estado: {create_result['status']}")

        # ============================================================
        # PASO 2: Consultar estado (GET /valuation-request/[code])
        # ============================================================
        print('⏳ Paso 2: Esperando a que el estado sea READY...')
        
        valuation_details = wait_for_completion(request_code)
        
        print('✅ Estado: READY')
        print(f"   Región: {valuation_details.get('region', 'N/A')}")
        print(f"   Modelo ML: {valuation_details.get('mlModelCode', 'N/A')}")

        # ============================================================
        # PASO 3: Obtener resultado (GET /valuation-request/[code]/result)
        # ============================================================
        print('📊 Paso 3: Obteniendo resultado completo...')
        
        result_response = requests.get(
            f'{API_BASE}/valuation-request/{request_code}/result',
            headers={'X-API-KEY': API_KEY}
        )
        
        result = result_response.json()
        total_value = result['priceLand'] + result['priceBuild']
        
        print('🎉 ¡Avalúo completado!')
        print(f"💰 Valor del terreno: ${result['priceLand']:,.2f} {result['currency']}")
        print(f"🏠 Valor construcción: ${result['priceBuild']:,.2f} {result['currency']}")
        print(f"📊 Valor total: ${total_value:,.2f} {result['currency']}")
        
        return result
        
    except Exception as e:
        print(f'❌ Error: {str(e)}')
        raise

def wait_for_completion(request_code):
    while True:
        response = requests.get(
            f'{API_BASE}/valuation-request/{request_code}',
            headers={'X-API-KEY': API_KEY}
        )
        
        data = response.json()
        
        if data['status'] == 'READY':
            return data
        elif data['status'] == 'ERROR_VALUATION':
            raise Exception(f"El avalúo falló: {data.get('failedMessage', 'Error desconocido')}")
        
        print(f"⏳ Estado: {data['status']} - Esperando 5 segundos...")
        time.sleep(5)

# Ejecutar el ejemplo
if __name__ == '__main__':
    create_valuation()

Conclusión

¡Felicidades! 🎉 Has completado tu primer avalúo con Place Analyzer API.

Resumen de lo que aprendiste:

  1. ✅ Paso 1: POST /valuation-request - Crear solicitud con latitude, longitude y property
  2. ✅ Paso 2: GET /valuation-request/[code] - Monitorear estado hasta READY
  3. ✅ Paso 3: GET /valuation-request/[code]/result - Obtener priceLand y priceBuild

🚀 Próximos pasos recomendados:

Ahora que dominas el flujo básico, explora más funcionalidades:

💬 ¿Necesitas ayuda?