Imovirtual Scraper avatar

Imovirtual Scraper

Pricing

from $2.50 / 1,000 results

Go to Apify Store
Imovirtual Scraper

Imovirtual Scraper

[💰 $2.50 / 1K] Extract property listings from Imovirtual, Portugal's leading real-estate portal. Search by location, buy/rent, property type, price, area and rooms — or paste search URLs — to get prices, areas, locations, photos and agency contacts.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

SolidCode

SolidCode

Maintained by Community

Actor stats

0

Bookmarked

15

Total users

3

Monthly active users

10 days ago

Last modified

Share

Pull property listings from Imovirtual — Portugal's leading real-estate portal — at scale: prices in euros, living area in m², T0–T5+ bedroom counts, full photo galleries, agency details, city and district, and new-development flags for every for-sale and for-rent listing across the country. Built for Portugal property investors, estate agents, relocation services, and proptech analysts who need a clean, structured Imovirtual dataset without hand-copying listings from the portal one page at a time.

Why This Scraper?

  • Two ways to search — no URL building required — fill in a guided builder (location, buy/rent, type, price, area, bedrooms) or paste Imovirtual search URLs straight from your browser. Most competing tools accept URLs only.
  • Every Portuguese place name resolves — all 18 districts, 11 island regions and 308 councils, plus regions ("Algarve", "Alentejo"), English names ("Lisbon") and resort towns ("Vilamoura", "Estoril"). Multi-district regions are pulled in a single pass, and a name we can't place stops the run with a plain explanation instead of handing you an empty file.
  • Nine property categories — apartments, houses, land, commercial spaces, garages, rooms, warehouses, new developments, or "any type" — each mapped to Imovirtual's own Portuguese categories (Apartamento, Moradia, Terreno, Empreendimento…).
  • Buy and rent in one actor — flip a single dropdown between Comprar (for sale) and Arrendar (for rent); rent rows carry the monthly euro price in the same field.
  • Server-side price, area, and bedroom filters — set min/max price (€), min/max living area (m²), and multi-select T0–T5+ bedroom counts; filters run on Imovirtual itself, so you only collect — and only pay for — listings that match.
  • Room counts that admit what they don't know — Imovirtual buckets everything above nine rooms into a single open "10 or more", with no exact figure behind it. Those rows are marked roomsAreMinimum: true and labelled "9+" instead of being rounded into a precise-looking 9, so a 14-unit building never lands in your dataset posing as a 9-bedroom home.
  • Thousands of listings per search, each one billed once — pagination walks every results page, and the sponsored copy Imovirtual re-displays at the foot of every page is matched back to its original and dropped. You are never charged twice for the same property.
  • One flat row per listing, with its fill rate published — title, total price, price per m², living area, bedrooms, total rooms, city, region, agency, photo URLs and three separate dates. Every output table below states how often each field actually arrives, and empty keys are dropped rather than padded with blanks — so a missing floor number means the seller never published one, not that we lost it.
  • Agency vs. private-owner intelligence — every row flags whether it came from an agency (with agency name and type) or a private seller, plus promoted and exclusive-offer markers.
  • New-development detection — empreendimento (new-construction) projects are flagged with isDevelopment and a development name, so you can separate off-plan inventory from resale stock.
  • Three separate dates, each one honestdateCreated is the day the listing first went live, lastRefreshedAt is the last re-activation, and pushedUpAt is the last paid bump. A 15-month-old ad re-bumped this morning shows all three, so "newest listing" means what you think it means.
  • Clean, analysis-ready output — euro prices as numbers, ISO-8601 UTC timestamps, null fields stripped, and consistent camelCase field names.

Use Cases

Real-Estate Investment & Acquisition

  • Compare asking prices and price-per-m² across Lisboa, Porto, and the Algarve
  • Surface new-development (empreendimento) projects for off-plan opportunities
  • Benchmark sale vs. rent yields by collecting both transaction types for one area
  • Size up building plots by area, with a minimum-m² filter applied at the source

Lead Generation for Agents

  • Build prospect lists of private-owner listings ripe for an agency mandate
  • Map competing agencies by name and type across a target district
  • Monitor exclusive and promoted listings to gauge competitor activity
  • Feed fresh listing inventory straight into your CRM

Market & Price Analysis

  • Track median price-per-m² movements by city and property type over time
  • Measure inventory volume by district, bedroom count, or price band
  • Compare apartment vs. house vs. land pricing across Portuguese regions
  • Build price-band histograms from min/max-filtered searches

Relocation & Property Services

  • Assemble shortlists filtered by location, budget, and T-typology bedroom count
  • Generate area-by-area rental availability reports for incoming clients
  • Pull listing photos, city and district for relocation briefing packs

Proptech & Data Products

  • Power a Portuguese property portal, valuation model, or comparison tool
  • Refresh an existing listings database with current prices and bump dates
  • Build alerting on new listings within a price and area window

Getting Started

Search by Location

The simplest run — just name a district, council or region:

{
"location": "Lisboa",
"maxResults": 100
}

Apartments for sale in Porto, priced €200k–€350k, with one or two bedrooms (T1 or T2):

{
"transaction": "buy",
"propertyType": "apartment",
"location": "Porto",
"priceMin": 200000,
"priceMax": 350000,
"rooms": ["1", "2"],
"maxResults": 300
}

Rent Search with a Price Band

Properties to rent in Lisboa up to €1,500/month:

{
"transaction": "rent",
"propertyType": "apartment",
"location": "Lisboa",
"priceMax": 1500,
"areaMin": 60,
"maxResults": 200
}

Paste Imovirtual Search URLs

Already filtered on the site? Copy the URL from your browser — its baked-in filters are used exactly as-is, and the guided fields are ignored:

{
"startUrls": [
"https://www.imovirtual.com/pt/resultados/comprar/moradia/faro",
"https://www.imovirtual.com/pt/resultados/arrendar/apartamento/lisboa"
],
"maxResults": 500
}

Input Reference

What to Scrape

ParameterTypeDefaultDescription
startUrlsstring[][]Paste one or more Imovirtual search-results URLs. The fastest way to get exactly what you see on the site. When provided, the guided "Build a Search" fields below are ignored. Up to 50 URLs.

Used only when no startUrls are provided.

ParameterTypeDefaultDescription
transactionselectbuyFor Sale (Comprar) or For Rent (Arrendar).
locationstringLisboaDistrict ("Lisboa", "Porto", "Faro"), council ("Cascais", or "Lisboa/Cascais" to disambiguate), region ("Algarve", "Alentejo", "Madeira", "Açores"), or "Portugal" for nationwide. Accents and English names accepted. An unrecognised place stops the run with an explanation rather than returning nothing.
propertyTypeselectapartmentApartment, House, Land, Commercial space, Garage, Room, Warehouse, New development, or Any type.

Filters

Applied to the Imovirtual search itself, so you only collect matching listings.

ParameterTypeDefaultDescription
priceMinintegernullMinimum price in € — monthly rent when renting, total price when buying.
priceMaxintegernullMaximum price in €.
areaMinintegernullMinimum living area in m².
areaMaxintegernullMaximum living area in m².
roomsstring[][]Bedroom counts in Portuguese T-typology — T0 (studio) through T5+. "3" means T3, i.e. 3 bedrooms, and comes back as bedrooms: 3 on every row. Multi-select; combined with OR.

Limits

ParameterTypeDefaultDescription
maxResultsinteger100Maximum listings per search or URL. Results come in full pages, so the last page may overshoot by a few rows. Set to 0 for no cap (an internal safety limit of 50,000 then applies).

Output

Each listing becomes one flat row. Here is a real result, collected from a Lisboa apartment search (image tokens shortened for readability):

{
"id": "19165860",
"title": "Apartamento T2 Remodelado por Arquiteto | Vista Rio Tejo | Avenida",
"url": "https://www.imovirtual.com/pt/ad/apartamento-t2-remodelado-por-arquiteto-vista-rio-tejo-avenida-ID1ipUM",
"slug": "apartamento-t2-remodelado-por-arquiteto-vista-rio-tejo-avenida-ID1ipUM",
"transaction": "buy",
"propertyType": "apartment",
"estate": "FLAT",
"totalPrice": 675000,
"currency": "EUR",
"pricePerSqm": 5869.57,
"area": 115,
"bedrooms": 2,
"bedroomsLabel": "2",
"totalRooms": 3,
"roomsAreMinimum": false,
"floor": 2,
"address": "Corredor da Torrinha",
"city": "Estrela",
"region": "Lisboa",
"images": [
"https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6ImMya2Z5bm9i.../image;s=1280x1024;q=80",
"https://ireland.apollo.olxcdn.com/v1/files/eyJmbiI6InpqcW9pamRo.../image;s=1280x1024;q=80"
],
"agencyName": "Group HBC",
"agencyType": "AGENCY",
"isPrivateOwner": false,
"isPromoted": false,
"isExclusive": false,
"isDevelopment": false,
"shortDescription": "Descubra este magnifico apartamento T2, totalmente remodelado e cuidadosamente projetado pelo Arquiteto Ricardo Rosa...",
"dateCreated": "2026-05-29T14:12:58Z",
"lastRefreshedAt": "2026-08-27T14:35:27Z",
"pushedUpAt": "2026-08-27T14:35:28Z",
"searchQuery": "buy/apartment/Lisboa",
"scrapedAt": "2026-08-27T15:41:05Z"
}

This row shows the three dates doing their job: the ad first went live on 29 May and was re-listed and bumped on 27 August. It also shows the bedroom mapping — the title says T2, so bedrooms is 2 and totalRooms is 3 (Imovirtual counts the living room too), and roomsAreMinimum is false because that count is exact. Imovirtual files its largest properties under a single open bracket, "10 rooms or more", and publishes no figure beyond it. Those listings come back with roomsAreMinimum: true and a bedroomsLabel of "9+", so a whole building never poses as a precise 9-bedroom home. They are about 1% of a typical mixed run and 4% of a big-city apartment search.

About the availability column. Imovirtual publishes some details only for the property types that have them, and some only when the seller filled them in. The tables below give the share of rows carrying each field, measured over a 2,557-listing audit across eight different searches (apartments, houses, land, and rooms, for sale and to rent). Fields that are empty are removed from the row entirely.

Core Fields

FieldTypeAvailabilityDescription
idstring100%Imovirtual listing identifier
titlestring100%Listing title
urlstring100%Canonical listing URL (/pt/ad/<slug>-ID<token>)
slugstring100%URL slug, ending in the ad's public token
transactionstring100%buy or rent
propertyTypestring100%Normalized type: apartment, house, land, commercial, garage, room, warehouse, development
estatestring100%Imovirtual's raw estate category (e.g. FLAT, HOUSE, TERRAIN, ROOM)
shortDescriptionstring100%Short listing description

Price & Specs

FieldTypeAvailabilityDescription
totalPricenumber98%Total price in € — sale price, or monthly rent for rent listings. Absent on "price on request" ads
currencystring98%Price currency (EUR) — present whenever totalPrice is
pricePerSqmnumber98%Price per m² in €
areanumber99.7%Living area in m². For land listings this is the plot size
terrainAreanumberhouses 77–86%, otherwise absentPlot / terrain area in m². Imovirtual publishes it for houses and villas; apartments, land and rooms don't carry it
bedroomsnumber99% on flats & houses, absent on land and roomsBedrooms — the Portuguese T-number (a T3 gives 3). Matches the rooms values you filtered on. 0 for a studio. Land and room listings have no T-typology
bedroomsLabelstringsame as bedroomsThe bedroom count as Imovirtual states it: "3" when the figure is exact, "9+" when the listing sits in Imovirtual's open "10 rooms or more" bracket. The column to read when you want the count at a glance
totalRoomsnumbersame as bedroomsImovirtual's own room count, which includes the living room and is one higher than bedrooms (a T3 gives 4)
roomsAreMinimumbooleansame as bedroomstrue on the ~1% of listings (4% of big-city apartment searches) that Imovirtual files under "10 rooms or more" — mostly whole buildings and investment lots. On those rows bedrooms and totalRooms are floors, not exact counts. false everywhere else
floornumber/stringapartments 63–70%, otherwise absentFloor (number, or cellar / attic). Imovirtual only publishes a floor for flats, and only when the seller entered one

Location & Media

FieldTypeAvailabilityDescription
addressstring~47%Street name, when the seller chose to publish one. Roughly half of Portuguese ads deliberately withhold the exact street
citystring100%City or parish
regionstring100%District / province
imagesstring[]100%Listing photo URLs at the largest available resolution

Listing Source & Flags

FieldTypeAvailabilityDescription
agencyNamestring89%Listing agency name. Absent for private sellers (use isPrivateOwner to tell them apart) and for the few agency ads with no agency record
agencyTypestring89%Agency type — present whenever agencyName is
isPrivateOwnerboolean100%True when posted by a private owner rather than an agency
isPromotedboolean100%Promoted / featured listing
isExclusiveboolean100%Exclusive-offer listing
isDevelopmentboolean100%New-construction / development project
developmentTitlestring~2%Development name — only on the small share of rows that are part of a named new-build project

Dates & Provenance

FieldTypeAvailabilityDescription
dateCreatedstring100%The day the listing first went live, never moved by a re-list (ISO 8601, UTC)
lastRefreshedAtstring100%The last time the listing was re-activated or refreshed (ISO 8601, UTC)
pushedUpAtstring~48%The last time the seller paid to push the listing back up the results (ISO 8601, UTC). Absent on the many listings that were never bumped
searchQuerystring100%The search that produced this row, as transaction/propertyType/location
scrapedAtstring100%ISO-8601 timestamp of data collection

Empty fields are removed from each row, so a listing without a development name, a floor or a street address simply omits those keys rather than carrying a blank. Check for a key's presence rather than for an empty string.

Tips for Best Results

  • Start small, then scale. Set maxResults to 50–100 on your first run to confirm the data fits your needs, then raise it — or set it to 0 to pull an entire search. A small first run is also the quickest way to see which optional fields your segment actually carries: floor numbers show up on flats, plot sizes on houses, and street addresses on roughly half of all ads.
  • Type the location however you say it. Districts ("Porto"), councils ("Cascais", "Albufeira"), regions ("Algarve", "Alentejo", "Madeira"), English names ("Lisbon") and resort towns ("Vilamoura", "Estoril") all resolve, accents optional. A region is searched across every district it covers, so "Alentejo" pulls Beja, Évora and Portalegre in one pass. Type "Lisboa/Cascais" when a council name exists in two districts.
  • Filter on bedrooms, not totalRooms. Portuguese listings are advertised in the "T" system, where T3 means three bedrooms. That is the number the rooms filter takes and the number bedrooms returns, so a T3 search gives you bedrooms: 3. totalRooms is Imovirtual's own count and adds the living room, so the same listing reads 4 there — use it for total-space comparisons, never as a bedroom filter. One caveat at the top of the scale: Imovirtual stops counting at "10 rooms or more", so rows carrying roomsAreMinimum: true hold a floor rather than an exact figure. They still match a bedrooms >= 5 filter, as they should, but drop them before you calculate a price per bedroom — most are whole buildings.
  • Sort on dateCreated, not on the refresh date. Portuguese sellers re-list aggressively, so a large share of any results page was re-activated today. dateCreated is the only one of the three dates that stays put, so build "listed in the last 7 days" alerts on it and use lastRefreshedAt when you want to spot sellers actively working an ad.
  • Rent prices live in totalPrice. For rent searches, the monthly euro amount is in totalPrice — there's no separate rent field to read.
  • Filter at the source to control cost. Price, area, and bedroom filters narrow the search on Imovirtual itself, so tighter filters mean fewer rows collected and a cheaper run.
  • Paste the results page, not a single listing. Any filter you can set on the site — including ones not exposed in the guided builder — carries through when you paste the search URL, and the URL's filters win over the guided fields. Use the address of a page that lists many properties (.../pt/resultados/...); the address of one individual property has nothing to page through and returns no rows.
  • Separate new builds from resale. Filter on isDevelopment downstream (or set propertyType to "New development") to isolate off-plan empreendimento inventory.

Pricing

From $2.50 per 1,000 results — below the typical market rate for Imovirtual extraction, with the guided search builder included at no extra charge.

Apify's loyalty tiers each earn a lower per-result rate, and Gold subscribers pay the headline price:

ResultsNo discountBronzeSilverGold
100$0.30$0.28$0.27$0.25
1,000$3.00$2.80$2.65$2.50
10,000$30.00$28.00$26.50$25.00
100,000$300.00$280.00$265.00$250.00

These tiered rates take effect on 11 September 2026. Until that date every plan pays $2.50 per 1,000 results.

A "result" is any listing row in the output dataset. No compute charges — you only pay per result returned. Standard Apify platform fees depend on your plan.

Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

  • Zapier / Make / n8n — Workflow automation
  • Google Sheets — Direct spreadsheet export
  • Slack / Email — Notifications on new results
  • Webhooks — Trigger custom APIs on run completion
  • Apify API — Full programmatic access

This actor is designed for legitimate real-estate research, market analysis, and lead generation. You are responsible for complying with applicable laws and Imovirtual's Terms of Service, including any rules on the reuse of listing content and personal data. Do not use collected data for spam, harassment, or any unlawful purpose, and respect data-protection regulations when handling agency or owner contact information.