# Urbania Listings Scraper (`piotrv1001/urbania-listings-scraper`) Actor

Export Urbania property listings from any search URL: price in soles or dollars, operation (venta/alquiler), mantenimiento, distrito and coordinates, total and built area, dormitorios, baños, estacionamientos, photos, description and the agency. Peru real estate data as JSON, CSV or Excel.

- **URL**: https://apify.com/piotrv1001/urbania-listings-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🚀 Urbania Listings Scraper

Export property listings from [Urbania](https://urbania.pe), one of Peru's largest real estate portals. The **Urbania Listings Scraper** turns any Urbania search — departamentos en venta en Lima, alquiler de departamentos en Miraflores, casas en venta en Santiago de Surco, terrenos, oficinas and proyectos inmobiliarios, in any distrito — into structured data: price in soles and dollars, mantenimiento, distrito and city, map coordinates, área total and techada, dormitorios, baños, estacionamientos, photos, the full description and the listing inmobiliaria. Use it for rental market analysis, price monitoring, investment research or lead lists of agencies.

### ✨ Features

- 🔎 **Any search you can build on Urbania**: paste the results URL after choosing location, operation, property type, price range, dormitorios, sort order or any other filter — every page of that search is collected, not just the first few.
- 💰 **Prices by operation**: the main `price` follows your search (venta / alquiler), usually in soles; Peruvian listings usually also carry the dollar price, and every price is in `prices`. Currencies are ISO codes (PEN or USD).
- 📍 **Location down to the map pin**: address, distrito or urbanización (`neighborhood`), city and departamento (`region`), plus latitude and longitude when the listing shows its location.
- 📐 **Property details**: total and built area (m², área total and techada), dormitorios, baños and medios baños, estacionamientos, age, property type and mantenimiento fees.
- 🏢 **Who is selling**: Agency (inmobiliaria) name, ID and profile URL on every listing.
- 🖼️ **Photos and description**: full-size photo URLs and the complete listing text.
- ♻️ **No duplicates**: featured listings that Urbania repeats on every page — and listings shared by overlapping searches — are returned and charged once.

### 🛠️ How It Works

1. **Search on Urbania** – Open [Urbania](https://urbania.pe/buscar/venta-de-departamentos-en-miraflores--lima--lima), set the location and filters you want and copy the URL of the results page.
2. **Paste the URL(s)** – Add one or more search URLs. Urbania search URLs look like `/buscar/venta-de-departamentos-en-miraflores--lima--lima`; one ending in `?page=3` starts from page 3.
3. **Set a limit** – `maxItems` caps the total number of listings (default 50).
4. **Run it** – Listings arrive page by page; the `SUMMARY` record shows, for each search, how many results Urbania reported and how many were collected.

### ⚙️ Input

| Field | Description |
|---|---|
| `startUrls` | Urbania search results URLs, e.g. `https://urbania.pe/buscar/venta-de-departamentos-en-miraflores--lima--lima`. |
| `maxItems` | Maximum number of listings across all searches. Default 50. |
| `proxyConfiguration` | Apify Proxy; the default works. |

```json
{
    "startUrls": [
        { "url": "https://urbania.pe/buscar/venta-de-departamentos-en-miraflores--lima--lima" },
        { "url": "https://urbania.pe/buscar/alquiler-de-departamentos-en-lima--lima" }
    ],
    "maxItems": 500
}
```

### 📊 Sample Output Data

```json
{
    "postingId": "149217783",
    "url": "https://urbania.pe/inmueble/clasificado/veclapin-venta-de-departamento-en-santa-cruz-miraflores-3-dormitorios-149217783",
    "title": "Penthouse en Santa Cruz en El Exclusivo Distrito de Miraflores",
    "operation": "Venta",
    "price": 2240000,
    "currency": "PEN",
    "prices": [
        {
            "operation": "Venta",
            "price": 2240000,
            "currency": "PEN"
        },
        {
            "operation": "Venta",
            "price": 659000,
            "currency": "USD"
        }
    ],
    "expenses": 1500,
    "expensesCurrency": "PEN",
    "propertyType": "Departamentos",
    "postingType": "PROPERTY",
    "address": "El Rosario",
    "neighborhood": "Santa Cruz",
    "city": "Miraflores",
    "region": "Lima",
    "latitude": -12.115131185,
    "longitude": -77.0398342609,
    "totalArea": 212,
    "coveredArea": 212,
    "rooms": null,
    "bedrooms": 3,
    "bathrooms": 4,
    "halfBathrooms": 1,
    "suites": null,
    "parkingSpaces": 2,
    "ageYears": 3,
    "description": "Tu próximo rooftop con jacuzzi, sobre una de las zonas más exclusivas de Miraflores. Con 212 metros cuadrados, este pent…",
    "images": [
        "https://img10.naventcdn.com/avisos/111/01/49/21/77/83/720x532/1592830053.jpg",
        "https://img10.naventcdn.com/avisos/111/01/49/21/77/83/720x532/1592830024.jpg"
    ],
    "publisherName": "PERU SOTHEBY'S INTERNATIONAL REALTY",
    "publisherId": "1041294",
    "publisherUrl": "https://urbania.pe/inmobiliarias/peru-sotheby-s-international-realty_1041294-inmuebles.html",
    "postingCode": "IPH7839546",
    "modifiedAt": "2026-08-24T00:00:00-0400",
    "searchUrl": "https://urbania.pe/buscar/venta-de-departamentos-en-miraflores--lima--lima",
    "scrapedAt": "2026-10-05T10:53:38.941Z"
}
```

### 💰 Pricing

This Actor uses pay-per-event pricing: **$1.50 per 1,000 listings** ($0.0015 per listing), plus a tiny start fee per run. You pay only for listings delivered to the dataset — repeats are never charged. Set a maximum cost per run in Apify Console and the Actor stops when it is reached.

### ❓ FAQ

**How many listings can I get from one search?**
All of them — the Actor walks every page of the search until Urbania runs out of results or your `maxItems` is reached. For very large searches, a narrower location or filter set keeps runs short.

**Does it return phone numbers or emails?**
No. Urbania shows agents' contact details only through its contact forms, so the output carries the agency name, ID and profile URL instead.

**Which price is `price` when a property is offered for sale and for rent?**
The one matching your search (venta / alquiler). All prices are listed in `prices`.

**Soles or dollars?**
`price` and `currency` give the first price the listing shows (usually soles, PEN); when the agency also lists a dollar price, it is in `prices` with `"currency": "USD"`.

**Can I monitor new listings?**
Yes — schedule the Actor with a search sorted by newest and compare `postingId`s between runs; `modifiedAt` shows when each listing was last updated.

**Is scraping Urbania legal?**
The Actor collects publicly visible listing data. Make sure your use of it complies with Urbania's terms and with data-protection law in your country.

*Keywords: urbania scraper, urbania API, departamentos en venta Lima, alquiler de departamentos Miraflores, casas en venta Surco, precios de departamentos Lima, inmobiliarias Perú.*

# Actor input Schema

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

Urbania search results pages, copied from the browser after choosing location, operation, property type and any filters or sort. Every page of each search is collected. A URL ending in ?page=3 starts from page 3.

## `maxItems` (type: `integer`):

Stop after this many listings across all searches. Each listing is returned once even when several searches include it.

## `proxyConfiguration` (type: `object`):

Urbania accepts connections from Peru; the default works.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://urbania.pe/buscar/venta-de-departamentos-en-miraflores--lima--lima"
    }
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PE"
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "startUrls": [
        {
            "url": "https://urbania.pe/buscar/venta-de-departamentos-en-miraflores--lima--lima"
        }
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "PE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/urbania-listings-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 = {
    "startUrls": [{ "url": "https://urbania.pe/buscar/venta-de-departamentos-en-miraflores--lima--lima" }],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "PE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/urbania-listings-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 '{
  "startUrls": [
    {
      "url": "https://urbania.pe/buscar/venta-de-departamentos-en-miraflores--lima--lima"
    }
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PE"
  }
}' |
apify call piotrv1001/urbania-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/urbania-listings-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/OWTfX6pT2fP07nXx3/builds/Cv5PkhwU6j2BTLAyv/openapi.json
