# Predimed Portugal Scraper - Property Listings (`studio-amba/predimed-pt-scraper`) Actor

Scrape every property listing from Predimed Imobiliária (predimed.pt), a Portuguese agency network. Get price, typology, useful, gross and land areas, district, municipality, parish, coordinates, description, photos, energy certificate, features and agent. No login required.

- **URL**: https://apify.com/studio-amba/predimed-pt-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Real estate
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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

## Predimed Portugal Scraper

Scrape property listings from [Predimed Imobiliária](https://www.predimed.pt), a Portuguese real estate agency network with offices across the country. You get every listing with price, typology, useful, gross and land areas, district, municipality and parish, map coordinates, the full description, all photos, energy certificate, features and the agent who handles it. Sale and rent, all property types. No login required.

### Why use this actor?

- **The complete Predimed catalogue.** One run reads all listings the site publishes, about 8,500 including sold and reserved properties, or only the ones still on the market.
- **Detail-page data, not just the list cards.** Description, district, municipality, coordinates, gross and land area, construction year, condition, grouped features, every photo and the agent's contact details.
- **The site's own categories.** Property type comes from Predimed's own filter (Apartamentos, Moradias, Terrenos, ...), so a type count matches the website.
- **Clean numbers.** Prices and areas are numbers, typology is `T0`, `T2`, `T3+1`, dates are ISO 8601.
- **Honest prices.** When the website shows "Sob consulta" or hides the price of a sold property, `price` is `null` and `priceOnRequest` or `availability` tells you why. The actor never invents a price.

Typical uses: feeding a real estate CRM or portal, market and price analysis per municipality, monitoring new and updated listings, and lead lists of agencies and consultants.

### How to scrape Predimed data

1. Open the actor and choose **Sale**, **Rent** or both.
2. Optionally type a district, municipality or parish in **Location** (for example `Lisboa`, `Sintra` or `Cedofeita`), and pick property types and typologies.
3. Set **Max items**. For the full catalogue, set it to 20,000 and **Availability** to "All".
4. Click **Start**. Download the results as JSON, CSV or Excel, or read them through the Apify API.

Example input for every apartment for rent in Lisbon district:

```json
{
    "transactionType": "rent",
    "location": "Lisboa",
    "propertyTypes": ["apartment"],
    "maxItems": 500
}
```

Example input for the full catalogue, sold and reserved included:

```json
{
    "transactionType": "all",
    "availability": "all",
    "maxItems": 20000
}
```

### Input

| Field | Type | Description |
|---|---|---|
| `transactionType` | string | `sale`, `rent` or `all` (default `all`) |
| `location` | string | District, municipality or parish name. Accents optional. Empty = all of Portugal. An unknown name fails the run with examples instead of silently searching the whole country |
| `propertyTypes` | array | `apartment`, `house`, `land`, `farm`, `shop`, `office`, `warehouse`, `garage`, `building`, `business`, `room`. Empty = all |
| `typologies` | array | `T0` to `T10`. Empty = all |
| `minPrice` / `maxPrice` | integer | Price range in EUR (monthly rent for rentals) |
| `minArea` | integer | Minimum area in m² |
| `availability` | string | `available` (default), `all`, `sold`, `reserved`, `rented` |
| `sortBy` | string | `newest` (default), `oldest`, `updated`, `price_desc`, `price_asc` |
| `maxItems` | integer | Maximum listings to return. Default 100, hard cap 20,000 |
| `includeDetails` | boolean | ON by default. Turning it OFF skips the listing pages: rows then only carry list data (price, typology, useful area, parish, status, one photo, dates) and description, district, municipality, coordinates, features, photos and agent stay empty |
| `maxConcurrency` | integer | Listing pages fetched in parallel (default 10, max 32) |
| `proxyConfiguration` | object | Apify proxy. The automatic pool is enough, residential is not needed |

### Output

| Field | Example | Description |
|---|---|---|
| `listingId` | `wlrm5q` | Predimed listing id |
| `reference` | `064515` | Agency reference |
| `url` | `https://www.predimed.pt/Imovel/wlrm5q` | Listing page |
| `title` | `VALONGO PREMIUM` | Listing headline |
| `summary` | `Apartamento T3` | Short label from the site |
| `transactionType` | `sale` | `sale` or `rent` |
| `businessType` | `Comprar` | Site label (Comprar, Arrendar, Imóveis com negócio) |
| `availability` | `available` | `available`, `sold`, `reserved`, `rented`, `withdrawn` |
| `propertyType` | `apartment` | Site category, normalised |
| `propertyTypeLabel` | `Apartamento` | Site type label, e.g. Moradia Geminada |
| `typology` | `T3` | T0, T1, T2, T3+1 ... |
| `bedrooms` / `bathrooms` | `3` / `3` | Quartos and WCs |
| `price` / `currency` | `335000` / `EUR` | Asking price or monthly rent. Null when the site shows no price |
| `priceOnRequest` | `false` | True when the site shows "Sob consulta" |
| `usefulAreaM2` | `122` | Área útil |
| `grossPrivateAreaM2` | `148` | Área Bruta Privativa |
| `landAreaM2` | `11500` | Área do Terreno |
| `floor` | `2` | Andar as written by the agency |
| `constructionYear` | `2008` | Ano |
| `condition` | `Novo` | Estado |
| `energyCertificate` | `A+` | Energy class, Isento or Sem certificado |
| `district` / `municipality` / `parish` | `Porto` / `Valongo` / `Valongo` | Distrito, concelho, freguesia |
| `locationFull` | `Valongo, Porto` | Parish, municipality, district |
| `latitude` / `longitude` | `41.19` / `-8.49` | Map pin from the listing page |
| `description` | `O empreendimento ...` | Full description |
| `features` | `["Cozinha equipada", "Escola"]` | All features |
| `featuresByGroup` | `{"Equipamentos": [...]}` | Features grouped as on the site |
| `imageUrl` / `imageUrls` / `imageCount` | | Main photo, all photos, count |
| `agentName` / `agentEmail` / `agentPhone` / `agentProfileUrl` | | Consultant handling the listing |
| `agencyName` | `PREDIMED PRIME` | Predimed office |
| `isFeatured` / `isExclusive` / `isPriceReduced` | | Site badges |
| `listedAt` / `updatedAt` | `2026-11-06T12:18:32.000000Z` | Created and last updated |
| `detailsScraped` | `true` | False when only list data was saved |
| `scrapedAt` | `2026-11-08T03:39:41.066Z` | Time of scraping |

### Example output

```json
{
    "listingId": "wlrm5q",
    "reference": "064515",
    "url": "https://www.predimed.pt/Imovel/wlrm5q",
    "title": "VALONGO PREMIUM",
    "summary": "Apartamento T3",
    "transactionType": "sale",
    "businessType": "Comprar",
    "availability": "available",
    "availabilityLabel": "Disponível",
    "propertyType": "apartment",
    "propertyTypeLabel": "Apartamento",
    "typology": "T3",
    "bedrooms": 3,
    "bathrooms": 3,
    "price": 335000,
    "currency": "EUR",
    "priceOnRequest": false,
    "usefulAreaM2": 122,
    "grossPrivateAreaM2": 148,
    "landAreaM2": null,
    "floor": null,
    "constructionYear": null,
    "condition": "Novo",
    "energyCertificate": "A+",
    "district": "Porto",
    "municipality": "Valongo",
    "parish": "Valongo",
    "locationFull": "Valongo, Porto",
    "latitude": 41.1928715,
    "longitude": -8.4945084,
    "description": "O empreendimento “Valongo Premium”, na bonita cidade de Valongo, ...",
    "features": [],
    "featuresByGroup": {},
    "imageUrl": "https://predimed-media.crm360.pt/imovs/wlrm5q/foto_marca_agua/cwviiafnhs5nnx5sc3byg.jpg",
    "imageCount": 12,
    "agentName": "Oscar Mendes",
    "agentEmail": "oscar.mendes@predimed.pt",
    "agentPhone": "913609904",
    "agentProfileUrl": "https://www.predimed.pt/oscar.mendes",
    "agencyName": "PREDIMED PRIME",
    "isFeatured": true,
    "isExclusive": false,
    "isPriceReduced": false,
    "listedAt": "2026-11-06T12:18:32.000000Z",
    "updatedAt": "2026-11-06T12:19:11.000000Z",
    "detailsScraped": true,
    "scrapedAt": "2026-11-08T03:39:41.066Z"
}
```

### Cost estimate

You pay per result: **$0.002 per listing** plus **$0.005 per run start** on the free plan, less on higher Apify plans. 1,000 listings cost about $2. The full catalogue of about 8,500 listings costs about $17.

A full-catalogue run of 8,482 listings takes about 55 minutes, because predimed.pt answers in 2 to 4 seconds per page. A run of 100 listings takes about a minute.

A run's usage cost only settles after the run reports SUCCEEDED. Reading the cost of a run that is still going shows a number far below the final one.

### Limitations

- Predimed does not publish a price for sold, reserved and rented properties, or when the listing says "Sob consulta". `price` is `null` there.
- Coordinates are the listing's map pin. The site draws a circle of about 1 km around it, so treat them as approximate. About 4% of listings have no pin.
- Features, floor and construction year are only present when the agency filled them in (roughly half the listings have features).
- The site does not publish street addresses, postal codes, floor plans or condominium fees.
- The counter on the predimed.pt search page shows 500 more listings than its own pages contain. This actor reports the real number.
- Data is scraped from the public website and may change without notice.

### Related Scrapers

- [RE/MAX Portugal Scraper](https://apify.com/studio-amba/remax-pt-scraper)
- [Imovirtual Scraper](https://apify.com/studio-amba/imovirtual-scraper)
- [Idealista Scraper](https://apify.com/studio-amba/idealista-scraper)
- [Supercasa Scraper](https://apify.com/studio-amba/supercasa-scraper)
- [Casa Sapo Portugal Scraper](https://apify.com/studio-amba/casa-sapo-pt-scraper)

### Maintained by Studio Amba

We run 700+ scrapers for European websites, and the priority is keeping
every one of them working. Automated runs test this actor against the live
site and verify the output is complete. When the website changes, the
scraper usually gets repaired the same day, without you having to report
anything. Questions and issues go straight to the people who built it, and
most get an answer the same day.

If this actor works for you, a review on its Store page helps other people
find it.

# Actor input Schema

## `transactionType` (type: `string`):

Sale (comprar), rent (arrendar) or both.

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

A Portuguese district (distrito), municipality (concelho) or parish (freguesia), e.g. "Lisboa", "Sintra", "Cedofeita". Accents are optional. Leave empty for all of Portugal. A name the site does not know fails the run with examples, it never silently widens to the whole country.

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

Only these property types. Leave empty for all types. These are the site's own categories (Apartamentos, Moradias, Terrenos, ...).

## `typologies` (type: `array`):

Only these typologies (number of bedrooms). Leave empty for all.

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

Minimum asking price, or minimum monthly rent for rentals.

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

Maximum asking price, or maximum monthly rent for rentals.

## `minArea` (type: `integer`):

Minimum area in square metres.

## `availability` (type: `string`):

Predimed keeps sold, reserved and rented properties in its catalogue. Default "available" returns only listings that are still on the market. Choose "all" for the complete catalogue, as the site lists it.

## `sortBy` (type: `string`):

Order of the results. With a low max items this decides which listings you get.

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

Maximum number of listings to return. Hard cap 20,000 (the full Predimed catalogue is about 8,500 including sold listings).

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

ON by default and load-bearing: the description, district, municipality, coordinates, gross and land areas, construction year, condition, features, all photos and the agent come from each listing page. Turn it OFF only for a fast price/status check: rows then carry only the list data (price, typology, useful area, parish, status, one photo, dates).

## `maxConcurrency` (type: `integer`):

Listing pages fetched in parallel.

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

predimed.pt has no anti-bot protection (see recon), so Apify's automatic proxy is enough. Residential is not needed.

## Actor input object example

```json
{
  "transactionType": "sale",
  "location": "Porto",
  "availability": "available",
  "sortBy": "newest",
  "maxItems": 20,
  "includeDetails": true,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "transactionType": "sale",
    "location": "Porto",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/predimed-pt-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 = {
    "transactionType": "sale",
    "location": "Porto",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/predimed-pt-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 '{
  "transactionType": "sale",
  "location": "Porto",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/predimed-pt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/predimed-pt-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/qD0zzCOKJ3BUSlS92/builds/qWImcdT4j1rj7i6sg/openapi.json
