L logiover
business · Jul 9, 2026 · 8 min read

How to Scrape Storia.ro Romania Real Estate Data in 2026

Extract Romanian property listings from Storia.ro — prices in EUR, price/m², full address with Bucharest sector, GPS and agency data. No API key, no browser.

Storia.ro is one of Romania’s largest real-estate portals, part of the OLX Group — the same platform family as Otodom in Poland and Imovirtual in Portugal. It carries hundreds of thousands of active vânzare (sale) and închiriere (rent) listings across every județ, but there is no open public listings API. This guide walks through what Storia exposes, how its listing data is embedded in the page, and how to extract clean Romanian property records — price in EUR, price per m², full address down to the Bucharest sector, and agency contacts — over plain HTTP.

What’s worth extracting

Storia surfaces a dense record per listing. Parsed out of the page state, each property yields 50+ fields. The useful ones group into five clusters:

  • Pricingprice (total listing price), priceCurrency (usually EUR — Romanian property is priced in euro), pricePerSqm (EUR/m²), and monthlyRent for rentals and some sale listings.
  • Property specareaSqm (usable surface), terrainAreaSqm (plot area for houses and land), rooms, floor (labels like GROUND, FLOOR_3, ABOVE_TENTH), totalFloors, market (PRIMARY new-build vs. SECONDARY resale), and a labels string of feature tags like BALCONY or AIR_CONDITIONING.
  • Location — a full Romanian breakdown: province (county / județ), city, sector (Bucharest Sectorul 1–6), district, subdistrict, street, postalCode, a composed fullAddress, and latitude/longitude.
  • Agency / contactadvertType (AGENCY / PRIVATE / DEVELOPER), an authoritative isPrivate flag, agencyName, agencyId, agencySlug, agencyType, contactName, contactLogoUrl, and the isExclusive / isFeatured / isPromoted flags.
  • Timestamps & mediadateCreated, dateCreatedFirst, pushedUpAt (last bump), mainImageUrl, an imageUrls array, imageCount, plus investmentName / investmentState for new-build developer projects.

For rental-yield work you want price, monthlyRent and areaSqm. For lead lists, isPrivate, agencyId and contactName are the payload.

How Storia.ro serves its data

The actor doesn’t drive a browser. Storia is a Next.js site, and Next.js ships its full page state in an embedded __NEXT_DATA__ JSON script tag inside the HTML. The listing array — prices, coordinates, agency data — is already in that payload before hydration. The actor fetches the search HTML over HTTP, extracts __NEXT_DATA__, and reads the structured records directly. No headless Chrome, no GraphQL token, no site API key or login.

Targeting works through URL location slugs. A Storia search URL looks like this:

https://www.storia.ro/ro/rezultate/vanzare/apartament/bucuresti?...

The slug is the location path between /rezultate/{txn}/{type}/ and the ?. Useful values:

  • All Romania: toata-romania
  • Bucharest: bucuresti, or a single sector like bucuresti/sectorul-3
  • County or city: cluj, ilfov, timis/timisoara, iasi/iasi, brasov/brasov

Each slug becomes its own task. A realistic input — apartments for sale in Bucharest and Cluj, resale market, filtered by price, area and rooms:

{
  "locationSlugs": ["bucuresti", "cluj"],
  "transaction": "sale",
  "propertyType": "apartment",
  "priceMin": 60000,
  "priceMax": 180000,
  "areaMin": 40,
  "areaMax": 90,
  "roomsMin": 2,
  "roomsMax": 3,
  "market": "SECONDARY",
  "sort": "latest",
  "maxListings": 500,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "RO" }
}

propertyType accepts apartment, house, plot, commercial, garage and room. market filters PRIMARY (new build), SECONDARY (resale) or ALL. ownerType (PRIVATE / BUSINESS / ALL) is a soft filter — every record also carries the authoritative isPrivate flag, so filter on that downstream if you need certainty. distanceRadius (0, 5, 10, 15, 25, 50, 75 km) expands a search into nearby areas.

Run the Storia.ro Romania Real Estate Scraper on Apify — one run returns thousands of Romanian listings with price in EUR, price/m², full address and agency data. No API key, no login. Export to JSON, CSV, Excel or XML.

Why the OLX-group platform matters

Storia isn’t a one-off site — it’s part of the OLX Group’s real-estate stack, the same platform family as Otodom in Poland and Imovirtual in Portugal. That shared lineage is useful in two ways. First, the __NEXT_DATA__ extraction pattern is consistent across the family, so if you’re building a multi-country Central and Eastern European dataset, the field shapes rhyme from portal to portal. Second, the field naming reflects the group’s schema conventions: enum-style values like advertType (AGENCY / PRIVATE / DEVELOPER), floor labels (GROUND, FLOOR_3, ABOVE_TENTH), and feature tags (AIR_CONDITIONING, BALCONY) come back as codes, not free text. That’s a feature for pipelines — you can filter and group on stable enum values rather than parsing localized display strings — but it means you’ll want a small lookup table to render those codes back into human-readable labels for a dashboard.

The market split is specific to this kind of portal and worth understanding: PRIMARY is new-build inventory sold by developers, carrying investmentName and investmentState, while SECONDARY is the resale market between owners and agencies. They behave differently — primary-market pricing tracks construction phases and developer promotions, secondary tracks the open resale market — so keep them separated in analysis rather than pooling them into one price series.

The access reality

Storia deploys mild bot protection — nowhere near the DataDome wall you hit on some other portals, but enough that datacenter proxies often get blocked. What keeps a run clean:

  • Residential proxy, country RO. Present Romanian residential IPs; the README recommends residential with apifyProxyCountry: "RO".
  • IP rotation with retries. maxRetries rotates the proxy IP on HTTP errors so a single flagged IP doesn’t stall the task.
  • Polite pacing. Keep requestDelay at or above 600 ms.
  • Pagination is capped. Storia caps pagination around page 500 for broad searches. A query like “all apartments in Bucharest” returns tens of thousands of matches you can’t fully page through — so narrow with price, area and room filters to reach deep, relevant inventory instead of hitting the ceiling on noise.

You control page size with limit (24, 36, 48 or 72 listings per page) and depth with maxPagesPerTask.

Example output

A single sale listing after parsing, trimmed:

{
  "adId": "IDabc12",
  "detailUrl": "https://www.storia.ro/ro/oferta/apartament-2-camere-herastrau-IDabc12",
  "title": "Apartament 2 camere | Herăstrău | vedere parc",
  "transactionType": "sale",
  "propertyType": "apartment",
  "advertType": "AGENCY",
  "isPrivate": "false",
  "market": "SECONDARY",
  "price": "145000",
  "priceCurrency": "EUR",
  "pricePerSqm": "2686",
  "areaSqm": "54",
  "rooms": "2",
  "province": "bucuresti",
  "city": "București",
  "sector": "Sectorul 1",
  "district": "Herăstrău",
  "latitude": "44.4738",
  "longitude": "26.0865",
  "agencyName": "Premium Imobiliare SRL",
  "agencyId": "39215",
  "isExclusive": "true",
  "dateCreated": "2026-07-02T09:14:00Z",
  "scrapedAt": "2026-07-06T12:00:00Z"
}

Values ship as strings. Note the location depth: county, city, Bucharest sector and district are all separate fields.

Who uses Storia.ro data

  • Market research — build EUR/m² heatmaps by county, city, Bucharest sector and district.
  • Investment screening — calculate rental yield per area by comparing monthlyRent on rental rows against price and pricePerSqm on sale rows for the same district.
  • Lead generation — set ownerType: PRIVATE (or filter on isPrivate) to find direct-owner listings, or cluster agency listings by agencyId and capture contactName for outreach.
  • Price tracking — re-run on a schedule and diff using dateCreated and pushedUpAt to detect price moves and re-listings.
  • Primary-market monitoring — set market: PRIMARY to track new developer offers via investmentName and investmentState.
  • Cross-city comparison — pass Bucharest, Cluj, Timișoara and Brașov in one run and benchmark like-for-like.

Build it yourself vs. use the managed actor

  • Build from scratch — a day or two to write the __NEXT_DATA__ extractor, plus proxy management, plus keeping up with schema changes when Storia (an OLX-group Next.js app) redeploys. You also handle the detail-page fetches, since GPS coordinates and postalCode are only present on detail records, not in the search results.
  • Managed actor — start in minutes on a pay-per-result model: you pay for the listings you extract, no Apify platform fee to calculate on top, no monthly floor. Cap with maxListings and test on the free tier first.

Common pitfalls

Specific gotchas for a Storia pipeline:

  • GPS and postal code are detail-only. latitude, longitude and postalCode are populated on detail-page records but are null in search-results rows. If you need coordinates for mapping, budget for the detail fetch.
  • Currency is usually EUR but not always. Romanian property is almost always priced in euro, and that’s what Storia returns — but priceCurrency occasionally reads RON. Always read priceCurrency per row rather than assuming EUR.
  • isPrivate beats ownerType. The ownerType input is a soft filter; the per-record isPrivate boolean is authoritative. Filter your dataset on isPrivate when you need a clean owner-vs-agency split.
  • Pagination ceiling at ~500. Broad searches can’t be fully paged. Narrow the query rather than expecting to walk every match.
  • monthlyRent can appear on sale listings. It sometimes carries an admin/maintenance fee on sales, not just rent on rentals. Don’t assume a non-null monthlyRent means the listing is a rental — check transactionType.
  • Everything is a string. Cast price, pricePerSqm, areaSqm and coordinates before computing anything.

Scheduling and keeping the data fresh

The dateCreated, dateCreatedFirst and pushedUpAt fields make Storia data especially good for time-series monitoring. Schedule the actor to re-run daily or weekly against the same locationSlugs, then diff on the stable adId: a new adId is fresh inventory, a changed price on an existing one is a price move, and pushedUpAt tells you when a seller re-bumped a stale listing (a signal that it isn’t selling). Export to Google Sheets for a quick dashboard, or connect the run to Make, n8n or Zapier to drive alerts and CRM syncs. For a cross-city view, pass Bucharest, Cluj, Timișoara and Brașov as separate slugs in one scheduled run so every refresh gives you a like-for-like national snapshot.

Wrapping up

If you need a one-off Romanian dataset, the __NEXT_DATA__ parse is straightforward — the friction is proxies and the detail-page hop for GPS. If you need a fresh Romanian property feed with EUR/m², full address and agency leads on every row, run a managed actor where the extraction, proxying and detail-fetch are already handled.

Open the Storia.ro Scraper on Apify — 50+ fields per listing including EUR/m², Bucharest sector and agency data, over direct HTTP. No API key, no login. Pay per row. Start on Apify’s free monthly credit.

Related guides