# Era Property Search Scraper (`stealth_mode/era-property-search-scraper`) Actor

Scrape hundreds of property listings from ERA.pt with detailed real estate data. This scraper extracts prices, locations, property specs, and 60+ fields per listing — perfect for market analysts, investors, and property aggregators.

- **URL**: https://apify.com/stealth\_mode/era-property-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, Real estate
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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?

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

## ERA Property Search Scraper: Extract Portuguese Real Estate Listings Fast

***

### What Is ERA.pt?

ERA.pt is Portugal's largest real estate platform, featuring residential and commercial properties across the country. The platform hosts thousands of active listings with detailed property information, pricing, and multimedia content. Manually collecting this real estate data is labor-intensive and error-prone — the **ERA Property Search Scraper** automates the process, delivering structured property records ready for analysis and integration.

***

### Overview

The **ERA Property Search Scraper** extracts property listings from ERA.pt search result pages, capturing comprehensive real estate data including prices, dimensions, location coordinates, property status, and special features. It is ideal for:

- **Real estate investors** tracking market trends and identifying opportunities
- **Market analysts** building competitive intelligence datasets
- **Property aggregators** integrating Portuguese listings into multi-market platforms
- **Researchers** studying housing markets and pricing patterns

Key advantages include configurable per-URL item limits (up to 200 properties per page), fault tolerance via `ignore_url_failures`, and access to 60+ fields spanning pricing, physical attributes, and listing metadata.

***

### Input Format

The scraper accepts a JSON configuration specifying which ERA.pt search URLs to scrape:

```json
{
  "urls": [
    "https://www.era.pt/en/buy?ob=1,2,3&ord=3&ir=1&nr=0&page=1"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 200
}
```

| Field | Description |
|---|---|
| `urls` | Array of ERA.pt property search result page URLs |
| `max_items_per_url` | Maximum number of properties to extract per URL (range: 1–200) |
| `ignore_url_failures` | If `true`, continues scraping if individual URLs fail; if `false`, stops on first error |

**URL structure:** ERA.pt search URLs include query parameters such as:

- `ob` = property types (1=apartments, 2=houses, 3=commercial)
- `ord` = sort order (3=newest)
- `ir` = filters (1=active listings)
- `page` = pagination

***

### Output Format

**Sample output**

```json
{
  "detail_url": "https://www.era.pt/imovel/moradia-t3-grandola-carvalhal-429260022",
  "gallery": [
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816166_2_1_gATxLve2QryDoR8Og5zUtnKQfaJlylyWYhZJiq7natbEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 1",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816168_2_1_J%2fX%2fnFA0ZkH4aX5%2fKUctNnFepfjKDbWtD6OGJCx5K7bEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 2",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816169_2_1_JHeISBTXgInOD4Yn0A5PrG%2bWYpXfW3P2khy4hA98H6LEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 3",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816171_2_1_5lvPXJTAs0pcZVNrDPYMp%2bjY3TO0S9E5xyc56M4FmBPEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 4",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816172_2_1_%2fpXyW6Y%2fxBsy7J7%2b9AQDQDNWxYCTZQKGuOQUCIU5U6PEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 5",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816174_2_1_NZvtjgYRppweS%2bmBGOlzj1G6MEVj0W7EcusXy7SnCeTEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 6",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816175_2_1_PZtPtHRGmoK8QSQ4ekayD%2bo2C9U15LwnFe2%2fknVMwj3EB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 7",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816177_2_1_PSHfKjl%2f7d9o5jOqxP0rYddCXOoBl0z5OZFls5jb%2fA7EB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 8",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816179_2_1_t%2fXMbCGNJgiPDiRAV7rDn1iAE6TEPTQJ6eBvrm6LchnEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 9",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816181_2_1_e0m%2fYAyBDO8YmzAKWhoORs2UH4hEKejEPeXd3TQYZqXEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 10",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816182_2_1_Vtu3JrY%2fWkqOubHMa%2bHkojdw5ae2dlr6bI8NnLYIjbnEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 11",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816184_2_1_TYTwU85q3qNtPJE%2bCK%2fhwEMwUzlMhbfssITScFYsOSPEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 12",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816185_2_1_EBxwH1%2bICmj8u3z64D7a3AgXo3JJHhCs%2buJL7CHWN6jEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 13",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816187_2_1_DzPQOVm099lYGcOPmVPvRd0T5ovkX4s52BCaIV1JU2HEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 14",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816189_2_1_sMdJmlIx8TKBuoIIzGjev1L5a0FiXoLx0vROlwboRbPEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 15",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816191_2_1_iSYOzlXIuWwoPnuHaz07iw3H8Xlj8SIfaYEywwxPeyjEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 16",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816192_2_1_HPtvwZWlFfqnsHJ1Kf0vYehxzVBXZ68t%2fncXrPwwqHjEB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 17",
      "is_highlight": false
    },
    {
      "url": "https://mediaredir2.era.pt/i/moradia-t3-grandola-carvalhal_13_1_1547558_18816194_2_1_B8SsVAjWVsVLIL%2fnHc4umfAziC3SrJK9lZSLTftv5M7EB8h4ZPpqcw%3d%3d_.jpg",
      "title": "",
      "description": "Apartamento T3 Grândola, Carvalhal - 1547558 - 18",
      "is_highlight": false
    }
  ],
  "belongs_to_development": false,
  "business_status": {
    "id": 1,
    "name": "Disponível"
  },
  "business_type": [
    {
      "result_page": null,
      "id": 2,
      "name": "Arrendar"
    }
  ],
  "ce": "A",
  "elevator": false,
  "floor": "0",
  "has_exact_location": false,
  "has_virtual_tour": false,
  "highlights": {
    "extra_info": "",
    "group_id": 2,
    "id": 5,
    "name": "Novidade"
  },
  "id": 1547558,
  "is_development": false,
  "is_excluded": false,
  "is_favorite": false,
  "is_free_ad_property": false,
  "is_online": true,
  "is_sold": false,
  "land_area": "",
  "lat": "38,49131",
  "listing_area": "153",
  "lng": "-8,903483",
  "localization": "Carvalhal, Setúbal",
  "net_area": "",
  "owner": null,
  "parking": "",
  "property_ad_state": null,
  "property_sub_type": {
    "id_property_type": "2",
    "id": 53,
    "name": "Moradia"
  },
  "property_type": "Moradia",
  "property_type_id": [
    2
  ],
  "real_estate": {
    "phone": "265236357",
    "id": 351010429,
    "id_sales_office": 0,
    "name": "ERA Setúbal Centro",
    "photo": {
      "url": "https://mediaredir.era.pt/escritorios/351010429/0c41b9f863294195beede4201c546053-20250526182229450.jpg",
      "title": "",
      "description": "",
      "is_highlight": false
    },
    "a_m_i": "9807",
    "company_name": "Real Paixão - Mediação Imobiliária, Lda",
    "u_r_l": null
  },
  "reference": "429260022",
  "rent_price": {
    "name": "Arrendar",
    "value": "3.500 €",
    "previous_value": "",
    "variation": ""
  },
  "rooms": "3",
  "sell_price": null,
  "sublease_price": null,
  "title": "Moradia T3 / Grândola, Carvalhal",
  "wcs": "3",
  "last_contact_info": null,
  "fraction_numb": null,
  "floor_numb": null,
  "housing_area": "",
  "listing_building_area": "",
  "implantation_area": "",
  "construction_feasibility": false,
  "walled": false,
  "price_net_area": null,
  "price_listing_area": null,
  "price_land_area": null,
  "rent_price_net_area": null,
  "rent_price_listing_area": null,
  "rent_price_land_area": null,
  "sub_lease_price_net_area": null,
  "sub_lease_price_listing_area": null,
  "sub_lease_price_land_area": null,
  "stamp": "",
  "last_units": false,
  "fractions": null,
  "fractions_qty": 0,
  "promoter_name": null,
  "promoter_logo": null,
  "has_more_fractions": false,
  "from_url": "https://www.era.pt/comprar?ob=1,2,3&ord=3&ir=1&nr=0&page=1"
}
```

Each property returns a rich dataset with 60+ fields describing physical attributes, pricing, location, and listing status:

#### Core Property Identification

| Field | Meaning |
|---|---|
| `ID` | Unique ERA property identifier |
| `Reference` | ERA reference code for the listing |
| `Detail URL` | Direct link to the property detail page |
| `Title` | Property title/headline as displayed |
| `Owner` | Agent or owner contact information |

#### Property Type & Classification

| Field | Meaning |
|---|---|
| `Property Type` | Main category (e.g., Apartment, House, Commercial) |
| `Property Type ID` | Numeric ID for the property type |
| `Property Sub Type` | Subcategory (e.g., Studio, Duplex, Warehouse) |
| `Business Type` | Transaction type (Buy, Rent, or Sublease) |

#### Physical Dimensions & Structure

| Field | Meaning |
|---|---|
| `Net Area` | Usable interior floor space (m²) |
| `Land Area` | Total land size including outdoor spaces (m²) |
| `Listing Area` | Area displayed in the listing (m²) |
| `Housing Area` | Residential floor area (m²) |
| `Listing Building Area` | Building footprint as listed (m²) |
| `Implantation Area` | Total construction footprint (m²) |
| `Rooms` | Number of bedrooms |
| `WCs` | Number of bathrooms and toilets |
| `Floor` | Floor level (ground, 1st, 2nd, etc.) |
| `Floor Number` | Numeric floor identifier |
| `Fraction Number` | Unit number within a building |

#### Pricing

| Field | Meaning |
|---|---|
| `Sell Price` | Listed sale price (€) |
| `Rent Price` | Monthly rental price (€) |
| `Sublease Price` | Sublease monthly price (€) |
| `Price Net Area` | Price per m² of net area (€/m²) |
| `Price Listing Area` | Price per m² of listing area (€/m²) |
| `Price Land Area` | Price per m² of land (€/m²) |
| `Rent Price Net Area` | Rent per m² of net area (€/m²) |
| `Rent Price Listing Area` | Rent per m² of listing area (€/m²) |
| `Rent Price Land Area` | Rent per m² of land (€/m²) |
| `Sub Lease Price Net Area` | Sublease price per m² (€/m²) |
| `Sub Lease Price Listing Area` | Sublease per listing m² (€/m²) |
| `Sub Lease Price Land Area` | Sublease per land m² (€/m²) |

#### Location & Coordinates

| Field | Meaning |
|---|---|
| `Localization` | Address or neighborhood name |
| `Latitude` | GPS latitude coordinate |
| `Longitude` | GPS longitude coordinate |
| `Has Exact Location` | Boolean indicating precise geo-location availability |

#### Amenities & Features

| Field | Meaning |
|---|---|
| `Elevator` | Whether the building has an elevator |
| `Parking` | Number of parking spaces or availability |
| `Walled` | Whether the property has perimeter walls/fencing |
| `CE` | Energy certification level (A–F scale) |
| `Highlights` | Array of special features or selling points |
| `Has Virtual Tour` | Whether a 3D virtual tour is available |
| `Gallery` | URLs and count of property photos |

#### Listing Status & Metadata

| Field | Meaning |
|---|---|
| `Is Online` | Whether the listing is currently active |
| `Is Sold` | Whether the property has been sold |
| `Is Excluded` | Whether the listing is hidden or archived |
| `Is Favorite` | User favorite flag status |
| `Is Free Ad Property` | Whether listed at no cost |
| `Property Ad State` | Current listing status (active, expired, etc.) |
| `Business Status` | Availability or transaction status |
| `Stamp` | Internal processing timestamp |
| `Last Contact Info` | Recent agent contact activity |

#### Development & Investment Data

| Field | Meaning |
|---|---|
| `Is Development` | Whether this is a new construction project |
| `Belongs To Development` | Parent development project ID if applicable |
| `Construction Feasibility` | Whether construction is permitted on the land |
| `Promoter Name` | Developer/promoter company name |
| `Promoter Logo` | Developer logo URL |
| `Fractions` | Number of units in a multi-unit development |
| `Fractions Quantity` | Total quantity of available units |
| `Has More Fractions` | Whether additional units are available |
| `Last Units` | Count of remaining units for sale |
| `Real Estate` | Associated real estate group or office |

***

### How to Use

1. **Build a search URL** — Navigate to ERA.pt, apply filters (property type, price range, location, etc.), and copy the full search result page URL.
2. **Add URLs to input** — Paste one or more search URLs into the `urls` array. You can scrape multiple search result pages in a single run.
3. **Configure limits** — Set `max_items_per_url` to control volume (e.g., 50 for a focused run, 200 for comprehensive scraping).
4. **Enable fault tolerance** — Set `ignore_url_failures: true` for production runs to avoid interruptions if a page temporarily fails.
5. **Execute and export** — Start the scraper and download results in JSON, CSV, or Excel format.

**Best practices:**

- Use search filters on ERA.pt to narrow results before scraping (saves time and API usage).
- For large datasets, split by region or property type into separate runs.
- Monitor price/m² and location fields for market trend analysis.

***

### Use Cases & Business Value

- **Investment analysis:** Compare pricing, location, and ROI metrics across neighborhoods
- **Market intelligence:** Track competitor listings and new property launches in real time
- **Portfolio management:** Build and maintain updated property databases for aggregators
- **Price benchmarking:** Calculate average price per m² by district, property type, or amenity
- **Research:** Analyze housing supply, affordability trends, or development activity

The ERA Property Search Scraper cuts manual data collection from hours to minutes, enabling real-time market insights and informed investment decisions.

***

### Conclusion

The **ERA Property Search Scraper** is the essential tool for anyone working with Portuguese real estate data. Whether you're an investor, analyst, or platform builder, this scraper delivers clean, structured property records with 60+ fields — ready for analysis, modeling, or integration. Start scraping today and unlock the full potential of ERA.pt's listings.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the property list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.era.pt/en/buy?ob=1,2,3&ord=3&ir=1&nr=0&page=1"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.era.pt/en/buy?ob=1,2,3&ord=3&ir=1&nr=0&page=1"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/era-property-search-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 = {
    "urls": ["https://www.era.pt/en/buy?ob=1,2,3&ord=3&ir=1&nr=0&page=1"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/era-property-search-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 '{
  "urls": [
    "https://www.era.pt/en/buy?ob=1,2,3&ord=3&ir=1&nr=0&page=1"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/era-property-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stealth_mode/era-property-search-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/OOZL2d0Eof5Z3tiVd/builds/kqeaqIwJkJhcMMk7k/openapi.json
