# Oikotie Scraper \[$0.5/1k💰] | Finnish Property & Rent Data (`ahmed_jasarevic/oikotie-fi-scraper`) Actor

Scrape Oikotie.fi — Finland's largest property marketplace — for sale, rent and business listings with debt-free price, EUR/m², energy class, fees and agent direct-contact data. Built on the internal JSON API: no browser, no key, $0.0005 per listing.

- **URL**: https://apify.com/ahmed\_jasarevic/oikotie-fi-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 33.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.48 / 1,000 listings

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Oikotie Fi Scraper — Finnish Real Estate & Rental Data

Scrape **Oikotie.fi** — Finland's largest real-estate marketplace — for sale apartments, rent apartments and business premises, with debt-free price, EUR/m², energy class, fees, GPS coordinates, and the **responsible agent's name, direct phone and email**. Also exports the full **estate-agency directory** (~1,800 offices with Y-tunnus). Built on Oikotie's internal JSON API — no browser, fast, cheap.

### Main Use Cases

- **Finnish property price monitoring** — track asking prices, debt-free prices and EUR/m² trends across Helsinki, Espoo, Tampere, Turku and all Finnish cities.
- **Real-estate lead generation** — build contact lists of active listings with the responsible agent's direct phone and email.
- **Rental market research** — monitor rent levels, security deposits, pet policies and maintenance fees (hoitovastike) over time.
- **Estate-agency directory building** — export all ~1,800 Finnish real-estate offices with phone, email, website and Y-tunnus.
- **Market & competitive intelligence for brokerages** — track inventory, pricing patterns and listing volumes by city/agency.

### How It Works

The actor calls Oikotie's **internal JSON API** directly (reverse-engineered from the site, no browser needed). Listing search results and per-listing detail pages are fetched **in parallel**, so a 100-listing run with full enrichment typically completes in under a minute on a 512 MB container. Output lands in a clean Apify dataset — ready for API access, scheduling, CSV/Excel/JSON export and CRM/BI pipelines.

### Monitor Finnish Property Prices Without the Official Oikotie API

Oikotie's official API (docs.asunnot.oikotie.fi) is a **partner API for real-estate agencies** — it requires a commercial contract and an API key, and is built for listing management (creating/updating own ads), not for market research. This actor reads the same listing data the public site exposes, no contract needed. Run it on a schedule per city or listing type to build your own Finnish housing market history.

### Extract Real Estate Agent Contacts for Lead Generation

Every listing can be enriched with the **responsible agent's direct phone and email** (`agentName`, `agentPhone`, `agentEmail`, plus `agencyName`/`agencyEmail` and the agency's profile URL). Perfect for relocation analysts, proptech CRMs and brokerages hunting listing mandates — the `agent-contact` event is billed per enriched row (see Pricing).

### Export the Finnish Estate-Agency Directory

Enable `scrapeCompanies` to export the complete directory of ~1,800 Finnish real-estate offices: `name`, `officialName`, `tradeRegistryNumber` (Y-tunnus), `phone`, `email`, `website`, `streetAddress`, `city`, `zipCode`, `parentName` — a ready-made B2B contact database for proptech and lead-gen teams.

### Input

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `cardTypes` | array | No | `["100"]` | Verticals: `100` sale apartments, `101` rent apartments, `106` business premises (toimitilat). Empty = directory-only mode. |
| `locations` | array | No | `[]` | Finnish city/district names, e.g. `["Helsinki","Espoo","Tampere"]`. Empty = all of Finland. |
| `sort` | string | No | `published_sort_desc` | Newest first, oldest first, price asc/desc, size asc/desc, most viewings, most popular. |
| `maxItems` | integer | No | `100` | Max listings per run (`0` = all ~55,000 sale / ~25,000 rent / ~40,000 business listings). |
| `maxConcurrency` | integer | No | `40` | Parallel HTTP requests, `1`–`50`. Raise it to finish enrichment faster. |
| `enrichDetails` | boolean | No | `true` | Fetch each listing's detail API: debt-free price, energy class, fees, full address. |
| `enrichContacts` | boolean | No | `true` | Fetch each listing page for the agent's name, direct phone and email. |
| `scrapeCompanies` | boolean | No | `false` | Also scrape the estate-agency directory (~1,800 offices). |
| `maxCompanies` | integer | No | `0` | Max offices when directory mode is on (`0` = all). |
| `proxy` | object | No | off | Not required for the API; enable only for very large runs. |

### Example Input

```json
{
  "cardTypes": ["100", "101"],
  "locations": ["Helsinki", "Espoo"],
  "enrichDetails": true,
  "enrichContacts": true,
  "maxItems": 500
}
```

### Example Output (listing row)

```json
{
  "cardId": 24703523,
  "cardType": 100,
  "url": "https://asunnot.oikotie.fi/myytavat-asunnot/mustasaari/24703523",
  "price": "105 000 €",
  "priceNumeric": 105000,
  "debtFreePrice": 108432.39,
  "shareOfLiabilities": 3432.39,
  "pricePerSqm": 1750,
  "size": 60,
  "rooms": 2,
  "buildYear": 1989,
  "maintenanceFee": 204,
  "energyClass": "E",
  "address": "Juhontie 5",
  "formattedAddress": "Juhontie 5, 65610 Mustasaari",
  "city": "Mustasaari",
  "latitude": 63.108526,
  "longitude": 21.673567,
  "agentName": "Katja Jansson",
  "agentPhone": "+358505422147",
  "agencyName": "Oy Optima LKV Ab",
  "agencyEmail": "info@optima-lkv.fi",
  "published": "2026-09-22 06:27:52"
}
```

#### Company directory row

`companyId`, `name`, `officialName`, `tradeRegistryNumber` (Y-tunnus), `phone`, `email`, `website`, `streetAddress`, `city`, `zipCode`, `parentName`.

### Track Rental & Sale Market Trends by City

With `locations` you can scope a run to any Finnish city or district (district-level names like `Kallio` work too). Combine with daily scheduling to capture rent and price movement over time — the actor resolves location names to Oikotie's internal IDs for you.

### Integrations & Automation

- **Apify API** — pipe listing rows into a price-tracking dashboard, CRM or BI tool.
- **Webhooks** — alert on new listings in a chosen city or district.
- **Scheduling** — daily price monitoring, weekly lead exports.
- **Export** — JSON, CSV, Excel, HTML.

*Recommended schedule:* daily for price/rent monitoring and new-listing alerts; weekly for agency-directory refreshes.

### Related Actors

- [Oikotie Scraper – Real Estate Listings](https://apify.com/studio-amba/oikotie-scraper) — Oikotie listings with prices, addresses and images (sale + rent).
- [Asunnot Oikotie.fi Real Estate Scraper](https://apify.com/rigelbytes/asunnot-oikotie-fi) — searchable Oikotie listings with optional detail enrichment.
- [Oikotie.fi Scraper – Finnish Real Estate Listings](https://apify.com/santamaria-automations/oikotie-fi-scraper) — buy/rent Oikotie listings with broker details.
- [Oikotie Property Scraper](https://apify.com/sian.agency/oikotie-property-scraper) — full-detail Oikotie listings incl. energy class and agent direct phone.
- [Oikotie Property Search Scraper](https://apify.com/stealth_mode/oikotie-property-search-scraper) — card-level Oikotie data with media and company info.

### FAQ

#### Why use this actor instead of the official Oikotie API?

Oikotie's official Asunnot API (docs.asunnot.oikotie.fi) requires a **commercial partnership contract and an API key**, and is built for agencies to manage their own listings — it is not a public market-data API. This actor uses Oikotie's internal JSON API with **no contract, no key and no browser**, and adds data the partner API doesn't conveniently expose for research (agent contacts, agency directory, EUR/m²).

#### What are alternatives to this actor / Finnish housing data?

- [studio-amba/oikotie-scraper](https://apify.com/studio-amba/oikotie-scraper) — basic Oikotie listings ($0.002/result).
- [rigelbytes/asunnot-oikotie-fi](https://apify.com/rigelbytes/asunnot-oikotie-fi) — searchable listings (+$0.0019 detail).
- [santamaria-automations/oikotie-fi-scraper](https://apify.com/santamaria-automations/oikotie-fi-scraper) — buy/rent listings (+$0.005 detail).
- Official sources: Tilastokeskus (Statistics Finland) housing-price indices, Kela/AVI datasets — aggregate statistics, not listing-level data.

#### How can I get the whole Oikotie catalog?

Set `maxItems: 0` with `cardTypes: ["100"]` to paginate through all ~55,000 sale listings, `["101"]` for ~25,000 rentals, or `["106"]` for ~40,000 business premises.

#### What is the best way to watch Helsinki apartment prices?

Run daily with `locations: ["Helsinki"]`, `cardTypes: ["100"]` and `enrichDetails: true` — compare `priceNumeric`, `debtFreePrice` and `pricePerSqm` across runs in one dataset.

#### How do I extract agent contacts only?

Set `enrichDetails: false`, `enrichContacts: true` (fast + cheap), or enable only `scrapeCompanies: true` to get the full agency directory without listings.

### SEO Keywords

oikotie scraper, finnish real estate data, oikotie asunnot, oikotie vuokra-asunnot, myytävät asunnot, helsinki apartment prices, finland property prices, suomen asuntomarkkinat, oikotie agent contacts, estate agency directory finland, y-tunnus business data, debt-free price data, hoitovastike data, rent price monitoring, oikotie api alternative, finnish housing market intelligence, proptech lead generation, toimitilat data

### For AI Agents & LLM Apps

- **Purpose:** given listing verticals (`cardTypes`), Finnish city/district names (`locations`) and optional enrichment flags, returns one row per Oikotie listing with price fields, property attributes, GPS coordinates, and agent/agency contact data (or one row per estate-agency office in directory mode).
- **Minimal input:**

```json
{ "cardTypes": ["100"], "locations": ["Helsinki"], "maxItems": 50 }
```

- **Variant — rent monitoring:**

```json
{ "cardTypes": ["101"], "locations": ["Tampere"], "enrichDetails": true, "maxItems": 200 }
```

- **Variant — directory only:**

```json
{ "cardTypes": [], "scrapeCompanies": true, "maxCompanies": 100 }
```

- **Output field list (listings dataset):** `cardId`, `cardType`, `url`, `price`, `priceNumeric`, `debtFreePrice`, `shareOfLiabilities`, `pricePerSqm`, `size`, `rooms`, `buildYear`, `startOfUseYear`, `apartmentCondition`, `maintenanceFee`, `managementCharge`, `financialFee`, `energyClass`, `heatingInfo`, `vistaInfo`, `balconyInfo`, `renovationInfo`, `renovationFutureInfo`, `fullDescription`, `address`, `formattedAddress`, `city`, `district`, `zipCode`, `county`, `latitude`, `longitude`, `housingCompanyName`, `housingCompanyBusinessId`, `agentName`, `agentPhone`, `agentEmail`, `agentPictureUrl`, `agentProfileUrl`, `agencyName`, `agencyEmail`, `agencyUrl`, `rentPerMonth`, `securityDeposit`, `rentTermInfo`, `petsAllowed`, `published`.
- **Companies dataset field list:** `companyId`, `name`, `officialName`, `tradeRegistryNumber`, `phone`, `email`, `website`, `streetAddress`, `city`, `zipCode`, `parentName`.

Behaviors an agent should know:

- `scrapeCompanies: true` **replaces** listing mode — leave `cardTypes` empty for directory-only runs, or you get listings + companies mixed.
- `maxItems: 0` means "everything" (up to ~55k sale / ~25k rent / ~40k business listings), not "nothing" — cap it explicitly for test runs.
- `locations` accept Finnish city **or district** names and are auto-resolved to Oikotie internal IDs.
- **No proxy needed** on the internal JSON API — keep `proxy` off.
- Energy class is parsed from all Oikotie formats (e.g. `D2018`, `Energialuokka: C2018`); some listings legitimately lack energy class/fees → those fields are `null`.
- **Billing:** pay-per-event — `listing` example price $0.0005/row (always billed), `listing-detail` +$0.001/row when `enrichDetails` on, `agent-contact` +$0.001/row when `enrichContacts` on, `company-detail` +$0.001/office (directory mode) + Actor Start ~$0.00005. Example prices per the actor README — actual prices are set by the publisher.

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Oikotie (Sanoma Media Finland). It reads only publicly available listing data via the same internal JSON API the Oikotie website uses — no login bypass, no paid account. Users are responsible for complying with Oikotie's Terms of Service and applicable Finnish and EU data-protection law (GDPR). Listings and directory data should be used for legitimate market research and business purposes.

# Actor input Schema

## `cardTypes` (type: `array`):

Which Oikotie verticals to scrape. Valid values: 100 = sale apartments (myytävät asunnot), 101 = rent apartments (vuokra-asunnot), 106 = business premises (toimitilat). Leave empty to scrape only the estate-agency directory when scrapeCompanies is enabled.

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

Optional list of Finnish city or district names to filter by, e.g. \["Helsinki", "Espoo", "Tampere"]. Leave empty to scrape all of Finland.

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

Sort order of the results.

## `maxItems` (type: `integer`):

Maximum number of listings to scrape per run (0 = all matching results).

## `maxConcurrency` (type: `integer`):

How many HTTP requests to run in parallel (1-50). Higher values make the run finish faster; the default of 40 is a good balance between speed and load on Oikotie servers.

## `enrichDetails` (type: `boolean`):

Fetch each listing's detail API for debt-free price (share of liabilities), energy class, fees and full address. Adds one API call per listing. Billed per listing as the "listing-detail" pay-per-event event.

## `enrichContacts` (type: `boolean`):

Fetch each listing page to extract the real-estate agent's name, direct phone and email. Adds one page fetch per listing. Billed per listing as the "agent-contact" pay-per-event event.

## `scrapeCompanies` (type: `boolean`):

Also scrape the Oikotie estate-agency directory (~1,800 offices) with phone, email and Y-tunnus (business ID). Billed per office as the "company-detail" pay-per-event event.

## `maxCompanies` (type: `integer`):

Maximum number of estate-agency offices to scrape when scrapeCompanies is enabled (0 = all).

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "cardTypes": [
    "100"
  ],
  "locations": [],
  "sort": "published_sort_desc",
  "maxItems": 100,
  "maxConcurrency": 40,
  "enrichDetails": true,
  "enrichContacts": true,
  "scrapeCompanies": false,
  "maxCompanies": 0,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "cardTypes": [
        "100"
    ],
    "locations": [],
    "sort": "published_sort_desc",
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/oikotie-fi-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 = {
    "cardTypes": ["100"],
    "locations": [],
    "sort": "published_sort_desc",
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/oikotie-fi-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 '{
  "cardTypes": [
    "100"
  ],
  "locations": [],
  "sort": "published_sort_desc",
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/oikotie-fi-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/oikotie-fi-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/fIJbMJMgbZjIEbJOg/builds/HpJ0RTAFEUqQ67hUi/openapi.json
