# FINN.no Scraper | Norway Real Estate Sale Rent (`lentic_clockss/finn-scraper`) Actor

Scrape FINN.no Eiendom homes for sale, rent, leisure, plots & projects. Extract NOK prices, bedrooms, size, addresses, agents & URLs — FINN API alternative.

- **URL**: https://apify.com/lentic\_clockss/finn-scraper.md
- **Developed by:** [kane liu](https://apify.com/lentic_clockss) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

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

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

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

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

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

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

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


# README

### What does FINN.no Scraper do?

**Scrape FINN.no Eiendom (Norway real estate) listings** — homes for sale, rentals, leisure/holiday homes, plots, commercial, new buildings, and planned projects — then export structured data as Excel, CSV, or JSON.

This Actor is a practical **FINN.no API alternative** for market research, investor comps, rental screening, agency monitoring, and lead lists. Enter a Norwegian location such as `oslo` or a FINN location code (`0.20061`), choose a channel, and get listing rows with prices (NOK), bedrooms, size (m²), addresses, photos, and direct listing URLs from [finn.no](https://www.finn.no/).

- Pull **Norwegian homes for sale**, **lettings**, **leisure**, **plots**, **commercial**, **new buildings**, **abroad**, and **planned** listings
- Filter by price, area, bedrooms, property type, ownership, construction year, and more
- Optionally enrich detail pages (viewings, facilities, gallery, neighborhood, ownership history, broker office)
- Export to **Excel / CSV / JSON**, or connect Make, n8n, Zapier, Python, or Apify API / MCP
- **Pay per event** — Actor start + each Dataset listing; users also pay Apify platform usage for the run

---

### What FINN listing data can you extract?

| Data point | Description |
| --- | --- |
| Title / address | Listing headline and location text |
| Finnkode / listing ID | Stable FINN identifier |
| Price (NOK) | Asking / rent display when shown |
| Bedrooms & area (m²) | Size signals from SERP or detail |
| Property & ownership type | e.g. Leilighet, Selveier, Andel |
| Channel | `sale`, `rent`, `leisure`, `plot`, … |
| Listing URL & main image | Direct FINN link + hero photo |
| Gallery / facilities / viewings | When `enrichDetails` is enabled |
| Agent / office | Broker name and office URL when available |
| Neighborhood / ownership history | Optional enrich endpoints |

Every Dataset row includes `country` = `NO`, `authority` / `source` = `finn.no`.

---

### Why scrape FINN.no?

FINN.no is Norway’s largest classifieds marketplace for housing. Scraping public Eiendom listings helps you:

- Build **Oslo / Bergen / Trondheim** market datasets for comps and pricing research
- Monitor **new listings** and **planned / project** supply with schedules
- Track **rentals vs sale** dynamics by location and property type
- Enrich CRM / investor workflows with addresses, URLs, and broker contacts
- Benchmark leisure, plot, and commercial inventory without manual browsing

---

### How to scrape FINN.no (no code required)

1. Create a free [Apify](https://console.apify.com/) account
2. Open [FINN.no Scraper](https://console.apify.com/actors/KrzW7bYRLOn4aAKgq)
3. Set `location` (e.g. `oslo`) and `channel` (e.g. `sale`)
4. Optionally enable `enrichDetails` or other enrich flags
5. Click **Start** and download results from the **Dataset** tab (JSON, CSV, Excel, …)

Start with `maxResults: 5–10` to verify the market, then scale up.

---

### How much does it cost to scrape FINN.no?

This Actor uses **pay-per-event** pricing. You are charged for:

| Event | Price |
| --- | --- |
| Actor Start (`apify-actor-start`) | **$0.005** per start |
| Result (`apify-default-dataset-item`) | **$3.00 / 1,000** listings (**$0.003** each) |

**Platform usage costs are paid by the user** — in addition to event prices above, you also pay Apify compute/proxy usage generated by the run.

#### Example cost estimates

| Listings collected | Approx. event cost* |
| --- | --- |
| 100 | ~$0.31 |
| 1,000 | ~$3.01 |
| 10,000 | ~$30.01 |

\*Assumes one Actor start at default memory billing for start events, plus `$0.003` per Dataset item. Exact start billing can scale with allocated memory (one start event per GB, minimum one).

Free Apify trial credit can cover a small test run — try `maxResults: 5` first.

---

### Input

Open the **Input** tab for the full form. Common fields:

| Field | Description |
| --- | --- |
| `location` | City slug (`oslo`) or FINN code (`0.20061`). For `abroad`, omit Norwegian location (Oslo empties that SERP). |
| `channel` | `sale`, `rent`, `projects`, `leisure`, `leisure_plots`, `plot`, `commercial`, `abroad`, `planned`, `office` |
| `maxResults` / `maxPages` | Cap results and SERP pages (`fetchAllPages` for larger crawls) |
| `priceFrom` / `priceTo`, `areaFrom` / `areaTo`, `minBedrooms` | SERP filters |
| `propertyType` / `ownershipType` | FINN enum values or labels (e.g. `Leilighet`, `Selveier`) |
| `enrichDetails` | Open listing detail pages for pricing, viewings, facilities, images |
| `enrichNeighborhood` / `enrichOwnershipHistory` / `enrichAreaProfile` / `enrichOffice` | Optional side endpoints |
| `detailUrls` / `officeUrl` | Scrape specific ads or broker profiles (`office` is detail-only) |
| `incremental` | Skip `listingId`s already stored in named KV `finn-seen-finnkodes` |

#### Input example

```json
{
  "location": "oslo",
  "channel": "sale",
  "maxResults": 25,
  "maxPages": 1,
  "enrichDetails": true,
  "enrichNeighborhood": true
}
````

Leisure / plots:

```json
{
  "location": "oslo",
  "channel": "leisure",
  "maxResults": 20,
  "maxPages": 1
}
```

Homes abroad (do not pass a Norwegian location):

```json
{
  "channel": "abroad",
  "maxResults": 20,
  "maxPages": 1
}
```

***

### Output sample

Results are written to the default **Dataset**. Preview fields include `name`, `type`, `status`, `country`, `authority`, plus FINN-specific columns.

```json
[
  {
    "listingId": "469777706",
    "finnkode": "469777706",
    "name": "SOFIENBERG | 2-roms selveie | Sjenerøs takhøyde",
    "type": "listing",
    "status": "active",
    "country": "NO",
    "authority": "finn.no",
    "channel": "sale",
    "listingUrl": "https://www.finn.no/realestate/homes/ad.html?finnkode=469777706",
    "address": "Sars' gate 22, Oslo",
    "priceDisplay": "3 900 000 kr",
    "bedrooms": 1,
    "areaSqm": 34.0,
    "imageUrl": "https://images.finncdn.no/dynamic/480w/...",
    "contentDepth": "guest_preview",
    "scrapedAt": "2026-07-23T10:00:56.917Z"
  }
]
```

With `enrichDetails` enabled you may also see `viewings`, `facilities`, `imageUrls`, agent/office fields, and an `enrichment` object (e.g. neighborhood).

***

### Channels (FINN Eiendom)

| Channel | FINN vertical | Notes |
| --- | --- | --- |
| `sale` | homes | Homes for sale |
| `rent` | lettings | Homes for rent |
| `projects` | newbuildings | New building projects |
| `leisure` | leisuresale | Holiday / leisure homes |
| `leisure_plots` | leisureplots | Leisure plots |
| `plot` | plots | Land / plots |
| `commercial` | businesssale | Commercial for sale |
| `abroad` | abroad | Homes abroad — omit Norwegian `location` |
| `planned` | homes (filtered) | Planned / coming-soon style listing URLs |
| `office` | — | Broker/company profile via `officeUrl` or `detailUrls` |

***

### Tips for better FINN scrapes

- Prefer **RESIDENTIAL Norway** proxy settings in the UI when offered; the managed worker also uses NO residential egress
- Use **city slugs** (`oslo`, `bergen`) or FINN location codes from `/v1/categories`
- Enable `enrichDetails` only when you need viewings, galleries, or deeper pricing — it costs more time per listing
- Use `incremental=true` for recurring schedules so already-seen `finnkode`s are skipped across runs
- For `abroad`, leave `location` empty / default — Norwegian codes return an empty SERP

***

### Is it legal to scrape FINN.no?

Only scrape **publicly available** listing data and only if you have a legitimate reason. Personal data that appears in public ads may be protected by GDPR and similar laws. Review FINN’s terms and your own compliance obligations before large-scale collection. This tool is intended for ethical use of public information — do not automate contact forms or bypass login-gated content.

***

### FAQ

#### Can I use this as a FINN.no API?

Yes — run the Actor via the Apify Console, CLI (`apify call`), Schedules, or HTTP API, then download the Dataset or stream items into your stack. There is no official public FINN “listings dump” API for this use case; this Actor is a structured data alternative.

#### Does it scrape listing detail pages?

Yes, when `enrichDetails` (and optional enrich flags) are enabled. Otherwise you get SERP / card-level fields only.

#### What formats can I export?

Apify Dataset downloads support JSON, JSONL, CSV, Excel, XML, and HTML. You can also pull results through the Apify API, Integrations, or webhooks.

#### How do I scrape only specific FINN ads?

Paste one or more `https://www.finn.no/realestate/.../ad.html?finnkode=...` URLs into `detailUrls`.

***

### Support

Open the **Issues** tab on this Actor page with sample input, run ID, and expected vs actual results. Feature requests for extra filters or fields are welcome.

Looking for other Nordic or European property sources? Browse more real-estate scrapers from the same publisher on Apify Store for multi-market workflows.

# Actor input Schema

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

FINN location code (e.g. 0.20061) or seed city slug (oslo, bergen, …).

## `channel` (type: `string`):

Eiendom vertical: sale/rent/projects/leisure/leisure\_plots/plot/commercial/abroad/planned/office.

## `priceFrom` (type: `integer`):

Optional minimum price filter (price\_from).

## `priceTo` (type: `integer`):

Optional maximum price filter (price\_to).

## `priceCollectiveFrom` (type: `integer`):

Optional price\_collective\_from filter.

## `priceCollectiveTo` (type: `integer`):

Optional price\_collective\_to filter.

## `areaFrom` (type: `integer`):

Optional minimum area filter (area\_from).

## `areaTo` (type: `integer`):

Optional maximum area filter (area\_to).

## `plotAreaFrom` (type: `integer`):

Optional plot\_area\_from filter.

## `plotAreaTo` (type: `integer`):

Optional plot\_area\_to filter.

## `minBedrooms` (type: `integer`):

Optional minimum bedrooms filter (min\_bedrooms).

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

FINN property\_type id or slug (3/leilighet, 1/enebolig, 4/rekkehus, …).

## `ownershipType` (type: `string`):

FINN ownership\_type id or slug (3/selveier, 4/andel, 2/aksje).

## `constructionYearFrom` (type: `integer`):

Optional construction\_year\_from.

## `constructionYearTo` (type: `integer`):

Optional construction\_year\_to.

## `published` (type: `string`):

Optional FINN published filter value.

## `videoType` (type: `string`):

Optional FINN video\_type filter.

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

Optional FINN sort enum.

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

Maximum listings to return (up to 2000).

## `maxPages` (type: `integer`):

Maximum SERP pages (~50 listings/page), up to 100.

## `fetchAllPages` (type: `boolean`):

Expand pages from treff estimate, capped by maxResults.

## `detailUrls` (type: `array`):

Optional FINN ad.html URLs. When set, calls /v1/listings.

## `officeUrl` (type: `string`):

Broker/company profile URL (required for channel=office if no detailUrls).

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

Fetch LDP testid + stream fields for each listing.

## `enrichOffice` (type: `boolean`):

Extract broker/office fields from LDP and follow office URL when present.

## `enrichAreaProfile` (type: `boolean`):

Fetch /areaprofile/{finnkode} summary into enrichment.areaProfile.

## `enrichOwnershipHistory` (type: `boolean`):

Fetch ownershiphistory.html rows into enrichment.ownershipHistory.

## `enrichNeighborhood` (type: `boolean`):

Fetch neighborhood-api-alt.json into enrichment.neighborhood.

## `incremental` (type: `boolean`):

Skip listingIds already stored in named KV store finn-seen-finnkodes (SEEN\_FINNKODES). Persists across runs; full skip still SUCCEEDED.

## `includeRaw` (type: `boolean`):

Include raw parse payload on each row when supported.

## `fields` (type: `array`):

Optional worker response field projection (dataset still stores full rows).

## `webhookUrl` (type: `string`):

Optional webhook; failures become partial warnings, not hard fail.

## `workerBaseUrl` (type: `string`):

Override Cloud Run worker URL (must be https://).

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

Apify proxy UI. Actor-run proxy passwords are not forwarded; worker PROXY\_URL is used.

## `proxyUrl` (type: `string`):

Optional durable proxy URL forwarded to the worker.

## Actor input object example

```json
{
  "location": "oslo",
  "channel": "sale",
  "maxResults": 50,
  "maxPages": 1,
  "fetchAllPages": false,
  "enrichDetails": false,
  "enrichOffice": false,
  "enrichAreaProfile": false,
  "enrichOwnershipHistory": false,
  "enrichNeighborhood": false,
  "incremental": false,
  "includeRaw": false
}
```

# Actor output Schema

## `listings` (type: `string`):

Normalized FINN listing records.

## `runSummary` (type: `string`):

Run outcome summary.

## `inputEcho` (type: `string`):

Normalized non-secret input.

## `errorSummary` (type: `string`):

Structured failure details.

# 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",
    "channel": "sale",
    "maxResults": 50,
    "maxPages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("lentic_clockss/finn-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",
    "channel": "sale",
    "maxResults": 50,
    "maxPages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("lentic_clockss/finn-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",
  "channel": "sale",
  "maxResults": 50,
  "maxPages": 1
}' |
apify call lentic_clockss/finn-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "FINN.no Scraper | Norway Real Estate Sale Rent",
        "description": "Scrape FINN.no Eiendom homes for sale, rent, leisure, plots & projects. Extract NOK prices, bedrooms, size, addresses, agents & URLs — FINN API alternative.",
        "version": "0.1",
        "x-build-id": "cmNS8cCcSARS46HWf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lentic_clockss~finn-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lentic_clockss-finn-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/lentic_clockss~finn-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lentic_clockss-finn-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/lentic_clockss~finn-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lentic_clockss-finn-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "location": {
                        "title": "Location",
                        "maxLength": 160,
                        "type": "string",
                        "description": "FINN location code (e.g. 0.20061) or seed city slug (oslo, bergen, …).",
                        "default": "oslo"
                    },
                    "channel": {
                        "title": "Channel",
                        "enum": [
                            "sale",
                            "rent",
                            "projects",
                            "leisure",
                            "leisure_plots",
                            "plot",
                            "commercial",
                            "abroad",
                            "planned",
                            "office"
                        ],
                        "type": "string",
                        "description": "Eiendom vertical: sale/rent/projects/leisure/leisure_plots/plot/commercial/abroad/planned/office.",
                        "default": "sale"
                    },
                    "priceFrom": {
                        "title": "Price from (NOK)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional minimum price filter (price_from)."
                    },
                    "priceTo": {
                        "title": "Price to (NOK)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional maximum price filter (price_to)."
                    },
                    "priceCollectiveFrom": {
                        "title": "Collective price from",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional price_collective_from filter."
                    },
                    "priceCollectiveTo": {
                        "title": "Collective price to",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional price_collective_to filter."
                    },
                    "areaFrom": {
                        "title": "Area from (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional minimum area filter (area_from)."
                    },
                    "areaTo": {
                        "title": "Area to (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional maximum area filter (area_to)."
                    },
                    "plotAreaFrom": {
                        "title": "Plot area from (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional plot_area_from filter."
                    },
                    "plotAreaTo": {
                        "title": "Plot area to (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional plot_area_to filter."
                    },
                    "minBedrooms": {
                        "title": "Min bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Optional minimum bedrooms filter (min_bedrooms)."
                    },
                    "propertyType": {
                        "title": "Property type",
                        "type": "string",
                        "description": "FINN property_type id or slug (3/leilighet, 1/enebolig, 4/rekkehus, …)."
                    },
                    "ownershipType": {
                        "title": "Ownership type",
                        "type": "string",
                        "description": "FINN ownership_type id or slug (3/selveier, 4/andel, 2/aksje)."
                    },
                    "constructionYearFrom": {
                        "title": "Construction year from",
                        "type": "integer",
                        "description": "Optional construction_year_from."
                    },
                    "constructionYearTo": {
                        "title": "Construction year to",
                        "type": "integer",
                        "description": "Optional construction_year_to."
                    },
                    "published": {
                        "title": "Published filter",
                        "type": "string",
                        "description": "Optional FINN published filter value."
                    },
                    "videoType": {
                        "title": "Video type",
                        "type": "string",
                        "description": "Optional FINN video_type filter."
                    },
                    "sort": {
                        "title": "Sort",
                        "enum": [
                            "PUBLISHED_DESC",
                            "PRICE_ASC",
                            "PRICE_DESC",
                            "PRICE_ASKING_ASC",
                            "PRICE_ASKING_DESC",
                            "PRICE_SQM_ASC",
                            "PRICE_SQM_DESC",
                            "AREA_PROM_ASC",
                            "AREA_PROM_DESC"
                        ],
                        "type": "string",
                        "description": "Optional FINN sort enum."
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum listings to return (up to 2000).",
                        "default": 50
                    },
                    "maxPages": {
                        "title": "Max pages",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum SERP pages (~50 listings/page), up to 100.",
                        "default": 1
                    },
                    "fetchAllPages": {
                        "title": "Fetch all pages",
                        "type": "boolean",
                        "description": "Expand pages from treff estimate, capped by maxResults.",
                        "default": false
                    },
                    "detailUrls": {
                        "title": "Detail URLs",
                        "type": "array",
                        "description": "Optional FINN ad.html URLs. When set, calls /v1/listings.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "officeUrl": {
                        "title": "Office URL",
                        "type": "string",
                        "description": "Broker/company profile URL (required for channel=office if no detailUrls)."
                    },
                    "enrichDetails": {
                        "title": "Enrich details",
                        "type": "boolean",
                        "description": "Fetch LDP testid + stream fields for each listing.",
                        "default": false
                    },
                    "enrichOffice": {
                        "title": "Enrich office",
                        "type": "boolean",
                        "description": "Extract broker/office fields from LDP and follow office URL when present.",
                        "default": false
                    },
                    "enrichAreaProfile": {
                        "title": "Enrich area profile",
                        "type": "boolean",
                        "description": "Fetch /areaprofile/{finnkode} summary into enrichment.areaProfile.",
                        "default": false
                    },
                    "enrichOwnershipHistory": {
                        "title": "Enrich ownership history",
                        "type": "boolean",
                        "description": "Fetch ownershiphistory.html rows into enrichment.ownershipHistory.",
                        "default": false
                    },
                    "enrichNeighborhood": {
                        "title": "Enrich neighborhood",
                        "type": "boolean",
                        "description": "Fetch neighborhood-api-alt.json into enrichment.neighborhood.",
                        "default": false
                    },
                    "incremental": {
                        "title": "Incremental dedupe",
                        "type": "boolean",
                        "description": "Skip listingIds already stored in named KV store finn-seen-finnkodes (SEEN_FINNKODES). Persists across runs; full skip still SUCCEEDED.",
                        "default": false
                    },
                    "includeRaw": {
                        "title": "Include raw",
                        "type": "boolean",
                        "description": "Include raw parse payload on each row when supported.",
                        "default": false
                    },
                    "fields": {
                        "title": "Fields projection",
                        "type": "array",
                        "description": "Optional worker response field projection (dataset still stores full rows).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "Optional webhook; failures become partial warnings, not hard fail."
                    },
                    "workerBaseUrl": {
                        "title": "Worker base URL",
                        "type": "string",
                        "description": "Override Cloud Run worker URL (must be https://)."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy UI. Actor-run proxy passwords are not forwarded; worker PROXY_URL is used."
                    },
                    "proxyUrl": {
                        "title": "Proxy URL (advanced)",
                        "type": "string",
                        "description": "Optional durable proxy URL forwarded to the worker."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
