# PropertyPro Scraper - Nigeria Real Estate Listings (`igolaizola/propertypro-scraper`) Actor

PropertyPro scraper for propertypro.ng real estate listings across Nigeria by location, sale, rent, land, shortlet, property type, price and bedrooms. Get clean prices, images, amenities, agents and contact data in JSON, CSV or Excel, with API and MCP workflows for research and lead generation

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

## Pricing

from $0.70 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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

## PropertyPro Scraper - Nigeria Real Estate Listings

Search **propertypro.ng** and collect Nigerian real estate listings for sale, rent, short stays, and land. Filter by location, property type, price, and bedrooms, then download clean property data for market research, lead generation, investment analysis, and rental-price comparisons.

### 🤖 What does PropertyPro Scraper do?

PropertyPro Scraper finds listings across Nigerian cities, states, and neighborhoods and turns them into organized property data. Use the results in JSON, CSV, or Excel, or connect runs to your systems through the Apify API or MCP-compatible workflows.

- **Search by place** — enter locations such as Lagos, Abuja, Lekki, or Port Harcourt.
- **Choose a purpose** — find properties for sale, rent, short stays, or land listings.
- **Apply practical filters** — narrow results by property category, price, and bedroom range.
- **Collect listing information** — get titles, prices, images, locations, amenities, agents, and contact details when published.
- **Fetch expanded details** — optionally store detail-page information separately under `_details`.

**Great for:** Nigerian property research, agent and developer lead generation, rental comparisons, investment screening, and real-estate market reports.

> SEO keywords: **PropertyPro scraper**, **propertypro.ng scraper**, **Nigeria real estate data**, **property listings API**, **real estate CSV export**, **Apify MCP**.

### 💡 Why use PropertyPro Scraper?

- 📈 **Track local prices** — compare sale and rental prices across Nigerian areas.
- 🎯 **Build property lead lists** — identify agencies, agents, and listings that match a buyer or renter brief.
- 🏘️ **Research neighborhoods** — combine location, property type, bedrooms, and budget filters.
- 📊 **Create reports faster** — download ready-to-analyze JSON, CSV, or Excel data instead of copying listings manually.

### 🚀 How to use

1. **Open the actor** — add **PropertyPro Scraper - Nigeria Real Estate Listings** from the Apify Store.
2. **Choose a location** — enter a city, state, neighborhood, or area in `location`.
3. **Set your search** — choose `operation` and optionally set `propertyType`, price, bedroom, and detail options.
4. **Run the actor** — start it in Apify Console, through the Apify API, or from an MCP-compatible tool.
5. **Download results** — open the dataset and export JSON, CSV, or Excel.

### 💳 Pricing

Apify's **Free plan** includes monthly credits for small tests. For larger searches, use the **Personal** or **Business** plan. Fetching expanded details uses one additional lookup per listing, so enable it when those extra fields matter.

### 📝 Input parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `maxItems` | Integer | No | Maximum listings to save. Default `100`. Set to `0` to continue through all available result pages. |
| `location` | Text | **Yes** | Nigerian city, state, neighborhood, or area, such as `Lagos`, `Abuja`, `Lekki`, or `Port Harcourt`. |
| `operation` | Enum | No | Listing purpose: `sale` (For sale, default) · `rent` (For rent) · `shortlet` (Short stay) · `land` (Land listings). |
| `propertyType` | Enum | No | Optional category: any type · `shop` · `office` · `flat` · `land` · `semiDetachedBungalow` · `semiDetachedDuplex` · `coWorkingSpace` · `detachedBungalow` · `warehouse` · `shopInMall` · `selfContain` · `miniFlat` · `detachedDuplex` · `house` · `terracedBungalow` · `commercial` · `terracedDuplex`. |
| `minPrice` | Integer | No | Lowest price in Nigerian naira. Default `0`, meaning no minimum. |
| `maxPrice` | Integer | No | Highest price in Nigerian naira. Default `0`, meaning no maximum. |
| `minBedrooms` | Integer | No | Minimum bedrooms. Default `0`, meaning no minimum. |
| `maxBedrooms` | Integer | No | Maximum bedrooms. Default `0`, meaning no maximum. |
| `fetchDetails` | Boolean | No | Default `false`. When `true`, fetches each listing page and stores the extra detail-page data only under `_details`. This adds one lookup per listing. |

#### Example inputs

**Lagos rental apartments**

```json
{
  "maxItems": 100,
  "location": "Lagos",
  "operation": "rent",
  "propertyType": "flat",
  "minPrice": 1000000,
  "maxPrice": 5000000,
  "minBedrooms": 2,
  "maxBedrooms": 4
}
```

**Abuja homes for sale with expanded details**

```json
{
  "maxItems": 50,
  "location": "Abuja",
  "operation": "sale",
  "propertyType": "house",
  "minPrice": 10000000,
  "maxPrice": 50000000,
  "minBedrooms": 3,
  "fetchDetails": true
}
```

**Lagos land search**

```json
{
  "maxItems": 25,
  "location": "Lekki",
  "operation": "land",
  "propertyType": "land"
}
```

### 📊 Output and results

Each dataset item represents one PropertyPro listing. Fields are omitted when the listing does not publish a value.

**Field reference**

- **`id`** *(string)* — PropertyPro listing ID.
- **`title`** *(string)* — Listing headline.
- **`description`** *(string)* — Description available from the listing card.
- **`url`** *(link)* — Canonical listing page.
- **`image`** *(link)* — Main listing image.
- **`images`** *(array)* — Image URLs found on the listing card.
- **`location`** *(string)* — City, area, or neighborhood shown by the listing.
- **`propertyType`** *(string)* — Property category shown by PropertyPro.
- **`operation`** *(string)* — `sale`, `rent`, `shortlet`, or `land`.
- **`price`** *(string)* — Displayed price, including its period when supplied.
- **`priceValue`** *(number)* — Numeric price amount.
- **`currency`** *(string)* — Currency code such as `NGN`, `USD`, `GBP`, or `EUR`.
- **`bedrooms`**, **`bathrooms`**, **`toilets`** *(number)* — Published room counts when available.
- **`agent`** *(string)* — Agent or agency name.
- **`agentUrl`** *(link)* — Agent profile page.
- **`agentLogo`** *(image)* — Agent or agency logo.
- **`phone`** *(string)* — Published contact phone number.
- **`badges`** *(array)* — Listing labels such as featured or serviced.
- **`amenities`** *(array)* — Property features such as parking, security, or a swimming pool.
- **`verified`** *(boolean)* — Whether the detail page marks the property as verified.
- **`virtualTourUrl`** *(link)* — Virtual-tour link when published.
- **`added`** and **`updated`** *(string)* — Listing dates when available.
- **`address`** *(string)* — Street-level address, generally available in `_details`.
- **`_details`** *(object, optional)* — Detail-page data when `fetchDetails` is enabled. It can include a fuller description, address, toilets, verification, virtual tour, amenities, contact data, and a larger image gallery. These values stay separate from the card fields above.

#### Example result

```json
{
  "id": "7QFGF",
  "title": "New 3 Bedroom Apartment",
  "url": "https://propertypro.ng/property/3-bedroom-flat-apartment-for-sale-off-freedom-way-lekki-phase-1-lekki-lagos-7QFGF",
  "location": "Off Freedom Way Lekki Phase 1 Lekki Lagos",
  "propertyType": "Flat Apartment",
  "operation": "sale",
  "price": "₦ 280,000,000",
  "priceValue": 280000000,
  "currency": "NGN",
  "bedrooms": 3,
  "bathrooms": 3,
  "agent": "Bethiros Real Estate",
  "agentUrl": "https://propertypro.ng/agent/beth-iros",
  "phone": "08107272392",
  "images": [
    "https://images.propertypro.ng/large/new-3-bedroom-apartment-KCk0OfQRXif1sxQjsAJb.jpeg"
  ],
  "_details": {
    "description": "3 bedroom Flat / Apartment for sale Off Freedom Way Lekki Phase 1 Lekki Lagos",
    "address": "Off Freedom Way Lekki Phase 1 Lekki Lagos",
    "toilets": 4,
    "verified": true,
    "virtualTourUrl": "https://my.matterport.com/show/?m=jvgMpzRmHZV",
    "amenities": ["Parking Space", "Swimming Pool", "Gym"],
    "images": [
      "https://images.propertypro.ng/large/new-3-bedroom-apartment-KCk0OfQRXif1sxQjsAJb.jpeg"
    ]
  }
}
```

### 🧭 Tips and common recipes

- **Start with a focused run:** use `maxItems` between `25` and `100` while refining a search.
- **Search everything available:** set `maxItems` to `0` to continue through available result pages.
- **Compare a budget band:** provide both `minPrice` and `maxPrice`.
- **Find larger homes:** set `minBedrooms` without setting `maxBedrooms`.
- **Compare categories:** leave `propertyType` as any property type.
- **Get richer records:** enable `fetchDetails` when you need address, verification, contact, or full-gallery data.
- **Automate exports:** use the Apify API or MCP to send dataset results to your reporting or lead workflow.

### ⚙️ Best practices

- Use a specific location and property type when you need a smaller, more comparable set of listings.
- Keep price filters in Nigerian naira, matching the input labels.
- Review contact information and listing dates before making business decisions; listings can change or be removed.
- Detail lookups add time and usage, so enable `fetchDetails` only when the additional information is useful.

### 🌍 Proxy usage

For repeated or larger searches, use Apify Residential proxies in your run settings. A stable residential location helps keep searches reliable and reduces interruptions from rate limits.

### ⚖️ Legal and ethical considerations

- Respect **PropertyPro.ng's terms of service** and applicable laws.
- Use listing and contact data responsibly; do not send unsolicited messages or create unlawful profiles.
- Follow privacy rules such as GDPR where they apply to your organization or audience.
- Keep request volumes reasonable and honor removal or correction requests when required.
- This Actor is independent and is **not affiliated with, endorsed by, or sponsored by PropertyPro.ng**. PropertyPro and related trademarks belong to their respective owners.

### ❓ FAQ

**Which Nigerian locations can I search?**

Enter a city, state, neighborhood, or area name, such as Lagos, Abuja, Lekki, or Port Harcourt.

**What is the default search?**

The default purpose is `sale`. Choose `rent`, `shortlet`, or `land` when you need another listing category.

**What does `maxItems: 0` do?**

It lets the actor continue through available result pages instead of applying a requested item limit.

**What does `fetchDetails` add?**

It stores a separate `_details` object for each successful detail lookup. The normal card fields are not replaced by detail-page values.

**Can I download CSV or Excel?**

Yes. Open the Apify dataset after the run and choose JSON, CSV, or Excel export. You can also read the dataset through the Apify API or an MCP-compatible workflow.

**Why is a field empty?**

PropertyPro does not publish every field for every listing. Missing values are omitted, and expanded values appear under `_details` only when `fetchDetails` is enabled and the detail page provides them.

### 🛟 Support

Need a custom field or export workflow? Open an issue or contact the maintainer at [igolaizola.com/#contact](https://igolaizola.com/#contact).

# Actor input Schema

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

Maximum number of property listings to save. Set to 0 to save all available listings.

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

Nigerian city, state, or area to search, for example Lagos, Abuja, or Lekki.

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

Choose whether you want properties for rent, for sale, or for a short stay.

## `propertyType` (type: `string`):

Optionally limit results to a common property category.

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

Lowest listing price to include in Nigerian naira. Leave at 0 for no minimum.

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

Highest listing price to include in Nigerian naira. Leave at 0 for no maximum.

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

Minimum number of bedrooms. Leave at 0 for no minimum.

## `maxBedrooms` (type: `integer`):

Maximum number of bedrooms. Leave at 0 for no maximum.

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

Open each result page to collect its full description, gallery, features, address, and contact details under \_details. This adds one request per listing.

## Actor input object example

```json
{
  "maxItems": 100,
  "location": "Lagos",
  "operation": "sale",
  "propertyType": "",
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "maxBedrooms": 0,
  "fetchDetails": false
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": "Lagos"
};

// Run the Actor and wait for it to finish
const run = await client.actor("igolaizola/propertypro-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "location": "Lagos" }

# Run the Actor and wait for it to finish
run = client.actor("igolaizola/propertypro-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "location": "Lagos"
}' |
apify call igolaizola/propertypro-scraper --silent --output-dataset

```

## MCP server setup

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