Imovirtual Scraper - Portugal Property Listings & Agents avatar

Imovirtual Scraper - Portugal Property Listings & Agents

Pricing

from $2.20 / 1,000 property searches

Go to Apify Store
Imovirtual Scraper - Portugal Property Listings & Agents

Imovirtual Scraper - Portugal Property Listings & Agents

Scrape Imovirtual.com property listings across Portugal with GPS coordinates, energy certificate, build year, agency phone numbers and the full advert text — not just the search-card summary.

Pricing

from $2.20 / 1,000 property searches

Rating

0.0

(0)

Developer

SIÁN OÜ

SIÁN OÜ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Imovirtual Scraper - Portugal Property Listings & Agents 🚀

SIÁN Agency Store Idealista Otodom Fotocasa

🎉 Goes one page deeper than the search card: GPS coordinates, energy certificate, build year and the advertiser's phone on every listing

For valuation teams, buyer's agents and anyone building a Portuguese property dataset that has to hold up


🔎 What is the Imovirtual Portugal Property Scraper — and when should you use it?

The Imovirtual Portugal Property Scraper turns public Imovirtual.com property listings from anywhere in Portugal into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

Use it when you need: Portuguese sale and rental adverts as rows: asking price or monthly rent in euros, price per square metre, floor and plot area, the T0-T4+ typology Portuguese buyers actually search, floor, and location down to district, council, parish and neighbourhood. Every row also names who is advertising, so an export splits agency stock from private owners after the fact. Switch on full details and each row additionally carries map coordinates, the energy certificate, build year, bathroom count, condition, fitted features, the complete photo set, floor plans, the full advert text and the advertiser's phone number.

Use something else when: the property is not in Portugal, or is on Idealista rather than Imovirtual. Use Idealista Scraper for Idealista in both Portugal and Spain, with the same sale-and-rent row shape. Use Otodom Scraper for Poland, on the same portal platform Imovirtual runs on. Use Fotocasa Scraper for Spain, for cross-border price comparison against the Portuguese market. This actor covers what Imovirtual publishes on its own portal: apartments, houses, land, commercial premises, warehouses, garages, rooms and new developments, each for sale or to rent, plus the estate-agency pages behind those adverts. It reads what the portal serves a visitor. Sold prices are not published by Imovirtual at all, and the portal's mortgage simulator, valuation module and editorial pages are not part of it.

🤖 Use with AI agents

Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/imovirtual-property-scraper

Your agent can pay for its own runs. This Actor is eligible for agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

I want property listings, asking prices and agent contacts from Imovirtual.com using the Apify Actor `sian.agency/imovirtual-property-scraper`.
Use it when I need: Portuguese sale and rental adverts as rows: asking price or monthly rent in euros, price per square metre, floor and plot area, the T0-T4+ typology Portuguese buyers actually search, floor, and location down to district, council, parish and neighbourhood. Every row also names who is advertising, so an export splits agency stock from private owners after the fact. Switch on full details and each row additionally carries map coordinates, the energy certificate, build year, bathroom count, condition, fitted features, the complete photo set, floor plans, the full advert text and the advertiser's phone number.
Don't use it when: the property is not in Portugal, or is on Idealista rather than Imovirtual — use smart-idealista-scraper or otodom-property-scraper or fotocasa-property-scraper instead.
How to call it: set `transaction` to `comprar` for sale or `arrendar` to rent, pick a `propertyType` (`apartamento`, `moradia`, `terreno`, `imoveis-comerciais`, `armazens`, `garagem`, `quarto` or `empreendimento`) and give `locations` a list of Imovirtual's own areas — the 18 mainland districts such as `lisboa`, `porto` and `faro`, the 11 Atlantic islands such as `ilha-da-madeira`, or `todo-o-pais` for the whole country. Narrow with `priceMin`, `priceMax`, `areaMin`, `areaMax`, `buildYearMin`, `typology` (T0 to T4+), `market` (new build or resale), `ownerType` (private owners or agencies) and `listedWithinDays`; every one of those goes to Imovirtual's own filter, so anything excluded is never saved and never billed. `sortBy` decides which listings you get when `maxResults` bites before the result set runs out. `fullDetails` opens each advert for its coordinates, certificate, features, photo set and phone, for an extra charge per listing. To expand adverts you already have, set `operation` to `detail` and pass `listingUrls`; for the firm behind a listing, set `operation` to `agency` and pass `agencyUrls`; to reach a parish or a map area the picker does not list, paste its Imovirtual address into `searchUrls`.
Start with this input:
{
"operation": "search",
"transaction": "comprar",
"propertyType": "apartamento",
"locations": [
"lisboa"
],
"typology": [
"T2",
"T3"
],
"priceMax": 400000,
"fullDetails": true,
"maxResults": 100
}
Ask me which part of Portugal to cover, whether they want listings for sale or to rent, and whether the coordinates, energy certificate, full advert text and advertiser phone are worth the extra per-listing charge, then run the Actor and summarise the results as a table.

Things you can ask your agent for:

  • Find T2 apartments for sale in Porto under EUR 300,000 and keep only the ones with an A or B energy certificate.
  • Pull every Lisbon apartment listed by a private owner in the last week, with the advert text and a phone number.
  • Compare median price per square metre for T3 apartments across Lisboa, Porto and Faro.

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/imovirtual-property-scraper.md.

📋 Overview

Imovirtual is where Portugal looks for a home — 1.5 million visits a month, and the Consumer's Choice winner in its category twelve years running. This Actor reads it the way a research team needs it read.

What you get here that a search-card dump does not have:

  • Map coordinates on every expanded row: latitude and longitude, so listings drop straight onto a map or into a spatial join
  • The energy certificate: mandatory on every Portuguese sale, and the fastest read on how much work a property needs
  • 🎯 The advertiser's phone number: the agency switchboard and the named agent, exactly as published on the advert
  • 💰 Mid-market pricing: $2.50 per 1,000 listings, with a deeper row than anything at that price
  • 💎 The agency record: registered address, postal code, switchboard, website, live portfolio split and areas covered
  • Filters that are actually honest: every filter was measured against Imovirtual's own result count and against the rows it returns, and the ones the site does not respect were left out on purpose

✨ Features

  • 🔍 Three modes in one Actor: property search, full property detail, and estate-agency profile
  • 🇵🇹 Full national coverage: 18 mainland districts, all 11 Atlantic islands, or the whole country in one run
  • 🏘️ Every property section: apartments, houses, land, commercial premises, warehouses, garages, rooms and new developments
  • 🤝 Sale and rental: both sides of the market, with the money field read correctly on each
  • 🛏️ Portuguese typology, translated: pick T0 to T4+ the way a buyer would, and the Actor handles the off-by-one in the source data
  • 🔬 One switch for depth: fullDetails expands every search result into a complete record
  • 📄 The full advert text: two thousand characters of description, not a truncated preview
  • 🖼️ The complete photo set: every image the advertiser uploaded, plus floor plans and any video
  • 🔖 The advertiser's own reference: the code an agency's CRM stamps on a property, which is what makes cross-portal deduplication work
  • 📊 Run report included: what came back, what did not, and what it cost

🎬 Quick Start

Pick a deal type, a property type and an area. Press Start. Rows land in your dataset within a minute.

curl -X POST "https://api.apify.com/v2/acts/sian.agency~imovirtual-property-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"operation":"search","transaction":"comprar","propertyType":"apartamento","locations":["lisboa"],"maxResults":100}'

🚀 Getting Started (3 Simple Steps)

Sale or rental, which property type, and which districts or islands. The defaults are Lisbon apartments for sale, so a bare run works.

Step 2: Narrow it, or do not

Price, area, typology, new build against resale, private owners only, build year, how recently it was listed. Each filter is applied by Imovirtual itself, so a narrower run reads fewer pages and costs less.

Step 3: Decide how deep to go

Leave fullDetails off for a fast price-and-area sweep. Turn it on when you need coordinates, the certificate, the features and a phone number.

That's it! In about a minute, you'll have:

  • A flat table of Portuguese listings with prices, areas and locations
  • Export-ready JSON, CSV or Excel
  • A run report showing exactly what came back and what it cost

📥 Input Configuration

FieldTypeRequiredDescription
operationstringNosearch, detail or agency. Defaults to search
transactionstringNocomprar (for sale) or arrendar (to rent)
propertyTypestringNoapartamento, moradia, terreno, imoveis-comerciais, armazens, garagem, quarto, empreendimento
locationsarrayNoImovirtual's own areas — lisboa, porto, faro, ilha-da-madeira … or todo-o-pais
searchUrlsarrayNoPaste result-page addresses to read them exactly as given
listingUrlsarrayNoAdvert addresses for the detail operation
agencyUrlsarrayNoAgency addresses for the agency operation
fullDetailsbooleanNoExpand every search result into a complete record
maxResultsintegerNoHow many listings to keep per area. Default 100
priceMin / priceMaxintegerNoPrice or monthly rent bounds, in euros
areaMin / areaMaxintegerNoFloor area bounds, in m²
typologyarrayNoT0, T1, T2, T3, T4+
marketstringNoany, primary (new build) or secondary (resale)
ownerTypestringNoany, private or agency
buildYearMinintegerNoFour-digit year, oldest acceptable build year
listedWithinDaysstringNoany, 1, 3, 7, 14, 30, 60
sortBystringNodefault, priceAsc, priceDesc, newest

Example — Lisbon T2 and T3 apartments under €400,000, fully expanded:

{
"operation": "search",
"transaction": "comprar",
"propertyType": "apartamento",
"locations": ["lisboa"],
"typology": ["T2", "T3"],
"priceMax": 400000,
"fullDetails": true,
"maxResults": 100
}

Example — expand specific adverts:

{
"operation": "detail",
"listingUrls": [
{ "url": "https://www.imovirtual.com/pt/anuncio/apartamento-t3-para-venda-ID1iQXv" }
]
}

Example — profile an estate agency:

{
"operation": "agency",
"agencyUrls": [
{ "url": "https://www.imovirtual.com/pt/empresas/agencias-imobiliarias/remax-grupo-team-ID4062704" }
]
}

📤 Output

Results are saved to the Apify dataset with 50+ fields. The Output tab carries one view per operation, so nothing renders as an empty column.

FieldTypeDescription
titleTextstringThe advert headline
urlstringThe listing address on Imovirtual
pricenumberAsking price on a sale, monthly rent on a rental
pricePerSqmnumberPrice per square metre, as Imovirtual computes it
areaSqmnumberFloor area in m²
plotAreaSqmnumberPlot area, on houses (a plot listing puts its size in areaSqm)
typologystringT0T4+
district / council / parish / neighbourhoodstringFour levels of location
latitude / longitudenumberMap coordinates (expanded rows)
energyCertificatestringA+F, or EXEMPT (expanded rows)
buildYearintegerYear built (expanded rows)
bathroomsintegerBathroom count (expanded rows)
extras / equipmentarrayLift, garage, terrace, balcony, fitted appliances (expanded rows)
contactPhone / agencyPhonestringThe numbers the advertiser publishes (expanded rows)
descriptionTextstringThe full advert text (expanded rows)
imageUrls / floorPlanUrlsarrayEvery photo and floor plan (expanded rows)
referenceIdstringThe advertiser's own CRM reference (expanded rows)
agencyName / agencyUrlstringThe estate agency behind the listing
activeAds / saleAds / rentAdsintegerPortfolio size (agency rows)

Example row (expanded):

{
"operation": "search",
"listingId": 19269818,
"titleText": "Apartamento T3 para venda",
"url": "https://www.imovirtual.com/pt/anuncio/apartamento-t3-para-venda-ID1iQXv",
"transaction": "sale",
"propertyType": "Apartment",
"price": 1600000,
"currency": "EUR",
"pricePerSqm": 8695.65,
"areaSqm": 184,
"typology": "T3",
"rooms": 4,
"floor": "Third",
"district": "Lisboa",
"council": "Oeiras",
"parish": "Oeiras e S. Julião da Barra, Paço de Arcos e Caxias",
"latitude": 38.699932,
"longitude": -9.295546,
"energyCertificate": "A",
"buildYear": 2020,
"bathrooms": 3,
"buildingType": "Block",
"constructionStatus": "Ready to use",
"extras": ["Lift", "Garage"],
"advertiserType": "agency",
"agencyName": "Remax Grupo Team",
"agencyPhone": "+351214152440",
"contactName": "Collection Team",
"contactPhone": "+351923232045",
"referenceId": "126801067-113",
"mediaCount": 45,
"listedAt": "2026-09-08T19:10:10Z"
}

💼 Use Cases & Examples

1. Portugal price index and valuation models

Analysts building a hedonic model need attributes, not headlines.

Input: one district, weekly, fullDetails: true Output: price, price per m², area, typology, build year, energy certificate and exact coordinates on every row Use: a panel that supports a real regression instead of a scatter plot of asking prices

2. Direct-to-owner acquisition

Buyer's agents and investors want the stock with no agent in the middle.

Input: ownerType: "private", listedWithinDays: "7" Output: the roughly 1% of listings placed by owners — 153 of 16,474 Lisbon apartments on the day this was measured Use: a short, high-intent outreach list refreshed every week

3. Estate-agency lead lists

Anyone selling software, photography or portal services to Portuguese agencies.

Input: operation: "agency" with agency links harvested from a search run Output: registered address, postal code, switchboard, website, live portfolio split between sale and rental, areas covered, years on the portal Use: a qualified prospect record with the firm's size already attached

4. New-listing alerts on a schedule

Relocation consultants and buying agents who need to be first.

Input: listedWithinDays: "1", run daily on a schedule Output: only what appeared since yesterday Use: a watchlist that stays small and never repeats itself

5. Cross-portal deduplication

Aggregators reconciling the same home across three sites.

Input: fullDetails: true Output: referenceId, the code the agency's own CRM stamps on the property Use: three duplicate records collapse to one, and the count you report is the count that exists

6. Golden-visa and relocation research

Advisers comparing what a budget actually buys across the country.

Input: locations: ["todo-o-pais"] or the Algarve and Madeira alone Output: every district and island with energy certificate and build year attached Use: a like-for-like comparison across 29 areas instead of the three everyone writes about

7. Rental market monitoring

Councils, researchers and build-to-rent operators tracking asking rents.

Input: transaction: "arrendar", monthly, one district per run Output: monthly rents with area, typology and parish Use: a rent index at parish resolution rather than city averages


🔗 Integration Examples

JavaScript/Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('sian.agency/imovirtual-property-scraper').call({
operation: 'search',
transaction: 'comprar',
propertyType: 'apartamento',
locations: ['lisboa'],
typology: ['T2', 'T3'],
priceMax: 400000,
fullDetails: true,
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('sian.agency/imovirtual-property-scraper').call(run_input={
'operation': 'search',
'transaction': 'arrendar',
'propertyType': 'apartamento',
'locations': ['porto'],
'priceMax': 1200,
'maxResults': 200,
})
for item in client.dataset(run['defaultDatasetId']).iterate_items():
print(item['titleText'], item['price'], item['parish'])

cURL

curl -X POST 'https://api.apify.com/v2/acts/sian.agency~imovirtual-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"agency","agencyUrls":[{"url":"https://www.imovirtual.com/pt/empresas/agencias-imobiliarias/remax-grupo-team-ID4062704"}]}'

Automation Workflows (N8N / Zapier / Make)

  1. Trigger: a daily schedule
  2. HTTP Request: run the Actor with listedWithinDays: "1"
  3. Process: filter the returned rows on your own criteria
  4. Action: append to a sheet, write to a database, or send the shortlist to Slack

📊 Performance & Pricing

FREE Tier (Try It Now)

  • 25 rows per run — every field, every operation, same quality
  • No credit card required
  • Enough to see the data shape before you commit
  • Unlimited rows per run
  • Pay per successful row. A search that matched nothing, an advert Imovirtual has withdrawn, and any link that could not be read all cost nothing
  • One result page returns up to 70 listings, so a broad sweep is cheap

💰 $2.50 per 1,000 listings — mid-market for Imovirtual on the Apify Store, with coordinates, certificate, phone and full advert text that the others do not return.

🔗 View current pricing


❓ Frequently Asked Questions

Q: Does this cover rentals as well as sales? A: Yes, and both were tested separately. Imovirtual serves them from different result pages, and on a rental the price column carries the monthly rent.

Q: What does fullDetails actually add? A: Map coordinates, energy certificate, build year, bathroom count, condition, building type, fitted features and equipment, the advertiser's phone number, the complete photo set, floor plans, any video, and the full advert text. It is one extra page read per listing, billed as a Property Detail on top of the listing.

Q: Can I search a specific parish or neighbourhood? A: Yes. Build the search on Imovirtual, copy the address from your browser bar and paste it into Search URLs. It is read exactly as given.

Q: Why is there no balcony, pool or air-conditioning filter? A: Because they do not work. Imovirtual accepts them and the result count moves, but the rows it returns do not honour them — a garage-filtered page returned an advert whose own listing shows no garage. Those features still come back on every expanded row, so filter them yourself and the answer will be right.

Q: What is T0, T1, T2? A: Portugal's bedroom typology. T0 is a studio, T1 has one bedroom, and so on. Imovirtual stores a room count that runs one ahead of the T number. This Actor converts it and puts both values on every row.

Q: Do I need a proxy or a login? A: No. Every page it reads is public, and nothing here needs an account, a key or a browser.

Q: How many listings can I get? A: maxResults applies per area, and you can pass several areas in one run. Imovirtual itself publishes tens of thousands per section — 73,940 apartments for sale nationwide when this was written.

Q: What output formats are available? A: JSON, CSV, Excel and XML, straight from the Apify dataset or over the API.


🐛 Troubleshooting

A run returns no rows

  • The combination may genuinely have no matches. Rooms are rental-only and new developments are sale-only, and the run stops at validation on those.
  • Clear a filter or two and widen the area. The run log prints Imovirtual's own result count before it reads anything.

An area is rejected

  • Use one of Imovirtual's own 29 areas. The islands are named individually (ilha-da-madeira, ilha-de-sao-miguel), never by archipelago.

A pasted URL is skipped

  • Search URLs must be /pt/resultados/… addresses, advert URLs /pt/anuncio/…, agency URLs /pt/empresas/…. Copy them from the browser bar rather than retyping.

Fewer rows than maxResults

  • Imovirtual ran out of matches, or the FREE tier row cap stopped the run at 25. The run log says which.

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the legality of web scraping.

Imovirtual is a trademark of Grupa OLX sp. z o.o. This Actor is not affiliated with, endorsed by, or sponsored by Imovirtual or Grupa OLX.


🤝 Support

Join our active support community


Built by SIÁN Agency | More Tools