# Oikotie Property Scraper (`sian.agency/oikotie-property-scraper`) Actor

Scrape asunnot.oikotie.fi: homes for sale and rent, holiday homes, plots, garages and farms. Prices, m2, rooms, hoitovastike, energy class, GPS and agent contacts.

- **URL**: https://apify.com/sian.agency/oikotie-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.32 / 1,000 property searches

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Oikotie Scraper — Finnish Property, Rental & Agency Data 🚀

[![Store-SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store-Hemnet Scraper](https://img.shields.io/badge/Store-Hemnet%20Scraper-E8412A)](https://apify.com/sian.agency/hemnet-property-scraper?fpr=sian) [![Store-FINN.no Property](https://img.shields.io/badge/Store-FINN.no%20Property-0063FB)](https://apify.com/sian.agency/finn-no-property-scraper?fpr=sian) [![Store-Funda.nl Scraper](https://img.shields.io/badge/Store-Funda.nl%20Scraper-FF6600)](https://apify.com/sian.agency/funda-property-scraper?fpr=sian)

#### 🎉 All ten Oikotie sections, 73 fields per row, and Finland's 1,791 estate-agency offices with phone and email

##### Built for analysts, brokers and proptech teams who need the Finnish market as a table, not as browser tabs

### 🔎 What is the Oikotie Scraper — and when should you use it?

The **Oikotie Scraper** turns any search on Oikotie, the portal Finnish property runs through into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** Finnish asking prices as three separate numbers: the debt-free price, the selling price and the share of housing-company debt. Rows also carry price per m², living area, lot area, room count, the Finnish room layout string, build year, floor out of total floors and WGS84 coordinates. Rental rows swap the sale price for a monthly rent and Oikotie's own view counters. Full detail adds the maintenance and financial fees, the water fee, the energy class, the heating method, completed and planned renovations, the housing company's name and business ID, every photo, and the selling agent's name, title and direct phone. A separate operation returns Finland's estate-agency offices with street address, phone, email, website and Y-tunnus.

**Use something else when:** the market is not Finland. Use [Hemnet Scraper](https://apify.com/sian.agency/hemnet-property-scraper?fpr=sian) for Sweden, including the sold-price archive. Use [FINN.no Property Scraper](https://apify.com/sian.agency/finn-no-property-scraper?fpr=sian) for Norway, across all seven Eiendom sections. Use [Funda.nl Scraper](https://apify.com/sian.agency/funda-property-scraper?fpr=sian) for the Netherlands, with price per m² and agents. This actor reads live Oikotie listings only. Finland publishes realised transaction prices through the tax administration rather than the portal, so sold prices are not available here — a listing disappearing between two scheduled runs is the closest signal. Tori.fi needs no separate actor: its property vertical closed and merged into Oikotie in autumn 2023. Oikotie's condition filter is deliberately not exposed, because two of its values return identical result counts and the mapping could not be proved from live data.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/oikotie-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want to research the Finnish property market, including its rental, holiday, land and commercial inventory using the Apify Actor `sian.agency/oikotie-property-scraper`.

Use it when I need: Finnish asking prices as three separate numbers: the debt-free price, the selling price and the share of housing-company debt. Rows also carry price per m², living area, lot area, room count, the Finnish room layout string, build year, floor out of total floors and WGS84 coordinates. Rental rows swap the sale price for a monthly rent and Oikotie's own view counters. Full detail adds the maintenance and financial fees, the water fee, the energy class, the heating method, completed and planned renovations, the housing company's name and business ID, every photo, and the selling agent's name, title and direct phone. A separate operation returns Finland's estate-agency offices with street address, phone, email, website and Y-tunnus.

Don't use it when: the market is not Finland — use hemnet-property-scraper or finn-no-property-scraper or funda-property-scraper instead.

How to call it: pick one `operation` per run. `search` takes a `section` — `homesForSale`, `homesForRent`, `holidayHomesForSale`, `holidayHomesForRent`, `plots`, `forestAndFarms`, `garagesForSale`, `garagesForRent`, `commercialForSale` or `commercialForRent` — and a `locations` list of plain Finnish place names, which may be cities, districts, regions or postcode areas; leave `locations` empty to sweep the whole country. Narrow with `minPrice`, `maxPrice`, `minSizeSqm`, `maxSizeSqm`, `rooms` (`any`, `1` to `6`, or `7plus`), `propertyType` (the Finnish building categories, from `apartmentBuilding` to `woodenApartment`), `minYearBuilt`, `maxYearBuilt` and `newDevelopmentOnly`, then order the result with `sortBy` and cap it with `maxResults`. Set `fullDetails` to true to fetch each listing's own page as well, which is what carries the fees, the renovation history and the agent's phone, billed once per enriched row. To expand listings you already have, set `operation` to `listingDetail` and pass `listingUrls`, which takes full Oikotie listing URLs; Apify validates the field as a URL list, so a bare listing number is refused. To build a lead list instead, set `operation` to `agencyDirectory`, optionally filtering by city through `locations` and by name through `agencyQuery`..

Start with this input:
{
  "operation": "search",
  "section": "homesForSale",
  "locations": [
    "Helsinki",
    "Espoo"
  ],
  "rooms": "2",
  "maxPrice": 300000,
  "sortBy": "newest",
  "maxResults": 120
}

Ask me which Finnish areas they want, which section they mean, and whether they need the full record with fees and agent contacts or just the search rows, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull every two-room flat under 300,000 euros in Helsinki and Espoo and give me the median price per m² by district.*
- *Find rentals in Tampere posted this week, fetch the full record for the five cheapest, and list the agents with their phone numbers.*
- *List every estate-agency office in Turku that publishes an email address, with their business IDs so I can join them to the trade register.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/oikotie-property-scraper.md](https://apify.com/sian.agency/oikotie-property-scraper.md).

### 📋 Overview

**Finland's property market lives on one portal now.** Oikotie carries the country's homes for sale and to rent, its holiday homes, plots, forest estates, garages and commercial premises — and this Actor reads all ten of those sections through one input form.

**What you get:**

- ✅ **Ten sections, one selector**: homes for sale (142,200 live listings), homes to rent (26,500), holiday homes, plots, forest and farm estates, garages and commercial premises.
- ⚡ **100 listings per request**: a full sweep of Helsinki's for-sale stock is a single run, and paging stays valid deep into a result set.
- 🎯 **73 fields per row**, typed from real listings rather than guessed: numbers arrive as numbers, dates as timestamps, photos as URLs.
- 💰 **Charged per row returned**: an area that matched nothing, or a listing that had been withdrawn, costs you nothing.
- 💎 **An agency directory no rival Oikotie actor ships**: 1,791 Finnish brokerage offices with street address, phone, email, website and Y-tunnus.
- ✨ **Finnish price structure done properly**: debt-free price, selling price and share of housing-company debt come back as three separate numbers, the way a Finnish buyer reads them.

### ✨ Features

- 🏘️ **Section selector**: pick homes, rentals, holiday homes, plots, forest estates, garages or commercial premises without learning a URL scheme.
- 📍 **Plain Finnish place names**: type Helsinki, Kallio, Uusimaa or a postcode area and the Actor resolves it against Oikotie's own location tree at run time.
- 📐 **Filters that run on the portal**: price, living area, room count, building type, construction year and new-developments-only are applied before rows are counted, so a narrow search is a cheap search.
- 📄 **Full-detail mode**: switch it on and every row gains fees, energy class, renovation history, every photo and the agent's direct phone.
- 🧾 **Housing-company paperwork**: maintenance fee, financial fee, water fee, lot ownership, the company name and its business ID.
- 🧑‍💼 **Agent and agency contacts**: name, job title, photo, direct phone, plus the office's phone, website and address.
- 🗺️ **Coordinates on every listing**: latitude and longitude in WGS84, ready to map.
- 📈 **Change signals for free**: publication date, price-change timestamp, next viewing slot and Oikotie's own view counters.
- 🏢 **National agency directory**: every brokerage office in Finland, filterable by city and by name.
- 🔄 **Schedule-friendly**: run the same search daily and the diff gives you new listings, price cuts and stale stock.

### 🎬 Quick Start

Pick an operation, name the areas you care about, press Start. Results land in the dataset as JSON, CSV or Excel, and a run report with the highlights is written to the key-value store. The default input works as-is — a bare run returns the newest homes for sale in Helsinki.

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~oikotie-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","section":"homesForSale","locations":["Helsinki"],"maxResults":100}'
```

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what to scrape

Pick an operation — Property Search, Listing Detail or Estate Agency Directory — and, for a search, the Oikotie section.

#### Step 2: Name your areas

Type Finnish place names into Areas: cities, districts, regions or postcode areas. Leave it empty to sweep the whole country.

#### Step 3: Set your budget and run

Max results caps the rows the run returns and bills for. Press Start.

**That's it! In about a minute, you'll have:**

- A structured table of live Finnish listings
- Prices, sizes, coordinates and agency names on every row
- A run report with the links and the exact charges

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `search`, `listingDetail` or `agencyDirectory`. Defaults to `search`. |
| `section` | string | No | Which Oikotie section to search. Defaults to `homesForSale`. |
| `locations` | array | No | Finnish place names. Empty means all of Finland. |
| `sortBy` | string | No | `newest`, `oldest`, `priceAsc`, `priceDesc` or `largest`. |
| `maxResults` | integer | No | Row ceiling for the whole run. Defaults to 50. |
| `minPrice` / `maxPrice` | integer | No | Asking price in euros, or monthly rent for rental sections. 0 means no bound. |
| `minSizeSqm` / `maxSizeSqm` | integer | No | Living area in m². 0 means no bound. |
| `rooms` | string | No | `any`, `1`–`6` or `7plus`. |
| `propertyType` | string | No | Finnish building category: kerrostalo, rivitalo, omakotitalo and the rest. |
| `minYearBuilt` / `maxYearBuilt` | integer | No | Construction year bounds. 0 means no bound. |
| `newDevelopmentOnly` | boolean | No | Keep only uudiskohteet. |
| `fullDetails` | boolean | No | Fetch each listing's full record, including the agent's phone. |
| `listingUrls` | array | No | Oikotie listing URLs, for the Listing Detail operation. |
| `agencyQuery` | string | No | Filter the agency directory by name or parent group. |

**Example:**

```json
{
  "operation": "search",
  "section": "homesForSale",
  "locations": ["Helsinki", "Espoo"],
  "rooms": "2",
  "maxPrice": 300000,
  "sortBy": "newest",
  "maxResults": 200
}
```

**Listing detail from a shortlist:**

```json
{
  "operation": "listingDetail",
  "listingUrls": [
    "https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/24678422",
    "https://asunnot.oikotie.fi/vuokra-asunnot/helsinki/24661093"
  ]
}
```

**Agency lead list:**

```json
{
  "operation": "agencyDirectory",
  "locations": ["Turku"],
  "maxResults": 100
}
```

### 📤 Output

Results are saved to the Apify dataset with **73 fields** including:

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | number | Oikotie's own listing ID |
| `listingUrl` | string | Link to the listing |
| `headline` | string | The seller's headline |
| `priceEur` | number | Debt-free price (velaton hinta) |
| `sellingPriceEur` | number | Selling price (myyntihinta) |
| `shareOfDebtEur` | number | Share of housing-company debt |
| `rentPerMonthEur` | number | Monthly rent, on rental sections |
| `pricePerSqmEur` | number | Price per m², on sale sections |
| `sizeSqm` | number | Living area |
| `rooms` | number | Room count |
| `streetAddress` / `district` / `city` | string | Where it is |
| `latitude` / `longitude` | number | WGS84 coordinates |
| `energyClass` | string | Energy certificate class and year |
| `maintenanceFeeEur` | number | Hoitovastike, per month |
| `agentName` / `agentPhone` | string | The selling agent and their direct number |
| `agencyName` / `agencyBusinessId` | string | The brokerage and its Y-tunnus |

**Example:**

```json
{
  "listingId": 24678422,
  "listingUrl": "https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/24678422",
  "headline": "RT 4 h, k, kph, s",
  "section": "Homes for sale",
  "propertyType": "Rivitalo",
  "priceText": "179 000 €",
  "priceEur": 179000,
  "sellingPriceEur": 112139.4,
  "shareOfDebtEur": 66860.6,
  "pricePerSqmEur": 1851.09,
  "sizeSqm": 96.7,
  "rooms": 4,
  "roomLayout": "RT 4 h, k, kph, s",
  "streetAddress": "Uittamontie 4, 00940 Helsinki",
  "district": "Vesala",
  "city": "Helsinki",
  "postalCode": "00940",
  "region": "Uusimaa",
  "latitude": 60.2475154231,
  "longitude": 25.0828770784,
  "buildYear": 1975,
  "maintenanceFeeEur": 392.22,
  "financialFeeEur": 305.06,
  "waterFeeEur": 24,
  "energyClass": "D, 2018",
  "heating": "Kaukolämpö, Vesikiertoinen keskuslämmitys, Patteri",
  "housingCompanyName": "Asunto-oy Vesalan pientalot",
  "housingCompanyBusinessId": "0221622-7",
  "hasSauna": true,
  "agentName": "Nina Kyyhkyläinen-Kallioniemi",
  "agentPhone": "+358 50 4200303",
  "agencyName": "Vantaan Habita Oy, Habita Vantaa",
  "photoCount": 16
}
```

### 💼 Use Cases & Examples

#### 1. Finnish Housing Market Analysis

**Analysts and valuers who need a price index at district granularity, not a national average.**

**Input:** A section, a list of municipalities, and a generous max results.
**Output:** Debt-free price, selling price, share of debt, living area, build year and energy class on every row.
**Use:** Compute price per m² by district and track it week over week.

#### 2. Estate Agent & Agency Lead Lists

**Proptech vendors and recruiters selling into Finnish brokerages.**

**Input:** The Estate Agency Directory operation, optionally filtered by city or by group name.
**Output:** 1,791 offices with street address, phone, email, website, business ID and parent group.
**Use:** Load it into a CRM and join it to the trade register on the Y-tunnus.

#### 3. Rental Yield & Portfolio Monitoring

**Landlords and rental operators benchmarking against live comparables.**

**Input:** The rentals section, the districts you own in, and a rent range.
**Output:** Monthly rent, size, rooms, floor, build year and Oikotie's own view counters.
**Use:** See which asking rents attract interest before you set yours.

#### 4. Housing Company Due Diligence

**Buyers, brokers and lenders reading the paperwork behind a flat.**

**Input:** Listing Detail with a shortlist of URLs.
**Output:** Maintenance fee, financial fee, water fee, heating method, completed renovations, planned renovations and the housing company's business ID.
**Use:** Compare five candidate flats on their real monthly cost, in one table.

#### 5. New-Build and Plot Pipeline Tracking

**Developers and land buyers watching where Finnish supply comes from.**

**Input:** New developments only, or the plots and forest-and-farm sections.
**Output:** Lot area, ownership type, coordinates and asking price.
**Use:** Map the pipeline months before it reaches the resale market.

#### 6. Price Drop & Days-on-Market Alerting

**Agents and buyers hunting for motivated sellers.**

**Input:** The same search, on a daily schedule.
**Output:** Publication date and price-change timestamp on every row.
**Use:** Diff two runs and you have today's price cuts and this month's stale stock.

#### 7. Commercial Property Sourcing

**Tenant reps and occupiers looking at Finnish office and retail space.**

**Input:** The commercial sections, plus a size range.
**Output:** Asking rent or price, floor area, address and the marketing agency.
**Use:** Build a shortlist of premises without opening a single browser tab.

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/oikotie-property-scraper').call({
  operation: 'search',
  section: 'homesForSale',
  locations: ['Helsinki'],
  maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/oikotie-property-scraper').call(
    run_input={
        'operation': 'search',
        'section': 'homesForRent',
        'locations': ['Tampere'],
        'maxResults': 100,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~oikotie-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"agencyDirectory","locations":["Turku"],"maxResults":100}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule or webhook
2. **HTTP Request**: Call the Actor API
3. **Process**: Handle the JSON results
4. **Action**: Save to a sheet, alert on price cuts, or push into a CRM

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 rows** per run, with every field and every section available
- No credit card required
- Enough to see whether the data fits your model

#### PAID Tier (Production Ready)

- **Unlimited** rows per run, up to the ceiling you set
- Pay per row returned: an area that matched nothing, and a listing that had been withdrawn, cost you nothing

💰 **Priced under the two most-installed Oikotie actors on the Store**, and it covers nine sections and an agency directory that neither of them does.

🔗 [View current pricing](https://apify.com/sian.agency/oikotie-property-scraper?fpr=sian)

### ❓ Frequently Asked Questions

**Q: Do I need an API key, a login or a proxy?**
A: No. Give it an area and press Start.

**Q: How many rows can I get?**
A: FREE tier: 25 per run. PAID tier: as many as the section holds. Helsinki's for-sale stock alone is about 8,100 rows, and paging stays valid deep into a result set.

**Q: What do I put in Areas?**
A: Plain Finnish place names. A city (Helsinki, Tampere), a district (Kallio, Töölö), a region (Uusimaa) or a postcode area all resolve, because the name is matched against Oikotie's own location tree at run time.

**Q: Why are some prices two numbers?**
A: Finnish flats are sold as housing-company shares, so a listing carries a debt-free price and a selling price. The difference is the share of company debt attached to the flat. Rows give you all three, and price per m² is computed on the debt-free price, the same way Oikotie shows it.

**Q: Can I get sold prices?**
A: No. Oikotie publishes live listings, not completed transactions, so you get asking prices and price changes. A listing disappearing between two scheduled runs is the closest available signal.

**Q: Is Tori.fi covered too?**
A: There is nothing left to cover. Tori's property vertical closed and merged into Oikotie in autumn 2023.

**Q: What output formats are available?**
A: JSON, CSV and Excel, exported straight from the Apify dataset.

**Q: Is this legal?**
A: Yes. Only publicly available data is collected; see the legal section below.

### 🐛 Troubleshooting

**"Oikotie does not know the area …"**

- Check the Finnish spelling, including ä and ö.
- Try the parent area: a district that is too small to have its own node resolves under its city.

**A search returns fewer rows than Max results**

- The filters matched fewer listings than your ceiling. The run log prints the total Oikotie reported for each area before paging starts.

**A listing detail comes back "no longer live"**

- The listing was withdrawn or sold. Re-run the search to pick up its replacement; you are not charged for it.

**Rental rows have no price per m²**

- That is deliberate. A rental's rent per m² is a monthly figure, and mixing it into the same column as a sale price per m² would make any average over a mixed export meaningless.

**An agency row has no phone or email**

- Not every office publishes both. The directory returns whatever that office chose to make public; the address and business ID are always there.

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

Oikotie is a trademark of Vend Suomi Oy. This Actor is not affiliated with, endorsed by, or sponsored by Oikotie.

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

Pick one per run. Property Search sweeps Oikotie's own card endpoint by area and filter and returns 100 listing rows per call, across all ten Oikotie sections. Listing Detail takes Oikotie listing URLs or numeric ids and returns the full record — housing-company fees, energy class, renovation history, every photo and the selling agent's direct phone. Estate Agency Directory returns Finland's registered Oikotie brokerage offices with phone, email, website and business ID.

## `section` (type: `string`):

Which part of Oikotie to search. Homes for sale is the big one (142,200 live listings) and homes to rent holds 26,500. Each section returns a slightly different row shape: rentals carry a monthly rent instead of an asking price, plots and forest estates carry lot area but no living area, and commercial premises live on Oikotie's toimitilat front so their URLs point there. Ignored by the Listing Detail and Estate Agency Directory operations.

## `locations` (type: `array`):

Finnish place names: Helsinki, Espoo, Tampere, Turku, Oulu, Jyväskylä, Kallio, Uusimaa. Each name is matched against Oikotie's own live location tree, so a city, a city district, a region or a postcode area all work and spelling follows Oikotie. One search runs per area, in the order you list them, and every area shares the single Max results budget below. Leave empty to sweep the whole of Finland. The Estate Agency Directory uses this list too — it keeps only offices in the cities you name.

## `sortBy` (type: `string`):

Newest first is what you want for monitoring a market on a schedule — a daily run then only has to read the top of the list. Price, low to high is the one that surfaces the cheap end of a district.

## `maxResults` (type: `integer`):

Hard ceiling on the rows this run returns and bills for, shared across every area you listed. 50 is a cheap look at a market; a full sweep of Helsinki's for-sale stock is about 8,100. Paging is 100 rows per request, so the run costs the same per row whatever you set.

## `minPrice` (type: `integer`):

Lowest asking price to include, in euros. For rentals this is the monthly rent. 0 means no lower bound.

## `maxPrice` (type: `integer`):

Highest asking price to include, in euros. For rentals this is the monthly rent. 0 means no upper bound.

## `minSizeSqm` (type: `integer`):

Smallest living area to include, in square metres. 0 means no lower bound. Plots and forest estates are filtered on lot area instead.

## `maxSizeSqm` (type: `integer`):

Largest living area to include, in square metres. 0 means no upper bound.

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

Oikotie counts rooms the Finnish way — a yksiö is 1, a kaksio is 2, and the kitchen is not counted. 7 rooms or more asks Oikotie for every count from 7 up.

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

Finnish building categories as Oikotie files them. Kerrostalo dominates the cities — 828 of the first 1,000 Helsinki for-sale listings — while omakotitalo and rivitalo carry the suburbs. Ignored for plots, forest estates and garages, which have no building type.

## `minYearBuilt` (type: `integer`):

Earliest construction year to include. 0 means no lower bound. Useful for skipping the 1970s pipe-renovation cohort.

## `maxYearBuilt` (type: `integer`):

Latest construction year to include. 0 means no upper bound.

## `newDevelopmentOnly` (type: `boolean`):

Keep only uudiskohteet — units sold new by the developer rather than resold by an owner. About a quarter of Helsinki's for-sale stock.

## `fullDetails` (type: `boolean`):

Off, a search row carries what Oikotie's result cards carry: price, size, rooms, address, coordinates, agency and agent name. On, each row also gets its listing page fetched for the full description, housing-company fees, energy class, renovation history, every photo and the agent's direct phone — one extra request per row, billed as one Detail Enrichment. Leave it off for a wide market sweep and on for a shortlist.

## `listingUrls` (type: `array`):

Used by the Listing Detail operation only. Paste Oikotie listing URLs — https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/24678422, or the toimitilat equivalent for commercial premises. Apify validates this field as a URL list, so a bare listing number is rejected before the run starts; copy the address bar instead. Upload a file or link a Google Sheet to run a saved shortlist.

## `agencyQuery` (type: `string`):

Used by the Estate Agency Directory operation only. Keeps offices whose name, official name or parent group contains this text — Habita, Kiinteistömaailma, OP Koti, RE/MAX. Leave empty for every office in the areas you listed, or for all 1,791 offices in Finland if you listed none.

## Actor input object example

```json
{
  "operation": "search",
  "section": "homesForSale",
  "locations": [
    "Helsinki",
    "Espoo"
  ],
  "sortBy": "newest",
  "maxResults": 50,
  "minPrice": 0,
  "maxPrice": 0,
  "minSizeSqm": 0,
  "maxSizeSqm": 0,
  "rooms": "any",
  "propertyType": "any",
  "minYearBuilt": 0,
  "maxYearBuilt": 0,
  "newDevelopmentOnly": false,
  "fullDetails": false,
  "listingUrls": [
    "https://asunnot.oikotie.fi/myytavat-asunnot/helsinki/24678422"
  ],
  "agencyQuery": ""
}
```

# Actor output Schema

## `oikotieListings` (type: `string`):

Every listing this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search",
    "section": "homesForSale",
    "locations": [
        "Helsinki"
    ],
    "sortBy": "newest",
    "maxResults": 50,
    "minPrice": 0,
    "maxPrice": 0,
    "minSizeSqm": 0,
    "maxSizeSqm": 0,
    "rooms": "any",
    "propertyType": "any",
    "minYearBuilt": 0,
    "maxYearBuilt": 0,
    "newDevelopmentOnly": false,
    "fullDetails": false,
    "listingUrls": [],
    "agencyQuery": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/oikotie-property-scraper").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 = {
    "operation": "search",
    "section": "homesForSale",
    "locations": ["Helsinki"],
    "sortBy": "newest",
    "maxResults": 50,
    "minPrice": 0,
    "maxPrice": 0,
    "minSizeSqm": 0,
    "maxSizeSqm": 0,
    "rooms": "any",
    "propertyType": "any",
    "minYearBuilt": 0,
    "maxYearBuilt": 0,
    "newDevelopmentOnly": False,
    "fullDetails": False,
    "listingUrls": [],
    "agencyQuery": "",
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/oikotie-property-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "operation": "search",
  "section": "homesForSale",
  "locations": [
    "Helsinki"
  ],
  "sortBy": "newest",
  "maxResults": 50,
  "minPrice": 0,
  "maxPrice": 0,
  "minSizeSqm": 0,
  "maxSizeSqm": 0,
  "rooms": "any",
  "propertyType": "any",
  "minYearBuilt": 0,
  "maxYearBuilt": 0,
  "newDevelopmentOnly": false,
  "fullDetails": false,
  "listingUrls": [],
  "agencyQuery": ""
}' |
apify call sian.agency/oikotie-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/oikotie-property-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mODcXMDDOVKc3461q/builds/yLodBEpzVFoDLMnkv/openapi.json
