Imobiliare.ro Scraper — Romania Real Estate & Agencies
No login. No CAPTCHA solving. Private sellers redacted by default.
Extracts property listings for sale and rent, and the agencies and developers behind them, from Imobiliare.ro anywhere in Romania. Since imobiliare.ro put bot protection in front of its searches in October 2026, every run opens a real browser session through residential IPs and then reads the results inside it; it never solves a CAPTCHA.
oswaldocarabano/imobiliare-ro-scraper
{
"offerType": "rent",
"propertyType": "apartments",
"location": "judetul-cluj/cluj-napoca",
"sort": "latest",
"maxItems": 60,
"includeDetails": false
}- Version
- v0.2.7
- Memory
- 4096 MB
- Browser
- yes
- Proxy
- Residential, built in, exiting outside Romania
Short answer
The Imobiliare.ro Scraper extracts Romanian property listings from imobiliare.ro without a login: EUR price with its period, usable and total surface, rooms, floor, year built, the full description, photos, GPS coordinates from the portal map and the advertiser, with a median of 66 filled fields per row measured on 480 listings across 14 searches. Pricing is $0.0012 per listing, $0.0025 per optional listing page and $0.0012 per agency, plus a start fee of $0.005 per GB of memory — $0.02 per run at the default 4 GB.
Key points
- The Imobiliare.ro Scraper delivered a median of 66 filled fields per listing row on 480 listings across 14 searches, measured on 23 September 2026.
- Imobiliare.ro put DataDome bot protection in front of every search and listing page in October 2026, so each run now opens a real browser session through residential IPs exiting outside Romania.
- Private persons were 81 of 480 advertisers (16.9%), and the Imobiliare.ro Scraper hides their name, account and any phone or e-mail written in the description by default.
- Imobiliare.ro pages through at most 9,990 results per search, so the Actor continues by sub-location above that; Bucharest apartments for sale alone held about 26,000 listings.
- An unknown location makes imobiliare.ro silently return the whole country, and the Actor turns that into an uncharged error row instead of wrong data.
- GPS coordinates come from one extra map request per search: 60 of 60 rows on a Cluj-Napoca search, 74 of 100 on a Bucharest search with more than 10,000 results.
What it does
Extracts property listings for sale and rent, and the agencies and developers behind them, from Imobiliare.ro anywhere in Romania. Since imobiliare.ro put bot protection in front of its searches in October 2026, every run opens a real browser session through residential IPs and then reads the results inside it; it never solves a CAPTCHA.
{
"row_type": "listing",
"id": 41530318,
"url": "https://www.imobiliare.ro/oferta/apartament-de-vanzare-sector-1-pipera-2-camere-3-41530318",
"offer_type": "sale",
"property_type": "apartment",
"price": 126929,
"currency": "EUR",
"price_period": "total",
"rooms": 2,
"usable_surface_m2": 44.8,
"floor": 2,
"total_floors": 5,
"year_built": 2026,
"city": "Sector 1",
"area": "Pipera",
"latitude": 44.4965276,
"longitude": 26.1223332,
"seller_type": "developer",
"agency_name": "BECALI IMOBILIARE",
"image_count": 20,
"days_on_market": 5
}Why this one
A wrong location is an error, not the whole country
Imobiliare.ro answers a location slug it does not know with the national result set and HTTP 200. A scraper that trusts the response bills you for listings from the wrong city. The Imobiliare.ro Scraper detects the substitution and returns an error row that is never charged.
Private sellers redacted, agencies complete
About one advertiser in six on imobiliare.ro is a private person, and up to 55% on Bucharest rentals. For those rows the Imobiliare.ro Scraper nulls the name and account and strips phone numbers and e-mails from the text unless you enable `includePrivateSellerContact`. Agencies and developers are always delivered in full. Any seller type it cannot classify is treated as private.
A browser, but no CAPTCHA solving
The portal's protection now challenges plain HTTP clients from data centres and from residential IPs alike. The Imobiliare.ro Scraper opens a real browser session, keeps the route that passes, and if a route is served a CAPTCHA it drops that route rather than solving it. If the protection ever serves a CAPTCHA to every route, the run stops and says so.
Use cases
- Track asking prices and price per square metre for apartments in Bucharest, Cluj-Napoca, Timișoara, Iași or Brașov, by sector and neighbourhood.
- Follow price cuts through `previous_price` and time on market through `days_on_market`.
- Measure rent levels in Bucharest and Cluj with the price period on every row.
- Build a list of Romanian real estate agencies and developers with IDs, logos and profile URLs.
- Feed a valuation model with surfaces, floor, year built, construction stage and coordinates.
Input
Every field has a default, and the defaults are deliberately small so a first run is cheap enough to inspect before you commit to a sweep. This table mirrors the Actor's own input schema field for field.
| Field | Default | What it does |
|---|---|---|
outputTypeselect | "listings" | What to extract`listings` or `agencies`. One row type per run. Private sellers never become agency rows. |
offerTypeselect | "sale" | Operation`sale` or `rent`. |
propertyTypeselect | "apartments" | Property type`apartments`, `studios`, `houses`, `land`, `commercial` or `offices`. Land exists only for sale and offices only for rent. |
locationstring | "bucuresti" | LocationThe location part of an imobiliare.ro search URL: `bucuresti`, `bucuresti/sector-1`, `judetul-cluj/cluj-napoca`. Empty searches all of Romania. An unknown location becomes an error row. |
startUrlsstring[] | [] | Search URLsimobiliare.ro search result URLs with any filters set on the site, instead of the fields above. |
sortselect | "default" | Sort by`default`, `latest`, `lowest-price` or `highest-price` — only orders verified to change the result. |
minPriceinteger | — | Minimum / maximum price (EUR)With `maxPrice` and `rooms`. Verified: a 100,000 EUR maximum cut Bucharest apartments from 25,983 to 5,733. |
maxItemsinteger | 100 | Maximum rowsHard cap on rows delivered, up to 100,000. |
includeDetailsboolean | false | Also scrape each listing pageAdds creation, publication and modification dates, street, bathrooms, characteristics, amenities and the agency's legal name, address and agents. About 20 times the bandwidth of a search result, billed separately. |
includeCoordinatesboolean | true | Add coordinates from the mapOne extra request per search adds latitude and longitude to every listing the portal map knows about. No extra charge. |
includePrivateSellerContactboolean | false | Include private sellers' namespersonal dataOff by default. Turn it on only if you have a lawful basis to process personal data under the GDPR. |
maxConcurrencyinteger | 3 | Maximum concurrency1 to 8. A burst of 36 requests, 8 in parallel, got no refusals; 3 stays well below that. |
Output and fill rates
A field being in the schema is not the same as it having a value. The percentages below were counted on real runs; the sample sizes are in Measurements. Anything not listed here is not promised.
| Field | Filled | Meaning |
|---|---|---|
idinteger | 100% | imobiliare.ro listing ID, with `url`, `title`, `offer_type`, `property_type` and `category`. |
pricenumber | 100% | Asking price, with `currency` (100%). |
price_periodstring | 99.4% | `total` for a sale, a period for a rent. |
price_per_sqmnumber | 18.1% | As published by the portal; 100% on land. |
previous_pricenumber | 4.6% | With `price_change_direction`: set when the price changed. |
roomsinteger | 78.5% | 100% on apartments and houses. |
usable_surface_m2number | 82.5% | Usable surface. |
surface_m2number | 94.2% | Total surface. |
year_builtinteger | 78.8% | Year of construction. |
construction_stagestring | 79% | Finished, under construction and similar. |
location_pathstring[] | 100% | With `county`, `city`, `area` and `address`. |
latitudenumber | not measured | With `longitude`, from the portal map. Depends on search size: 60/60 in Cluj-Napoca, 74/100 in Bucharest. |
metro_distance_mnumber | 23.1% | With `metro_walk_minutes`. 44% on Bucharest rentals. |
descriptionstring | 100% | The full listing description. |
imagesstring[] | 100% | Every photo URL, with `image_count`. |
seller_typestring | not measured | `agency`, `developer` or `private`. |
agency_namestring | not measured | With `agency_id` and `agency_slug`. The README reports 100% on 480 rows, counted before private-seller redaction; redacted rows carry null. |
agent_namestring | not measured | The agent named on the listing. Null on redacted private-seller rows. |
days_on_marketinteger | 98.8% | Days since the listing appeared. |
street_addressstring | 73.3% | Listing pages only: 44 of 60 measured. |
date_createddatetime | 100% | Listing pages only, with `date_published` and `date_modified`: 60 of 60. |
Every key is always present. A field that exists but is empty comes back as explicit null, so a parser never has to guess.
Datasets
Different record types go to different datasets, so the main table never carries columns that are blank on most rows.
defaultOne row per listing, or one per agency with `outputType: agencies`; error rows carry `row_type: error`.billedRUN_SUMMARY (key-value store)Counts of rows, listing pages, error rows and requests.never billed
Pricing
Pay per delivered result. Charges are applied as each row is produced rather than in a lump at the end, so an aborted run bills only for what it actually gave you.
| Event | Price | Notes |
|---|---|---|
apify-actor-startActor start | $0.005 | One event per GB of memory, minimum one: $0.02 per run at the default 4 GB. Covers opening the browser session. |
listingListing delivered | $0.0012 | One property row. Duplicates within a run and error rows are not charged. |
listing-detailListing page data | $0.0025 | Adds the listing page to a row. Only with `includeDetails`. |
agencyAgency delivered | $0.0012 | One agency or developer row, with `outputType: agencies`. |
Measurements
Each figure is shown with the method that produced it. A benchmark without a method is a marketing claim wearing a number's clothes.
Fill-rate sample
480 listings, 14 searches
Measured on 23 September 2026. Every listing fill rate on this page comes from that sample unless another n is stated.
Fields per row
Median 66; 82 with listing pages
66 on the 480-listing sample. With listing pages the README states 84 (n = 60, 23 September); a re-measurement on build 0.2.7 on 6 October gave 82 (n = 60), and the lower figure is the one published.
Private advertisers
81 of 480 (16.9%)
Counted on the fill-rate sample. The share varies by facet, reaching 55% on Bucharest rentals.
Coordinates from the map
60/60 Cluj-Napoca; 74/100 Bucharest
Two searches. The Bucharest one held about 26,000 results and the map returns at most 10,000 pins.
Run time
100 listings in 48 seconds
Default input on build 0.2.7 at 4,096 MB on the Apify platform, most of it opening the browser session. Peak memory 1,254 MB.
Per-search ceiling
9,990 results
The deepest the site pages for one search. Above it the Actor continues by sub-location.
What it will not do
Stated plainly so you can judge fit before spending anything.
- One row type per run: listings or agencies.
- Imobiliare.ro pages through at most 9,990 results per search; larger searches are split by sub-location.
- Map coordinates are capped at 10,000 pins per search, which is why a 26,000-result Bucharest search returned coordinates on 74 of 100 rows.
- Only search-page URLs are accepted in `startUrls`; a single listing URL is rejected with an error row.
- The browser session takes 20 to 60 seconds to open, so even a small run is not instant.
- If the portal's protection serves a CAPTCHA to every route, the Actor stops rather than solving it.
Privacy
- Agencies and developers are delivered in full: they are businesses advertising for the purpose of being contacted.
- Private sellers' name, account and any phone number or e-mail written in the description are hidden by default; the row is flagged `seller_contact_redacted`.
- `includePrivateSellerContact` exists for users with a lawful basis under the GDPR, and enabling it is their decision.
- The Actor never logs in and never presses the portal's "show phone" button.
- Removal requests: privacy@actorstack.dev
See also the data removal process.