# Metrocuadrado Scraper — Colombia Property Data & API (`sian.agency/metrocuadrado-property-scraper`) Actor

Metrocuadrado scraper & real estate data API for Colombia's #1 property portal. Sale (venta) & rent (arriendo) listings: price (COP), admin fee, stratum, size, rooms, baths, garages, GPS, neighbourhood, amenities, photos — clean JSON/CSV. Fast overview or full detail. No API key needed.

- **URL**: https://apify.com/sian.agency/metrocuadrado-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 overview listings

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Property Data & Real Estate API 🏠

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![QuintoAndar Scraper](https://img.shields.io/badge/Store-QuintoAndar%20Scraper-1AE392)](https://apify.com/sian.agency/quintoandar-property-scraper?fpr=sian) [![Immobiliare.it Scraper](https://img.shields.io/badge/Store-Immobiliare.it%20Scraper-00A933)](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian) [![Smart Idealista Scraper](https://img.shields.io/badge/Store-Idealista%20Scraper-E60023)](https://apify.com/sian.agency/idealista-property-scraper?fpr=sian)

#### 🎉 Turn Metrocuadrado listings into clean structured data — sale & rent, every Colombian city, no API key
##### Built for real-estate analysts, proptech teams, investors and lead-gen agencies who need Colombia property data at scale

---

### 📋 Overview

**Scrape Metrocuadrado — Colombia's #1 real-estate portal — into ready-to-use datasets.** Pull thousands of listings with price (COP), administration fee, stratum (estrato), size, rooms, bathrooms, garages, neighbourhood, agent, GPS coordinates, amenities and photos — as JSON, CSV or Excel.

**Why proptech teams and investors choose us:**
- ✅ **Complete listings**: dozens of fields per property — price, admin fee, stratum, area, rooms, baths, garages, agent, amenities, photos
- ⚡ **Fast & affordable Overview mode**: paginate the portal's own search index for thousands of listings — the cheapest way to harvest volume, and **100% carry a price**
- 🎯 **Both contracts**: sale (venta) **and** rent (arriendo), in Bogotá, Medellín, Cali and every other city
- 💸 **Pay-per-result**: only pay for listings you actually extract — generous FREE tier, no credit card to start
- 💎 **Detail mode with everything**: real GPS coordinates, build age, the listing agent & profile, video, the full amenity list and hi-res gallery — each detail row is also enriched with the overview fields, so you always get a complete record
- ✨ **Investor KPIs built in**: automatic price-per-m² (COP/m²) and a thumbnail-first row for instant gallery views

---

### ✨ Features

- 🏠 **Sale & rent listings**: venta and arriendo in one actor
- 📍 **Search by place, URL or listing ID**: pick type + contract + city, paste a search URL, or feed exact listing URLs/IDs
- 💵 **Full pricing breakdown**: sale price, monthly rent and the monthly administration fee — all in Colombian pesos
- 📶 **Colombian specifics**: the socioeconomic **stratum (estrato 1–6)** on every row — essential for local market analysis
- 📐 **Rich specs**: total / built / private area (m²), rooms, bathrooms, garages, build age
- 🧭 **Geo data**: neighbourhood, zone, city and real latitude & longitude (Detail mode)
- 🏬 **Agent & agency**: agency name, agency ID and agency profile link, plus contact phone / WhatsApp
- 📸 **High-resolution photos**: every listing image URL, plus a cover thumbnail
- 🗂️ **Amenities**: pool, jacuzzi, gym and more — flattened to a clean list
- 📊 **Computed KPIs**: price-per-m² in COP, ready for comparables and yield models
- 🔢 **Filters**: narrow by price, rooms, bathrooms and area; cap each run with Max results
- 📤 **Clean exports**: JSON, CSV and Excel directly from the dataset

---

### 🎬 Quick Start

Pick a mode (Overview for speed, Detail for full data), tell it where to look (a property type + city, a search URL, or listing IDs), and run. Results stream into your dataset as clean rows you can export to JSON, CSV or Excel.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~metrocuadrado-property-scraper/runs?token=YOUR_TOKEN \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byPlace","propertyTypes":"apartamento","business":"venta","places":["bogota"],"maxResults":100}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose your mode

Pick **Overview** (fast & cheap — the search-list fields) or **Detail** (full fields per listing).

#### Step 2: Tell it where to look

Pick a property type, contract (**Sale** or **Rent**) and optionally a city (e.g. `bogota`), paste a search URL, or — in Detail mode — paste listing URLs/IDs.

#### Step 3: Run it

Click **Start** (or call the API). Listings stream into your dataset in real time.

**That's it! In under a minute, you'll have:**

- A clean table of Metrocuadrado listings with prices (COP), stratum and specs
- Real GPS, the agent and the full amenity list (Detail mode)
- A JSON / CSV / Excel export ready for your model or CRM

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast & cheap) or `detail` (full fields). Default `overview`. |
| searchMode | string | No | `byPlace`, `bySearchUrl`, or `byListingUrl` (detail only). |
| propertyTypes | string | No | `casas-apartamentos`, `apartamento`, `casa` or `apartamento-casa`. |
| business | string | No | `venta` (sale), `arriendo` (rent) or `arriendo-venta` (both). Default `venta`. |
| places | array | No | Metrocuadrado city slugs, e.g. `bogota`, `medellin`. Empty = all Colombia. |
| neighborhood | string | No | Neighbourhood slug to narrow a By place search. |
| searchUrls | array | No | metrocuadrado.com search-results URLs. |
| listingUrls | array | No | Detail mode: listing URLs or bare IDs (e.g. `20625-M5964176`). |
| maxResults | integer | No | Cap listings per run. FREE: 25. PAID: unlimited. |
| minPrice / maxPrice | integer | No | Price filters (COP). |
| minRooms / minBathrooms | integer | No | Minimum rooms / bathrooms. |
| minArea / maxArea | integer | No | Area range (m²). |
| proxyCountry | string | No | Empty = direct (default). `CO` routes through a Colombian residential proxy for very large runs. |

**Example — by place:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "byPlace",
  "propertyTypes": "apartamento",
  "business": "venta",
  "places": ["bogota", "medellin"],
  "minPrice": 200000000,
  "maxResults": 200
}
```

**Example — detail by listing ID:**

```json
{
  "scrapeMode": "detail",
  "searchMode": "byListingUrl",
  "listingUrls": ["20625-M5964176", "https://www.metrocuadrado.com/inmueble/.../20625-M5964176"]
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **dozens of fields** including:

| Field | Type | Description |
|-------|------|-------------|
| listingId | string | Metrocuadrado listing identifier |
| url | string | Canonical listing URL |
| propertyTitle | string | Listing title |
| business\_type | string | venta (sale) or arriendo (rent) |
| sale\_price | integer | Sale price (COP) |
| rent\_price | integer | Monthly rent (COP) |
| admin\_fee | integer | Monthly administration fee (COP) |
| price\_per\_sqm\_cop | integer | Computed price per m² (COP) |
| area\_total / area\_built / area\_private | integer | Areas (m²) |
| rooms / bathrooms / garages | integer | Property specs |
| stratum | integer | Colombian socioeconomic stratum (1–6) |
| neighborhood / zone / city | string | Location |
| latitude / longitude | number | GPS coordinates (Detail mode) |
| agency\_name / agency\_link / contact\_phone | string | Listing agent & agency |
| amenities | array | Pool, jacuzzi, gym, etc. |
| photos | array | High-resolution image URLs |
| thumbnail | string | Cover image |

**Example:**

```json
{
  "listingId": "20625-M5964176",
  "url": "https://www.metrocuadrado.com/inmueble/venta-apartamento-armenia-sector-oro-negro-2-habitaciones-2-banos-1-garajes/20625-M5964176",
  "source": "detail",
  "propertyTitle": "Apartamento en Venta, ORO NEGRO, Armenia",
  "property_type": "Apartamento",
  "business_type": "venta",
  "sale_price": 499000000,
  "admin_fee": 255000,
  "price_per_sqm_cop": 6480519,
  "area_total": 77,
  "rooms": 2,
  "bathrooms": 2,
  "garages": 1,
  "stratum": 5,
  "built_age": "Entre 0 y 5 años",
  "city": "Armenia",
  "neighborhood": "SECTOR ORO NEGRO",
  "latitude": 4.5763583,
  "longitude": -75.64458,
  "agency_name": "INMOBILIARIA L3",
  "agency_link": "https://www.metrocuadrado.com/inmobiliaria/inmobiliaria-l3/11209",
  "amenities": ["Piscina", "Jacuzzi"],
  "image_count": 20,
  "thumbnail": "https://multimedia.metrocuadrado.com/20625-M5964176/...jpg",
  "currency": "COP"
}
```

***

### 💼 Use Cases & Examples

#### 1. Rental Yield & Investment Analysis

**Investors and proptech analysts modelling returns across Bogotá and Medellín.**

**Input:** A list of city slugs, business = arriendo and venta.
**Output:** Rent, sale price, admin fee and computed COP/m² per listing.
**Use:** Build gross-yield and price-to-rent models for whole cities and strata.

#### 2. Price & Rent Comparables (CMA)

**Brokers and appraisers needing fast comparables.**

**Input:** A search URL for a specific area and property type.
**Output:** Comparable listings with price, area, stratum and COP/m².
**Use:** Produce a comparative market analysis in minutes, not hours.

#### 3. Lead Generation

**Agencies sourcing seller and landlord inventory.**

**Input:** By-place searches across target cities.
**Output:** Listings with location, specs and the listing agent + contact details.
**Use:** Feed a CRM with fresh, qualified property leads.

#### 4. Market Research & Trend Dashboards

**Data teams tracking Colombia's housing market.**

**Input:** Scheduled daily runs across multiple cities.
**Output:** A time series of prices, inventory and admin costs by stratum.
**Use:** Power BI / Looker dashboards on supply and pricing trends.

#### 5. Powering a Real-Estate Data API

**Proptech startups building products on Colombia listings.**

**Input:** Programmatic API calls per region.
**Output:** Structured JSON ready to ingest.
**Use:** Back a search app or valuation API with live Metrocuadrado data.

#### 6. Relocation & Site-Selection Tools

**Relocation services and corporate housing teams.**

**Input:** Rent searches filtered by rooms and budget.
**Output:** Options with amenities, stratum and GPS.
**Use:** Shortlist properties for employees moving to Colombia.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/metrocuadrado-property-scraper').call({
  scrapeMode: 'overview',
  searchMode: 'byPlace',
  propertyTypes: 'apartamento',
  business: 'venta',
  places: ['bogota'],
  maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/metrocuadrado-property-scraper').call(
    run_input={
        'scrapeMode': 'overview',
        'searchMode': 'byPlace',
        'propertyTypes': 'apartamento',
        'business': 'venta',
        'places': ['bogota'],
        'maxResults': 100,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~metrocuadrado-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byPlace","propertyTypes":"apartamento","business":"venta","places":["bogota"],"maxResults":100}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule (e.g. daily) or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON results
4. **Action**: Save to a sheet, push to a CRM, or send an alert

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run — full feature access, same data quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- **Unlimited** listings per run
- Pay-per-result: only charged for listings successfully extracted
- Ideal for dashboards, comparables and data APIs

💰 **Transparent pay-per-result pricing** — the fast Overview event is the cheapest way to harvest Colombia property data at volume; upgrade to Detail only when you need GPS, the agent and the full feature list.

🔗 [View current pricing](https://apify.com/sian.agency/metrocuadrado-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many listings can I extract?**
A: FREE tier: 25 per run. PAID tier: unlimited (up to the portal's 10,000-listing depth cap per search).

**Q: Does it cover both sale and rent?**
A: Yes — set `business` to `venta` (sale), `arriendo` (rent) or `arriendo-venta` (both).

**Q: What is the difference between Overview and Detail?**
A: Overview is the fast, cheap search-list view (and every row carries a price). Detail fetches each property page for real GPS, build age, the agent, video, the full amenity list and hi-res gallery — and is also enriched with the overview fields so each row is complete.

**Q: What is "stratum / estrato"?**
A: Colombia classifies properties into socioeconomic strata 1–6. Every row carries it — it's a key signal for local pricing and comparables.

**Q: What output formats are available?**
A: JSON, CSV and Excel — export directly from the Apify dataset.

**Q: Do I need a Metrocuadrado account or API key?**
A: No. The actor works straight out of the box.

**Q: What currency are prices in?**
A: Colombian pesos (COP), as published on Metrocuadrado.

**Q: Is this legal?**
A: We only extract publicly available listing data. See the legal note below.

***

### 🐛 Troubleshooting

**No results returned**

- Check your city slug — open the search on metrocuadrado.com and copy the slug from the URL.
- Make sure `business` matches what's available in that area (sale vs rent).

**A specific listing URL was skipped**

- Sold or removed listings return a page with no data and are skipped automatically. Try a currently-live listing.

**Fewer rows than expected**

- Each search caps at 10,000 listings deep. Add more city slugs or tighten filters to reach more distinct properties.

**Large runs slowing down**

- Set `proxyCountry` to `CO` to route through a Colombian residential proxy and keep the listing-detail geo check happy at scale.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

> **Disclaimer:** This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Metrocuadrado or El Tiempo Casa Editorial. "Metrocuadrado" and related marks are trademarks of their respective owners. Use this actor in compliance with Metrocuadrado's terms and all applicable laws.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `scrapeMode` (type: `string`):

⚡ **OVERVIEW** — fast, cheap. Pulls the search-list fields straight from Metrocuadrado's search API (price in COP, admin fee, size, rooms, baths, garages, stratum, neighbourhood, city, photos).

🔍 **DETAIL** — full fields per listing (real GPS, build age, agent name & profile, video, full amenity list, hi-res photos). Each detail record is enriched with the overview fields too, so you always get a complete row. Slower and priced higher per result.

**TIP:** Start with Overview — upgrade to Detail only when you need GPS, the agent, or the full feature list.

## `searchMode` (type: `string`):

🧭 How to tell the scraper what to fetch:

- **By place** — pick the property type, contract (sale/rent) and optionally a city/neighbourhood. Combine with the filters below.
- **By search URL** — paste a metrocuadrado.com search-results URL; the property type, contract and location are honored.
- **By listing URL/ID** — Detail mode only: paste listing URLs or bare IDs (e.g. 20625-M5964176) to fetch specific properties.

## `propertyTypes` (type: `string`):

🏘️ Which property types to include in a **By place** search. Default covers houses + apartments (the common case).

## `business` (type: `string`):

🏷️ **Sale** (venta), **Rent** (arriendo) or **both**. Applies to By place searches.

## `places` (type: `array`):

📍 Metrocuadrado city slugs, e.g. "bogota", "medellin", "cali". Used when **Search by = By place**. Leave empty to search all of Colombia.

**TIP:** Add several — each city is searched in turn until **Max results** is reached.

## `neighborhood` (type: `string`):

🏙️ Optional neighbourhood slug to narrow a By place search (e.g. "chapinero"). Combine with a single city.

## `searchUrls` (type: `array`):

🔗 metrocuadrado.com search-results URLs to scrape. Used when **Search by = By search URL**.

**TIP:** Build any search on metrocuadrado.com (pick property type, sale/rent, city), then copy the URL from the address bar.

**BULK EDIT:** Click "Bulk edit" to paste many URLs, one per line.

## `listingUrls` (type: `array`):

🆔 **Detail mode only.** metrocuadrado.com listing URLs or bare IDs (e.g. 20625-M5964176).

**BULK EDIT:** Click "Bulk edit" to paste many URLs/IDs, one per line.

## `maxResults` (type: `integer`):

🔢 Maximum listings to extract this run.

- **FREE tier:** capped at 25 listings per run.
- **PAID tier:** unlimited — set as high as you need (up to the portal's 10,000-listing depth cap per search).

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

💵 Optional. Minimum price filter in Colombian pesos (By place mode).

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

💵 Optional. Maximum price filter in Colombian pesos (By place mode).

## `minRooms` (type: `integer`):

🛏️ Optional. Minimum number of rooms (By place mode).

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

🚿 Optional. Minimum number of bathrooms (By place mode).

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

📐 Optional. Minimum area in m² (By place mode).

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

📐 Optional. Maximum area in m² (By place mode).

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

↕️ Optional sort key passed through verbatim to the search (e.g. a value copied from a metrocuadrado.com search URL).

## `proxyCountry` (type: `string`):

🌐 Leave empty to run **direct** (no proxy — the default, fastest & cheapest). Set to "CO" to route through a Colombian residential proxy, only needed to keep the listing-detail geo check happy on very large runs.

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byPlace",
  "propertyTypes": "casas-apartamentos",
  "business": "venta",
  "places": [
    "bogota",
    "medellin"
  ],
  "searchUrls": [
    "https://www.metrocuadrado.com/apartamento/venta/bogota/"
  ],
  "listingUrls": [
    "20625-M5964176"
  ],
  "maxResults": 100,
  "proxyCountry": ""
}
```

# Actor output Schema

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

Clean structured Metrocuadrado listings (JSON/CSV/Excel).

# 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 = {};

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

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/metrocuadrado-property-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call sian.agency/metrocuadrado-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sian.agency/metrocuadrado-property-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Metrocuadrado Scraper — Colombia Property Data & API",
        "description": "Metrocuadrado scraper & real estate data API for Colombia's #1 property portal. Sale (venta) & rent (arriendo) listings: price (COP), admin fee, stratum, size, rooms, baths, garages, GPS, neighbourhood, amenities, photos — clean JSON/CSV. Fast overview or full detail. No API key needed.",
        "version": "1.0",
        "x-build-id": "j2j6lzJUgA6PiXhdv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~metrocuadrado-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-metrocuadrado-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sian.agency~metrocuadrado-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-metrocuadrado-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sian.agency~metrocuadrado-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-metrocuadrado-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "scrapeMode": {
                        "title": "⚡ Scrape mode",
                        "enum": [
                            "overview",
                            "detail"
                        ],
                        "type": "string",
                        "description": "⚡ **OVERVIEW** — fast, cheap. Pulls the search-list fields straight from Metrocuadrado's search API (price in COP, admin fee, size, rooms, baths, garages, stratum, neighbourhood, city, photos).\n\n🔍 **DETAIL** — full fields per listing (real GPS, build age, agent name & profile, video, full amenity list, hi-res photos). Each detail record is enriched with the overview fields too, so you always get a complete row. Slower and priced higher per result.\n\n**TIP:** Start with Overview — upgrade to Detail only when you need GPS, the agent, or the full feature list.",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🧭 Search by",
                        "enum": [
                            "byPlace",
                            "bySearchUrl",
                            "byListingUrl"
                        ],
                        "type": "string",
                        "description": "🧭 How to tell the scraper what to fetch:\n\n- **By place** — pick the property type, contract (sale/rent) and optionally a city/neighbourhood. Combine with the filters below.\n- **By search URL** — paste a metrocuadrado.com search-results URL; the property type, contract and location are honored.\n- **By listing URL/ID** — Detail mode only: paste listing URLs or bare IDs (e.g. 20625-M5964176) to fetch specific properties.",
                        "default": "byPlace"
                    },
                    "propertyTypes": {
                        "title": "🏘️ Property type",
                        "enum": [
                            "casas-apartamentos",
                            "apartamento",
                            "casa",
                            "apartamento-casa"
                        ],
                        "type": "string",
                        "description": "🏘️ Which property types to include in a **By place** search. Default covers houses + apartments (the common case).",
                        "default": "casas-apartamentos"
                    },
                    "business": {
                        "title": "🏷️ Contract",
                        "enum": [
                            "venta",
                            "arriendo",
                            "arriendo-venta"
                        ],
                        "type": "string",
                        "description": "🏷️ **Sale** (venta), **Rent** (arriendo) or **both**. Applies to By place searches.",
                        "default": "venta"
                    },
                    "places": {
                        "title": "📍 City slugs (optional)",
                        "type": "array",
                        "description": "📍 Metrocuadrado city slugs, e.g. \"bogota\", \"medellin\", \"cali\". Used when **Search by = By place**. Leave empty to search all of Colombia.\n\n**TIP:** Add several — each city is searched in turn until **Max results** is reached.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "neighborhood": {
                        "title": "🏙️ Neighbourhood slug (optional)",
                        "type": "string",
                        "description": "🏙️ Optional neighbourhood slug to narrow a By place search (e.g. \"chapinero\"). Combine with a single city."
                    },
                    "searchUrls": {
                        "title": "🔗 Search URLs",
                        "type": "array",
                        "description": "🔗 metrocuadrado.com search-results URLs to scrape. Used when **Search by = By search URL**.\n\n**TIP:** Build any search on metrocuadrado.com (pick property type, sale/rent, city), then copy the URL from the address bar.\n\n**BULK EDIT:** Click \"Bulk edit\" to paste many URLs, one per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingUrls": {
                        "title": "🆔 Listing URLs or IDs",
                        "type": "array",
                        "description": "🆔 **Detail mode only.** metrocuadrado.com listing URLs or bare IDs (e.g. 20625-M5964176).\n\n**BULK EDIT:** Click \"Bulk edit\" to paste many URLs/IDs, one per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "🔢 Max results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "🔢 Maximum listings to extract this run.\n\n- **FREE tier:** capped at 25 listings per run.\n- **PAID tier:** unlimited — set as high as you need (up to the portal's 10,000-listing depth cap per search).",
                        "default": 100
                    },
                    "minPrice": {
                        "title": "💵 Min price (COP)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "💵 Optional. Minimum price filter in Colombian pesos (By place mode)."
                    },
                    "maxPrice": {
                        "title": "💵 Max price (COP)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "💵 Optional. Maximum price filter in Colombian pesos (By place mode)."
                    },
                    "minRooms": {
                        "title": "🛏️ Min rooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "🛏️ Optional. Minimum number of rooms (By place mode)."
                    },
                    "minBathrooms": {
                        "title": "🚿 Min bathrooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "🚿 Optional. Minimum number of bathrooms (By place mode)."
                    },
                    "minArea": {
                        "title": "📐 Min area (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "📐 Optional. Minimum area in m² (By place mode)."
                    },
                    "maxArea": {
                        "title": "📐 Max area (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "📐 Optional. Maximum area in m² (By place mode)."
                    },
                    "sort": {
                        "title": "↕️ Sort (optional)",
                        "type": "string",
                        "description": "↕️ Optional sort key passed through verbatim to the search (e.g. a value copied from a metrocuadrado.com search URL)."
                    },
                    "proxyCountry": {
                        "title": "🌐 Proxy country (optional)",
                        "enum": [
                            "",
                            "CO"
                        ],
                        "type": "string",
                        "description": "🌐 Leave empty to run **direct** (no proxy — the default, fastest & cheapest). Set to \"CO\" to route through a Colombian residential proxy, only needed to keep the listing-detail geo check happy on very large runs.",
                        "default": ""
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
