# Metrocuadrado Real Estate Extractor (`kawsar/metrocuadrado-real-estate-extractor`) Actor

Metrocuadrado scraper that extracts Colombian property listings with price, area, rooms, estrato, and photos so you can run market research and local SEO without manual copy-paste.

- **URL**: https://apify.com/kawsar/metrocuadrado-real-estate-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 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?

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

## Metrocuadrado Real Estate Extractor: Scrape Colombian Property Listings

Metrocuadrado Real Estate Extractor scrapes property listings from Metrocuadrado.com, Colombia's major real estate portal. Paste a search URL or pick a city, then export price, area, rooms, estrato, location, and photos as JSON or CSV.

No proxy picker in the input form. Configure the run, hit start, and download structured listing data for market research, lead lists, price tracking, or local SEO content.

### About this actor

| Detail | Value |
| --- | --- |
| Target site | [metrocuadrado.com](https://www.metrocuadrado.com) |
| Data type | Sale and rent property listings (and project cards) |
| Coverage | Bogotá, Medellín, Cali, Barranquilla, Cartagena, and other cities listed on Metrocuadrado |
| Output | One dataset item per listing |
| Default limit | `maxItems = 50` (raise up to 1000) |
| Auth in input | None. Bypass runs through built-in infrastructure |
| Best for | Market research, agency leads, price monitoring, local SEO pages |

The actor reads your Metrocuadrado search URL (or builds one from city + transaction type), pulls the first results page, then paginates automatically until it reaches `maxItems` or runs out of listings.

### What data does this actor extract?

Each dataset item is one Metrocuadrado listing (or project card) with fields such as:

| Field | Description |
| --- | --- |
| `url` | Full listing URL |
| `listingId` | Metrocuadrado ID |
| `itemTitle` | Listing headline |
| `itemDescription` | Summary text when available |
| `price` / `salePrice` / `rentPrice` | Prices in COP |
| `priceCurrency` | Usually `COP` |
| `transactionType` | Venta or Arriendo |
| `propertyType` | Apartamento, Casa, Oficina, and more |
| `propertyStatus` | e.g. Nuevo / Usado |
| `bedrooms` / `bathrooms` / `parkingSpaces` | Room counts |
| `areaM2` / `privateAreaM2` | Area in square meters |
| `estrato` | Socioeconomic stratum |
| `city` / `neighborhood` / `zone` | Location labels |
| `address` | Approximate address when present |
| `latitude` / `longitude` | Coordinates when present |
| `projectName` | Project name for new developments |
| `publisherType` / `publisherName` | Publisher labels |
| `contactPhone` / `whatsapp` | Contact details when shown |
| `images` | Photo URLs |
| `features` | Feature tags from the card |
| `housingCategory` / `housingType` | Extra housing labels |
| `scrapedAt` | UTC timestamp |
| `error` | Set only when a page fails |

### How to use

1. Open the actor on Apify.
2. Paste one or more Metrocuadrado search URLs into **Start URLs**, or set **City** plus **Transaction type**.
3. Optionally narrow **Property type**, toggle **Include images**, and set **Max items**.
4. Run the actor and download the dataset as JSON, CSV, or Excel.

#### Example input

```json
{
    "startUrls": [
        "https://www.metrocuadrado.com/inmuebles/venta/bogota/?search=form"
    ],
    "includeImages": true,
    "maxItems": 100,
    "requestTimeoutSecs": 30
}
```

Or build the search from filters:

```json
{
    "city": "medellin",
    "transactionType": "arriendo",
    "propertyType": "apartment",
    "maxItems": 50
}
```

#### Example output

```json
{
    "url": "https://www.metrocuadrado.com/inmueble/venta-casa-bogota-villas-del-madrigal-3-habitaciones-3-banos/15594-M6905366",
    "listingId": "15594-M6905366",
    "itemTitle": "Casa en Venta, Villas Del Madrigal, Bogotá D.C.",
    "price": 450000000,
    "priceCurrency": "COP",
    "transactionType": "Venta",
    "propertyType": "Casa",
    "bedrooms": 3,
    "bathrooms": 3,
    "areaM2": 120,
    "estrato": 3,
    "city": "Bogotá D.C.",
    "neighborhood": "Villas Del Madrigal",
    "images": [
        "https://multimedia.metrocuadrado.com/15594-M6905366/15594-M6905366_1_p.jpg"
    ],
    "scrapedAt": "2026-09-20T12:00:00+00:00",
    "error": null
}
```

### Input parameters

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | array | Bogotá sale search | Metrocuadrado search or category URLs |
| `city` | string | (empty) | City slug if you skip startUrls (`bogota`, `medellin`, `cali`, ...) |
| `transactionType` | string | `venta` | `venta` or `arriendo` |
| `propertyType` | string | `all` | Optional type filter when building a URL from city |
| `includeImages` | boolean | `true` | Include image URLs |
| `maxItems` | integer | `50` | Cap listings saved per run (max 1000). Actor paginates until this number |
| `requestTimeoutSecs` | integer | `30` | Per-request timeout |

### How maxItems works

Metrocuadrado returns roughly 50–65 listings per results page. If you set `maxItems` higher than one page (for example `100`), the actor:

1. Loads your start URL and saves the first batch
2. Requests the next pages automatically
3. Stops when it reaches `maxItems`, or when no new listings are left

So `maxItems=100` should save close to 100 unique listings (not just the first page). If the search itself has fewer matches than your limit, you get whatever exists.

### Supported URL patterns

These all work as start URLs:

- City sale: `https://www.metrocuadrado.com/inmuebles/venta/bogota/?search=form`
- City rent: `https://www.metrocuadrado.com/inmuebles/arriendo/medellin/`
- Property type: `https://www.metrocuadrado.com/apartamentos/venta/cali/`
- Neighborhood-style paths when Metrocuadrado exposes them in the URL

You can also mix several start URLs in one run. Duplicates are skipped by listing ID.

### Use cases

- **Market research**: compare sale and rent prices by city, neighborhood, and estrato
- **Agency lead lists**: collect listing URLs, phones, and WhatsApp contacts from public cards
- **Price monitoring**: schedule runs and watch how asking prices move over time
- **Local SEO**: feed real inventory stats into city and neighborhood landing pages
- **Investment screening**: filter by area, bedrooms, and budget before manual review

### Tips for better coverage

- Prefer specific Metrocuadrado URLs (city, barrio, or property type) over the national homepage.
- Raise `maxItems` when you need a deeper sample of a large city search.
- Add several start URLs if you want apartments, houses, and offices in the same dataset.
- Keep the first test run small (`maxItems=20` or `50`), then scale up once the output looks right.

### Integrations

- Export dataset as JSON, CSV, Excel, or XML from the Apify console
- Call the actor from the Apify API, webhooks, or schedules
- Pipe results into Sheets, warehouses, n8n, Make, or your own backend

### FAQ

**Why did I only get ~65 results before?**
Older runs stopped after the first results page. Current builds paginate until `maxItems` is filled.

**Does this cover sale and rent?**
Yes. Use a venta or arriendo URL, or set `transactionType` when you build the search from a city.

**Which cities work?**
Any city Metrocuadrado lists, including Bogotá, Medellín, Cali, Barranquilla, Cartagena, and others. Prefer real search URLs from the site when possible.

**Do I need to configure proxies in the input?**
No. Requests go through built-in bypass infrastructure. There is no proxy field in the actor input.

**How many listings can I get per run?**
Up to 1000 via `maxItems`. The actor keeps paging through results until that cap is reached.

**Can I run it on a schedule?**
Yes. Use Apify schedules or the API to refresh datasets daily or weekly.

**Are images included?**
Yes by default. Set `includeImages` to `false` if you only need text fields and want smaller output.

Run Metrocuadrado Real Estate Extractor when you need clean Colombian property data without manual copy-paste.

# Actor input Schema

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

Metrocuadrado search or category URLs to scrape. Example: https://www.metrocuadrado.com/inmuebles/venta/bogota/?search=form

## `city` (type: `string`):

Optional city slug used when startUrls is empty. Examples: bogota, medellin, cali, barranquilla, cartagena.

## `transactionType` (type: `string`):

Sale (venta) or rent (arriendo). Used with city when startUrls is empty.

## `propertyType` (type: `string`):

Optional property filter when building a URL from city. Leave empty for all property types.

## `includeImages` (type: `boolean`):

Include listing image URLs in the output.

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

Maximum number of property listings to save per run. The actor paginates until this limit is reached (max 1000).

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.metrocuadrado.com/inmuebles/venta/bogota/?search=form",
    "https://www.metrocuadrado.com/apartamentos/arriendo/medellin/"
  ],
  "city": "bogota",
  "transactionType": "venta",
  "propertyType": "all",
  "includeImages": true,
  "maxItems": 50,
  "requestTimeoutSecs": 30
}
```

# Actor output Schema

## `properties` (type: `string`):

Dataset of Metrocuadrado property listings extracted from your search URLs or city filters.

# 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": [
        "https://www.metrocuadrado.com/inmuebles/venta/bogota/?search=form"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/metrocuadrado-real-estate-extractor").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": ["https://www.metrocuadrado.com/inmuebles/venta/bogota/?search=form"] }

# Run the Actor and wait for it to finish
run = client.actor("kawsar/metrocuadrado-real-estate-extractor").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": [
    "https://www.metrocuadrado.com/inmuebles/venta/bogota/?search=form"
  ]
}' |
apify call kawsar/metrocuadrado-real-estate-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kawsar/metrocuadrado-real-estate-extractor"
        }
    }
}
```

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/ZFZ8WoE1RFZgPb3oS/builds/LKgvucMhfGQTcrUQS/openapi.json
