# Inmuebles24 Scraper (`automation-lab/inmuebles24-property-listings-scraper`) Actor

Extract Mexico property listings, prices, features, locations, advertiser names, images, and public contact-channel availability from supplied Inmuebles24 search URLs.

- **URL**: https://apify.com/automation-lab/inmuebles24-property-listings-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Inmuebles24 Scraper

Extract current Mexico property inventory from real Inmuebles24 search URLs. The Actor returns stable listing IDs, canonical URLs, asking prices, property features, locations, descriptions, images, public advertiser names, and the contact channels displayed on each result card.

Use the output for one-time market analysis, scheduled inventory refreshes, advertiser qualification, spreadsheet exports, and listing upserts in a warehouse or CRM.

### What does Inmuebles24 Scraper do?

1. Opens each supplied Inmuebles24 search-results URL with its existing filters.
2. Uses a Mexico residential browser session because ordinary HTTP and datacenter requests are blocked by the source.
3. Reads rendered property cards and the page's structured listing data.
4. Follows result pages until `maxItems`, `maxPagesPerUrl`, or source exhaustion.
5. Deduplicates records by the stable Inmuebles24 listing ID.
6. Saves normalized property rows to the default Apify dataset.

The Actor accepts search URLs copied from the Inmuebles24 address bar. It does not invent a parallel filter language, so the source URL remains the exact and auditable scope of every run.

### Who is this Mexico property scraper for?

- **Real-estate analysts** comparing asking prices and inventory by city or property type.
- **Agencies and lead teams** reviewing public advertisers and available contact channels.
- **PropTech teams** refreshing a catalog with stable IDs and canonical source URLs.
- **Investors and developers** measuring available homes, apartments, land, or commercial inventory.
- **Data engineers** loading repeatable snapshots into spreadsheets, databases, and BI tools.
- **Operations teams** scheduling the same URL and comparing records between runs.

### What Inmuebles24 data is extracted?

| Field group | Included data |
| --- | --- |
| Identity | `listingId`, canonical `url`, `listingType` |
| Search provenance | `searchUrl`, `pageNumber`, `scrapedAt` |
| Listing content | `title`, `description`, `datePosted` |
| Price | parsed `price`, normalized `currency`, original `priceText` |
| Property details | `featuresText`, bedrooms, bathrooms, parking, first displayed area |
| Location | public address and locality labels |
| Advertiser | public advertiser name and publisher logo URL |
| Contact availability | phone, WhatsApp, and contact-form action flags |
| Media | primary public image URL |

Fields are `null` when Inmuebles24 does not display that value for a result. Contact flags report whether the result card offers the channel; they do not claim to reveal a phone number, email address, or private contact record.

### Why use this Actor?

- **URL-faithful scope:** filters remain encoded in the source URL you supplied.
- **Stable deduplication:** `listingId` is suitable for database upserts and snapshot comparisons.
- **Typed output:** numeric price and feature fields are available alongside source text.
- **Source context:** every row retains its seed URL and page number.
- **Bounded recovery:** verified challenge pages rotate to a fresh residential session up to three times.
- **Fail-closed behavior:** malformed URLs and unrecognized blocked pages fail the run instead of returning a misleading empty dataset.

### How to get started

1. Open Inmuebles24 and apply the city, operation, property type, and price filters you need.
2. Copy the resulting URL ending in `.html`.
3. Paste it into **Inmuebles24 search URLs**.
4. Set `maxItems` to the maximum number of listings you want.
5. Keep `maxPagesPerUrl` at its default unless you need a stricter safety cap.
6. Run the Actor and open the **Property listings** dataset view.
7. Export JSON, CSV, Excel, XML, or connect the dataset API.

Start with 10 records to inspect the shape before scheduling a larger refresh.

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | array | required | One or more real Inmuebles24 search-results URLs ending in `.html`. |
| `maxItems` | integer | `20` | Maximum unique listings across all supplied URLs; range 1–10,000. |
| `maxPagesPerUrl` | integer | `20` | Pagination safety limit per URL; range 1–500. |

Listing detail URLs under `/propiedades/` are rejected. Apply the desired filters on Inmuebles24 first and supply the resulting search URL.

### Example input: CDMX apartments

```json
{
  "startUrls": [
    {
      "url": "https://www.inmuebles24.com/departamentos-en-venta-en-ciudad-de-mexico.html"
    }
  ],
  "maxItems": 10,
  "maxPagesPerUrl": 1
}
```

This exact input returns current apartment records rather than placeholder data.

### Example output

```json
{
  "listingId": "150316235",
  "url": "https://www.inmuebles24.com/propiedades/desarrollo/ememvein-jai-reforma-36-150316235.html",
  "searchUrl": "https://www.inmuebles24.com/departamentos-en-venta-en-ciudad-de-mexico.html",
  "pageNumber": 1,
  "listingType": "DEVELOPMENT",
  "title": "Desarrollo vertical, Cuauhtémoc · Jai Reforma 36",
  "description": "Departamentos en venta con ubicación céntrica...",
  "price": 4500000,
  "currency": "MXN",
  "priceText": "MN 4,500,000",
  "featuresText": "Departamentos desde 48 m²",
  "bedrooms": null,
  "bathrooms": null,
  "parkingSpaces": null,
  "areaSquareMeters": 48,
  "address": "Paseo de la Reforma 36",
  "location": "Cuauhtémoc",
  "advertiserName": "Class Experiencia Inmobiliaria",
  "publisherLogoUrl": "https://img10.naventcdn.com/empresas/.../logo.jpg",
  "imageUrl": "https://img10.naventcdn.com/avisos/.../property.jpg",
  "datePosted": "8/11/26",
  "hasPhoneContact": true,
  "hasWhatsAppContact": true,
  "hasContactForm": true,
  "scrapedAt": "2026-08-11T15:00:00.000Z"
}
```

The sample is shortened only where image paths and description text are long. Actual rows preserve the public values returned at run time.

### How much does it cost to scrape Inmuebles24 property listings?

The Actor uses pay-per-event pricing:

- a **$0.0051 start event** once per run;
- one property-listing event per unique row saved;
- the current Bronze listing price is **$0.0012 per listing**, with lower per-item rates on higher Apify pricing tiers.

Examples at the Bronze rate:

| Listings | Start | Listing events | Estimated Actor charge |
| ---: | ---: | ---: | ---: |
| 10 | $0.0051 | $0.012 | $0.0171 |
| 100 | $0.0051 | $0.120 | $0.1251 |
| 1,000 | $0.0051 | $1.200 | $1.2051 |

The Actor charges only for unique rows it saves. Residential proxy and browser infrastructure are included in the Actor's event price; users do not configure a separate proxy mode.

### Pagination, limits, and deduplication

Inmuebles24 normally exposes about 30 cards per page. The Actor constructs the source's `-pagina-N.html` URLs, then stops when:

- `maxItems` is reached;
- `maxPagesPerUrl` is reached;
- the source returns no listings;
- a page contains no new listing IDs.

When multiple start URLs overlap, a listing is saved once per run. For repeated scheduled runs, use `listingId` as the external upsert key.

### Scheduled inventory and price monitoring

Run the same search URL daily or weekly and store each dataset snapshot. A downstream workflow can:

1. join records on `listingId`;
2. detect new and removed IDs;
3. compare `price`, `priceText`, or advertiser fields;
4. notify an analyst or update a dashboard.

The Actor produces snapshots. It does not retain history or send alerts by itself, which keeps each run portable and easy to integrate.

### Export and integration patterns

- Export CSV or Excel for an analyst.
- Send dataset rows to Google Sheets with an Apify integration.
- Upsert records into PostgreSQL, BigQuery, Snowflake, or a search index.
- Connect scheduled runs to Make, Zapier, n8n, or webhooks.
- Use canonical listing URLs for manual verification.
- Use contact-channel flags to prioritize listings that expose the buyer contact action you need.

### Run through the Apify API with cURL

Replace `APIFY_TOKEN` with your token:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~inmuebles24-property-listings-scraper/runs?token=APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://www.inmuebles24.com/departamentos-en-venta-en-ciudad-de-mexico.html"}],
    "maxItems": 10,
    "maxPagesPerUrl": 1
  }'
```

For production, prefer an authorization header rather than placing a token in logs or source files.

### JavaScript API example

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/inmuebles24-property-listings-scraper').call({
  startUrls: [{ url: 'https://www.inmuebles24.com/departamentos-en-venta-en-ciudad-de-mexico.html' }],
  maxItems: 10,
  maxPagesPerUrl: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Python API example

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/inmuebles24-property-listings-scraper').call(run_input={
    'startUrls': [{'url': 'https://www.inmuebles24.com/departamentos-en-venta-en-ciudad-de-mexico.html'}],
    'maxItems': 10,
    'maxPagesPerUrl': 1,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with Apify MCP and AI agents

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/inmuebles24-property-listings-scraper"
```

#### Claude Desktop setup

Add this server object to Claude Desktop's MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/inmuebles24-property-listings-scraper"
    }
  }
}
```

#### Cursor setup

Open Cursor settings, choose **MCP**, add a remote HTTP server named `apify`, and use the same Actor-specific MCP URL shown above.

#### VS Code setup

In VS Code with MCP support enabled, add an HTTP server named `apify` to the workspace MCP configuration and set its URL to the same Actor-specific endpoint.

Example prompts:

- “Extract 20 CDMX apartments from this Inmuebles24 search URL and summarize median asking price.”
- “Run this rental URL, then group the returned listings by advertiser.”
- “Compare today’s listing IDs with yesterday’s dataset and list new inventory.”

### Limits and troubleshooting

**The run says the URL is invalid.** Use an Inmuebles24 search-results URL ending in `.html`, not a listing detail URL.

**The source shows a Cloudflare challenge.** The Actor detects this and rotates the Mexico residential browser session up to three times. If every bounded attempt is blocked, the run fails clearly rather than producing zero misleading rows.

**Some fields are null.** Search cards vary by property and advertiser. A null means the source did not expose that field in the public search result at extraction time.

**The phone flag is true but there is no phone number.** The flag indicates that Inmuebles24 displayed a phone action. This Actor does not claim to reveal contact values that the search page did not disclose in its public data.

**Why did fewer items return than `maxItems`?** The search may contain fewer unique results, reach `maxPagesPerUrl`, or repeat IDs across supplied URLs.

### Responsible use and legality

This independent Actor is not affiliated with Inmuebles24 or Navent. Use it only for lawful purposes and public property information you are entitled to process. Respect source terms, applicable privacy and marketing law, database rights, and reasonable run frequency. Do not use advertiser information for spam, harassment, discrimination, or unlawful profiling.

Property availability and asking prices can change after extraction. Verify important decisions on the canonical source URL.

### FAQ

**Does it support sale and rental searches?** Yes. Supply the corresponding Inmuebles24 search URL.

**Does it support CDMX, Guadalajara, Mérida, Puebla, and other Mexico locations?** Yes, when represented by a valid public Inmuebles24 search-results URL.

**Can I run it in English?** The input and output schema are documented in English. Source listing text remains in the language displayed by Inmuebles24.

**Does it download property photos?** No. It returns the public primary image URL, avoiding unnecessary transfer and storage.

**Can I scrape a single listing URL?** Not in this release. The product is optimized for search inventory and scheduled refreshes.

**Can I monitor changes?** Yes. Schedule repeat runs and compare rows downstream using `listingId`.

**Are empty searches successful?** A recognized natural no-result page completes with zero rows. A block or unrecognized page shape fails.

### Related automation-lab Actors

For adjacent property-market workflows, explore the automation-lab Store profile for source-specific real-estate Actors. Each source has its own schema and access strategy; use this Actor specifically for Inmuebles24 Mexico search inventory.

### Support

When reporting a problem, include the run URL, input search URL, expected listing count, and whether the same source URL opens in your browser. Do not post API tokens or private downstream credentials.

# Actor input Schema

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

One or more filtered Inmuebles24 search-results URLs ending in .html. Listing detail URLs are not accepted.

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

Maximum number of unique property listing records saved across all supplied search URLs.

## `maxPagesPerUrl` (type: `integer`):

Safety limit for pagination on each supplied search URL. Collection also stops at maxItems or when no new listings are found.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.inmuebles24.com/departamentos-en-venta-en-ciudad-de-mexico.html"
    }
  ],
  "maxItems": 10,
  "maxPagesPerUrl": 20
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing all extracted listings.

# 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://www.inmuebles24.com/departamentos-en-venta-en-ciudad-de-mexico.html"
        }
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/inmuebles24-property-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://www.inmuebles24.com/departamentos-en-venta-en-ciudad-de-mexico.html" }],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/inmuebles24-property-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://www.inmuebles24.com/departamentos-en-venta-en-ciudad-de-mexico.html"
    }
  ],
  "maxItems": 10
}' |
apify call automation-lab/inmuebles24-property-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/inmuebles24-property-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/dqyT6qCKqhGuX9jqX/builds/I1e9wtg65VoK29j8L/openapi.json
