# Metrocuadrado Scraper - Colombia Real Estate Listings (`igolaizola/metrocuadrado-scraper`) Actor

Extract Colombian listings from metrocuadrado.com with prices, locations, amenities, images, links, and contact data. Filter sales or rentals by location, property type, budget, rooms, area, and radius. Export JSON, CSV, Excel, API, or MCP-ready datasets for market research and lead generation

- **URL**: https://apify.com/igolaizola/metrocuadrado-scraper.md
- **Developed by:** [Iñigo Garcia Olaizola](https://apify.com/igolaizola) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 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

## Metrocuadrado Scraper - Colombia Real Estate Listings

Search and extract Colombian property listings from [metrocuadrado.com](https://www.metrocuadrado.com) for market research, valuation, investment analysis, and lead generation. Filter homes and commercial properties by location, sale or rental status, price, rooms, area, amenities, and distance, then download the results in formats that fit your workflow.

> SEO keywords: **Metrocuadrado scraper**, **Colombia real estate data**, **property listings scraper**, **real estate API alternative**, **Apify real estate actor**.

### 🤖 What does Metrocuadrado Scraper do?

This actor collects public real estate listings from Metrocuadrado and keeps the complete listing record available in your dataset. Search Colombian homes, apartments, offices, land, farms, and other property types for sale or rent.

- **Buy and rent searches** — compare used properties, new properties, or both sales categories together.
- **Friendly location search** — enter a city, neighborhood, or zone and optionally choose the location category.
- **Property filters** — narrow results by price, area, bedrooms, bathrooms, parking spaces, socioeconomic stratum, age, and amenities.
- **Nearby searches** — use latitude, longitude, and a distance in kilometers to search around a point.
- **Rich listing data** — keep prices, images, links, location, property features, and published contact information.
- **Optional details** — request additional listing information when a deeper dataset is worth the extra usage.

**Great for:** Colombian housing research, investment screening, competitor monitoring, valuation models, property lead lists, and real estate market reports.

### 💡 Why use Metrocuadrado data?

- 📈 **Track local prices** — compare sale and rental prices by city, neighborhood, zone, or radius.
- 🏘️ **Find investment opportunities** — identify properties that match a budget, size, room count, and amenity profile.
- 🎯 **Build qualified lead lists** — collect listing links and published contact fields for legitimate business outreach.
- 📊 **Create market reports** — download structured datasets for spreadsheets, dashboards, and valuation work.
- 🔎 **Monitor competition** — repeat the same search to follow inventory, pricing, and new listings over time.

### 🚀 How to use it

1. **Add the actor** — Open **Metrocuadrado Scraper - Colombia Real Estate Listings** in Apify.
2. **Choose a location** — Enter a city, neighborhood, or zone such as `Bogotá`. The location field is prefilled for a quick start.
3. **Set your search** — Choose the listing type, `maxItems`, and any filters. The default listing type is used and new properties for sale.
4. **Start the run** — Click **Run** in Apify, or start it through the Apify API or an MCP-compatible tool.
5. **Use the results** — Open the Dataset tab and download JSON, CSV, or Excel, or connect the dataset to your workflow.

### 💳 Pricing

Apify's **Free plan** includes monthly credits for testing and small runs. Larger collections can use Personal or Business plans with more usage and concurrency. Requesting full details adds usage because each saved listing receives an additional lookup.

### 📝 Input parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `maxItems` | Integer | Yes | Maximum listings to save. Default `100`. Use `0` for unlimited results, subject to account and run limits. |
| `location` | String | No\* | City, neighborhood, or zone to search, for example `"Bogotá"`. Use this or provide both coordinates. |
| `locationType` | Enum | No | Location suggestion category: `""` (Any) · `"city"` · `"neighborhood"` · `"zone"`. Any uses the first suggestion. |
| `propertyCodes` | Array of strings | No | Published property reference codes such as `"1614-C0051"`. When provided, the actor looks up those listings and ignores the other search filters. |
| `operation` | Enum | No | `"buy"` (used and new) · `"buy-used"` · `"buy-new"` · `"rent"`. Default: `"buy"`. |
| `sort` | Enum | No | Sort field and direction: `"price-asc"` · `"price-desc"` · `"date-asc"` · `"date-desc"` · `"bedrooms-asc"` · `"bedrooms-desc"` · `"area-asc"` · `"area-desc"`. |
| `fetchDetails` | Boolean | No | Add additional information under `_details`. Default `false`; increases usage and run time. |
| `propertyTypes` | Array of strings | No | `"apartment"` · `"studio-apartment"` · `"house"` · `"office"` · `"warehouse"` · `"consulting-room"` · `"commercial-property"` · `"land"` · `"farm"` · `"office-building"` · `"apartment-building"`. |
| `minPrice`, `maxPrice` | Integers | No | Minimum and maximum sale price or monthly rent in Colombian pesos. `0` means no limit. |
| `minArea`, `maxArea` | Integers | No | Minimum and maximum built area in square metres. `0` means no limit. |
| `bedrooms` | Array of strings | No | `"1"` · `"2"` · `"3"` · `"4"` · `"5"`, where `"5"` means five or more. |
| `bathrooms` | Array of strings | No | `"1"` · `"2"` · `"3"` · `"4"` · `"5"`, where `"5"` means five or more. |
| `garages` | Array of strings | No | `"1"` · `"2"` · `"3"` · `"4"` · `"5"`, where `"5"` means five or more parking spaces. |
| `stratum` | Array of strings | No | `"1"` through `"6"` for residential strata, `"7"` for commercial, or `"8"` for rural. |
| `keyword` | String | No | Optional feature or description term, for example `"furnished"`. |
| `buildTime` | Enum | No | `"0-to-5-years"` · `"5-to-10-years"` · `"10-to-20-years"` · `"over-20-years"` · `"remodeled"` · `"under-construction"` · `"brand-new"`. |
| `amenities` | Array of strings | No | `"security-24-7"` · `"service-room"` · `"gated-community"` · `"storage-room"` · `"pets-allowed"` · `"bbq-area"` · `"pool"` · `"furnished"` · `"elevator"` · `"balcony"` · `"gym"`. |
| `latitude` | Number | No† | Latitude in decimal degrees. Example: `4.711`. |
| `longitude` | Number | No† | Longitude in decimal degrees. Example: `-74.0721`. |
| `distanceKm` | Number | No | Search radius around the coordinates in kilometers. Default `20`. |

\* Provide `location` unless you use both `latitude` and `longitude` or provide `propertyCodes`.

† `latitude` and `longitude` must be provided together for a nearby search.

#### Example inputs

**1️⃣ Buy used and new apartments in Bogotá**

```json
{
  "maxItems": 100,
  "location": "Bogotá",
  "locationType": "city",
  "operation": "buy",
  "propertyTypes": ["apartment", "house"],
  "minPrice": 200000000,
  "maxPrice": 700000000,
  "bedrooms": ["2", "3"],
  "bathrooms": ["2"],
  "sort": "price-asc"
}
```

**2️⃣ Rental apartments near a coordinate**

```json
{
  "maxItems": 50,
  "operation": "rent",
  "latitude": 4.711,
  "longitude": -74.0721,
  "distanceKm": 20,
  "propertyTypes": ["apartment"],
  "minArea": 50,
  "maxArea": 120,
  "maxPrice": 5000000,
  "bedrooms": ["2", "3"],
  "fetchDetails": true
}
```

**3️⃣ Look up selected published listings**

```json
{
  "maxItems": 20,
  "propertyCodes": ["1614-C0051", "17030-M6160164"]
}
```

### 📊 Output and results

Each dataset item keeps the complete listing record. The following fields are commonly useful in the Overview and exports; additional fields from the listing may also be present.

- **`id`** *(string)* — listing reference.
- **`title`** *(string)* — listing headline.
- **`status`** *(string)* — listing status when available.
- **`image`** *(string)* — primary image URL.
- **`pricesale`**, **`pricelease`**, **`priceadmin`** *(number)* — sale, rental, and administration prices.
- **`adminincluded`** *(boolean)* — whether administration is included.
- **`area`**, **`bedrooms`**, **`baths`**, **`garages`** — property size and main features.
- **`city`** *(string)* — listing city.
- **`url`** *(string)* — listing page URL.
- **`phone`**, **`whatsapp`** *(string)* — published contact values when available.
- **`_details`** *(object, optional)* — extra listing information when `fetchDetails` is enabled.

Download the dataset as JSON, CSV, or Excel. You can also consume it through the Apify API or an MCP-compatible workflow.

```json
{
  "id": "17030-M6160164",
  "title": "Apartamento en Venta, USME, Bogotá D.C.",
  "status": null,
  "pricesale": 100000000,
  "pricelease": 0,
  "priceadmin": 50000,
  "adminincluded": false,
  "area": "44.0 m2",
  "bedrooms": "3",
  "baths": "1",
  "garages": "0",
  "city": "Bogotá D.C.",
  "image": "https://multimedia.metrocuadrado.com/17030-M6160164/17030-M6160164_1_p.jpg",
  "url": "https://www.metrocuadrado.com/inmueble/venta-apartamento-bogota-almirante-padilla-3-habitaciones-1-banos/17030-M6160164",
  "phone": "3170974341",
  "whatsapp": "573170974341"
}
```

### 🧭 Tips and common recipes

- **Start with the broad sale market:** use the default `operation: "buy"` to include used and new listings.
- **Compare only existing homes:** set `operation: "buy-used"`.
- **Find new developments:** set `operation: "buy-new"` and optionally use `buildTime: "brand-new"`.
- **Build rental shortlists:** use `operation: "rent"` with `maxPrice`, `bedrooms`, and `amenities`.
- **Choose the right place:** use `locationType: "city"`, `"neighborhood"`, or `"zone"`; leave it empty for Any.
- **Search around a point:** provide latitude and longitude together. The default radius is 20 km.
- **Collect a large market sample:** set `maxItems` to `0` for unlimited results, subject to run and account limits.
- **Save usage:** enable `fetchDetails` only when the additional information is important for your analysis.

### ⚙️ Best practices

- Begin with 50–100 listings to confirm that your location and filters match the market you want.
- Use a realistic `maxItems` value for routine monitoring and increase it for scheduled market snapshots.
- Keep `minPrice` below `maxPrice` and `minArea` below `maxArea` when using both limits.
- For coordinates, use decimal degrees and set `distanceKm` to match the area you want to compare.
- Treat phone and WhatsApp fields as published contact data and use them only for appropriate, permission-based outreach.

### ⚖️ Legal and ethical considerations

- Follow Metrocuadrado's terms, applicable Colombian law, and any restrictions on commercial data use.
- Collect and store contact information responsibly, with a legitimate purpose and appropriate safeguards.
- Respect rate limits and avoid creating unnecessary load through repeated runs.
- Do not republish personal contact data without a lawful basis or permission.
- Attribute the source when presenting market research or derived reports.

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Metrocuadrado. Metrocuadrado and related marks belong to their respective owners.

### ❓ FAQ

**What is the default listing type?**

`operation: "buy"` includes used and new properties for sale. You can switch to `buy-used`, `buy-new`, or `rent`.

**Can I search by a city and by coordinates?**

Yes. Use `location` for a city, neighborhood, or zone, or provide both `latitude` and `longitude` for a nearby search. `distanceKm` defaults to 20 km.

**What happens when I leave `locationType` empty?**

The actor uses the first location suggestion. Set `locationType` to `city`, `neighborhood`, or `zone` when you want to restrict the category.

**Does `fetchDetails` change the normal listing data?**

No. It adds an optional `_details` object to each saved listing. It takes longer and uses more resources because each saved listing receives an additional lookup.

**Can I download the results for spreadsheets or automation?**

Yes. Apify provides JSON, CSV, and Excel exports, and the dataset can also be accessed through the Apify API or MCP-compatible tools.

**How do I get support?**

Open an issue or contact [Apify actor support](https://igolaizola.com/#contact) with your run ID and a short description of the result you need.

### 🛟 Support

Need a custom field, saved search, or export workflow? [Contact actor support](https://igolaizola.com/#contact) and include an example of the listings or fields you need.

# Actor input Schema

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

Maximum number of property listings to save. Use 0 for unlimited results.

## `location` (type: `string`):

Enter a city, neighborhood, or zone. Example: Santa Marta.

## `locationType` (type: `string`):

Optional category used to filter location suggestions. Leave as Any to select the first suggestion.

## `propertyCodes` (type: `array`):

Optional published property reference codes, for example 1614-C0051. When provided, other search filters are ignored.

## `operation` (type: `string`):

Select used and new sale listings, used sale listings, new sale listings, or rental listings.

## `sort` (type: `string`):

Choose the listing field and direction used to order matching results.

## `fetchDetails` (type: `boolean`):

Fetch additional details for every saved listing and place them under \_details. This increases runtime and usage.

## `propertyTypes` (type: `array`):

Choose one or more property types. Leave empty to include all types.

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

Lowest sale or monthly rental price in Colombian pesos. Example: 200000000.

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

Highest sale or monthly rental price in Colombian pesos. Example: 700000000.

## `minArea` (type: `integer`):

Minimum built area in square metres. Example: 70.

## `maxArea` (type: `integer`):

Maximum built area in square metres. Example: 180.

## `bedrooms` (type: `array`):

Choose acceptable bedroom counts. The value 5 includes properties with five or more bedrooms.

## `bathrooms` (type: `array`):

Choose acceptable bathroom counts. The value 5 includes properties with five or more bathrooms.

## `garages` (type: `array`):

Choose acceptable parking space counts. The value 5 includes properties with five or more spaces.

## `stratum` (type: `array`):

Choose one or more Colombian socioeconomic classifications.

## `keyword` (type: `string`):

Optional feature or description keyword. Example: furnished.

## `buildTime` (type: `string`):

Filter by property age or construction stage.

## `amenities` (type: `array`):

Choose one or more desired property or building amenities.

## `latitude` (type: `number`):

Latitude in decimal degrees for a nearby search. Longitude is also required. Example: 4.711.

## `longitude` (type: `number`):

Longitude in decimal degrees for a nearby search. Latitude is also required. Example: -74.0721.

## `distanceKm` (type: `number`):

Search radius around the latitude and longitude point, in kilometers. The default is 20. Example: 20.

## Actor input object example

```json
{
  "maxItems": 100,
  "location": "Bogota",
  "locationType": "",
  "operation": "buy",
  "fetchDetails": false,
  "minPrice": 0,
  "maxPrice": 0,
  "minArea": 0,
  "maxArea": 0,
  "distanceKm": 20
}
```

# 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 = {
    "location": "Bogota"
};

// Run the Actor and wait for it to finish
const run = await client.actor("igolaizola/metrocuadrado-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 = { "location": "Bogota" }

# Run the Actor and wait for it to finish
run = client.actor("igolaizola/metrocuadrado-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 '{
  "location": "Bogota"
}' |
apify call igolaizola/metrocuadrado-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,igolaizola/metrocuadrado-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/uOGyzMW9P7lKfEBtz/builds/RLlljPYu3B5hMOSll/openapi.json
