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:
- Pricing —
price(total listing price),priceCurrency(usually EUR — Romanian property is priced in euro),pricePerSqm(EUR/m²), andmonthlyRentfor rentals and some sale listings. - Property spec —
areaSqm(usable surface),terrainAreaSqm(plot area for houses and land),rooms,floor(labels likeGROUND,FLOOR_3,ABOVE_TENTH),totalFloors,market(PRIMARY new-build vs. SECONDARY resale), and alabelsstring of feature tags likeBALCONYorAIR_CONDITIONING. - Location — a full Romanian breakdown:
province(county / județ),city,sector(Bucharest Sectorul 1–6),district,subdistrict,street,postalCode, a composedfullAddress, andlatitude/longitude. - Agency / contact —
advertType(AGENCY / PRIVATE / DEVELOPER), an authoritativeisPrivateflag,agencyName,agencyId,agencySlug,agencyType,contactName,contactLogoUrl, and theisExclusive/isFeatured/isPromotedflags. - Timestamps & media —
dateCreated,dateCreatedFirst,pushedUpAt(last bump),mainImageUrl, animageUrlsarray,imageCount, plusinvestmentName/investmentStatefor 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 likebucuresti/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.
maxRetriesrotates the proxy IP on HTTP errors so a single flagged IP doesn’t stall the task. - Polite pacing. Keep
requestDelayat 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
monthlyRenton rental rows againstpriceandpricePerSqmon sale rows for the same district. - Lead generation — set
ownerType: PRIVATE(or filter onisPrivate) to find direct-owner listings, or cluster agency listings byagencyIdand capturecontactNamefor outreach. - Price tracking — re-run on a schedule and diff using
dateCreatedandpushedUpAtto detect price moves and re-listings. - Primary-market monitoring — set
market: PRIMARYto track new developer offers viainvestmentNameandinvestmentState. - 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 andpostalCodeare 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
maxListingsand test on the free tier first.
Common pitfalls
Specific gotchas for a Storia pipeline:
- GPS and postal code are detail-only.
latitude,longitudeandpostalCodeare 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
priceCurrencyoccasionally reads RON. Always readpriceCurrencyper row rather than assuming EUR. isPrivatebeatsownerType. TheownerTypeinput is a soft filter; the per-recordisPrivateboolean is authoritative. Filter your dataset onisPrivatewhen 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.
monthlyRentcan appear on sale listings. It sometimes carries an admin/maintenance fee on sales, not just rent on rentals. Don’t assume a non-nullmonthlyRentmeans the listing is a rental — checktransactionType.- Everything is a string. Cast
price,pricePerSqm,areaSqmand 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
EU Company Registry Data Export — Germany, France, Netherlands
How to extract company-registry records from Handelsregister, INPI, and KvK in a unified schema — for KYC, B2B lead generation, and compliance workflows.
How to Scrape Allabolag.se Sweden Company Leads in 2026
Extract Swedish company data from allabolag.se — org number, revenue, CEO, phone and email — without an API key. A guide to bulk firmographics and B2B leads.
How to Scrape the Australia Business Register (ABN/ABR)
Bulk-export Australian business names, ABNs, status and registration dates from the official data.gov.au CKAN register — no API key, no browser, no captcha.