# Etuovi Scraper - Finland Property Listings & Prices (`sian.agency/etuovi-property-scraper`) Actor

Scrape Etuovi.com listings across Finland: asking price, €/m², rooms, area, build year, photos, agency and agent contacts. Homes, new builds, holiday homes, plots and land.

- **URL**: https://apify.com/sian.agency/etuovi-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

## Etuovi Scraper: Finland's Biggest Property Portal, as 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-Otodom Scraper](https://img.shields.io/badge/Store-Otodom%20Scraper-0C7C59)](https://apify.com/sian.agency/otodom-property-scraper?fpr=sian)

#### 🎉 61,000+ homes plus holiday homes, plots and land, across every one of Finland's 335 municipalities, with asking price, €/m² and agent contacts

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

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

The **Etuovi Scraper** turns any search on Etuovi.com, Finland's biggest property portal 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:** asking prices in euros next to living and total area, the Finnish room layout string, room-count class, floor out of building floors, build year, WGS84 coordinates, the listing agency, the next scheduled showing and the listing photo. Detail enrichment adds the full Finnish description, the asking and debt-free prices side by side, price per m², the housing-company debt share, the region-to-postcode hierarchy, heating and balcony details, and the selling agent's contact details. Searches cover homes, new builds, holiday homes, plots and land.

**Use something else when:** the market is not Etuovi.com's. Use [Hemnet Scraper](https://apify.com/sian.agency/hemnet-property-scraper?fpr=sian) for Sweden's biggest housing market, listing by listing. Use [FINN.no Property Scraper](https://apify.com/sian.agency/finn-no-property-scraper?fpr=sian) for Norway, across the Eiendom sections. Use [Otodom Scraper](https://apify.com/sian.agency/otodom-property-scraper?fpr=sian) for Poland's largest property portal, sale and rent. This actor reads live Etuovi.com listings only, and Etuovi.com is a sale-only portal: rentals live on Vuokraovi.com, Alma Media's separate rental site, which Etuovi.com's own search hands over to. 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. Price, size and feature filters are applied by the portal in the browser and are not part of the page a run reads, so the narrowing this actor offers is what the served page honours: section, municipality, property type and page depth — a pasted Etuovi search address is read exactly as the portal serves it.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/etuovi-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 housing market for sale — homes, new builds, holiday homes, plots and land using the Apify Actor `sian.agency/etuovi-property-scraper`.

Use it when I need: asking prices in euros next to living and total area, the Finnish room layout string, room-count class, floor out of building floors, build year, WGS84 coordinates, the listing agency, the next scheduled showing and the listing photo. Detail enrichment adds the full Finnish description, the asking and debt-free prices side by side, price per m², the housing-company debt share, the region-to-postcode hierarchy, heating and balcony details, and the selling agent's contact details. Searches cover homes, new builds, holiday homes, plots and land.

Don't use it when: the market is not Etuovi.com's — use hemnet-property-scraper or finn-no-property-scraper or otodom-property-scraper instead.

How to call it: pick one `operation` per run. `search` takes a `section` — `asunnot` (homes), `loma-asunnot` (holiday homes), `tontit` (plots) or `maa-ja-metsatilat` (land and forest) — plus any number of `locations` typed as Finnish municipality names (all 335 the portal indexes resolve, diacritics optional), and optionally `propertyTypes` from the portal's own type pages: yksio, kaksio, kerrostalo, omakotitalo, erillistalo, paritalo, rivitalo, luhtitalo, puutalo-osake, omistusasunnot, osaomistusasunnot, asumisoikeusasunnot, uudiskohteet. `detail` takes Etuovi listing addresses and returns the full record.

Start with this input:
{
  "operation": "search",
  "section": "asunnot",
  "locations": [
    "Helsinki",
    "Espoo"
  ],
  "maxResults": 120
}

Ask me which Finnish municipalities they want, which section they mean, and whether they need the full record with both prices and the agent's 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 new studio listing in Helsinki posted this week and give me the median asking price.*
- *Search detached houses in Tampere, Kuopio and Oulu, fetch full details for the ten cheapest, and list the agents with their phone numbers.*
- *Watch plots in the Turku region daily and alert me when a new shore plot appears under 100,000 euros.*
- *Export all holiday homes in Lapland with coordinates so I can map them by lake.*

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

### 📋 Overview

**Finland's homes-for-sale market runs through one portal.** Etuovi.com carries the country's largest for-sale inventory — apartments, detached houses, new builds, holiday homes, plots and land — and this Actor reads all four of its sale sections through one input form.

**What you get:**

- ✅ **Four sections, one selector**: homes for sale (61,000+ live listings), new builds (8,700+), holiday homes (5,300+), plots (6,900+) and land & forest estates.
- ⚡ **30 listings per page, no ceiling**: the portal serves its entire result set (verified paging past page 2,000 of a national search), so a city sweep reaches the last listing, not the first thousand.
- 🎯 **41 fields per row**, typed from real listings rather than guessed: prices arrive as numbers, dates as timestamps, photos as URLs.
- 💰 **Charged per listing returned**: a municipality that matched nothing, or a listing that had been withdrawn, costs you nothing.
- 💎 **Detail mode returns both Finnish prices**: asking price and debt-free price side by side, with the debt share and the price per m² the portal itself computes.
- 🇫🇮 **All 335 municipalities by name**: type Helsinki, Äänekoski or Koski Tl. The portal's own sitemap is the address book.

### ✨ Features

- 🏘️ **Section selector**: homes, holiday homes, plots or land without learning a URL scheme.
- 📍 **Plain Finnish place names**: type Helsinki, Tampere or Äänekoski; diacritics are optional and every municipality the portal indexes resolves.
- 🏠 **The portal's own type pages**: studios, two-room homes, apartment blocks, detached, semi-detached and row houses, terrace-access blocks, wooden house shares, ownership types and new builds.
- 📄 **Full-detail mode**: switch it on and every row gains the full description, both prices, €/m², the debt share, the region-to-postcode hierarchy and the agent's direct phone.
- 🧑‍💼 **Agent and agency contacts**: the agent's name, title and phone, plus the office's name and website.
- 🗺️ **Coordinates on every listing**: latitude and longitude in WGS84, ready to map.
- 📅 **Showing times and open bidding**: the next scheduled showing and the open-bidding flag come back on the card.
- 🔗 **Paste any Etuovi search address**: a URL from your browser is read exactly as the portal serves it.
- 🔄 **Schedule-friendly**: run the same search daily and the diff gives you new listings, price cuts and sold stock.

### 🎬 Quick Start

Pick an operation, name the municipalities 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~etuovi-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","section":"asunnot","locations":["Helsinki"],"maxResults":100}'
```

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what to scrape

Pick an operation (Property Search or Property Detail) and, for a search, the section.

#### Step 2: Name your municipalities

Type Finnish municipality names into Municipalities: one per line, diacritics optional. Leave a name out and it is not searched; empty the field 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` or `detail`. Defaults to `search`. |
| `section` | string | No | `asunnot` (homes), `loma-asunnot` (holiday homes), `tontit` (plots) or `maa-ja-metsatilat` (land & forest). Defaults to `asunnot`. |
| `locations` | array | No | Finnish municipality names, diacritics optional. All 335 the portal indexes resolve. Empty defaults to Helsinki. |
| `propertyTypes` | array | No | The portal's own type pages, homes section only: `yksio`, `kaksio`, `kerrostalo`, `omakotitalo`, `erillistalo`, `paritalo`, `rivitalo`, `luhtitalo`, `puutalo-osake`, `omistusasunnot`, `osaomistusasunnot`, `asumisoikeusasunnot`, `uudiskohteet`. |
| `maxResults` | integer | No | Row ceiling for the whole run. Defaults to 100. |
| `includeDetails` | boolean | No | Fetch each listing's full record; one extra charge per listing. |
| `searchUrls` | array | No | Etuovi search addresses, read exactly as the portal serves them. |
| `listingUrls` | array | No | Etuovi listing addresses, for the Property Detail operation. |

**Example:**

```json
{
  "operation": "search",
  "section": "asunnot",
  "locations": ["Helsinki", "Espoo"],
  "propertyTypes": ["kaksio"],
  "maxResults": 200
}
```

**Full details from a shortlist:**

```json
{
  "operation": "detail",
  "listingUrls": [
    "https://www.etuovi.com/kohde/2277218"
  ]
}
```

### 📤 Output

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

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | The portal's own listing id (numeric or alphanumeric) |
| `url` | string | Link to the listing |
| `address` | string | Street address |
| `price` | number | Asking price in euros |
| `debtFreePrice` | number | Debt-free price (velaton hinta), on detail rows |
| `pricePerSqm` | number | Price per m², on detail rows |
| `debtShare` | number | Share of housing-company debt, on detail rows |
| `area` | number | Living area in m² |
| `totalArea` | number | Total area in m² |
| `rooms` | string | Finnish room layout, e.g. "3h, k, kph" |
| `roomCount` | string | Room-count class (`ONE_ROOM`, `TWO_ROOMS`, …) |
| `floor` / `floorsTotal` | number | Floor and building floors |
| `buildYear` | number | Construction year |
| `propertyType` | string | The portal's own type code |
| `section` | string | Which of the four sections the row came from |
| `newBuilding` | boolean | New-build flag |
| `openBidding` | boolean | Open-bidding flag |
| `publishedAt` | string | Publication / update timestamp |
| `nextShowing` | string | Next scheduled showing |
| `thumbnailUrl` | string | Listing photo |
| `agencyName` / `agencyUrl` | string | Listing agency and its website |
| `latitude` / `longitude` | number | WGS84 coordinates |
| `description` | string | Full Finnish description, on detail rows |
| `region` / `district` / `postCode` | string | Location hierarchy, on detail rows |
| `heating` / `balcony` | string | Residence details, on detail rows |
| `agentName` / `agentPhone` / `agentTitle` / `agentOffice` | string | Selling agent contacts, on detail rows |

**Example row:**

```json
{
  "listingId": "2277218",
  "url": "https://www.etuovi.com/kohde/2277218",
  "address": "Satamasaarentie 1",
  "addressExtra": "Vuosaari Helsinki",
  "price": 129000,
  "debtFreePrice": 129000,
  "pricePerSqm": 3486.49,
  "debtShare": 7982,
  "area": 37,
  "rooms": "1h, kk, alkovi, kph, lasitettu parveke",
  "roomCount": "ONE_ROOM",
  "floor": 6,
  "floorsTotal": 8,
  "buildYear": 1966,
  "section": "asunnot",
  "publishedAt": "2026-09-07T19:41:35+03:00",
  "agencyName": "Habita Helsinki | Helsingin Habita Oy",
  "latitude": 60.211996,
  "longitude": 25.136673,
  "agentName": "Erkki Talvitie",
  "agentPhone": "+358 50 4200101"
}
```

### 💼 Use Cases & Examples

#### 1. Price Tracking Across Finland

Watch asking prices in any set of municipalities and diff yesterday's feed against today's to catch price moves the day they happen. The published/updated timestamp on every row makes the diff one group-by.

#### 2. Agent and Agency Lead Lists

Every listing names its agency; detail enrichment adds the agent's name, title, phone and office. Build broker, photographer or mortgage lead lists by city and property type.

#### 3. €/m² Market Analysis

Detail rows carry asking price, debt-free price and price per square metre next to district and post code: the inputs for valuation comps and municipal market reports.

#### 4. Deal Sourcing for Investors

Filter to studios, row houses or open-bidding homes, page through entire cities, and pipe the feed into Sheets or a dashboard for yield screening.

#### 5. New-Build Monitoring

Track uudiskohteet for developers and buyers' agents: 8,700+ units and growing, with build year and coordinates on every row.

#### 6. Holiday Home and Plot Scouting

Separate sections for leisure properties and plots, including lakeside cottages and shore plots. That is the cross-border buyer's hardest category to monitor.

#### 7. Data Feeds for AI and Research

Clean, schema-typed rows with coordinates and a full location hierarchy, ready for market models or property search assistants.

### 🔗 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/etuovi-property-scraper').call({
    operation: 'search',
    section: 'asunnot',
    locations: ['Helsinki', 'Espoo'],
    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/etuovi-property-scraper").call(
    run_input={
        "operation": "search",
        "section": "asunnot",
        "locations": ["Helsinki", "Espoo"],
        "maxResults": 100,
    },
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["address"], item["price"])
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~etuovi-property-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"operation":"search","section":"asunnot","locations":["Tampere"],"maxResults":60}'
```

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

This Actor is an Apify HTTP endpoint, so any automation platform can run it:

- **N8N**: add an HTTP Request node that POSTs your input JSON to `https://api.apify.com/v2/acts/sian.agency~etuovi-property-scraper/runs?token=YOUR_TOKEN`, then a Wait node and a Dataset-items GET to collect the rows. (N8N also ships a native Apify integration.)
- **Zapier / Make**: use Apify's official app/integration, choose this Actor, paste the input JSON, and map the dataset rows into your next step.
- **Schedules**: run the same input daily from Apify Console → Schedules and diff consecutive runs for new listings and price cuts.

### 📊 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 listing returned: a municipality that matched nothing, and a listing that had been withdrawn, cost you nothing

💰 **Priced at $1.50 per 1,000 listings, under the most-installed Etuovi actor on the Store ($3.50/1k)**, and it covers the portal's full depth, to the last page of every search.

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

### ❓ Frequently Asked Questions

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

**Q: Does this cover rental apartments?**
A: No, and neither does Etuovi.com. Rentals in Finland live on Vuokraovi.com, Alma Media's separate rental portal that Etuovi.com itself hands rental searches to. This Actor reads Etuovi.com's four sale sections.

**Q: How many rows can I get?**
A: FREE tier: 25 per run. PAID tier: as many as exist. The portal has no result ceiling (verified paging past page 2,040 of a 61,000-listing national search), so Max results is the practical limit.

**Q: Can I filter by price or size?**
A: Only through pasted search addresses. The portal applies its price, size and feature filters in the browser, not on the page a run reads, so this Actor offers the narrowing the served page honours: section, municipality, property type and page depth.

**Q: What do I put in Municipalities?**
A: Finnish municipality names (Helsinki, Tampere, Äänekoski) with or without the dots on ä and ö. All 335 municipalities the portal indexes resolve.

**Q: Why are some prices two numbers?**
A: Finnish flats are sold as housing-company shares, so a listing carries an asking price and a debt-free price. The difference is the share of company debt attached to the flat. Detail enrichment returns both plus the debt share, and the portal's own price per m².

**Q: Can I get sold prices?**
A: No. Etuovi.com publishes live listings, not completed transactions. A listing disappearing between two scheduled runs is the closest available signal.

**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

**"… is not a municipality Etuovi.com indexes"**

- Check the Finnish spelling; both Helsinki and helsinki work, but the name must be a real municipality.
- Try the portal itself: if etuovi.com does not list the place, the Actor cannot search it.

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

- The search matched fewer listings than your ceiling. The run log prints the total the portal reported before paging starts.

**A listing detail comes back "sold or withdrawn"**

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

**The type list did nothing**

- Property types apply only to the homes section. Holiday homes, plots and land have no type pages on the portal, and the run log says so when the list is not applied.

### ⚖️ 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/).

Etuovi.com is a trademark of Alma Media Finland Oy. This Actor is not affiliated with, endorsed by, or sponsored by Etuovi.com or Alma Media.

### 🤝 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 walks Etuovi.com's own listing pages for any of Finland's 335 municipalities — homes for sale, new builds, holiday homes, plots or land — and returns 30 listings per page. Property Detail takes Etuovi listing links and returns the full description, both prices (asking and debt-free), €/m², full location hierarchy and the agent's direct contact details.

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

Which of Etuovi.com's sale sections to read. Homes for sale is the default and the only section the Property types field narrows. New builds are a type of the homes section — pick 'uudiskohteet' under Property types rather than here. Holiday homes, plots and land each have their own section. Sale only: Etuovi.com carries no rentals (its rental search is Vuokraovi.com, a different portal).

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

Where to search, one municipality per line. All 335 Finnish municipalities Etuovi.com indexes resolve by name, with or without Finnish diacritics (Helsinki, Tampere, Äänekoski and aanekoski both work). Leave empty to read all of Finland. For a finer area than a municipality, or to control the search exactly, paste an Etuovi search address into Search URLs instead.

## `propertyTypes` (type: `array`):

Which kinds of home to keep, homes section only. Leave empty to take every type. The values are Etuovi.com's own type pages, so the list is exactly what the site offers — studios, two-room homes, apartment blocks, detached, semi-detached and row houses, terrace-access blocks, wooden house shares, ownership types and new builds.

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

Stop after this many results across the whole run, not per municipality. One page carries 30 results, so a run ends on the first page that crosses your limit. Etuovi.com has no result ceiling — a national homes search is 61,000+ listings over ~2,050 pages — so set a limit you actually need.

## `includeDetails` (type: `boolean`):

Also fetch each listing's detail page and merge in the full description, asking and debt-free prices, €/m², debt share, region-to-postcode hierarchy, residence details and the agent's direct contacts. Each enriched row costs one detail charge on top of the listing row, because it is one extra page fetched for you.

## `searchUrls` (type: `array`):

Paste Etuovi search addresses instead of filling the form, e.g. https://www.etuovi.com/myytavat-asunnot/tampere or https://www.etuovi.com/myytavat-tontit/helsinki. The address is fetched exactly as etuovi.com serves it, so its section, municipality and type slugs apply. A page number in the address is ignored; the run starts at page one and pages forward on its own.

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

Etuovi listing addresses for the Property Detail operation, e.g. https://www.etuovi.com/kohde/2277218. One address per line, up to the run's limits. The detail page carries the full description, both prices, €/m², residence details and the agent's phone and office.

## Actor input object example

```json
{
  "operation": "search",
  "section": "asunnot",
  "locations": [
    "Helsinki"
  ],
  "propertyTypes": [],
  "maxResults": 100,
  "includeDetails": false,
  "searchUrls": [],
  "listingUrls": []
}
```

# Actor output Schema

## `etuoviComListings` (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": "asunnot",
    "locations": [
        "Helsinki"
    ],
    "propertyTypes": [],
    "maxResults": 100,
    "includeDetails": false,
    "searchUrls": [],
    "listingUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/etuovi-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": "asunnot",
    "locations": ["Helsinki"],
    "propertyTypes": [],
    "maxResults": 100,
    "includeDetails": False,
    "searchUrls": [],
    "listingUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/etuovi-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": "asunnot",
  "locations": [
    "Helsinki"
  ],
  "propertyTypes": [],
  "maxResults": 100,
  "includeDetails": false,
  "searchUrls": [],
  "listingUrls": []
}' |
apify call sian.agency/etuovi-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/etuovi-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/lDpFvtn5btqceUJvi/builds/AiLh5m7L61ZhIQz6K/openapi.json
