Obtener el histórico de precios con la API de Oportunista usando Python

En esta guía, aprenderás a obtener el histórico de precios de inmuebles de idealista usando Python y la API de Oportunista.

Una vez que vimos cómo obtener una API key de Oportunista, ya podemos obtener los precios de un inmueble usando Python muy fácilmente. Esto te permitirá tener los datos listos para copiar o, con unas pocas líneas más, exportalo a CSV o Excel.

Requisitos Previos

Antes de comenzar, asegúrate de tener lo siguiente:

pip install requests

Paso 1: Configurar la conexión con la API

Primero, define las credenciales y la URL base de la API:

#!/usr/bin/env python3
import requests

API_KEY = 'TU-API-KEY'
BASE_URL = 'idealista-historico.p.rapidapi.com'

Paso 2: Crea un funcion para llamar a la API

Con este código, hacemos una llamada a la API:

def get_data(property_code):
    url = f"https://{BASE_URL}/inmueble/{property_code}"
    
    headers = {
        "x-rapidapi-key": API_KEY,
        "x-rapidapi-host": BASE_URL
    }
    
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        return response.json()
    except Exception as e:
        print(f"Error: {e}")
        return None

Paso 3: Realizar una consulta con nuestro ID de inmueble

Para obtener el histórico de precios de una propiedad específica, realiza una petición con el ID del inmueble.

data = get_data('107660891')
if data:
    prices = data.get('data',{}).get('prices') or []
    for price_obj in prices:
        print(price_obj['fetchedAt'], price_obj['price'])

Paso 4: Guardar y ejecutar el script

Guardamos y ejecutamos el script para ver los resultados:

python3 oportunista_api.py

Y este será el resultado:

2025-03-23 549000
2025-03-30 330000

Paso 5: Ampliar los datos analizando el contenido

Hasta aquí ya habríamos obtenido los precios. Pero, el objecto data devuelve muchos más datos:

{
    "data": {
        "address": "paseo de la esperanza, 37",
        "bathrooms": 1,
        "country": "es",
        "district": "Arganzuela",
        "exterior": true,
        "fetchedAt": "2025-03-30",
        "floor": "2",
        "hasAirConditioning": true,
        "hasBoxRoom": true,
        "hasGarden": true,
        "hasLift": true,
        "hasParkingSpace": true,
        "hasSwimmingPool": true,
        "hasTerrace": true,
        "highestPrice": 549000,
        "latitude": 40.3997493,
        "locationId": "0-EU-ES-28-07-001-079-02-002",
        "locationName": "Acacias, Madrid",
        "longitude": -3.7033601,
        "lowestPrice": 330000,
        "municipality": "Madrid",
        "neighborhood": "Acacias",
        "numPrices": 2,
        "operation": "sale",
        "price": 330000,
        "priceByArea": 5789,
        "prices": [
            {
                "fetchedAt": "2025-03-23",
                "price": 549000
            },
            {
                "fetchedAt": "2025-03-30",
                "price": 330000
            }
        ],
        "propertyCode": "107660891",
        "propertyType": "flat",
        "province": "Madrid",
        "publishedAt": "2025-03-23",
        "rooms": 2,
        "size": 57,
        "status": "good",
        "subTypology": "",
        "thumbnail": "https://img4.idealista.com/blur/WEB_LISTING-M/0/id.pro.es.image.master/f4/7c/f0/1321091342.webp",
        "typology": "flat",
        "url": "https://www.idealista.com/inmueble/107660891/"
    }
}

Script oportunista_api.py

#!/usr/bin/env python3
import requests


API_KEY = 'TU-API-KEY'
BASE_URL = 'idealista-historico.p.rapidapi.com'
PROPERTY_CODE = '107660891'


def get_data(property_code):
    url = f"https://{BASE_URL}/inmueble/{property_code}"
    
    headers = {
        "x-rapidapi-key": API_KEY,
        "x-rapidapi-host": BASE_URL
    }
    
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        return response.json()
    except Exception as e:
        print(f"Error: {e}")
        return None


def main():
    data = get_data(PROPERTY_CODE)
    if data:
        prices = data.get('data',{}).get('prices') or []
        
        for price_obj in prices:
            print(price_obj['fetchedAt'], price_obj['price'])


if __name__ == '__main__':
    main()

Conclusión

Usando la API de Oportunista junto con Python, es posible extraer y analizar el histórico de precios de inmuebles en Idealista muy fácilmente.

Para ampliar o preguntar dudas puedes entrar a nuestro Discord.

Más artículos de interés