# FINN Eiendom Property Discovery Scraper (`trovevault/finn-eiendom-property-discovery-scraper`) Actor

Discover public FINN Eiendom property listings by location, sale or rent, and property type. Extract prices, descriptions, areas, rooms, images, agents, and URLs.

- **URL**: https://apify.com/trovevault/finn-eiendom-property-discovery-scraper.md
- **Developed by:** [Trove Vault](https://apify.com/trovevault) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 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/platform/actors/running/actors-in-store#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

## FINN Eiendom Property Discovery Scraper

Discover public FINN Eiendom real estate listings by Norwegian city, sale or rent, and property type. The actor returns normalized property rows with prices, price per square meter when available, areas, bedrooms, descriptions, features, agencies, images, and listing URLs.

### Why Use This Actor

FINN Eiendom is Norway's central real estate marketplace, but the public website is optimized for browsing, not repeatable data collection. This actor converts public sale and rental listings into a structured Apify dataset for:

- monitoring property supply in Oslo, Bergen, Trondheim, Stavanger, and other Norwegian cities;
- comparing sale prices and price per square meter across available listings;
- collecting rental listings for relocation, housing research, or lead workflows;
- combining Norway coverage with other TroveVault real estate discovery actors.

The actor uses buyer-facing inputs only. You provide the city, operation, property type, and item limit. The FINN search route is resolved internally.

### What It Extracts

For each valid public listing, the actor can save:

- listing identity: `platform`, `listingId`, `title`, `url`;
- search context: `operation`, `propertyType`;
- pricing: `price`, `currency`, `priceText`, `pricePerM2`;
- property facts: `areaM2`, `bedrooms`;
- location: `address`, `city`, `country`;
- listing content: `description`, `features`;
- seller and media: `sellerName`, `mainImage`, `images`;
- workflow metadata: `listedAtText`, `scrapedAt`, `runId`.

Rows missing a public title, description, price text, or main image are skipped instead of saved as empty records.

### Input

```json
{
  "location": "Oslo",
  "operation": "sale",
  "propertyType": "apartment",
  "maxItems": 50
}
```

#### Input Fields

| Field | Type | Description |
| --- | --- | --- |
| `location` | string | Norwegian city to discover. Use English names where common, for example `Oslo`, `Bergen`, `Trondheim`, `Stavanger`, `Tromso`, `Drammen`, or `Kristiansand`. |
| `operation` | select | `sale` or `rent`. |
| `propertyType` | select | `any`, `apartment`, `house`, `land`, or `commercial`. |
| `maxItems` | integer | Maximum number of valid listings to save. Use small values for tests and larger values for market discovery. |
| `datasetId` | string | Optional Apify dataset ID. When supplied, rows are appended there as well as to the run's default dataset. |
| `runId` | string | Optional workflow ID copied into each output row and run summary. |

Stable city examples include Oslo, Bergen, Trondheim, Stavanger, Tromso, Drammen, Kristiansand, Fredrikstad, Sandnes, and Bodo. City-level discovery is used because it is more reliable for daily runs than broad national search.

### Output Example

```json
{
  "platform": "FINN Eiendom",
  "listingId": "469840591",
  "title": "Klassisk og moderne 3-roms i indre gård | Balkong",
  "url": "https://www.finn.no/realestate/homes/ad.html?finnkode=469840591",
  "operation": "sale",
  "propertyType": "apartment",
  "price": 9200000,
  "currency": "NOK",
  "priceText": "9 200 000 kr",
  "pricePerM2": 122667,
  "areaM2": 75,
  "bedrooms": 2,
  "address": "Waldemar Thranes gate 32 C, 0171 Oslo",
  "city": "Oslo",
  "country": "Norway",
  "description": "A public listing description from FINN...",
  "features": ["75 m2", "2 bedrooms", "Boligtype: Leilighet"],
  "sellerName": "DNB Eiendom AS",
  "mainImage": "https://images.finncdn.no/...",
  "images": ["https://images.finncdn.no/..."],
  "scrapedAt": "2026-07-29T11:28:20.802Z",
  "runId": "optional-parent-run"
}
```

`pricePerM2` is calculated only when both numeric `price` and `areaM2` are visible. FINN rental listings do not always expose a usable area, so those rows can omit `areaM2` and `pricePerM2`.

### API Usage

```bash
curl -X POST "https://api.apify.com/v2/acts/trovevault~finn-eiendom-property-discovery-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"location":"Oslo","operation":"sale","propertyType":"apartment","maxItems":50}'
```

After the run finishes, download the dataset items:

```bash
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?clean=true" \
  -H "Authorization: Bearer $APIFY_TOKEN"
```

### Practical Workflows

- **Norway market tracking:** collect sale listings in Oslo or Bergen and compare asking prices per square meter.
- **Rental discovery:** collect current apartments for rent in a target city and append them to a shared dataset.
- **Agency research:** capture seller names, listing URLs, images, and public descriptions for enrichment.
- **Cross-market coverage:** combine FINN output with other TroveVault actors for broader property discovery.

### Troubleshooting

If the actor saves fewer rows than `maxItems`, common reasons include duplicate search results, property type filtering, or listings that do not expose a required public image or description.

If a city is rejected, use a supported city name such as `Oslo`, `Bergen`, or `Trondheim`. Do not pass FINN search URLs.

If `pricePerM2` is missing, FINN did not expose a usable area on that listing. This is common on some rental listings.

### Limitations

- This actor discovers listings from public FINN Eiendom pages. It does not log in or access private user data.
- Country-wide discovery is not exposed because city routes are more reliable.
- FINN uses Norwegian source labels. Output field names are normalized in English, while some source labels can appear inside `features`.
- Bathroom counts are not exposed because FINN detail pages do not provide that value consistently enough for a trustworthy column.
- Listing availability and pricing can change quickly on real estate portals.

### FAQ

**Can I pass FINN search result URLs?**\
No. This is a discovery actor. Use `location`, `operation`, and `propertyType`.

**Does it support both sale and rent?**\
Yes. Use `operation: "sale"` or `operation: "rent"`.

**Can it append rows to an existing dataset?**\
Yes. Pass `datasetId` to append every saved row to a shared Apify dataset.

**Is this suitable for scheduled runs?**\
Yes. Keep the default input small for smoke tests, or schedule larger runs for monitored cities.

### Changelog

- `0.1` - Initial TroveVault discovery actor for FINN Eiendom public property listings.

# Actor input Schema

## `location` (type: `string`):

Norwegian city to search. Use English names where common, for example Oslo, Bergen, Trondheim, Stavanger, Tromso, Drammen, Kristiansand, or Fredrikstad. City-level searches are more stable than broad country searches.

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

Choose whether to discover FINN Eiendom properties offered for sale or for rent.

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

Choose the type of property to discover. Use Any to return the broadest listing set supported by FINN Eiendom.

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

Maximum number of property listings to return. Use smaller values for quick checks and higher values for broader market discovery.

## `datasetId` (type: `string`):

Optional Apify dataset ID to append each saved listing to, in addition to this run's default dataset. Use this when chaining multiple discovery actors into one shared dataset.

## `runId` (type: `string`):

Optional external or Apify run ID copied into each output row and RUN\_SUMMARY. Use this to trace listings back to a parent workflow run.

## Actor input object example

```json
{
  "location": "Oslo",
  "operation": "sale",
  "propertyType": "apartment",
  "maxItems": 3
}
```

# Actor output Schema

## `datasetUrl` (type: `string`):

No description

## `savedListings` (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 = {
    "location": "Oslo"
};

// Run the Actor and wait for it to finish
const run = await client.actor("trovevault/finn-eiendom-property-discovery-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 = { "location": "Oslo" }

# Run the Actor and wait for it to finish
run = client.actor("trovevault/finn-eiendom-property-discovery-scraper").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 '{
  "location": "Oslo"
}' |
apify call trovevault/finn-eiendom-property-discovery-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=trovevault/finn-eiendom-property-discovery-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/3hhum0GnYOkQnUw9D/builds/6KUTr3MQCU0tXDjZL/openapi.json
