# Zameen Scraper — Pakistan Property Listings & Agents (`logiover/zameen-property-scraper`) Actor

Export Pakistani property listings from Zameen.com: sale and rental price, property type, bedrooms, bathrooms, area in marla, kanal, m² and sq ft, exact coordinates, city and locality, plus the listing agency, contact name and phone number behind every ad.

- **URL**: https://apify.com/logiover/zameen-property-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (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 $3.50 / 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/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

## Zameen Scraper — Pakistan Property Listings & Agent Contacts

Zameen.com is Pakistan's largest property portal, and a single city section on it holds tens of thousands of live listings — 25,000+ homes for sale in Karachi, 37,000+ plots in Lahore, 13,000+ rentals in Lahore alone. This Actor walks any of those result lists and turns them into a clean, typed table: **price, property type, bedrooms, bathrooms, area in marla / kanal / m² / sq ft, exact latitude and longitude, city and locality, and the listing agency with its contact name and phone number.**

Nothing here is guessed from the visible card. Zameen ships the full search result set inside the page it serves, so every listing comes back with the same fields the site itself renders from — including the coordinates and the phone numbers that the card only exposes after a click.

### What you get

One row per listing, 48 columns:

| Group | Fields |
|---|---|
| Identity | `listingId`, `url`, `title`, `titleUrdu`, `description`, `listingState`, `source`, `country` |
| Commercial | `purpose` (for-sale / for-rent), `price`, `currency`, `priceLabel`, `pricePerSqm` |
| Property | `propertyType`, `propertySection`, `bedrooms`, `bathrooms`, `areaSqm`, `areaMarla`, `areaKanal`, `areaSqft` |
| Location | `city`, `locality`, `subLocality`, `province`, `locationPath`, `latitude`, `longitude`, `hasExactLocation` |
| Seller / lead | `agencyName`, `agencyId`, `agencyTier`, `agencyProduct`, `agencySince`, `agencyLogo`, `contactName`, `phone`, `allPhones`, `whatsapp` |
| Quality signals | `isVerified`, `listingTier`, `hasVideo`, `hasVirtualTour`, `photoCount`, `coverPhoto` |
| Timestamps | `createdAt`, `updatedAt`, `scrapedAt` |

Measured on a 500-listing run over Lahore: `phone` 100%, `price` 100%, `latitude`/`longitude` 100%, `areaMarla` 100%, `agencyName` 98%, `whatsapp` 98%, `contactName` 83%.

#### Sample row

```json
{
  "listingId": "51483576",
  "url": "https://www.zameen.com/Property/dha_defence_dha_phase_6_ultra_luxury_1_kanal...html",
  "title": "ULTRA LUXURY 1 KANAL BRAND NEW BUNGALOW | DHA PHASE 6 | 100% ORIGINAL DEAL",
  "purpose": "for-sale",
  "price": 91500000,
  "currency": "PKR",
  "priceLabel": "PKR 91,500,000",
  "propertyType": "Houses",
  "bedrooms": 5,
  "bathrooms": 6,
  "areaSqm": 418.06,
  "areaMarla": 16.53,
  "areaKanal": 0.826,
  "areaSqft": 4500,
  "pricePerSqm": 218866,
  "city": "Lahore",
  "locality": "DHA Defence",
  "subLocality": "DHA Phase 6",
  "province": "Punjab",
  "latitude": 31.471571,
  "longitude": 74.445906,
  "agencyName": "Aslam Real Estate",
  "agencyTier": 4,
  "contactName": "Mohsin Ali (CEO)",
  "phone": "+923213260605",
  "whatsapp": "923213260605",
  "isVerified": false,
  "listingTier": "superhot",
  "photoCount": 47,
  "createdAt": "2026-08-11T09:37:55.000Z"
}
```

### Input

| Field | What it does |
|---|---|
| **Property section** | `Homes` (houses + flats for sale), `Houses_Property`, `Apartments_Flats`, `Plots`, `Commercial`, or `Rentals` for everything offered to rent. |
| **City** | 25 cities from Lahore and Karachi down to Mirpur and Wah Cantt. Zameen identifies a city by name *and* numeric ID, which is why the values read `Lahore-1`. |
| **Listing URL** | Optional. Paste any Zameen result URL and it overrides the two fields above — every filter you set on the site (price range, bed count, sort order, area unit) is kept while the Actor pages through. |
| **Maximum listings** | Stop after this many rows. 25 listings arrive per page. |
| **Proxy** | Residential, pinned to Pakistan by default. |

```json
{
  "section": "Homes",
  "city": "Lahore-1",
  "maxResults": 500,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "PK" }
}
```

To reuse a filtered search instead, paste the URL from your browser:

```json
{
  "listingUrl": "https://www.zameen.com/Homes/Lahore-1-1.html?price_min=10000000&beds_in=3",
  "maxResults": 2000
}
```

### What it is good for

**Agent and agency lead lists.** Every row carries the agency, the named contact and a dialable phone number, so a run over a city section is a ready-made prospect list for CRM vendors, mortgage brokers, interior firms and portal competitors. `agencyTier` and `agencyProduct` tell you how much that agency already spends on the portal — the cheapest qualifier there is.

**Price and yield research.** `pricePerSqm` is computed for every listing, and area is given in all four units Pakistani buyers actually use. Pull the same city weekly and you have a price index by locality; pull `Rentals` and `Homes` for the same locality and you have a gross-yield estimate per neighbourhood.

**Mapping and site selection.** `latitude` / `longitude` are exact for the vast majority of listings and `hasExactLocation` tells you when they are not, so listings drop straight into a GIS layer or a heat map without geocoding.

**Supply monitoring.** `createdAt` and `updatedAt` let you separate genuinely new stock from re-posted stock, and `listingTier` (`superhot`, `hot`, `basic`) shows which sellers are paying for visibility this week.

**Training and enrichment data.** Urdu and English titles come as separate columns, which makes the output usable for bilingual model training or for matching against Urdu-language sources.

### How it works

Zameen renders its search results server-side and embeds the full result set — the same one its own front end reads — inside the page. The Actor requests each result page through a Pakistani residential IP, lifts that embedded result set, and maps every listing to a flat row. Because the data comes from the embedded set rather than from HTML selectors, a cosmetic redesign of the card does not break the output.

Pagination follows Zameen's own `-<page>.html` scheme and is verified page by page: pages 1, 15 and 40 of the same search return entirely distinct listings, so deep runs genuinely reach deep stock rather than re-serving page one.

Robustness details that matter on long runs:

- **Fresh IP per retry.** A single 403 from one residential exit node says nothing about the next, so failed requests are retried on a new IP rather than on the same session.
- **A failed page is skipped, not fatal.** One unreachable page costs one page, not the run; three consecutive failures stop it.
- **Three stop conditions.** Target reached, list exhausted, or time budget spent — rows already collected are always pushed.
- **De-duplication by listing ID** across the whole run, so a listing promoted onto two pages is saved once.

### Cost and limits

Billing is per result, so cost scales with rows saved and not with pages fetched or retries burned. Store discounts apply on paid Apify plans.

- Zameen's own search caps out around 950 pages (~23,000 listings) per query. To go past that, split by city, by section, or by price band using the **Listing URL** field.
- Rental prices on Zameen are monthly.
- `contactName` is filled by roughly 8 listings in 10; agency-posted ads without a named person leave it blank rather than inventing one.

### Legal

This Actor collects publicly available listing data. It does not log in, does not bypass access control, and does not touch anything behind a login. Contact details published on the listings are personal data in many jurisdictions — if you process them, make sure you have a lawful basis (GDPR and Pakistan's PECA both apply depending on your position) and honour opt-outs.

Not affiliated with, endorsed by, or connected to Zameen.com or Empire Holdings. "Zameen" is used here only to describe the public source of the data.

# Actor input Schema

## `section` (type: `string`):

Which part of Zameen to walk. 'Homes' covers houses and flats for sale, 'Rentals' covers everything offered for rent. Ignored when you paste your own listing URL below.

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

City to search. Zameen identifies a city by name and numeric ID together, which is why the values look like 'Lahore-1'. Ignored when you paste your own listing URL below.

## `listingUrl` (type: `string`):

Paste any Zameen result URL to reuse the filters you set on the site, e.g. https://www.zameen.com/Homes/Lahore-1-1.html?price\_min=10000000\&beds\_in=3. Every filter in the query string is kept while the Actor pages through the results.

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

Stop once this many listings have been saved. Zameen returns 25 per page, so 500 is 20 pages. A city section typically holds 10,000–40,000 live listings.

## `proxyConfiguration` (type: `object`):

Zameen only serves its full result set to Pakistani IPs, so residential proxies pinned to Pakistan are used by default. Leave this as it is unless you know you need something else.

## Actor input object example

```json
{
  "section": "Homes",
  "city": "Lahore-1",
  "listingUrl": "https://www.zameen.com/Homes/Lahore-1-1.html",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PK"
  }
}
```

# Actor output Schema

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

Every record collected in this run. Open the Dataset tab to browse, filter or export as JSON, CSV or 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 = {
    "section": "Homes",
    "city": "Lahore-1",
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "PK"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/zameen-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 = {
    "section": "Homes",
    "city": "Lahore-1",
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "PK",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/zameen-property-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 '{
  "section": "Homes",
  "city": "Lahore-1",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PK"
  }
}' |
apify call logiover/zameen-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/zameen-property-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/nydJHqUgCEgHoxrOd/builds/fMN7xyzlT1Il7S7J0/openapi.json
