Imovirtual Scraper
Pricing
from $2.39 / 1,000 listings
Imovirtual Scraper
Scrape Imovirtual.com property listings in Portugal from any search URL: price, price per m², area, rooms, floor, district, city, parish, agency and photos. Filter by price, area and private owner. Export JSON, CSV or Excel.
Pricing
from $2.39 / 1,000 listings
Rating
0.0
(0)
Developer
ParseBird
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Imovirtual Scraper
Imovirtual Scraper collects property listings from Imovirtual.com, one of Portugal's main real estate portals. Paste any Imovirtual search URL and get every matching apartment, house, plot of land or room for sale or rent as structured data, with no account and no API key.
| Paste a search URL from imovirtual.com, set an optional price range, area range or private-owner filter, and get price, price per m², area, rooms, floor, district, city, parish, street, agency and photos for every listing. Turn on listing details to add the full description, map coordinates, energy certificate, bathrooms and the advertiser's phone number. |
Copy to your AI assistant
Copy this block into ChatGPT, Claude, Cursor or any other LLM to start using this Actor.
Use the Apify Actor "parsebird/imovirtual-scraper" (Imovirtual Scraper) to get Portuguese property listings from imovirtual.com. Call it with the apify-client package: Python `ApifyClient("<APIFY_TOKEN>").actor("parsebird/imovirtual-scraper").call(run_input={...})`, or JavaScript `new ApifyClient({ token }).actor('parsebird/imovirtual-scraper').call({...})`, then read items from the run's default dataset. Inputs: startUrls (required, array of imovirtual.com search result URLs such as "https://www.imovirtual.com/pt/resultados/comprar/apartamento/lisboa/lisboa" or "https://www.imovirtual.com/pt/resultados/arrendar/moradia/porto"; filters already in the URL are kept; single listing URLs /pt/anuncio/... also work), maxItems (int, default 100, unique listings across all URLs), minPrice and maxPrice (int euros, inclusive; monthly rent for rentals), minAreaM2 and maxAreaM2 (int m², inclusive), privateOwnerOnly (bool, default false), includeDetails (bool, default false, opens each listing page), maxRequestRetries (int, default 3), proxyConfiguration (object, default Apify Proxy). Each item has listingId, url, title, estate (FLAT, HOUSE, TERRAIN, ROOM...), transaction (SELL or RENT), price, currency, priceHidden, pricePerSqm, areaM2, terrainAreaM2, rooms (ONE, TWO... MORE), roomsCount, floor, district, city, parish, neighborhood, street, locationName, agencyName, agencyId, agencyUrl, advertiserType, isPrivateOwner, photos (array of URLs), photoCount, dateCreated, createdAtFirst, pushedUpAt, isPromoted, isExclusiveOffer, developmentTitle, developmentUrl, videoUrl, virtualTourUrl, searchUrl, scrapedAt; with includeDetails also description, latitude, longitude, energyCertificate, bathrooms, market, constructionStatus, buildingType, buildingFloors, buildYear, heating, contactName, contactPhones, agencyAddress, referenceId, modifiedAt, attributes. Pricing: pay per listing saved. API docs: https://apify.com/parsebird/imovirtual-scraper/api. Get a token at https://console.apify.com/settings/integrations.
What is Imovirtual Scraper?
Imovirtual Scraper turns Imovirtual search results into clean JSON, CSV or Excel. Run a search on imovirtual.com, copy the URL from the address bar and paste it into the Actor. It returns every listing in that search with its price, price per m², area, rooms, floor, location from district down to street, agency and photos.
It works as an Imovirtual API alternative. Imovirtual doesn't offer a public API for its listings, so this Actor collects the same data the website shows and saves it as a dataset you can download or read through the Apify API.
To try it, open the Input tab and click Start. The prefilled search returns 50 apartments for sale in Lisbon.
What can Imovirtual Scraper do?
- 🔗 Scrape any Imovirtual search URL: apartments, houses, land, rooms and other property types, for sale (
comprar) or for rent (arrendar), in any district, city or parish. Filters you set on the website, such as number of rooms or sort order, stay in place. - 💶 Filter by price and area: set a minimum and maximum price and a minimum and maximum area in m². Both ends are inclusive.
- 👤 Private owners only: keep only listings posted by private owners (particulares), without agencies or developers.
- 📚 Several searches in one run: add as many search URLs as you need. Listings that show up in more than one search are saved once, and Max listings is shared fairly between the searches.
- 🏠 Single listings: paste listing URLs (
/pt/anuncio/...) to scrape specific properties. - 📄 Listing details: turn on Include listing details to add the full description, latitude and longitude, energy certificate, bathrooms, construction status, building type, heating, the advertiser's phone number and the agency's address.
- ⚙️ Built for automation: schedule runs to watch new listings and price changes, call the Actor from the Apify API, connect it to Make, Zapier, n8n, Google Sheets or Slack, and export as JSON, CSV, Excel or HTML.
What data can you extract from Imovirtual?
| Field | Description |
|---|---|
listingId, url, title | Imovirtual listing ID, link to the listing and its title |
estate, transaction | Property type (FLAT, HOUSE, TERRAIN, ROOM and others) and SELL or RENT |
price, currency, priceHidden | Asking price, or monthly rent for rentals, in EUR, and whether the advertiser hides the price |
pricePerSqm | Price per m² as shown by Imovirtual (sale listings) |
areaM2, terrainAreaM2 | Usable area and plot area in m² |
rooms, roomsCount | Imovirtual's room count as a word (ONE, TWO… MORE) and as a number |
floor | Floor (0 for ground floor, 1, 2… 10+) |
district, city, parish, neighborhood | Location levels as Imovirtual names them: distrito, concelho, freguesia and zone |
street, locationName | Street when the advertiser shows it, and the full location text |
agencyName, agencyId, agencyUrl, advertiserType | Agency or advertiser and link to its Imovirtual profile |
isPrivateOwner | true when a private owner posted the listing |
photos, photoCount | Large photo URLs from the search results, and the listing's total number of photos |
dateCreated, createdAtFirst, pushedUpAt | When the listing was created, first published, and last bumped to the top |
isPromoted, isExclusiveOffer | Paid promotion and exclusive offer flags |
developmentTitle, developmentUrl | New-build development the listing belongs to |
videoUrl, virtualTourUrl | Video and 3D tour links |
description, latitude, longitude | Full description and map position (details only) |
energyCertificate, bathrooms, market | Energy rating (a, b, c…), bathrooms, primary or secondary market (details only) |
constructionStatus, buildingType, buildingFloors, buildYear, heating | Building information when the advertiser fills it in (details only) |
contactName, contactPhones, agencyAddress, referenceId | Advertiser contact, phone numbers, agency address and the agency's own reference (details only) |
Fields a listing doesn't have come back as null. Rooms and land have no floor, and many advertisers leave the street, build year or heating empty.
How to scrape Imovirtual
- Go to imovirtual.com and run a search, for example apartments for sale in Lisbon. Add any filters you like on the website.
- Copy the URL from the browser's address bar. It looks like
https://www.imovirtual.com/pt/resultados/comprar/apartamento/lisboa/lisboa. - Open Imovirtual Scraper on Apify Store and click Try for free.
- Paste one or more URLs into Search URLs.
- Optionally set Min price, Max price, Min area, Max area or Private owners only, and turn on Include listing details.
- Set Max listings and click Start. When the run finishes, download the dataset as JSON, CSV, Excel or HTML, or read it from the dataset API.
Input parameters
See the Input tab for details.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
startUrls | array | Yes | Lisbon apartments | Imovirtual search result URLs or listing URLs |
maxItems | integer | No | 100 | Maximum unique listings saved, shared across all URLs |
minPrice | integer | No | — | Minimum price in euros, inclusive. Monthly rent for rentals |
maxPrice | integer | No | — | Maximum price in euros, inclusive |
minAreaM2 | integer | No | — | Minimum area in m², inclusive |
maxAreaM2 | integer | No | — | Maximum area in m², inclusive |
privateOwnerOnly | boolean | No | false | Keep only listings from private owners |
includeDetails | boolean | No | false | Open each listing page for the description, coordinates, energy certificate and phone |
maxRequestRetries | integer | No | 3 | Retries for a failed request |
proxyConfiguration | object | No | Apify Proxy | Proxy settings |
When you set a price or area filter, listings that hide their price or area are left out, because they can't be checked against it.
Example input
Apartments for sale in Lisbon and houses for rent in Porto district, between €150,000 and €400,000, at least 60 m², from private owners only:
{"startUrls": ["https://www.imovirtual.com/pt/resultados/comprar/apartamento/lisboa/lisboa","https://www.imovirtual.com/pt/resultados/arrendar/moradia/porto"],"minPrice": 150000,"maxPrice": 400000,"minAreaM2": 60,"privateOwnerOnly": true,"maxItems": 500}
The filters apply to every URL, so in this example the Porto rentals are filtered to €150,000 to €400,000 per month and few or none will match. Use separate runs when sale and rent searches need different price ranges.
Output example
Each listing is one item. This is a real record from a run with Include listing details turned on (description and photos shortened). The Console shows the results as a table.
{"listingId": 19323245,"url": "https://www.imovirtual.com/pt/anuncio/loja-com-95-m-e-apartamento-t1-com-vista-para-o-rio-douro-ID1j4Rf","title": "Loja com 95 m² e Apartamento T1 com Vista para o Rio Douro","shortDescription": null,"estate": "FLAT","transaction": "SELL","price": 395000,"currency": "EUR","priceHidden": false,"pricePerSqm": 2633.33,"areaM2": 150,"terrainAreaM2": null,"rooms": "TWO","roomsCount": 2,"floor": null,"district": "Porto","city": "Porto","parish": "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória","neighborhood": "Miragaia - Virtudes","street": "Viela Companhia","locationName": "Miragaia - Virtudes, Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória, Porto, Porto","agencyName": "Porto Casas - Imobiliária","agencyId": 2179825,"agencyUrl": "https://www.imovirtual.com/pt/empresas/agencias-imobiliarias/porto-casas-imobiliaria-ID2179825","advertiserType": "business","isPrivateOwner": false,"photos": ["https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6ImsyOHFuNWF1ZHhidS1FQ09TWVNURU0iLCJ3IjpbeyJmbiI6IjY5bmxwYTdlY3FtNzEtQVBUIiwicyI6IjE2IiwiYSI6IjAiLCJwIjoiMTAsLTEwIn1dfQ.GkjQmsEwd6ToZ9S8FEi4ahAoRS2JkD4vuLUfpY_ekR0/image;s=1280x1024;q=80"],"photoCount": 13,"dateCreated": "2026-10-27T10:19:23Z","createdAtFirst": "2026-10-27T10:19:23+00:00","pushedUpAt": null,"isPromoted": false,"isExclusiveOffer": false,"developmentTitle": null,"developmentUrl": null,"videoUrl": null,"virtualTourUrl": null,"searchUrl": "https://www.imovirtual.com/pt/resultados/comprar/apartamento/porto/porto","description": "Dois imóveis, uma localização de excelência e inúmeras possibilidades!\n\nApresentamos esta oportunidade de adquirir, em conjunto, uma loja de comércio ou serviços e um agradável apartamento T1...","latitude": 41.14338,"longitude": -8.62083,"energyCertificate": "b","bathrooms": "1","market": "secondary","constructionStatus": "ready_to_use","buildingType": "block","buildingFloors": null,"buildYear": null,"heating": null,"contactName": "PortoCasas","contactPhones": ["+351221458228"],"agencyAddress": "Avenida Fernão Magalhães 1382, 4000-354, Bonfim, Porto, Porto","referenceId": "APA_1013","modifiedAt": "2026-10-27T10:21:54Z","attributes": {"bathrooms_num": "1","building_type": "block","construction_status": "ready_to_use","energy_certificate": "b","m": "150","market": "secondary","price_per_m": "2633.33","rooms_num": "2"},"scrapedAt": "2026-10-27T10:23:59.990081+00:00"}
Without listing details, the fields from description to attributes are not in the item.
Use Imovirtual Scraper from Python or JavaScript
Install the client with pip install apify-client or npm install apify-client, and get your API token from Apify Console.
Python
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("parsebird/imovirtual-scraper").call(run_input={"startUrls": ["https://www.imovirtual.com/pt/resultados/comprar/apartamento/porto/porto"],"maxPrice": 300000,"minAreaM2": 70,"maxItems": 200,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["price"], item["areaM2"], item["pricePerSqm"], item["parish"], item["url"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('parsebird/imovirtual-scraper').call({startUrls: ['https://www.imovirtual.com/pt/resultados/arrendar/apartamento/lisboa/lisboa'],privateOwnerOnly: true,includeDetails: true,maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach((l) => console.log(l.price, l.city, l.contactPhones, l.url));
Use cases
- Property price research: compare asking prices and price per m² across Portuguese districts, cities and parishes.
- Rental market analysis: track monthly rents for apartments and rooms in Lisbon, Porto or the Algarve.
- Private-owner leads: find listings posted directly by owners, without an agency.
- New listing alerts: schedule a search sorted by newest and get fresh listings in your area every day.
- Agency and competitor monitoring: see which agencies list in a market and what they ask.
- Data for apps, dashboards and models: feed listing data into spreadsheets, BI tools or valuation models.
How it works
- The Actor reads each search URL and adds your price, area and private-owner filters to it.
- It loads the results 72 listings at a time, page after page, until it reaches Max listings or the end of the search.
- It checks each listing against your filters again and leaves out listings that don't match, such as promoted ads Imovirtual mixes into the results.
- Listings that appear in several searches are saved once. If one search runs out of results, its unused share of Max listings goes to the other searches.
- With Include listing details on, it opens each listing page and adds the description, coordinates, building information and contact details.
How much does it cost to scrape Imovirtual?
Imovirtual Scraper uses pay-per-event pricing. You pay for each listing saved to the dataset. Platform usage (compute and proxy) is included in the event price, so it isn't billed separately.
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Listing scraped | $2.99 / 1,000 | $2.79 / 1,000 | $2.59 / 1,000 | $2.39 / 1,000 |
One saved listing is one charge, with or without listing details. At Free plan prices, 100 listings cost about $0.30 and 1,000 listings cost $2.99. To control spending, use Max listings. The run also stops when it reaches the maximum cost per run you set in Apify Console.
Is it legal to scrape Imovirtual?
Imovirtual Scraper only collects listing information that Imovirtual shows publicly to visitors who aren't logged in. It doesn't log in and doesn't access messages or account data. Listings can contain personal data, such as a private owner's name or an advertiser's phone number. If you store or process that data you're responsible for complying with the GDPR and Imovirtual's terms of service. Consult a lawyer if you're unsure. For more background, read Apify's article Is web scraping legal?
Other real estate scrapers from ParseBird
| Actor | What it does |
|---|---|
| Fotocasa Scraper | Property listings from Fotocasa.es in Spain |
| Immobiliare.it Scraper | Property listings from Immobiliare.it in Italy |
| ImmoScout24 Scraper | Property listings from ImmobilienScout24 in Germany |
| Otodom.pl Scraper | Property listings from Otodom.pl in Poland |
| Funda.nl Scraper | Houses and apartments from Funda.nl in the Netherlands |
FAQ
Do I need an Imovirtual account or API key? No. The Actor reads the same public listings the website shows to logged-out visitors.
Which URLs can I use?
Search result URLs that start with https://www.imovirtual.com/pt/resultados/, and listing URLs that start with https://www.imovirtual.com/pt/anuncio/. Older URLs such as https://www.imovirtual.com/comprar/apartamento/lisboa/ are followed to their new address. Agency profile pages aren't supported.
Why did my URL return nothing?
Imovirtual didn't recognise the location in the URL, and the run log says so. Location names must match Imovirtual's, for example faro for the Algarve. Run the search on the website and copy the URL from the address bar.
Why does rooms not match the T number in the title?
rooms is Imovirtual's own room count, which advertisers fill in separately from the title. A T2 apartment is often listed with three rooms, because the living room counts too.
Are the price and area filters exact? Yes. Imovirtual applies them to the search, and the Actor checks every listing again, so you only get listings inside your range, ends included.
How many listings can I get from one search? All of them. The Actor pages through the whole search, including searches with tens of thousands of results.
Do I need a proxy? The Actor uses Apify Proxy by default. If Imovirtual refuses requests, it changes IP and moves to residential proxy by itself. Proxy costs are included in the price per listing.
Can I run it on a schedule or connect it to other tools? Yes. Use Apify schedules, call it from the API, or connect it to Make, Zapier, n8n, Google Sheets, Slack or a webhook through integrations.
Something is missing or wrong. What should I do? Open an issue in the Issues tab. We read every report.