# Storia.ro Scraper — Romania Real Estate Data (`logiover/storia-ro-scraper-romania-real-estate`) Actor

Scrape real estate listings from Storia.ro — Romania's leading property portal (OLX Group). No browser, no API key. Filter by location, sale/rent, property type, price (EUR), area, rooms and market. Returns price, m², full Romanian address, agency, images and more per listing.

- **URL**: https://apify.com/logiover/storia-ro-scraper-romania-real-estate.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Storia.ro Scraper — Romania Real Estate Data, Prices & Broker Leads (No API)

![Apify Actor](https://img.shields.io/badge/Apify-Actor-00A67E?logo=apify&logoColor=white) ![No API key](https://img.shields.io/badge/No%20API%20key-required-2ea44f) ![Pay per result](https://img.shields.io/badge/Pricing-Pay%20per%20result-1C7ED6) ![Real Estate](https://img.shields.io/badge/Category-Real%20Estate-8B5CF6) ![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel-F59E0B)

---

Scrape property listings from **Storia.ro**, one of Romania's largest real estate portals (OLX Group — the same platform family as Otodom and Imovirtual) with hundreds of thousands of active listings — apartments, houses, land/plots, commercial space, garages and rooms, for **sale or rent**. Get **price in EUR, price/m², GPS coordinates, full Romanian address (county, city, Bucharest sector, district), agency data & image galleries** in clean structured JSON, straight from the site's `__NEXT_DATA__` payload. **Fast, no browser, no API key, no login.**

> ### 🏆 Why this Storia.ro scraper?
> **50+ fields per listing** · **thousands of listings per run** · direct HTTP + `__NEXT_DATA__` JSON (no browser) · residential-proxy ready · export to JSON / CSV / Excel. The unofficial **Storia.ro API alternative** for Romanian real-estate market research, investment screening and lead generation.

---

### ✨ What this Actor does / Key features

- 🏠 **6 property types** — apartments, houses, land/plots, commercial space, garages and rooms, for **sale or rent**.
- 📍 **Nationwide targeting** — scrape all of Romania, any county (județ), city or Bucharest sector via location slugs.
- 💰 **Powerful filters** — price range (EUR), area range (m²), room range, market (primary/secondary), owner type and distance radius.
- 🔀 **Flexible sorting** — by latest, price, price/m² or area, ascending or descending.
- 🗺️ **Full address & GPS** — county, city, Bucharest sector, district, subdistrict, street, postal code + latitude/longitude on detail records.
- 🏢 **Agency & contact lead data** — agency name, ID, slug, logo and type, plus the listing contact name and photo, and exclusivity/featured/promoted flags.
- 🖼️ **Image galleries** — main image URL plus the full list of image URLs and image count.
- ⚡ **Direct HTTP + JSON extraction** — parses Storia's `__NEXT_DATA__` payload; no browser, no DOM walking, no GraphQL token.
- 🛡️ **Proxy support** — Apify Proxy integration; residential + country=RO strongly recommended to avoid blocks.

Storia.ro lists hundreds of thousands of active properties across Romania, from Bucharest apartments and Cluj new-builds to houses in Brașov and land in Ilfov. This Actor turns that inventory into a clean, structured dataset you can analyse, monitor and integrate.

### 🚀 Quick start (3 steps)

1. **Configure** — paste one or more location slugs (e.g. `bucuresti`, `cluj`) and pick `sale` or `rent`. Add price/area/room filters if you want.
2. **Run** — click **Start**. The Actor paginates the search results and streams listings into your dataset.
3. **Get your data** — open the **Output** tab and export to **JSON, CSV, Excel or XML**, or pull it via the Apify API.

### 📥 Input

Give the Actor at least one `locationSlugs` value. Everything else is optional and has sensible defaults.

#### Example — apartments for sale in Bucharest & Cluj
```json
{
  "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" }
}
````

#### Example — private-owner rentals nationwide (lead generation)

```json
{
  "locationSlugs": ["toata-romania"],
  "transaction": "rent",
  "propertyType": "apartment",
  "ownerType": "PRIVATE",
  "sort": "latest",
  "maxListings": 1000
}
```

#### Example — new-build developer offers in Bucharest Sector 3

```json
{
  "locationSlugs": ["bucuresti/sectorul-3"],
  "transaction": "sale",
  "market": "PRIMARY",
  "maxListings": 300
}
```

| Field | Type | Description |
|-------|------|-------------|
| `locationSlugs` | array | Storia URL location paths. Each slug becomes its own task (e.g. `bucuresti`, `cluj`, `timis/timisoara`, `toata-romania`). **Required.** |
| `transaction` | string | `sale` (vânzare) or `rent` (închiriere). |
| `propertyType` | string | `apartment`, `house`, `plot`, `commercial`, `garage` or `room`. |
| `priceMin` / `priceMax` | integer | Price range in EUR (Romanian property is priced in euro). 0 = no bound. |
| `areaMin` / `areaMax` | integer | Surface area range in m². 0 = no bound. |
| `roomsMin` / `roomsMax` | integer | Room-count range (1–10). 0 = no bound. |
| `market` | string | `ALL`, `PRIMARY` (new build) or `SECONDARY` (resale). |
| `ownerType` | string | `ALL`, `PRIVATE` or `BUSINESS` (agency). Soft filter — every record also carries an authoritative `isPrivate` flag. |
| `sort` | string | latest, price\_asc/desc, price\_per\_m\_asc/desc, area\_asc/desc. |
| `distanceRadius` | integer | Expand to nearby areas: 0, 5, 10, 15, 25, 50 or 75 km. |
| `limit` | integer | Listings per page: 24, 36, 48 or 72. |
| `maxListings` | integer | Total cap across all location tasks. 0 = unlimited. |
| `maxPagesPerTask` | integer | Pagination depth per location (Storia caps around page 500 for broad searches). |
| `requestDelay` | integer | Delay between page requests in ms (keep ≥ 600 ms). |
| `maxRetries` | integer | Retries per request on HTTP errors (rotates proxy IP). |
| `proxyConfiguration` | object | Apify Proxy settings. Residential + country=RO strongly recommended. |

> **Finding a location slug:** browse storia.ro, apply a location filter, and copy the path between `/rezultate/{txn}/{type}/` and `?` from the URL. Use `toata-romania` for all of Romania, a county slug like `cluj` or `ilfov`, or a deeper `judet/oras` path like `timis/timisoara`.

#### Common location slugs

- **All Romania:** `toata-romania`
- **Bucharest:** `bucuresti` (or a sector, e.g. `bucuresti/sectorul-1` … `bucuresti/sectorul-6`)
- **Cluj-Napoca area:** `cluj`
- **Timișoara:** `timis/timisoara`
- **Iași:** `iasi/iasi`
- **Constanța:** `constanta/constanta`
- **Brașov:** `brasov/brasov`
- **Sibiu:** `sibiu/sibiu`
- **Oradea:** `bihor/oradea`
- **Craiova:** `dolj/craiova`
- **Ilfov county (Bucharest metro):** `ilfov`

### 📤 Output

One row per listing — **50+ fields**, exportable to JSON, CSV, Excel or XML. Here is a trimmed sample record:

```json
{
  "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",
  "monthlyRent": null,
  "areaSqm": "54",
  "rooms": "2",
  "floor": "FLOOR_3",
  "totalFloors": "8",
  "province": "bucuresti",
  "city": "București",
  "sector": "Sectorul 1",
  "district": "Herăstrău",
  "street": "Bulevardul Aviatorilor",
  "postalCode": "011852",
  "latitude": "44.4738",
  "longitude": "26.0865",
  "mainImageUrl": "https://ireland.apollo.olxcdn.com/v1/files/…/image.jpeg",
  "imageUrls": ["https://…/1.jpeg", "https://…/2.jpeg", "…"],
  "imageCount": "18",
  "contactName": "Andrei Popescu",
  "agencyName": "Premium Imobiliare SRL",
  "agencyId": "39215",
  "agencyType": "AGENCY",
  "isExclusive": "true",
  "dateCreated": "2026-07-02T09:14:00Z",
  "labels": "BALCONY, AIR_CONDITIONING",
  "searchLocation": "bucuresti",
  "scrapedAt": "2026-07-06T12:00:00Z"
}
```

<details>
<summary><b>📋 Full field reference (click to expand)</b></summary>

| Field | Description |
|-------|-------------|
| `adId` | Storia's stable listing ID |
| `detailUrl` | Full listing detail URL |
| `slug` | Listing URL slug |
| `title` | Listing title |
| `shortDescription` | Card-level description snippet |
| `transactionType` | sale or rent |
| `propertyType` | Property type (apartment, house, plot, commercial, garage, room) |
| `advertType` | Raw advert type (AGENCY / PRIVATE / DEVELOPER) |
| `isPrivate` | True if posted by a private owner |
| `market` | PRIMARY (new build) or SECONDARY (resale) |
| `price` | Total listing price |
| `priceCurrency` | Currency code (usually EUR, sometimes RON) |
| `pricePerSqm` | Price per square meter (EUR/m²) |
| `monthlyRent` | Monthly rent / admin fee (present on rentals and some sale listings) |
| `areaSqm` | Usable surface area in m² |
| `terrainAreaSqm` | Terrain / plot area in m² (houses, land) |
| `rooms` | Number of rooms |
| `floor` | Floor number/label (GROUND, ABOVE\_TENTH, …) |
| `totalFloors` | Total floors in the building |
| `province` | County (județ) |
| `city` | City / locality |
| `sector` | Bucharest sector (Sectorul 1–6) |
| `district` | District / neighbourhood |
| `subdistrict` | Sub-district / quarter |
| `street` | Street name |
| `postalCode` | ZIP / postal code (detail pages only; null in search results) |
| `fullAddress` | Composed full address string |
| `latitude` | GPS latitude (detail pages only; null in search results) |
| `longitude` | GPS longitude (detail pages only; null in search results) |
| `mainImageUrl` | Cover photo (large) |
| `imageUrls` | Array of all listing image URLs |
| `imageCount` | Total number of images |
| `contactName` | Listing contact name (agent or private seller) |
| `contactLogoUrl` | Contact avatar / photo URL |
| `agencyId` | Agency ID |
| `agencyName` | Agency display name |
| `agencySlug` | Agency URL slug |
| `agencyLogoUrl` | Agency logo image URL |
| `agencyType` | Agency category from API |
| `isExclusive` | Exclusive offer flag |
| `isFeatured` | Featured / highlighted listing flag |
| `isPromoted` | Promoted listing flag |
| `hasOpenDay` | Has a scheduled open day |
| `investmentName` | New-build development name (primary market) |
| `investmentState` | Construction state |
| `dateCreated` | Most recent post date |
| `dateCreatedFirst` | First-ever post date |
| `pushedUpAt` | Most recent bump date |
| `labels` | Listing feature tags / badges (e.g. AIR\_CONDITIONING, BALCONY) |
| `searchTransaction` | Transaction type used for this search |
| `searchPropertyType` | Property type used for this search |
| `searchLocation` | Location slug used for this search |
| `searchUrl` | Full search URL used |
| `scrapedAt` | Scrape timestamp (ISO 8601) |

</details>

### 💡 Use cases

- **Market research** — build EUR/m² heatmaps by county, city, Bucharest sector and district.
- **Investment screening** — calculate rental yield (monthly rent vs. sale price) per area.
- **Lead generation** — use `ownerType: PRIVATE` (or filter on `isPrivate`) to find direct-owner listings, or cluster agency listings by `agencyId` and capture `contactName`.
- **Price tracking** — re-run on a schedule and diff against prior datasets using `dateCreated` and `pushedUpAt`.
- **Primary-market monitoring** — use `market: PRIMARY` to track new developer offers and residential projects via `investmentName` / `investmentState`.
- **Cross-city comparison** — pass multiple `locationSlugs` in one run to benchmark prices across Romanian cities.

### 👥 Who uses it

Real-estate agencies & proptech teams · property investors & flippers · mortgage and valuation analysts · market researchers & data journalists · lead-gen agencies building owner/agency contact lists · relocation & expat-services firms.

### 💰 Pricing

This Actor runs on a simple **pay-per-result** model — you pay for the listings you extract, with no separate Apify platform fees to calculate. Try it on the **free tier** first, then scale up. See the **Pricing** tab on this page for the current rate.

### ❓ Frequently Asked Questions

**Is it legal to scrape Storia.ro?**
The Actor only collects publicly available property listing data. You are responsible for using the data in compliance with Storia's terms and applicable laws such as GDPR.

**Does Storia.ro have a public API?**
Storia does not offer an open public data API for listings, so this Actor reads the site's own embedded `__NEXT_DATA__` JSON instead — giving you structured Romanian real estate data without any API key.

**Do I need an API key or a login?**
No. There is no Storia account, login or API key required — only an Apify account.

**Do I need a proxy?**
Storia deploys mild bot protection. Datacenter proxies often get blocked, so residential Apify Proxy with country=RO is strongly recommended; the Actor runs cleanly with it at a ≥600 ms request delay.

**How do I target a specific city, county or Bucharest sector?**
Storia uses URL location slugs. Browse storia.ro, apply a location filter, and copy the path from the URL. Common slugs for major cities, counties and Bucharest sectors are listed above; append more segments for districts.

**What currency are prices in?**
Romanian real estate is almost always priced in **euro (EUR)**, and that is what Storia returns; the `priceCurrency` field records the exact currency for each listing so you never have to guess.

**How much data can I get?**
You can scrape thousands of listings per run. Broad searches (like all apartments in Bucharest) return tens of thousands of matches; Storia caps pagination around page 500, so narrow with price, area and room filters to reach deeper, more relevant inventory across multiple locations.

**Does it return monthly rent separately?**
Yes. For rental listings the recurring monthly rent is returned in the `monthlyRent` field, separate from the headline `price`, so you can work with whichever you need.

**What output formats are supported?**
Results are stored in a structured Apify dataset and can be exported as JSON, CSV, Excel or XML, or accessed via the Apify API.

#### Is this a Storia.ro API alternative?

Yes. Storia has no open public listings API, so this Actor works as an unofficial Storia.ro API alternative — it reads the site's embedded `__NEXT_DATA__` JSON and returns structured Romanian real estate data with no API key.

#### Can I scrape Storia.ro without an API or login?

Yes. No Storia account, login or API key is needed — only an Apify account. The Actor pulls publicly available property listings over direct HTTP, so you can scrape Storia.ro without an API.

#### How do I export Storia.ro data to CSV or JSON?

Run the Actor, then export the resulting dataset as CSV, JSON, Excel or XML from the Apify console or via the Apify API. This makes it easy to move Storia.ro property data into spreadsheets and BI tools.

#### How do I scrape apartments for sale in Bucharest from Storia.ro?

Set `locationSlugs` to `bucuresti`, `transaction` to `sale` and `propertyType` to `apartment`. The scraper returns Bucharest apartments with price in EUR, price/m², area, address (including sector) and — on detail records — GPS. Add `bucuresti/sectorul-3` or similar to focus on a single sector.

#### How do I calculate rental yield for Romanian property from Storia.ro data?

Scrape sale and rent listings for the same area: sale rows carry `price` and `pricePerSqm`, while rental rows carry `monthlyRent`. Divide annualised rent by sale price for the same district or Bucharest sector to estimate gross rental yield — useful for comparing Bucharest, Cluj, Timișoara and Brașov.

### 🔗 More real estate scrapers by logiover

Building a cross-country property dataset? Pair Storia.ro with the rest of the European real-estate suite:

| Country | Actor |
|---|---|
| 🇵🇱 Poland | [Otodom.pl Scraper](https://apify.com/logiover/otodom-pl-scraper-polish-real-estate-data) |
| 🇵🇹 Portugal | [Imovirtual Scraper](https://apify.com/logiover/imovirtual-pt-scraper-portugal-real-estate) |
| 🇧🇬 Bulgaria | [Imot.bg Scraper](https://apify.com/logiover/imot-bg-scraper-bulgaria-real-estate) |
| 🇨🇿 Czechia | [Sreality.cz Scraper](https://apify.com/logiover/sreality-cz-scraper-czech-real-estate-data) |
| 🇬🇷 Greece | [Spitogatos Scraper](https://apify.com/logiover/spitogatos-gr-real-estate-scraper-greece-properties-data) · [XE.gr Scraper](https://apify.com/logiover/xe-gr-real-estate-scraper-greece-property-data) |
| 🇮🇹 Italy | [Subito Scraper](https://apify.com/logiover/subito-it-property-scraper) |
| 🇪🇸 Spain | [Habitaclia Scraper](https://apify.com/logiover/habitaclia-com-spain-scraper) · [Pisos.com Scraper](https://apify.com/logiover/pisos-com-property-scraper) |
| 🇩🇪 Germany | [ImmobilienScout24 Scraper](https://apify.com/logiover/immobilienscout24-de-scraper-germany-real-estate) |
| 🇫🇷 France | [Bien'ici Scraper](https://apify.com/logiover/bien-ici-fr-scraper-france-real-estate) |
| 🇷🇸 Serbia | [Halooglasi Scraper](https://apify.com/logiover/halooglasi-property-scraper-serbia-real-estate) |
| 🇭🇷 Croatia | [Njuškalo Scraper](https://apify.com/logiover/njuskalo-hr-property-scraper) |
| 🇮🇪 Ireland | [Daft.ie Scraper](https://apify.com/logiover/daft-ie-scraper) · [MyHome.ie Scraper](https://apify.com/logiover/myhome-ie-scraper) |

👉 Browse all **[logiover scrapers on Apify Store](https://apify.com/logiover)** — 180+ actors across real estate, jobs, crypto, social media & B2B data.

### ⏰ Scheduling & integration

Schedule this Actor on Apify to track the Romanian property market daily or weekly. Export results to JSON, CSV or Excel, sync to Google Sheets, or push to your database, BI tools and webhooks through the Apify API. Connect it to **Make, n8n or Zapier** to build automated real-estate pipelines.

### ⭐ Support & feedback

Found a bug or need an extra field? Open an issue on the **Issues** tab — response is usually fast. If this Actor saves you time, a **★★★★★ review** on the Store page genuinely helps and is hugely appreciated. 🙏

### ⚖️ Legal

This Actor extracts only publicly available data and is intended for legitimate research, analytics and lead-generation use. You are responsible for complying with Storia's terms of service, GDPR and any applicable local laws.

***

### 📝 Changelog

#### 2026-07-06

- ✨ README overhaul: refreshed the output sample and cross-country real-estate suite links, tidied the changelog, and re-verified the field reference against the live `__NEXT_DATA__` schema.

#### 2026-07-05 — Initial release

- Scrapes Storia.ro (Romania) real estate listings via direct HTTP + `__NEXT_DATA__` JSON extraction — no browser, no API key.
- Supports sale/rent, six property types, price (EUR), area, room, market and owner-type filters, sorting, distance radius and multi-location tasks.
- Returns price, price/m², EUR currency, full Romanian address (county, city, Bucharest sector, district), GPS, agency data, image galleries and listing feature tags.

# Actor input Schema

## `locationSlugs` (type: `array`):

URL location paths from Storia. Each slug becomes its own scraping task. Use `toata-romania` for nationwide, a county slug like `cluj` or `ilfov`, or a `judet/oras` path like `timis/timisoara` or `iasi/iasi`. For Bucharest use `bucuresti` (or a sector like `bucuresti/sectorul-3`). Find one by browsing storia.ro, applying the location filter, and copying the path between `/rezultate/{txn}/{type}/` and `?` from the URL. Common slugs are listed in the README.

## `transaction` (type: `string`):

Sale (`vanzare`) or rent (`inchiriere`).

## `propertyType` (type: `string`):

Storia URL category slug.

## `priceMin` (type: `integer`):

Minimum price in euro (Romanian property is priced in EUR). 0 = no minimum.

## `priceMax` (type: `integer`):

Maximum price in euro. 0 = no maximum.

## `areaMin` (type: `integer`):

Minimum surface area. 0 = no minimum.

## `areaMax` (type: `integer`):

Maximum surface area. 0 = no maximum.

## `roomsMin` (type: `integer`):

Minimum room count (1-10). 0 = no minimum.

## `roomsMax` (type: `integer`):

Maximum room count (1-10). 0 = no maximum.

## `market` (type: `string`):

Primary market = developer / new build. Secondary market = resale. ALL = both.

## `ownerType` (type: `string`):

Request private- or agency-only listings. Storia treats this as a soft filter, so every record also carries an authoritative `isPrivate` flag you can filter on downstream.

## `sort` (type: `string`):

Result ordering. Maps to `by` + `direction` query params.

## `distanceRadius` (type: `integer`):

Expand search to nearby areas. Storia supports 0, 5, 10, 15, 25, 50, 75 km.

## `limit` (type: `integer`):

Page size. Storia supports 24, 36, 48, 72.

## `maxListings` (type: `integer`):

Total cap across all location tasks (0 = unlimited).

## `maxPagesPerTask` (type: `integer`):

Pagination depth per location. Storia caps results around page 500 for broad searches. Narrow with price/area for deeper, more relevant inventory.

## `requestDelay` (type: `integer`):

Delay between sequential page requests. Storia is mildly bot-protected — keep ≥ 600ms.

## `maxRetries` (type: `integer`):

Retries per request on HTTP errors (rotates proxy IP).

## `proxyConfiguration` (type: `object`):

Apify Proxy is recommended. Storia deploys mild bot defense — RESIDENTIAL with country=RO is strongly recommended; datacenter often gets blocked.

## Actor input object example

```json
{
  "locationSlugs": [
    "bucuresti"
  ],
  "transaction": "sale",
  "propertyType": "apartment",
  "priceMin": 0,
  "priceMax": 0,
  "areaMin": 0,
  "areaMax": 0,
  "roomsMin": 0,
  "roomsMax": 0,
  "market": "ALL",
  "ownerType": "ALL",
  "sort": "latest",
  "distanceRadius": 0,
  "limit": 72,
  "maxListings": 200,
  "maxPagesPerTask": 5,
  "requestDelay": 800,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "RO"
  }
}
```

# Actor output Schema

## `adId` (type: `string`):

Storia listing ID

## `detailUrl` (type: `string`):

Full URL to the listing page

## `slug` (type: `string`):

URL slug

## `title` (type: `string`):

Listing title

## `shortDescription` (type: `string`):

Card-level description snippet

## `transactionType` (type: `string`):

sale / rent

## `propertyType` (type: `string`):

apartment / house / plot / commercial / ...

## `advertType` (type: `string`):

AGENCY / PRIVATE / DEVELOPER (raw)

## `isPrivate` (type: `string`):

True if posted by private owner

## `market` (type: `string`):

PRIMARY (new) / SECONDARY (resale)

## `price` (type: `string`):

Total price

## `priceCurrency` (type: `string`):

Currency (EUR, RON)

## `pricePerSqm` (type: `string`):

Price per square meter

## `monthlyRent` (type: `string`):

Monthly rent / admin fee. Present on rentals and some sale listings.

## `areaSqm` (type: `string`):

Usable surface area

## `terrainAreaSqm` (type: `string`):

Plot/terrain area (houses, land)

## `rooms` (type: `string`):

Room count

## `floor` (type: `string`):

Floor number/label (GROUND, ABOVE\_TENTH, ...)

## `totalFloors` (type: `string`):

Total floors in the building

## `province` (type: `string`):

County (județ)

## `city` (type: `string`):

City / locality

## `sector` (type: `string`):

Bucharest sector (Sectorul 1-6)

## `district` (type: `string`):

District / neighbourhood

## `subdistrict` (type: `string`):

Sub-district / quarter

## `street` (type: `string`):

Street name

## `postalCode` (type: `string`):

ZIP / postal code (only on detail pages; null in search results)

## `fullAddress` (type: `string`):

Composed address string

## `latitude` (type: `string`):

GPS latitude (only on detail pages; null in search results)

## `longitude` (type: `string`):

GPS longitude (only on detail pages; null in search results)

## `mainImageUrl` (type: `string`):

Cover photo (large)

## `imageUrls` (type: `string`):

All listing images

## `imageCount` (type: `string`):

Total images

## `contactName` (type: `string`):

Listing contact name (agent or private seller)

## `contactLogoUrl` (type: `string`):

Contact avatar / photo URL

## `agencyId` (type: `string`):

Agency ID

## `agencyName` (type: `string`):

Agency display name

## `agencySlug` (type: `string`):

Agency URL slug

## `agencyLogoUrl` (type: `string`):

Agency logo image URL

## `agencyType` (type: `string`):

Agency category from API

## `isExclusive` (type: `string`):

Exclusive offer flag

## `isFeatured` (type: `string`):

Featured / highlighted listing

## `isPromoted` (type: `string`):

Promoted listing

## `hasOpenDay` (type: `string`):

Has scheduled open day

## `investmentName` (type: `string`):

New-build development name (primary market)

## `investmentState` (type: `string`):

Construction state

## `dateCreated` (type: `string`):

Most recent post date

## `dateCreatedFirst` (type: `string`):

First-ever post date

## `pushedUpAt` (type: `string`):

Most recent bump

## `labels` (type: `string`):

Listing feature tags / badges

## `searchTransaction` (type: `string`):

Transaction used in search

## `searchPropertyType` (type: `string`):

Property type used in search

## `searchLocation` (type: `string`):

Location slug used in search

## `searchUrl` (type: `string`):

Full search URL used

## `scrapedAt` (type: `string`):

ISO timestamp

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locationSlugs": [
        "bucuresti"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "RO"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/storia-ro-scraper-romania-real-estate").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locationSlugs": ["bucuresti"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "RO",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/storia-ro-scraper-romania-real-estate").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locationSlugs": [
    "bucuresti"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "RO"
  }
}' |
apify call logiover/storia-ro-scraper-romania-real-estate --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=logiover/storia-ro-scraper-romania-real-estate",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Storia.ro Scraper — Romania Real Estate Data",
        "description": "Scrape real estate listings from Storia.ro — Romania's leading property portal (OLX Group). No browser, no API key. Filter by location, sale/rent, property type, price (EUR), area, rooms and market. Returns price, m², full Romanian address, agency, images and more per listing.",
        "version": "1.0",
        "x-build-id": "CWaR1MOUayuN3Gx8j"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~storia-ro-scraper-romania-real-estate/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-storia-ro-scraper-romania-real-estate",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/logiover~storia-ro-scraper-romania-real-estate/runs": {
            "post": {
                "operationId": "runs-sync-logiover-storia-ro-scraper-romania-real-estate",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/logiover~storia-ro-scraper-romania-real-estate/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-storia-ro-scraper-romania-real-estate",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "locationSlugs"
                ],
                "properties": {
                    "locationSlugs": {
                        "title": "Location Slugs",
                        "type": "array",
                        "description": "URL location paths from Storia. Each slug becomes its own scraping task. Use `toata-romania` for nationwide, a county slug like `cluj` or `ilfov`, or a `judet/oras` path like `timis/timisoara` or `iasi/iasi`. For Bucharest use `bucuresti` (or a sector like `bucuresti/sectorul-3`). Find one by browsing storia.ro, applying the location filter, and copying the path between `/rezultate/{txn}/{type}/` and `?` from the URL. Common slugs are listed in the README.",
                        "default": [
                            "bucuresti"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "transaction": {
                        "title": "Transaction Type",
                        "enum": [
                            "sale",
                            "rent"
                        ],
                        "type": "string",
                        "description": "Sale (`vanzare`) or rent (`inchiriere`).",
                        "default": "sale"
                    },
                    "propertyType": {
                        "title": "Property Type",
                        "enum": [
                            "apartment",
                            "house",
                            "plot",
                            "commercial",
                            "garage",
                            "room"
                        ],
                        "type": "string",
                        "description": "Storia URL category slug.",
                        "default": "apartment"
                    },
                    "priceMin": {
                        "title": "Min Price (EUR)",
                        "minimum": 0,
                        "maximum": 1000000000,
                        "type": "integer",
                        "description": "Minimum price in euro (Romanian property is priced in EUR). 0 = no minimum.",
                        "default": 0
                    },
                    "priceMax": {
                        "title": "Max Price (EUR)",
                        "minimum": 0,
                        "maximum": 1000000000,
                        "type": "integer",
                        "description": "Maximum price in euro. 0 = no maximum.",
                        "default": 0
                    },
                    "areaMin": {
                        "title": "Min Area (m²)",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Minimum surface area. 0 = no minimum.",
                        "default": 0
                    },
                    "areaMax": {
                        "title": "Max Area (m²)",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Maximum surface area. 0 = no maximum.",
                        "default": 0
                    },
                    "roomsMin": {
                        "title": "Min Rooms",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Minimum room count (1-10). 0 = no minimum.",
                        "default": 0
                    },
                    "roomsMax": {
                        "title": "Max Rooms",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum room count (1-10). 0 = no maximum.",
                        "default": 0
                    },
                    "market": {
                        "title": "Market",
                        "enum": [
                            "ALL",
                            "PRIMARY",
                            "SECONDARY"
                        ],
                        "type": "string",
                        "description": "Primary market = developer / new build. Secondary market = resale. ALL = both.",
                        "default": "ALL"
                    },
                    "ownerType": {
                        "title": "Owner Type",
                        "enum": [
                            "ALL",
                            "PRIVATE",
                            "BUSINESS"
                        ],
                        "type": "string",
                        "description": "Request private- or agency-only listings. Storia treats this as a soft filter, so every record also carries an authoritative `isPrivate` flag you can filter on downstream.",
                        "default": "ALL"
                    },
                    "sort": {
                        "title": "Sort Order",
                        "enum": [
                            "latest",
                            "price_asc",
                            "price_desc",
                            "price_per_m_asc",
                            "price_per_m_desc",
                            "area_asc",
                            "area_desc"
                        ],
                        "type": "string",
                        "description": "Result ordering. Maps to `by` + `direction` query params.",
                        "default": "latest"
                    },
                    "distanceRadius": {
                        "title": "Distance Radius (km)",
                        "minimum": 0,
                        "maximum": 75,
                        "type": "integer",
                        "description": "Expand search to nearby areas. Storia supports 0, 5, 10, 15, 25, 50, 75 km.",
                        "default": 0
                    },
                    "limit": {
                        "title": "Listings per Page",
                        "minimum": 24,
                        "maximum": 72,
                        "type": "integer",
                        "description": "Page size. Storia supports 24, 36, 48, 72.",
                        "default": 72
                    },
                    "maxListings": {
                        "title": "Max Listings",
                        "minimum": 0,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Total cap across all location tasks (0 = unlimited).",
                        "default": 200
                    },
                    "maxPagesPerTask": {
                        "title": "Max Pages per Task",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Pagination depth per location. Storia caps results around page 500 for broad searches. Narrow with price/area for deeper, more relevant inventory.",
                        "default": 5
                    },
                    "requestDelay": {
                        "title": "Request Delay (ms)",
                        "minimum": 0,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Delay between sequential page requests. Storia is mildly bot-protected — keep ≥ 600ms.",
                        "default": 800
                    },
                    "maxRetries": {
                        "title": "Max Retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Retries per request on HTTP errors (rotates proxy IP).",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify Proxy is recommended. Storia deploys mild bot defense — RESIDENTIAL with country=RO is strongly recommended; datacenter often gets blocked."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
