# AdondeVivir Peru Real Estate Scraper | Property Listings API (`scrapers_lat/adondevivir-scraper`) Actor

Scrape AdondeVivir property listings for sale and rent in Peru: apartments, houses, offices and land in Lima and nationwide. Extract price in USD and PEN, bedrooms, bathrooms, area, price per m2, location, amenities, images, agent phone and WhatsApp. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/adondevivir-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Real estate, Business, Automation
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $6.15 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![AdondeVivir Peru Real Estate Scraper](https://scrapers.lat/banners/adondevivir-scraper.png)](https://console.apify.com/actors/37zGwq9Vei0HFyTPu/input)

## AdondeVivir Peru Real Estate Scraper | Property Listings & API

The most complete **AdondeVivir (Peru) real estate scraper and API**. Turn any adondevivir.com search into clean, structured **property listings data**: apartments (departamentos), houses (casas), offices and land for **sale or rent** in Lima and across Peru. Get **dual-currency prices (USD and PEN)**, bedrooms, bathrooms, area, price per m2, exact address and geo coordinates, amenities, full image galleries, and **agent phone plus WhatsApp**. Export to JSON, CSV or Excel, or pull it live over the API.

Here is one real result, with every field the actor returns:

```json
{
  "imageUrl": "https://img10.naventcdn.com/avisos/111/01/50/99/85/85/720x532/1629728726.jpg",
  "title": "Departamento 100m2 Alquiler Jesus Maria - 2 Dorm. Cada Uno con Bano Propio",
  "price": 3100,
  "currency": "PEN",
  "priceUsd": 924,
  "pricePen": 3100,
  "maintenanceFee": 280,
  "maintenanceFeeCurrency": "PEN",
  "operationType": "alquiler",
  "propertyType": "Departamento",
  "isDevelopment": false,
  "bedrooms": 2,
  "bathrooms": 3,
  "totalAreaM2": 100,
  "builtAreaM2": 100,
  "pricePerM2": 31,
  "pricePerM2Currency": "PEN",
  "age": "2",
  "ageYears": 2,
  "isNew": false,
  "location": "Jesus Maria, Lima",
  "address": "Av. Salaverry 2158",
  "district": "Jesus Maria",
  "city": "Lima",
  "region": "Lima",
  "coordinates": { "lat": -12.0857511, "lng": -77.0500467 },
  "status": "ONLINE",
  "reserved": false,
  "numberOfFloors": null,
  "amenities": ["Guardiania/Seguridad privada", "Parrilla", "Area de lavanderia", "Closet", "Balcon(es)"],
  "images": [
    "https://img10.naventcdn.com/avisos/resize/111/01/50/99/85/85/1200x1200/1629728726.jpg",
    "https://img10.naventcdn.com/avisos/resize/111/01/50/99/85/85/1200x1200/1629728748.jpg"
  ],
  "description": "Se alquila departamento de 2 dormitorios cada uno con bano propio en Jesus Maria...",
  "publisher": {
    "name": "GROVER ROSAS",
    "url": "https://www.adondevivir.com/inmobiliarias/grover-rosas_102948719-inmuebles.html",
    "logo": "https://img10.naventcdn.com/empresas/111/01/02/94/54/28/130x70/logo_grover-rosas.jpg",
    "publisherId": "102948719",
    "partialPhone": "96189",
    "license": null,
    "premium": false,
    "publisherTypeId": 4
  },
  "publisherId": "102948719",
  "publisherLogo": "https://img10.naventcdn.com/empresas/111/01/02/94/54/28/130x70/logo_grover-rosas.jpg",
  "agentPhone": "+51961891527",
  "agentWhatsapp": "+51961891527",
  "contactName": null,
  "postingCode": "grover",
  "url": "https://www.adondevivir.com/propiedades/clasificado/alclapin-se-alquila-departamento-de-100-m2-de-2-dorm-cada-150998588.html",
  "listingId": "150998588",
  "publishedDate": "2026-09-04T07:12:13Z",
  "observedAt": "2026-09-04T10:58:04.708Z",
  "detailError": null,
  "error": null
}
```

**📥 [Input](https://apify.com/scrapers_lat/adondevivir-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/adondevivir-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/adondevivir-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/adondevivir-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Peru-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Why this scraper](#why-this-scraper)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [How it compares](#how-it-compares)
- [Use cases](#use-cases)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

The actor takes one or more AdondeVivir.com search results URLs (apply any filters on the site and paste the resulting URL), paginates through the matching properties, and writes one clean record per listing to the run's dataset. Each listing record carries the image, title, price and currency, both the USD and PEN figures when the listing shows them, operation type (venta or alquiler), property type, bedrooms, bathrooms, total and built area, a computed `pricePerM2`, location, listing id and the direct URL.

When `withDetails` is on, each listing's detail page is opened to add the full description, published date, amenities, the complete image gallery, structured address (street, district, city, region) with geo coordinates, maintenance/HOA fee, the publisher/agency block and the agent phone and WhatsApp. Three optional AI add-ons (paid Apify plans only) add an English summary, structured features (condition, highlights, nearby points of interest), and a Spanish-to-English translation of title and description. Missing values are returned as `null`, never invented.

### Why this scraper

- **Dual-currency prices.** Both `priceUsd` and `pricePen` are captured straight from the listing, so you never guess an exchange rate.
- **Real contact data.** Agent `agentPhone` and `agentWhatsapp` plus the full publisher/agency block, not just a masked partial.
- **Analysis-ready metrics.** A computed `pricePerM2` (in the listing's own currency) that competing scrapers do not provide.
- **Full location.** Street `address`, `district`, `city`, `region` and `{lat, lng}` coordinates, not only a district string.
- **Complete media and amenities.** Entire image gallery and the full amenities list, not a single thumbnail.
- **Batch and filters.** Multiple search URLs in one run, plus optional price, bedroom, bathroom and area filters on top of the URL.
- **Honest billing.** No charge on failure, free-plan cap, and a spend limit you control.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns apartments for sale with full details.

```json
{
  "startUrl": "https://www.adondevivir.com/departamentos-en-venta.html",
  "maxListings": 25,
  "withDetails": true
}
```

Apply filters on adondevivir.com and paste the resulting search URL into `startUrl`. Every field except a search URL is optional.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `startUrl` | string | one URL required | departamentos-en-venta | An AdondeVivir.com search results URL. Apply filters on the site and paste the URL, for example `https://www.adondevivir.com/departamentos-en-venta.html`. |
| `startUrls` | array | no | empty | Optional list of AdondeVivir search URLs to scrape in one run (plain strings or `{ "url": "..." }` objects). |
| `maxListings` | integer | no | all (paid) / 10 (free) | Maximum number of listings to collect. |
| `withDetails` | boolean | no | `true` | Paid plans only. Fetches each detail page to add description, amenities, gallery, exact dual-currency price, address, publisher/agent and coordinates. Billed per listing enriched (`details`). |
| `minPrice` | integer | no | none | Keep listings priced at or above this amount, in `priceCurrency`. |
| `maxPrice` | integer | no | none | Keep listings priced at or below this amount, in `priceCurrency`. |
| `priceCurrency` | string | no | `USD` | Currency used for the price filters (`USD` or `PEN`). |
| `minBedrooms` | integer | no | none | Keep listings with at least this many bedrooms. |
| `maxBedrooms` | integer | no | none | Keep listings with at most this many bedrooms. |
| `minBathrooms` | integer | no | none | Keep listings with at least this many bathrooms. |
| `minAreaM2` | integer | no | none | Keep listings with total area at or above this many m2. |
| `maxAreaM2` | integer | no | none | Keep listings with total area at or below this many m2. |
| `withAiListingSummary` | boolean | no | `false` | Paid AI add-on. Writes a concise English summary of each listing. Charged only when a summary is produced. |
| `withAiFeatures` | boolean | no | `false` | Paid AI add-on. Extracts structured condition, highlights and nearby points of interest. Charged only when features are produced. |
| `withAiTranslate` | boolean | no | `false` | Paid AI add-on. Translates each listing title and description from Spanish to English. Charged only when a translation is produced. |

### Output reference

One dataset item per listing. Types: `string`, `number`, `boolean`, `string[]`, `object`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `imageUrl` | string | Main listing image. |
| `title` | string | Listing title. |
| `price` | number | Primary price (PEN when shown, else USD), or `null`. |
| `currency` | string | Currency of `price`: `PEN` or `USD`, or `null`. |
| `priceUsd` | number | Price in US dollars when shown, or `null`. |
| `pricePen` | number | Price in Peruvian soles when shown, or `null`. |
| `maintenanceFee` | number | Maintenance/HOA fee when shown, or `null`. |
| `maintenanceFeeCurrency` | string | Currency of the maintenance fee, or `null`. |
| `operationType` | string | `venta` (sale) or `alquiler` (rent). |
| `propertyType` | string | Property type, for example `Departamento`, `Casa`, `Oficina`. |
| `isDevelopment` | boolean | `true` for new-build projects (proyecto), else `false`. |
| `bedrooms` | number | Bedroom count, or `null`. |
| `bathrooms` | number | Bathroom count, or `null`. |
| `halfBathrooms` | number | Half bathroom count, or `null`. |
| `parkingSpaces` | number | Parking spaces, or `null`. |
| `totalAreaM2` | number | Total area in square meters, or `null`. |
| `builtAreaM2` | number | Built/covered area in square meters, or `null`. |
| `pricePerM2` | number | Price per m2 in the listing's own currency, computed when price and area are known, else `null`. |
| `pricePerM2Currency` | string | Currency of `pricePerM2`, or `null`. |
| `age` | string | Antiquity as shown ("A estrenar" or a number of years), or `null`. |
| `ageYears` | number | Numeric age in years when parseable, or `null`. |
| `isNew` | boolean | `true` when brand new (a estrenar), else `false`/`null`. |
| `numberOfFloors` | number | Building floor count when published, or `null`. |
| `location` | string | District and city as shown on the card. |
| `address` | string | Street address (with `withDetails`), or `null`. |
| `district` | string | District/neighborhood, or `null`. |
| `city` | string | City, or `null`. |
| `region` | string | Region/province, or `null`. |
| `coordinates` | object | `{lat, lng}` geo coordinates (with `withDetails`), or `null`. |
| `status` | string | Listing status, for example `ONLINE`, or `null`. |
| `reserved` | boolean | Whether the listing is reserved, or `null`. |
| `amenities` | string\[] | Amenities and features (with `withDetails`), or `null`. |
| `images` | string\[] | Full image gallery (with `withDetails`), or `null`. |
| `description` | string | Full listing description, or `null`. |
| `publisher` | object | Agency block: name, url, logo, publisherId, partialPhone, license, premium, publisherTypeId. |
| `publisherId` | string | Publisher/agency id, or `null`. |
| `publisherLogo` | string | Publisher/agency logo URL, or `null`. |
| `agentPhone` | string | Agent phone in `+<digits>` form, or `null`. |
| `agentWhatsapp` | string | Agent WhatsApp number, or `null`. |
| `contactName` | string | Agent contact name when the listing exposes one, or `null`. |
| `postingCode` | string | Human-readable listing code, or `null`. |
| `url` | string | Direct link to the listing. |
| `listingId` | string | AdondeVivir listing id. |
| `publishedDate` | string | Publication date (ISO 8601), or `null`. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `aiListingSummary` | string | AI English summary when the add-on is enabled, else `null`. |
| `aiFeatures` | object | AI structured features (condition, highlights, nearby) when enabled, else `null`. |
| `aiListingEnglish` | object | AI English title and description when enabled, else `null`. |
| `detailError` | string | Set only when the detail page failed while the base listing was still delivered (that row is not billed the `details` add-on). |
| `error` | string | Present only on a failed run; a single item with a populated `error` field is written instead. |

### How it compares

| Capability | This actor | Typical AdondeVivir / Navent scraper |
|---|---|---|
| Sale and rent listings | Yes | Yes |
| Multiple search URLs per run | Yes | Often single URL |
| Price filters, beds, baths, area | Yes | Partial |
| Dual currency (USD and PEN) | Yes, both numeric | Usually one figure |
| Price per m2 | Yes, computed | No |
| Maintenance/HOA fee | Yes | Rare |
| Structured address + district/city/region | Yes | District string only |
| Geo coordinates | Yes | Sometimes |
| Full image gallery | Yes | Thumbnail only |
| Amenities list | Yes | Partial |
| Agent phone | Yes | Often WhatsApp only |
| Agent WhatsApp | Yes | Sometimes |
| Publisher/agency block | Yes | Partial |
| Optional AI enrichment | Yes | No |
| No charge on failure + spend cap | Yes | Varies |

### Use cases

- **Real estate market analysis** across Lima and Peru: track price per m2, inventory and rent vs sale trends.
- **Lead generation** for agencies and proptech: agent phone, WhatsApp and publisher details per listing.
- **Property portals and aggregators** that need clean, deduplicated AdondeVivir inventory on a schedule.
- **Investors and appraisers** comparing dual-currency prices, area and amenities across districts.
- **CRM and spreadsheet enrichment** by exporting straight to JSON, CSV or Excel.

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~adondevivir-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"startUrl":"https://www.adondevivir.com/departamentos-en-venta.html","maxListings":25,"withDetails":true}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~adondevivir-scraper/runs?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"startUrl":"https://www.adondevivir.com/casas-en-alquiler.html","maxListings":100}'
```

Apify CLI:

```bash
apify call scrapers_lat/adondevivir-scraper \
  --input '{"startUrl":"https://www.adondevivir.com/departamentos-en-venta.html"}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per listing record returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/adondevivir-scraper/pricing) for the current per-result price.
- **Add-ons billed separately.** `details` is charged per listing enriched (paid plans only); `ai_listing_summary`, `ai_features` and `ai_translate` are each charged per listing only when the model returns usable output.
- **No charge on failure.** If a run errors, the actor writes a single item with a populated `error` field and does not charge for it. If a detail page fails while the base listing is still delivered, that row is not billed the `details` add-on. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 10 records per run and listing-only. Upgrade for the full result set and detail enrichment.

### FAQ and troubleshooting

**A run returned 0 records. Why?**
The search URL matched no listings, or the source throttled the request. Confirm the URL loads results on adondevivir.com. Zero-result runs are not charged.

**How do I filter by district, price or property type?**
Apply the filters on adondevivir.com, then copy the resulting search URL into `startUrl`. You can also use the optional `minPrice`, `maxPrice`, `minBedrooms`, `maxBedrooms`, `minBathrooms`, `minAreaM2` and `maxAreaM2` inputs on top of the URL.

**Do I get agent phone numbers?**
When `withDetails` is on and the listing exposes them, yes: `agentPhone` and `agentWhatsapp` are populated from the detail page, along with the full publisher/agency block.

**Why are some prices only in one currency?**
Not every listing publishes both currencies. When only one is shown, the other stays `null`. Project and pre-sale listings often show a starting ("desde") price. Missing values are never invented.

**Can I scrape several searches at once?**
Yes. Pass an array of URLs in `startUrls`, or combine `startUrl` with `startUrls`.

**Is this an official AdondeVivir tool?**
No. This actor is independent and has no affiliation with AdondeVivir or Navent. It reads only data that is publicly available on adondevivir.com.

### Related scrapers

- [Urbania Scraper](https://apify.com/scrapers_lat/urbania-scraper): Peru real estate listings on the same Navent platform.
- [Nexo Inmobiliario Peru Scraper](https://apify.com/scrapers_lat/nexo-inmobiliario-peru-scraper): Peru new-development property listings.
- [InfoCasas Scraper](https://apify.com/scrapers_lat/infocasas-scraper): Latin America property listings.
- [Properati Scraper](https://apify.com/scrapers_lat/properati-scraper): Latin America real estate listings.
- [Plusvalia Scraper](https://apify.com/scrapers_lat/plusvalia-scraper): Ecuador and regional property listings.
- [Lamudi Scraper](https://apify.com/scrapers_lat/lamudi-scraper): Emerging-market real estate listings.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

## AdondeVivir Scraper de Inmuebles Peru | Datos y API de Propiedades

El scraper y **API de inmuebles de AdondeVivir (Peru)** mas completo. Convierte cualquier busqueda de adondevivir.com en **datos estructurados de propiedades**: departamentos, casas, oficinas y terrenos en **venta o alquiler** en Lima y en todo el Peru. Obten **precios en doble moneda (USD y PEN)**, dormitorios, banos, area, precio por m2, direccion exacta y coordenadas, amenidades, galerias completas de imagenes y **telefono del agente y WhatsApp**. Exporta a JSON, CSV o Excel, o consume los datos en vivo por la API.

Este es un resultado real, con todos los campos que devuelve el actor:

```json
{
  "imageUrl": "https://img10.naventcdn.com/avisos/111/01/50/99/85/85/720x532/1629728726.jpg",
  "title": "Departamento 100m2 Alquiler Jesus Maria - 2 Dorm. Cada Uno con Bano Propio",
  "price": 3100,
  "currency": "PEN",
  "priceUsd": 924,
  "pricePen": 3100,
  "maintenanceFee": 280,
  "maintenanceFeeCurrency": "PEN",
  "operationType": "alquiler",
  "propertyType": "Departamento",
  "isDevelopment": false,
  "bedrooms": 2,
  "bathrooms": 3,
  "totalAreaM2": 100,
  "builtAreaM2": 100,
  "pricePerM2": 31,
  "pricePerM2Currency": "PEN",
  "age": "2",
  "ageYears": 2,
  "isNew": false,
  "location": "Jesus Maria, Lima",
  "address": "Av. Salaverry 2158",
  "district": "Jesus Maria",
  "city": "Lima",
  "region": "Lima",
  "coordinates": { "lat": -12.0857511, "lng": -77.0500467 },
  "status": "ONLINE",
  "reserved": false,
  "amenities": ["Guardiania/Seguridad privada", "Parrilla", "Area de lavanderia", "Closet", "Balcon(es)"],
  "agentPhone": "+51961891527",
  "agentWhatsapp": "+51961891527",
  "url": "https://www.adondevivir.com/propiedades/clasificado/alclapin-...-150998588.html",
  "listingId": "150998588",
  "publishedDate": "2026-09-04T07:12:13Z"
}
```

### Tabla de contenido

- [Que hace](#que-hace)
- [Por que este scraper](#por-que-este-scraper)
- [Inicio rapido](#inicio-rapido)
- [Referencia de entrada](#referencia-de-entrada)
- [Referencia de salida](#referencia-de-salida)
- [Como se compara](#como-se-compara)
- [Casos de uso](#casos-de-uso)
- [Uso por API y CLI](#uso-por-api-y-cli)
- [Obtener resultados](#obtener-resultados)
- [Facturacion y limites](#facturacion-y-limites)
- [Preguntas frecuentes](#preguntas-frecuentes)

### Que hace

El actor toma una o varias URL de resultados de busqueda de AdondeVivir.com (aplica los filtros que quieras en el sitio y pega la URL resultante), recorre las propiedades y escribe un registro limpio por aviso en el dataset de la ejecucion. Cada registro incluye la imagen, el titulo, el precio y la moneda, las cifras en USD y PEN cuando el aviso las muestra, el tipo de operacion (venta o alquiler), el tipo de propiedad, dormitorios, banos, area total y techada, un `pricePerM2` calculado, la ubicacion, el id del aviso y la URL directa.

Con `withDetails` activado, se abre la pagina de detalle de cada aviso para agregar la descripcion completa, la fecha de publicacion, las amenidades, la galeria completa de imagenes, la direccion estructurada (calle, distrito, ciudad, region) con coordenadas, el gasto de mantenimiento, el bloque de la inmobiliaria y el telefono y WhatsApp del agente. Tres complementos de IA opcionales (solo planes de pago) agregan un resumen en ingles, caracteristicas estructuradas (condicion, aspectos destacados, puntos de interes cercanos) y una traduccion del titulo y la descripcion del espanol al ingles. Los valores ausentes se devuelven como `null`, nunca se inventan.

### Por que este scraper

- **Precios en doble moneda.** Se capturan `priceUsd` y `pricePen` directamente del aviso, sin adivinar tipos de cambio.
- **Datos de contacto reales.** `agentPhone` y `agentWhatsapp` del agente mas el bloque completo de la inmobiliaria, no solo un numero parcial.
- **Metricas listas para analisis.** Un `pricePerM2` calculado (en la moneda del aviso) que otros scrapers no ofrecen.
- **Ubicacion completa.** Calle `address`, `district`, `city`, `region` y coordenadas `{lat, lng}`, no solo el nombre del distrito.
- **Medios y amenidades completos.** Galeria completa de imagenes y la lista completa de amenidades, no una sola miniatura.
- **Lotes y filtros.** Varias URL de busqueda en una ejecucion, mas filtros opcionales de precio, dormitorios, banos y area.
- **Facturacion honesta.** Sin cobro ante fallas, tope para planes gratuitos y un limite de gasto que tu controlas.

### Inicio rapido

Abre el actor, pega esto en la entrada y presiona Run. Devuelve departamentos en venta con detalle completo.

```json
{
  "startUrl": "https://www.adondevivir.com/departamentos-en-venta.html",
  "maxListings": 25,
  "withDetails": true
}
```

Aplica filtros en adondevivir.com y pega la URL de busqueda resultante en `startUrl`. Todos los campos excepto una URL de busqueda son opcionales.

### Referencia de entrada

| Campo | Tipo | Requerido | Predeterminado | Descripcion |
|---|---|---|---|---|
| `startUrl` | string | una URL requerida | departamentos-en-venta | Una URL de resultados de AdondeVivir.com. Aplica filtros en el sitio y pega la URL, por ejemplo `https://www.adondevivir.com/departamentos-en-venta.html`. |
| `startUrls` | array | no | vacio | Lista opcional de URL de busqueda para procesar en una ejecucion (strings o objetos `{ "url": "..." }`). |
| `maxListings` | integer | no | todo (pago) / 10 (gratis) | Numero maximo de avisos a recolectar. |
| `withDetails` | boolean | no | `true` | Solo planes de pago. Abre cada detalle para agregar descripcion, amenidades, galeria, precio exacto en doble moneda, direccion, inmobiliaria/agente y coordenadas. Se cobra por aviso enriquecido (`details`). |
| `minPrice` | integer | no | ninguno | Conserva avisos con precio igual o mayor a este monto, en `priceCurrency`. |
| `maxPrice` | integer | no | ninguno | Conserva avisos con precio igual o menor a este monto, en `priceCurrency`. |
| `priceCurrency` | string | no | `USD` | Moneda usada para los filtros de precio (`USD` o `PEN`). |
| `minBedrooms` | integer | no | ninguno | Conserva avisos con al menos esta cantidad de dormitorios. |
| `maxBedrooms` | integer | no | ninguno | Conserva avisos con como maximo esta cantidad de dormitorios. |
| `minBathrooms` | integer | no | ninguno | Conserva avisos con al menos esta cantidad de banos. |
| `minAreaM2` | integer | no | ninguno | Conserva avisos con area total igual o mayor a estos m2. |
| `maxAreaM2` | integer | no | ninguno | Conserva avisos con area total igual o menor a estos m2. |
| `withAiListingSummary` | boolean | no | `false` | Complemento de IA de pago. Escribe un resumen conciso en ingles. Se cobra solo cuando se genera un resumen. |
| `withAiFeatures` | boolean | no | `false` | Complemento de IA de pago. Extrae condicion, aspectos destacados y puntos de interes cercanos. Se cobra solo cuando se generan. |
| `withAiTranslate` | boolean | no | `false` | Complemento de IA de pago. Traduce el titulo y la descripcion del espanol al ingles. Se cobra solo cuando se genera. |

### Referencia de salida

Un item de dataset por aviso. Tipos: `string`, `number`, `boolean`, `string[]`, `object`, o `null` cuando el valor de origen no existe.

| Campo | Tipo | Descripcion |
|---|---|---|
| `imageUrl` | string | Imagen principal del aviso. |
| `title` | string | Titulo del aviso. |
| `price` | number | Precio principal (PEN si se muestra, si no USD), o `null`. |
| `currency` | string | Moneda de `price`: `PEN` o `USD`, o `null`. |
| `priceUsd` | number | Precio en dolares cuando se muestra, o `null`. |
| `pricePen` | number | Precio en soles cuando se muestra, o `null`. |
| `maintenanceFee` | number | Gasto de mantenimiento cuando se muestra, o `null`. |
| `maintenanceFeeCurrency` | string | Moneda del mantenimiento, o `null`. |
| `operationType` | string | `venta` o `alquiler`. |
| `propertyType` | string | Tipo de propiedad, por ejemplo `Departamento`, `Casa`, `Oficina`. |
| `isDevelopment` | boolean | `true` para proyectos de obra nueva, si no `false`. |
| `bedrooms` | number | Cantidad de dormitorios, o `null`. |
| `bathrooms` | number | Cantidad de banos, o `null`. |
| `halfBathrooms` | number | Cantidad de medios banos, o `null`. |
| `parkingSpaces` | number | Cocheras, o `null`. |
| `totalAreaM2` | number | Area total en m2, o `null`. |
| `builtAreaM2` | number | Area techada/construida en m2, o `null`. |
| `pricePerM2` | number | Precio por m2 en la moneda del aviso, calculado cuando hay precio y area, si no `null`. |
| `pricePerM2Currency` | string | Moneda de `pricePerM2`, o `null`. |
| `age` | string | Antiguedad tal como se muestra ("A estrenar" o numero de anos), o `null`. |
| `ageYears` | number | Antiguedad numerica en anos cuando es interpretable, o `null`. |
| `isNew` | boolean | `true` si es a estrenar, si no `false`/`null`. |
| `numberOfFloors` | number | Numero de pisos del edificio cuando se publica, o `null`. |
| `location` | string | Distrito y ciudad como aparecen en la tarjeta. |
| `address` | string | Direccion (con `withDetails`), o `null`. |
| `district` | string | Distrito/barrio, o `null`. |
| `city` | string | Ciudad, o `null`. |
| `region` | string | Region/provincia, o `null`. |
| `coordinates` | object | Coordenadas `{lat, lng}` (con `withDetails`), o `null`. |
| `status` | string | Estado del aviso, por ejemplo `ONLINE`, o `null`. |
| `reserved` | boolean | Si el aviso esta reservado, o `null`. |
| `amenities` | string\[] | Amenidades y caracteristicas (con `withDetails`), o `null`. |
| `images` | string\[] | Galeria completa de imagenes (con `withDetails`), o `null`. |
| `description` | string | Descripcion completa del aviso, o `null`. |
| `publisher` | object | Bloque de la inmobiliaria: name, url, logo, publisherId, partialPhone, license, premium, publisherTypeId. |
| `publisherId` | string | Id de la inmobiliaria, o `null`. |
| `publisherLogo` | string | URL del logo de la inmobiliaria, o `null`. |
| `agentPhone` | string | Telefono del agente en formato `+<digitos>`, o `null`. |
| `agentWhatsapp` | string | WhatsApp del agente, o `null`. |
| `contactName` | string | Nombre de contacto del agente cuando el aviso lo expone, o `null`. |
| `postingCode` | string | Codigo legible del aviso, o `null`. |
| `url` | string | Enlace directo al aviso. |
| `listingId` | string | Id del aviso en AdondeVivir. |
| `publishedDate` | string | Fecha de publicacion (ISO 8601), o `null`. |
| `observedAt` | string | Marca de tiempo ISO 8601 de cuando se recolecto el registro. |
| `aiListingSummary` | string | Resumen en ingles por IA cuando el complemento esta activo, si no `null`. |
| `aiFeatures` | object | Caracteristicas estructuradas por IA cuando esta activo, si no `null`. |
| `aiListingEnglish` | object | Titulo y descripcion en ingles por IA cuando esta activo, si no `null`. |
| `detailError` | string | Presente solo cuando la pagina de detalle fallo pero el aviso base si se entrego (esa fila no se cobra el complemento `details`). |
| `error` | string | Presente solo en una ejecucion fallida; se escribe un unico item con el campo `error`. |

### Como se compara

| Capacidad | Este actor | Scraper tipico de AdondeVivir / Navent |
|---|---|---|
| Avisos de venta y alquiler | Si | Si |
| Varias URL de busqueda por ejecucion | Si | Suele ser una sola |
| Filtros de precio, dormitorios, banos, area | Si | Parcial |
| Doble moneda (USD y PEN) | Si, ambas numericas | Suele ser una cifra |
| Precio por m2 | Si, calculado | No |
| Gasto de mantenimiento | Si | Raro |
| Direccion estructurada + distrito/ciudad/region | Si | Solo texto del distrito |
| Coordenadas geograficas | Si | A veces |
| Galeria completa de imagenes | Si | Solo miniatura |
| Lista de amenidades | Si | Parcial |
| Telefono del agente | Si | Suele ser solo WhatsApp |
| WhatsApp del agente | Si | A veces |
| Bloque de la inmobiliaria | Si | Parcial |
| Enriquecimiento con IA opcional | Si | No |
| Sin cobro ante fallas + tope de gasto | Si | Variable |

### Casos de uso

- **Analisis del mercado inmobiliario** en Lima y Peru: sigue el precio por m2, el inventario y las tendencias de alquiler frente a venta.
- **Generacion de leads** para inmobiliarias y proptech: telefono del agente, WhatsApp y datos de la inmobiliaria por aviso.
- **Portales y agregadores** que necesitan inventario de AdondeVivir limpio y deduplicado de forma programada.
- **Inversores y tasadores** que comparan precios en doble moneda, area y amenidades entre distritos.
- **Enriquecimiento de CRM y hojas de calculo** exportando directo a JSON, CSV o Excel.

### Uso por API y CLI

Inicia una ejecucion, espera a que termine y lee el dataset. Reemplaza `<TOKEN>` con tu token de API de Apify.

Ejecucion sincronica que devuelve los items en una sola llamada:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~adondevivir-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"startUrl":"https://www.adondevivir.com/departamentos-en-venta.html","maxListings":25,"withDetails":true}'
```

Ejecucion asincronica:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~adondevivir-scraper/runs?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"startUrl":"https://www.adondevivir.com/casas-en-alquiler.html","maxListings":100}'
```

Apify CLI:

```bash
apify call scrapers_lat/adondevivir-scraper \
  --input '{"startUrl":"https://www.adondevivir.com/departamentos-en-venta.html"}'
```

### Obtener resultados

Cada ejecucion escribe en un dataset. Obten los items en JSON, CSV o Excel cambiando `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"

## Paginar datasets grandes
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&offset=1000&limit=1000"
```

`<DATASET_ID>` se devuelve como `defaultDatasetId` en el objeto de la ejecucion. Usa `offset` y `limit` para paginar. `clean=true` descarta campos vacios e internos.

### Facturacion y limites

- **Pago por resultado.** Se cobra por registro de aviso devuelto (evento `result`). Consulta la [pestana de precios](https://apify.com/scrapers_lat/adondevivir-scraper/pricing) para el precio por resultado vigente.
- **Complementos facturados aparte.** `details` se cobra por aviso enriquecido (solo planes de pago); `ai_listing_summary`, `ai_features` y `ai_translate` se cobran por aviso solo cuando el modelo devuelve salida util.
- **Sin cobro ante fallas.** Si una ejecucion falla, el actor escribe un unico item con el campo `error` y no lo cobra. Si una pagina de detalle falla pero el aviso base si se entrega, esa fila no se cobra el complemento `details`. Las ejecuciones vacias no cuestan nada.
- **Tope de gasto respetado.** Configura `maxTotalChargeUsd` en la ejecucion; al alcanzarlo, el actor deja de emitir y cobrar resultados.
- **Los planes gratuitos de Apify** estan limitados a 10 registros por ejecucion y solo al listado. Mejora tu plan para el conjunto completo y el enriquecimiento de detalle.

### Preguntas frecuentes

**Una ejecucion devolvio 0 registros. Por que?**
La URL de busqueda no encontro avisos, o el origen limito la solicitud. Confirma que la URL carga resultados en adondevivir.com. Las ejecuciones sin resultados no se cobran.

**Como filtro por distrito, precio o tipo de propiedad?**
Aplica los filtros en adondevivir.com y copia la URL de busqueda resultante en `startUrl`. Tambien puedes usar los campos opcionales `minPrice`, `maxPrice`, `minBedrooms`, `maxBedrooms`, `minBathrooms`, `minAreaM2` y `maxAreaM2` sobre la URL.

**Obtengo los telefonos del agente?**
Con `withDetails` activado y cuando el aviso los expone, si: `agentPhone` y `agentWhatsapp` se completan desde la pagina de detalle, junto con el bloque completo de la inmobiliaria.

**Por que algunos precios estan en una sola moneda?**
No todos los avisos publican ambas monedas. Cuando solo se muestra una, la otra queda en `null`. Los proyectos y preventas suelen mostrar un precio "desde". Los valores ausentes nunca se inventan.

**Puedo scrapear varias busquedas a la vez?**
Si. Pasa un arreglo de URL en `startUrls`, o combina `startUrl` con `startUrls`.

**Es una herramienta oficial de AdondeVivir?**
No. Este actor es independiente y no tiene afiliacion con AdondeVivir ni Navent. Solo lee datos disponibles publicamente en adondevivir.com.

### Mas scrapers

- [Urbania Scraper](https://apify.com/scrapers_lat/urbania-scraper): inmuebles de Peru en la misma plataforma Navent.
- [Nexo Inmobiliario Peru Scraper](https://apify.com/scrapers_lat/nexo-inmobiliario-peru-scraper): proyectos de obra nueva en Peru.
- [InfoCasas Scraper](https://apify.com/scrapers_lat/infocasas-scraper): propiedades en America Latina.
- [Properati Scraper](https://apify.com/scrapers_lat/properati-scraper): inmuebles en America Latina.
- [Plusvalia Scraper](https://apify.com/scrapers_lat/plusvalia-scraper): propiedades de Ecuador y la region.
- [Lamudi Scraper](https://apify.com/scrapers_lat/lamudi-scraper): inmuebles de mercados emergentes.

### Mas scrapers en scrapers.lat

Construido y mantenido por [scrapers.lat](https://scrapers.lat), donde publicamos scrapers de plataformas publicas de EE. UU. y America Latina: registros de empresas, datos de gobierno, finanzas, e-commerce y mas. Explora el catalogo o solicita un scraper a medida en [scrapers.lat](https://scrapers.lat).

> Herramienta independiente, sin afiliacion con AdondeVivir ni Navent. Accede solo a datos disponibles publicamente en adondevivir.com.

# Actor input Schema

## `maxListings` (type: `integer`):

Maximum number of real estate listings to collect. Optional.

## `withDetails` (type: `boolean`):

When enabled, each listing's detail page is fetched to add description, amenities, full image gallery, exact dual-currency price, structured address, publisher/agent contacts and coordinates. Paid Apify plans only; billed per listing enriched (details event).

## `startUrl` (type: `string`):

An Adondevivir.com search results URL. Apply any filters on adondevivir.com and paste the resulting URL, for example https://www.adondevivir.com/departamentos-en-venta.html

## `startUrls` (type: `array`):

Optional list of Adondevivir.com search URLs to scrape in one run. Accepts plain strings or {"url": "..."} objects. Combine with or use instead of startUrl.

## `minPrice` (type: `integer`):

Only keep listings priced at or above this amount, in the currency set by Price currency (default USD). Optional.

## `maxPrice` (type: `integer`):

Only keep listings priced at or below this amount, in the currency set by Price currency (default USD). Optional.

## `priceCurrency` (type: `string`):

Currency used for Min/Max price filtering.

## `minBedrooms` (type: `integer`):

Only keep listings with at least this many bedrooms. Optional.

## `maxBedrooms` (type: `integer`):

Only keep listings with at most this many bedrooms. Optional.

## `minBathrooms` (type: `integer`):

Only keep listings with at least this many bathrooms. Optional.

## `minAreaM2` (type: `integer`):

Only keep listings with total area at or above this many square meters. Optional.

## `maxAreaM2` (type: `integer`):

Only keep listings with total area at or below this many square meters. Optional.

## `withAiListingSummary` (type: `boolean`):

Off by default. When on, writes a concise English summary of each listing. Requires a paid Apify plan. Billed only when a summary is produced.

## `withAiFeatures` (type: `boolean`):

Off by default. When on, extracts structured condition, highlights and nearby points of interest from each listing. Requires a paid Apify plan. Billed only when features are produced.

## `withAiTranslate` (type: `boolean`):

Off by default. When on, translates each listing title and description from Spanish to English. Requires a paid Apify plan. Billed only when a translation is produced.

## Actor input object example

```json
{
  "maxListings": 10,
  "withDetails": true,
  "startUrl": "https://www.adondevivir.com/departamentos-en-venta.html",
  "priceCurrency": "USD",
  "withAiListingSummary": false,
  "withAiFeatures": false,
  "withAiTranslate": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxListings": 10,
    "startUrl": "https://www.adondevivir.com/departamentos-en-venta.html"
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/adondevivir-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxListings": 10,
    "startUrl": "https://www.adondevivir.com/departamentos-en-venta.html",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/adondevivir-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxListings": 10,
  "startUrl": "https://www.adondevivir.com/departamentos-en-venta.html"
}' |
apify call scrapers_lat/adondevivir-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/adondevivir-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/37zGwq9Vei0HFyTPu/builds/P5U4uJiyUAZFeYziV/openapi.json
