# Casas y Terrenos Scraper - Mexico Real Estate & Agents (`normdata/casasyterrenos-scraper`) Actor

Scrape homes, apartments, land and commercial property for sale or rent on Casas y Terrenos, Mexico. Get price, place, land and built area, rooms, map point, amenities, photos and the agent's name, email, phone and WhatsApp, plus description and address. Filter by state, city, type, price, rooms.

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

## Pricing

from $13.00 / 1,000 property 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/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

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm2.png)

## 🏠 Casas y Terrenos Scraper - Mexico Real Estate & Agents

Extract houses, apartments, land, offices, retail space, warehouses and ranches from **Casas y Terrenos** (casasyterrenos.com), a Mexican property portal with about 39,000 listings for sale and for rent across all 32 states. For each listing you get the **price and currency, property type, state, municipality and neighborhood, land and built area, bedrooms, bathrooms, parking, map point, amenities, every photo, virtual tour and video, plus the agent's name, email, phone and WhatsApp**. Turn on **property details** to also get the **full description, street address, building age, half bathrooms, floors, the agent's full name, agency and logo, every phone they list and amenities by group**. It collects **1,000 listings in under 10 seconds** and can run on a schedule to send you **only new listings**.

### 🎯 Who uses it?

#### 📞 Lead generation and B2B sales

Get the email, phone and WhatsApp of every real estate agent and agency in a city or state: mortgage brokers, notaries, insurers, movers, photographers and CRM vendors use them as leads.

#### 🏢 Real estate agencies and developers

See what competitors list, where and at what price per square meter, and find owners and agents to partner with.

#### 📊 Investors and market analysts

Build price and rent maps by state, municipality and neighborhood, compare sale and rent prices for the same areas, and track supply over time.

#### 🔔 Buyers and tenants

Get a daily list of new listings that match your city, budget, rooms and amenities.

### ✨ What it does

- **The whole country.** Every listing in the 32 states, for sale, for rent or for transfer (traspaso), with no page cap.
- **Many filters.** States, municipalities, neighborhoods, a map point and radius, property types, price range, bedrooms, bathrooms, parking spots, land and built area, and amenities. Pick several values per filter.
- **Sort like on the site.** Featured first, lowest price or highest price.
- **Property details add-on:** opens each property page for the description, address and every phone.
- **Or paste links.** Property pages, or results pages with the site's own filters set. Filters are not used with links.
- **Monitoring:** run it on a schedule with **Only new listings**, and each run saves only the listings you haven't received yet.

### 🏆 Why this scraper

- **Fast.** 1,000 listings in under 10 seconds without details, about 2 to 3 minutes with them.
- **Contacts in every row.** The agent's name, email, phone and WhatsApp come with each listing, without the add-on.
- **Right places.** The site files Mexico City and many towns of Estado de México together as "DF". This Actor gives each listing its real state, so Naucalpan, Huixquilucan or Toluca show up under Estado de México.
- **Clean, typed data.** Prices, areas and counts are numbers, and 0 placeholders become empty. Phones are in +52 format. Dates are ISO. Broken titles and placeholder links from the site are cleaned up.
- **Nothing to set up.** No proxy, no login.

### 📦 What data you get

| Field | Description |
| --- | --- |
| `imageUrl` | Main photo. |
| `title` | Listing title, as the seller wrote it. |
| `propertyType` | Casa, Departamento, Terreno, Oficina, Local, Bodega, Nave industrial... |
| `operation` | Sale, Rent or Transfer: what was searched. |
| `price`, `currency` | Price for that operation (monthly for rent) and its currency, MXN or USD. Empty when the seller gives none. |
| `salePrice`, `rentPrice`, `transferPrice` | Sale, monthly rent and transfer prices, when the listing offers more than one. |
| `state`, `municipality`, `neighborhood` | State, municipality and neighborhood (colonia). Towns the site files under Mexico City ("DF") get their real state. |
| `landArea`, `builtArea` | Land and built area in square meters. |
| `bedrooms`, `bathrooms`, `parkingSpots` | Bedrooms, full bathrooms and parking spots. |
| `latitude`, `longitude` | Map point. |
| `agentName`, `agentEmail`, `agentPhone`, `agentWhatsapp` | The agent or agency: name, email, phone and WhatsApp (+52 format). |
| `id` | The site's listing ID. |
| `description` | *(Property details)* The seller's full description. |
| `address` | *(Property details)* Street and number, when the seller gives them. |
| `ageYears`, `halfBathrooms`, `floors` | *(Property details)* Age of the building, half bathrooms and floors. |
| `contactName`, `agencyName` | *(Property details)* The agent's full name and their agency. |
| `otherPhonesText` | *(Property details)* Extra phones as the agent wrote them, like "Tel. (33)3122 3344". |
| `featured` | A paid, featured listing. Empty for property links. |
| `forSale`, `forRent`, `forTransfer` | Which operations the listing offers: sale, rent, transfer. |
| `url` | Link to the listing. |
| `virtualTourUrl`, `videoUrl` | Virtual tour and video links, when there are any. |
| `agencyLogoUrl` | *(Property details)* The agency's logo. |
| `amenities` | Amenities, like Alberca, Jardín, Elevador, Pet-friendly. |
| `photos` | Every photo. |
| `contactPhones` | *(Property details)* Every phone of the agent, in +52 format. |
| `amenityGroups` | *(Property details)* The same amenities by group, like {"Exterior": \["Jardín", "Terraza"]}. |
| `updatedAt` | When the listing was last updated. Empty for property links. |
| `scrapedAt` | When this row was saved. |
| `error` | Only present when a row failed. The fields that loaded are still there. |

Fields marked *Property details* only appear when that add-on is on.

#### Example row (trimmed)

```json
{
  "imageUrl": "https://cyt-media.s3-us-west-2.amazonaws.com/img_casas/92-Ranchos-Venta-Atemajac-de-Brizuela-Atemajac-de-Brizuela-Jalisco-3881750-4q4-1T05.jpg",
  "title": "RANCHO EN VENTA EN HACIENDA LAGO ENTRE PINOS EN TAPALPA",
  "propertyType": "Rancho",
  "operation": "Sale",
  "price": 125000000,
  "currency": "MXN",
  "salePrice": 125000000,
  "state": "Jalisco",
  "municipality": "Atemajac de Brizuela",
  "neighborhood": "Atemajac de Brizuela",
  "landArea": 75000,
  "builtArea": 1000,
  "bedrooms": 5,
  "bathrooms": 6,
  "parkingSpots": 20,
  "latitude": 20.138719,
  "longitude": -103.726124,
  "agentName": "Frava Grupo Inmobiliario",
  "agentEmail": "info@frava.com.mx",
  "agentPhone": "+523336780333",
  "agentWhatsapp": "+523336780333",
  "id": "3881750",
  "description": "HACIENDA LAGO ENTRE PINOS\n\nUNA DE LAS HACIENDAS PRIVADAS MÁS EXTRAORDINARIAS DE MÉXICO, DONDE EL LUJO, LA NATURALEZA Y LA PRIVACIDAD CONVERGEN EN UNA EXPERIENCIA ÚNICA.\n\nEN EL ...",
  "address": "NICOLAS BRAVO",
  "ageYears": 2,
  "halfBathrooms": 1,
  "floors": 1,
  "contactName": "Frava Grupo Inmobiliario",
  "agencyName": "FRAVA GRUPO INMOBILIARIO",
  "otherPhonesText": "3678-0333 Lada sin costo: 01-800-22 FRAVA (37282)",
  "featured": false,
  "forSale": true,
  "forRent": false,
  "forTransfer": false,
  "url": "https://www.casasyterrenos.com/propiedad/rancho-venta-nicolas-bravo-atemajac-de-brizuela-atemajac-de-brizuela-jal-3881750",
  "videoUrl": "https://youtu.be/ab3H5fDnp0s",
  "agencyLogoUrl": "https://cyt-media.s3-us-west-2.amazonaws.com/img_inmobiliarias/3126/frava-grupo-inmobiliario-3126-foto-perfil-whats",
  "amenities": ["Aire acondicionado", "Terraza", "Jardín"],
  "photos": [
    "https://cyt-media.s3-us-west-2.amazonaws.com/img_casas/92-Ranchos-Venta-Atemajac-de-Brizuela-Atemajac-de-Brizuela-Jalisco-3881750-4q4-1T05.jpg",
    "https://cyt-media.s3-us-west-2.amazonaws.com/img_casas/57-Ranchos-Venta-Atemajac-de-Brizuela-Atemajac-de-Brizuela-Jalisco-3881750-_XTeqgtB.jpg",
    "https://cyt-media.s3-us-west-2.amazonaws.com/img_casas/77-Ranchos-Venta-Atemajac-de-Brizuela-Atemajac-de-Brizuela-Jalisco-3881750-DpYOEDYD.jpg"
  ],
  "contactPhones": ["+523336780333"],
  "amenityGroups": { "Amenidades": ["Aire acondicionado", "Bodega", "Cocina integral"], "Exterior": ["Jardín", "Patio de Servicio", "Roof Garden"] },
  "updatedAt": "2026-09-21T10:04:03.645Z",
  "scrapedAt": "2026-10-27T01:06:57.154Z"
}
```

### 💡 Use cases

**Every agent with houses for sale in Zapopan and Guadalajara, with all their phones:**

```json
{
  "operation": "sale",
  "propertyTypes": ["Casa"],
  "municipalities": ["Zapopan, Jalisco", "Guadalajara, Jalisco"],
  "includeDetails": true
}
```

**Apartments for rent in Mexico City, 2+ bedrooms, up to 25,000 pesos a month, with a pool:**

```json
{
  "operation": "rent",
  "propertyTypes": ["Departamento"],
  "states": ["Ciudad de México"],
  "minBedrooms": 2,
  "maxPrice": 25000,
  "amenities": ["Alberca"]
}
```

**Land within 30 km of Mérida, cheapest first:**

```json
{
  "operation": "sale",
  "propertyTypes": ["Terreno"],
  "latitude": 20.9674,
  "longitude": -89.5926,
  "radiusKm": 30,
  "sort": "priceLow"
}
```

**Listings in a few neighborhoods (colonias):**

```json
{
  "operation": "sale",
  "municipalities": ["Monterrey, Nuevo León"],
  "neighborhoods": ["Cumbres", "Contry"]
}
```

**New listings every day (schedule this run):**

```json
{
  "operation": "sale",
  "states": ["Jalisco"],
  "onlyNew": true,
  "monitorName": "jalisco-daily"
}
```

**Links (filters are not used):**

```json
{
  "startUrls": [
    { "url": "https://www.casasyterrenos.com/jalisco/zapopan/casas/venta?habitaciones=3" },
    { "url": "https://www.casasyterrenos.com/propiedad/casa-venta-paseo-del-prado-colonia-lomas-del-valle-zapopan-jal-3806662" }
  ],
  "includeDetails": true
}
```

### ⚙️ How the input is organised

| Section | What it's for |
| --- | --- |
| **Maximum results** | Always first, caps the whole run. Empty means no limit. |
| **What to scrape** | For sale or rent, property types and property details (description, address, every phone). |
| **Where** | States, municipalities (cities), neighborhoods (colonias), map point latitude, map point longitude and radius around the point (km). |
| **Filters** | Minimum price, maximum price, minimum bedrooms, minimum bathrooms, minimum parking spots, minimum land area (m²), maximum land area (m²), minimum built area (m²), maximum built area (m²), amenities and order. |
| **Monitoring** | Only new listings and monitor name. |
| **Links** | Links instead of the fields above. Filters are ignored with links. |

### 💰 Pricing

Pay-per-event: a one-time **$0.003** when the run starts, plus a price per listing saved to your dataset. The price depends on your Apify plan tier:

| Your Apify plan | Price per listing |
| --- | --- |
| Free | $0.018 |
| Bronze | $0.016 |
| Silver | $0.0145 |
| Gold / Platinum / Diamond | $0.013 |

**Property details add-on:** when **Property details** is on, each listing saved with its page details adds one more charge:

| Your Apify plan | Property details, per listing |
| --- | --- |
| Free | $0.007 |
| Bronze | $0.0062 |
| Silver | $0.0055 |
| Gold / Platinum / Diamond | $0.0048 |

Approximate total cost:

| Listings collected | Free | Bronze | Silver | Gold+ |
| --- | --- | --- | --- | --- |
| 1,000 | $18.00 | $16.00 | $14.50 | $13.00 |
| 1,000 with details | $25.00 | $22.20 | $20.00 | $17.80 |
| 10,000 | $180.00 | $160.00 | $145.00 | $130.00 |

Property pages that could not be read pay only the base price, and listings left out by filters are free. New Apify accounts start with $5 in free credit. On the Free plan, a run saves up to 10 listings.

### 🚀 Run it

1. Create a free Apify account with $5 in credit.
2. Open the Casas y Terrenos Scraper.
3. Pick sale or rent, add filters (or keep them empty for the whole country), then click **Start**.
4. Export the results as CSV, Excel, JSON or XML from the Dataset tab.

### 🤖 Use with AI agents (MCP)

Connect the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client, then ask in plain words, for example: *"Get every apartment for rent in Polanco on Casas y Terrenos under 40,000 pesos, with the agent's WhatsApp"*. The agent runs this Actor and reads the results.

### 🔧 Troubleshooting

- **Few or no results.** Loosen a filter. Neighborhoods match part of the name, so "Valle" also finds "Valle Real" and "Valle Oriente": add a municipality to narrow it. Transfer (traspaso) has only a handful of listings.
- **A price in US dollars looks out of range.** A few listings are priced in US dollars. Price filters and price sorting use each listing's own number, with no conversion, so a US$1,500,000 house counts as 1,500,000.
- **Some prices look wrong.** A few sellers type junk prices (like a rent of 1 peso or billions). They are saved as the site shows them.
- **Some fields are empty.** They are empty on the site too: land rarely has bedrooms, and many sellers leave out parking, building age, floors, a tour or a video.
- **A results link gives more than the page shows.** A results link gives every listing in its map area, like the site's map view.

### ❓ FAQ

**How many listings are there?** About 39,000 as of October 2026, most of them for sale.

**Why does a listing say Estado de México when the site says DF?** The site files many towns around Mexico City under "DF". The Actor uses the listing's municipality to give its real state.

**Do I need a proxy?** No.

### 🛡️ Limits & responsible use

This Actor collects property listings that Casas y Terrenos publishes on its website, at a moderate pace. Use the data in line with the site's terms and Mexico's personal data law (LFPDPPP). Agent phones and emails belong to agents and agencies: follow anti-spam rules and only contact them about their listings.

### 📧 Contact

Questions, bugs or a field you need: norm.data.scrapers@gmail.com

### 🧪 Local development

```bash
bun install
bun scripts/gen-schemas.mjs
sh test/run.sh first '{"maxItems":10}'
```

# Actor input Schema

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

Stop after this many listings in total. Leave empty for no limit. The Apify Free plan is always capped at 10.

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

Sale (venta), rent (renta, monthly prices) or transfer (traspaso, a business or lease handed over; only a handful of listings).

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

Only these types. Empty = every type.

## `includeDetails` (type: `boolean`):

Also read each property page: the seller's full description, street address, age of the building, half bathrooms, floors, the agent's full name, agency name and logo, every phone they list, and amenities by group. Charged per listing as an add-on.

## `states` (type: `array`):

Only listings in these states.

## `municipalities` (type: `array`):

Only listings in these municipalities, like Zapopan or Benito Juárez (Mexico City).

## `neighborhoods` (type: `array`):

Only listings whose neighborhood contains one of these words, like "Valle Real" or "Polanco". Pick its municipality too, so the search stays small.

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

Search around a point instead, like 20.6767 (Guadalajara center). Give longitude and radius too.

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

Like -103.3475.

## `radiusKm` (type: `number`):

From 0.1 to 1,000 km. Default 5.

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

The price as listed: pesos for nearly all listings. The few in US dollars are compared by their dollar number, with no conversion. For rent, the monthly rent.

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

Same as the minimum price.

## `minBedrooms` (type: `integer`):

At least this many bedrooms (recámaras).

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

At least this many full bathrooms.

## `minParking` (type: `integer`):

At least this many parking spots.

## `minLandArea` (type: `integer`):

Land (terreno) in square meters.

## `maxLandArea` (type: `integer`):

Land (terreno) in square meters.

## `minBuiltArea` (type: `integer`):

Built area (construcción) in square meters.

## `maxBuiltArea` (type: `integer`):

Built area (construcción) in square meters.

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

Only listings with all of these.

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

Featured first is the site's own order. Prices in US dollars are sorted by their dollar number.

## `onlyNew` (type: `boolean`):

Skip listings saved by earlier runs with the same monitor name.

## `monitorName` (type: `string`):

Runs with the same name share their history. Use a different name for each schedule.

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

Property pages (https://www.casasyterrenos.com/propiedad/casa-venta-paseo-del-prado-colonia-lomas-del-valle-zapopan-jal-3806662) or results pages with the site's filters set (https://www.casasyterrenos.com/jalisco/zapopan/casas/venta?habitaciones=3). A results page gives what the site shows for it: every listing in its map area.

## Actor input object example

```json
{
  "maxItems": 10,
  "operation": "sale"
}
```

# 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 = {
    "maxItems": 10,
    "operation": "sale"
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/casasyterrenos-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 = {
    "maxItems": 10,
    "operation": "sale",
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/casasyterrenos-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 '{
  "maxItems": 10,
  "operation": "sale"
}' |
apify call normdata/casasyterrenos-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,normdata/casasyterrenos-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/L3pDqZV9diWoBMTpU/builds/2TITughGMhoTqjH4k/openapi.json
