# FINN.no Scraper — Property, Jobs, Cars & Torget (`memo23/finn-no-scraper`) Actor

Scrape FINN.no, Norway's largest marketplace: property (sale, rent, plots), job ads, cars and Torget classifieds in one actor. Price, m2, energy label, coordinates, agent phones — or employer, deadline, contacts — or VIN, mileage, full car specs. No proxy needed.

- **URL**: https://apify.com/memo23/finn-no-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, Jobs, Agents
- **Stats:** 17 total users, 16 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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.no Scraper — Norway Property, Jobs, Cars & Torget

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/finn-logo.png" alt="FINN.no Scraper" width="160">
</p>

Turn any [FINN.no](https://www.finn.no) search into clean, structured data. FINN is Norway's largest marketplace, and this actor covers four of its verticals in one run: **property listings** (for sale, rentals, new-builds, holiday homes, plots), **job ads**, **cars & vehicles**, and **Torget** classifieds. Paste any FINN search or ad URL, or build a search from filters, and get one flat row per listing.

| Input | Row(s) emitted |
|---|---|
| `…/realestate/homes/search.html?location=0.20061` | One `property` row per listing on every page |
| `…/realestate/lettings/search.html?…` | One `property` row per rental, with deposit and furnishing |
| `…/realestate/homes/ad.html?finnkode=473282564` | One fully detailed `property` row |
| `…/job/search?q=utvikler` | One `job` row per ad on every page |
| `…/job/ad/472810559` | One fully detailed `job` row |
| `…/mobility/search/car?variant=0.817` | One `car` row per vehicle on every page |
| `…/mobility/item/441416549` | One fully detailed `car` row |
| `…/recommerce/forsale/search?q=sykkel` | One `torget` row per classified ad |
| `…/recommerce/forsale/item/473315083` | One fully detailed `torget` row |
| Filter builder (locations, price, area, keyword…) | Same as the matching search URL |

> Pure HTTP. No browser, no third-party bypass service, and **no proxy needed** — FINN serves datacenter IPs without a bot challenge, so proxy traffic costs you nothing.

#### ✨ Why use this scraper?

- **Four verticals, one actor** — Norwegian property, jobs, vehicles and classifieds from a single run and a single bill, instead of stitching four scrapers together.
- **Reads FINN's own data layer** — property rows come from the same structured payload FINN's website consumes, so you get exact numbers (`7 490 000 NOK`, `59.93029 / 10.71958`) rather than scraped-and-reparsed strings.
- **Contact details included** — property ads carry the agent's or private seller's phone numbers; job ads carry the named contact person plus their phone and the apply URL.
- **Full vehicle records** — car ads return FINN's complete spec table: registration number, VIN, owner count, next EU inspection date, CO₂, power, towing capacity, boot volume and colour, alongside price excluding the re-registration fee.
- **Rental-aware** — lettings rows add deposit, what the rent includes, furnishing level and whether pets are allowed, not just the monthly figure.
- **50 listings per page** — property searches paginate in 50s, so large sweeps finish fast.
- **Verified filters only** — every filter in the input was checked against FINN's live result counts. Filters FINN doesn't honour are not offered, so a search never silently ignores what you asked for.
- **JSON, CSV, Excel or API** — pipe straight into your sheet, BI tool or pipeline. Billed per listing.

#### 🎯 Use cases

| You are a… | Use it to… |
|---|---|
| Property analyst | Track asking prices, price per m², energy labels and days-on-market across Norwegian counties |
| Estate agency | Monitor competitor listings and viewing schedules in your area |
| Proptech / portal | Seed a Norwegian property dataset with coordinates, photos and full descriptions |
| Recruiter / job board | Track live Norwegian vacancies by keyword, employer, industry and deadline |
| Lead generation | Reach listing agents and hiring contacts through the phone numbers published on the ads |
| Investor / researcher | Compare rent vs sale economics per neighbourhood using deposit, shared cost and collective debt |
| Car dealer / valuation | Track used-vehicle asking prices by make, model, year and mileage, with full spec records |
| Resale / arbitrage | Watch Torget classifieds for underpriced items by keyword and price band |

#### 📥 Supported inputs

- **Property search URLs** — `https://www.finn.no/realestate/{homes|lettings|newbuildings|leisure-sale|plots}/search.html?…` with any filters you set on the site.
- **Property ad URLs** — `https://www.finn.no/realestate/homes/ad.html?finnkode={id}`. Always fully detailed.
- **Job search URLs** — `https://www.finn.no/job/search?q=…`. See the FAQ about `location` in job URLs.
- **Job ad URLs** — `https://www.finn.no/job/ad/{id}`. Always fully detailed.
- **Car search / ad URLs** — `https://www.finn.no/mobility/search/car?…` and `https://www.finn.no/mobility/item/{id}`.
- **Torget search / ad URLs** — `https://www.finn.no/recommerce/forsale/search?q=…` and `https://www.finn.no/recommerce/forsale/item/{id}`.
- **Filter builder** — counties by name (`Oslo`, `Vestland`, …) or FINN codes, plus price, area, bedrooms, property type, ownership type, energy label, car price/year/mileage, and Torget price band.

#### ⚙️ How it works

![How the FINN.no Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-finn.png)

1. **Classify** every pasted URL into vertical × search/ad, and build extra search URLs from your filters.
2. **Paginate** each search — property through FINN's structured data feed (50 listings per page); jobs, cars and Torget through their results pages (~50 cards per page).
3. **Enrich** each listing from its own ad page when *Scrape detail pages* is on.
4. **Export** one row per listing — JSON, CSV, Excel or API.

#### ⚙️ Input parameters

| Field | Type | Default | What it does |
|---|---|---|---|
| `startUrls` | array | `[]` | FINN search / ad URLs, auto-classified across all four verticals |
| `vertical` | string | `realestate` | Which vertical the filter builder targets |
| `section` | string | `homes` | `homes`, `lettings`, `newbuildings`, `leisure-sale`, `plots` |
| `locations` | array | `["Oslo"]` | County names or FINN codes (`0.20061`, `1.22042.20166`) |
| `searchQuery` | string | — | Free-text property keyword |
| `priceFrom` / `priceTo` | integer | — | Price range in NOK (monthly rent for lettings) |
| `areaFrom` / `areaTo` | integer | — | Usable internal area in m² |
| `minBedrooms` | integer | — | Minimum bedrooms |
| `propertyTypes` | array | all | `1` Enebolig · `2` Tomannsbolig · `3` Leilighet · `4` Rekkehus · `6` Garasje · `9` Industri · `11` Gårdsbruk · `18` Andre · `20` Bygård |
| `ownershipTypes` | array | all | `1` Obligasjon · `2` Aksje · `3` Selveier · `4` Andel · `255` Annet |
| `energyLabels` | array | any | `1` = A … `7` = G |
| `privateSellerOnly` | boolean | `false` | Only ads posted without an agency |
| `publishedToday` | boolean | `false` | Only ads first published today |
| `jobQuery` | string | — | Free-text job keyword |
| `jobOccupations` / `jobIndustries` | array | all | FINN `occupation=` / `industry=` codes |
| `jobLocationContains` | string | — | Narrows job rows by location text after parsing |
| `carQuery` | string | — | Free-text vehicle keyword |
| `carPriceFrom` / `carPriceTo` | integer | — | Vehicle price range in NOK |
| `carYearFrom` / `carYearTo` | integer | — | Model-year range |
| `carMileageTo` | integer | — | Max odometer reading in km |
| `torgetQuery` | string | — | Free-text classifieds keyword |
| `torgetPriceFrom` / `torgetPriceTo` | integer | — | Classifieds price range in NOK |
| `scrapeDetails` | boolean | `false` | Fetch each ad's own page for the full payload |
| `maxItems` | integer | `1000` | Hard cap on rows for the whole run |
| `maxItemsPerSearch` | integer | `1000` | Cap per search |
| `maxConcurrency` | integer | `6` | Parallel HTTP requests (1–20) |
| `maxRequestRetries` | integer | `8` | Retry budget on transient 403/429/5xx |
| `proxy` | object | none | Optional override; not needed |

#### 📊 Output overview

Each dataset record is **one listing**. `rowType` tells the four shapes apart: `property` carries price, area, rooms and agent details; `job` carries employer, deadline and hiring contacts; `car` carries the vehicle spec record; `torget` carries the classified ad. Columns belonging to one vertical are absent on the others.

#### 📦 Output samples

**`rowType: "property"`** (a rental, with detail mode on)

```json
{
  "rowType": "property",
  "finnkode": "467925455",
  "heading": "Moderne leilighet | Internett og hvitevarer inkludert",
  "url": "https://www.finn.no/realestate/lettings/ad.html?finnkode=467925455",
  "section": "lettings",
  "price": { "amount": 25300, "currency": "NOK" },
  "deposit": { "amount": 75900, "currency": "NOK" },
  "rentIncludes": "Internett, hvitevarer, bod",
  "furnishing": "Umøblert",
  "animalsAllowed": false,
  "propertyType": "Leilighet",
  "areaFrom": 64,
  "bedrooms": 3,
  "address": "Hausmanns gate 19 B, Oslo",
  "localArea": "Sentrum",
  "coordinates": { "latitude": 59.9166, "longitude": 10.7563 },
  "contactPhones": ["98192618"],
  "facilities": ["Balkong/Terrasse", "Garasje/P-plass", "Moderne", "Sentralt"],
  "imageUrls": ["https://images.finncdn.no/dynamic/default/…"],
  "detailScraped": true,
  "scrapedAt": "2026-08-17T13:03:58.512Z"
}
```

**`rowType: "job"`** (with detail mode on)

```json
{
  "rowType": "job",
  "adId": "469164249",
  "title": "Utvikler kryptoforsering",
  "url": "https://www.finn.no/job/ad/469164249",
  "employer": "Etterretningstjenesten",
  "location": "Lutvannsveien 60, 0676 Oslo",
  "deadline": "18.08.2026",
  "employmentType": "Fast",
  "sector": "Offentlig",
  "industry": "IT",
  "jobTitleRole": "Utvikling",
  "keywords": ["kryptologi", "utvikling", "sikkerhet"],
  "contactNames": ["HR"],
  "contactPhones": ["23 09 43 29"],
  "applyUrl": "https://www.finn.no/job-apply/469164249/job/apply",
  "publishedAt": "2026-07-07T07:41:34.000Z",
  "detailScraped": true,
  "scrapedAt": "2026-08-17T13:05:12.004Z"
}
```

**`rowType: "car"`** (with detail mode on)

```json
{
  "rowType": "car",
  "adId": "441416549",
  "title": "Volkswagen Tiguan",
  "variant": "2,0 TDI 140hk 4M BMT",
  "url": "https://www.finn.no/mobility/item/441416549",
  "price": { "amount": 117995, "currency": "NOK" },
  "priceExclRegistration": { "amount": 116000, "currency": "NOK" },
  "registrationFee": { "amount": 1995, "currency": "NOK" },
  "make": "Volkswagen",
  "model": "Tiguan",
  "year": 2014,
  "mileageKm": 162000,
  "fuel": "Diesel",
  "transmission": "Automat",
  "drivetrain": "Firehjulsdrift",
  "bodyType": "SUV/Offroad",
  "powerHp": 140,
  "co2GramsPerKm": 153,
  "towingCapacityKg": 2200,
  "seats": 5,
  "colour": "Hvit",
  "firstRegistered": "30.05.2014",
  "nextInspection": "14.06.2027",
  "owners": 4,
  "registrationNumber": "CV72758",
  "vin": "WVGZZZ5NZEW613699",
  "location": "Horten",
  "sellerType": "Privat",
  "detailScraped": true
}
```

**`rowType: "torget"`** (with detail mode on)

```json
{
  "rowType": "torget",
  "adId": "473315083",
  "title": "TREK El-sykkel",
  "url": "https://www.finn.no/recommerce/forsale/item/473315083",
  "price": { "amount": 16000, "currency": "NOK" },
  "brand": "Trek",
  "cardAttribute": "Trek",
  "condition": "Used",
  "category": "Sport og friluftsliv > Sykkelsport > Sykler",
  "location": "Biri",
  "postedLabel": "2 dg.",
  "description": "Svært lite og pent brukt, Borch Powerpack batteri el motor.",
  "detailScraped": true
}
```

#### 🗂 Key output fields

**Property**

| Field | Description |
|---|---|
| `finnkode` | FINN ad id, e.g. `473282564` |
| `heading` / `url` | Listing headline and canonical ad URL |
| `price` / `totalPrice` | Asking price and total incl. costs (monthly rent for lettings) |
| `sharedCost` / `collectiveDebt` / `taxValue` | Felleskostnader, collective debt and tax assessment value |
| `deposit` / `rentIncludes` / `furnishing` / `animalsAllowed` | Rental-only economics and terms |
| `propertyType` / `ownershipType` | Leilighet, Enebolig… / Selveier, Andel… |
| `areaFrom` / `areaTo` / `plotArea` | Usable internal area and plot size in m² |
| `bedrooms` / `rooms` / `floor` / `constructionYear` | Layout and age |
| `energyLabel` | Energy class A–G |
| `address` / `localArea` / `coordinates` | Street address, neighbourhood, lat/lon |
| `agencyName` / `contactPhones` / `contactNames` | Listing agent or private seller |
| `facilities` / `imageUrls` / `viewings` | Amenities, photos, scheduled open-house slots |
| `description` | Full ad copy (detail mode) |

**Job**

| Field | Description |
|---|---|
| `adId` / `title` / `url` | FINN ad id, job title, canonical URL |
| `employer` / `employerLogo` | Hiring company |
| `location` | Workplace address |
| `deadline` | Application deadline, or `Snarest` (ASAP) |
| `employmentType` / `positions` / `sector` | Fast/Vikariat…, number of positions, private/public |
| `industry` / `jobTitleRole` / `keywords` | FINN's own taxonomy plus ad keywords |
| `contactNames` / `contactPhones` / `applyUrl` | Named hiring contacts and where to apply |
| `publishedAt` | When the ad went live (ISO) |
| `description` | Full ad text (detail mode) |

**Car**

| Field | Description |
|---|---|
| `adId` / `title` / `variant` | FINN ad id, model name, and the trim/engine line |
| `price` / `priceExclRegistration` / `registrationFee` | Asking price, and the Norwegian split of price vs re-registration fee |
| `make` / `model` / `year` / `bodyType` | Vehicle identity |
| `mileageKm` / `fuel` / `transmission` / `drivetrain` | Core running gear |
| `powerHp` / `engineLitres` / `co2GramsPerKm` / `weightKg` / `towingCapacityKg` | Performance and capacity |
| `seats` / `doors` / `bootLitres` / `colour` | Body details |
| `firstRegistered` / `nextInspection` / `owners` | History and upcoming EU inspection |
| `registrationNumber` / `vin` | Plate and chassis number as published on the ad |
| `location` / `sellerType` / `paidPlacement` | Where it is, private vs dealer, promoted slot |

**Torget**

| Field | Description |
|---|---|
| `adId` / `title` / `url` | FINN ad id, headline, canonical URL |
| `price` | Asking price in NOK |
| `brand` | Brand from the ad's structured data — only set when detail mode ran |
| `cardAttribute` | The chip FINN prints on the results card; category-dependent (brand on bikes, storage size on phones), so reported verbatim |
| `condition` / `category` | `New` / `Used`, plus the full category path |
| `location` / `postedLabel` / `paidPlacement` | Town, ad age as printed, promoted slot |

#### ❓ FAQ

**Do I need a proxy or an account?** No. FINN serves datacenter IPs without a bot challenge, so the actor runs direct and you pay no proxy traffic. The `proxy` input exists only if you specifically want your own egress.

**Why does my job URL with a location filter return nothing?** FINN renders location-filtered job results in the browser, so the page a scraper receives is genuinely empty — no code can read rows that were never sent. Every location code format was tested; all return zero server-rendered cards. Use `jobLocationContains` instead: it fetches the unfiltered search and keeps only the rows whose location matches, and filtered-out rows are never billed.

**Why is there no bedroom filter on job searches, or a `sort` option?** Only filters verified against FINN's live result counts are exposed. Anything FINN silently ignores was left out on purpose, so a run never quietly returns something other than what you asked for.

**What does *Scrape detail pages* add?** Property: full description, energy label, construction year, floor, shared cost, collective debt, tax value, facilities, every photo, viewing times and contact phones. Jobs: full ad text, employment type, deadline, sector, industry, keywords, contact people and the apply URL. It roughly doubles the requests. Ad URLs you paste are always fully detailed.

**A run failed saying FINN returned server errors — what now?** FINN's search routes fail independently of one another; we've observed `/realestate/homes/search.html` returning 500 for everyone while lettings, ads and jobs stayed healthy. That's FINN, not a block, and no proxy changes it. Try another section or run again shortly.

**Why is `brand` empty on Torget rows?** It comes from the ad's own structured data, which only the detail page carries — turn on *Scrape detail pages* to fill it. The card chip is reported separately as `cardAttribute` because FINN puts different things there per category (a brand on bikes, storage size on phones), and calling that a brand would be wrong.

**Which locations does it cover?** All of Norway. Use county names (`Oslo`, `Vestland`, `Trøndelag`, …) or paste a municipality code such as `1.22042.20166` from any finn.no search URL.

**What format is the output?** JSON, CSV, Excel or via API — one row per listing.

#### 💬 Support

Found a missing field or a page that won't parse? Open an issue on the actor's Issues tab with the input you used — fixes usually ship within a day or two.

#### 🛠 Additional services

Need FINN's other verticals (cars, boats, Torget classifieds), a custom field, or a scheduled feed into your database? Reach out via the Issues tab.

#### 🔎 Explore more scrapers

Browse the full portfolio of property and job-board scrapers on the [Apify Store](https://apify.com/store) — including Rightmove, OnTheMarket, Hemnet, Daft.ie, Funda and Jobindex.

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/finn-no-scraper`).

**Purpose:** scrape FINN.no — Norway's largest marketplace — into one flat row per listing, across four verticals: property (sale, lettings, new-builds, leisure, plots), jobs, cars & vehicles, and Torget classifieds. Property and job rows include contact phone numbers; car rows include the full spec record.

**Minimal input:**

```json
{ "vertical": "realestate", "section": "lettings", "locations": ["Oslo"], "maxItems": 20 }
```

**Output:** rows are discriminated by `rowType`. `property` — `finnkode`, `heading`, `url`, `section`, `price {amount, currency}`, `totalPrice`, `sharedCost`, `collectiveDebt`, `taxValue`, `deposit`, `rentIncludes`, `furnishing`, `animalsAllowed`, `propertyType`, `ownershipType`, `areaFrom`, `areaTo`, `plotArea`, `bedrooms`, `rooms`, `floor`, `constructionYear`, `energyLabel`, `address`, `localArea`, `coordinates {latitude, longitude}`, `agencyName`, `contactPhones`, `contactNames`, `imageUrls`, `viewings`, `facilities`, `publishedAt`, `description`, `detailScraped`. `job` — `adId`, `title`, `url`, `employer`, `employerLogo`, `location`, `deadline`, `publishedAt`, `employmentType`, `positions`, `sector`, `jobTitleRole`, `industry`, `keywords`, `contactNames`, `contactPhones`, `applyUrl`, `description`, `detailScraped`. `car` — `adId`, `title`, `variant`, `url`, `price`, `priceExclRegistration`, `registrationFee`, `make`, `model`, `year`, `mileageKm`, `fuel`, `transmission`, `drivetrain`, `bodyType`, `powerHp`, `engineLitres`, `co2GramsPerKm`, `weightKg`, `towingCapacityKg`, `seats`, `doors`, `bootLitres`, `colour`, `firstRegistered`, `nextInspection`, `owners`, `registrationNumber`, `vin`, `salesForm`, `location`, `sellerType`, `paidPlacement`, `imageUrls`, `description`, `detailScraped`. `torget` — `adId`, `title`, `url`, `price`, `brand`, `cardAttribute`, `condition`, `category`, `location`, `postedLabel`, `paidPlacement`, `imageUrls`, `description`, `detailScraped`.

**Behaviors an agent should know:**

- Always set `maxItems` — a single county search can exceed 5,000 property listings (50 per page).
- `startUrls` and the filter builder are additive; the builder only fires when at least one of its fields is set, so pasted URLs are never joined by a phantom search.
- `scrapeDetails: true` fetches one extra request per row and is what populates description, energy label, contacts and the apply URL.
- Job searches cannot be location-filtered server-side; pass `jobLocationContains` and expect fewer rows than pages fetched. Dropped rows are not billed.
- Car and Torget rows only get their full payload with `scrapeDetails: true`; without it `brand`, `vin`, the spec table and descriptions stay null.
- Property `section` must match the URLs you paste — `homes` and `lettings` return different price semantics (`price` is monthly rent for lettings).
- Billing: one `result` event per emitted row. Blocked, failed and filtered-out requests are never billed.
- No proxy is required; passing one is an explicit override.

### ⚠️ Disclaimer

This scraper is an independent tool and is **not affiliated with, endorsed by, or sponsored by** FINN.no, Schibsted, or any of their subsidiaries. All trademarks, service marks and trade names are the property of their respective owners.

It collects only **publicly available** listing data from FINN.no. It does not access private accounts, bypass authentication, or collect personal data beyond the contact details advertisers themselves publish on public ads. You are responsible for using the scraped data in compliance with FINN's terms, Norwegian and EU law (including GDPR), and any applicable regulations. Use it for legitimate research, aggregation and analysis.

### SEO Keywords

FINN.no scraper, finn no scraper, FINN cars scraper, Norway used car data, bruktbil scraper, FINN Torget scraper, Norwegian classifieds data, Norway property scraper, Norwegian real estate data, scrape FINN eiendom, FINN bolig til salgs, Norway rental listings API, leiebolig scraper, Oslo property data, Norwegian housing market data, FINN jobb scraper, Norway jobs scraper, Norwegian job listings API, ledige stillinger data, Schibsted marketplace scraper, finnkode scraper, Norway real estate API, property price data Norway, estate agent leads Norway, Apify FINN.

# Actor input Schema

## `startUrls` (type: `array`):

FINN.no search-result or ad URLs, auto-classified across all four verticals. Property search: `https://www.finn.no/realestate/homes/search.html?location=0.20061`. Property ad: `https://www.finn.no/realestate/homes/ad.html?finnkode=473282564`. Job search: `https://www.finn.no/job/search?q=utvikler`. Job ad: `https://www.finn.no/job/ad/472810559`. Car search: `https://www.finn.no/mobility/search/car?variant=0.817`. Car ad: `https://www.finn.no/mobility/item/441416549`. Torget search: `https://www.finn.no/recommerce/forsale/search?q=sykkel`. Torget ad: `https://www.finn.no/recommerce/forsale/item/473315083`. Note: job URLs containing a `location=` parameter return 0 rows because FINN renders those results in the browser — use `jobLocationContains` instead. Example: \["https://www.finn.no/realestate/homes/search.html?location=0.20061"]. Default: empty.

## `vertical` (type: `string`):

Which vertical the filter fields below build a search for. `realestate` uses the property filters; `job` uses the job filters. Ignored when you only paste URLs. Example: "realestate". Default: "realestate".

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

Which FINN property market to search. `homes` = homes for sale, `lettings` = rentals, `newbuildings` = new-builds, `leisure-sale` = holiday homes, `plots` = land. Example: "homes". Default: "homes".

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

Norwegian counties by name (`Oslo`, `Vestland`, `Trøndelag`, `Akershus`, `Rogaland`, `Innlandet`, `Agder`, `Buskerud`, `Vestfold`, `Østfold`, `Telemark`, `Troms`, `Nordland`, `Finnmark`, `Møre og Romsdal`, `Svalbard`) or raw FINN location codes such as `0.20061` (Oslo) and `1.22042.20166` (Arendal municipality). Copy a municipality code from any finn.no search URL. Example: \["Oslo"]. Default: empty.

## `searchQuery` (type: `string`):

Free-text keyword matched against property ads, e.g. `penthouse`, `enebolig`, `sjøutsikt`. Leave empty to match everything in the selected locations. Example: "penthouse". Default: empty.

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

Lowest total price in NOK. For lettings this is monthly rent. Example: 3000000. Default: no minimum.

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

Highest total price in NOK. For lettings this is monthly rent. Example: 8000000. Default: no maximum.

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

Smallest usable internal area in square metres. Example: 60. Default: no minimum.

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

Largest usable internal area in square metres. Example: 200. Default: no maximum.

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

Minimum number of bedrooms. Example: 3. Default: no minimum.

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

FINN property-type codes: `1` Enebolig (detached), `2` Tomannsbolig (semi-detached), `3` Leilighet (apartment), `4` Rekkehus (terraced), `6` Garasje/Parkering, `9` Produksjon/Industri, `11` Gårdsbruk/Småbruk (farm), `18` Andre, `20` Bygård/Flermannsbolig. Repeatable — several codes widen the search. Example: \["3"]. Default: all types.

## `ownershipTypes` (type: `array`):

FINN ownership codes: `1` Obligasjon, `2` Aksje, `3` Selveier (freehold), `4` Andel (co-op), `255` Annet. Repeatable. Example: \["3"]. Default: all ownership types.

## `energyLabels` (type: `array`):

Energy-class codes, where `1` = A through `7` = G. Repeatable. Example: \["1", "2"]. Default: any energy class.

## `privateSellerOnly` (type: `boolean`):

When true, returns only ads posted privately rather than through an estate agency. Example: false. Default: false.

## `publishedToday` (type: `boolean`):

When true, returns only ads first published today — useful for scheduled daily runs. Example: false. Default: false.

## `jobQuery` (type: `string`):

Free-text keyword matched against job ads, e.g. `utvikler`, `sykepleier`, `prosjektleder`. Example: "utvikler". Default: empty.

## `jobOccupations` (type: `array`):

FINN occupation (Stillingsfunksjon) codes such as `0.38` (Mekanikk og installasjon) or `0.46` (Produksjon). Copy them from an `occupation=` parameter in any finn.no job search URL. Repeatable. Example: \["0.38"]. Default: all occupations.

## `jobIndustries` (type: `array`):

FINN industry (Bransje) codes such as `70` (Industri og produksjon) or `35` (Kraft og energi). Copy them from an `industry=` parameter in any finn.no job search URL. Repeatable. Example: \["70"]. Default: all industries.

## `jobLocationContains` (type: `string`):

Case-insensitive text that a job's location must contain, applied after parsing, e.g. `Oslo` or `Bergen`. This exists because FINN renders location-filtered job searches in the browser, so a `location=` URL parameter returns nothing to a scraper. Rows that don't match are dropped and never billed. Example: "Oslo". Default: no location filter.

## `carQuery` (type: `string`):

Free-text keyword matched against vehicle ads, e.g. `tiguan`, `tesla model 3`, `varebil`. Example: "tiguan". Default: empty.

## `carPriceFrom` (type: `integer`):

Lowest asking price in NOK. Example: 50000. Default: no minimum.

## `carPriceTo` (type: `integer`):

Highest asking price in NOK. Example: 200000. Default: no maximum.

## `carYearFrom` (type: `integer`):

Earliest model year. Example: 2015. Default: no minimum.

## `carYearTo` (type: `integer`):

Latest model year. Example: 2022. Default: no maximum.

## `carMileageTo` (type: `integer`):

Highest odometer reading in kilometres. Example: 150000. Default: no maximum.

## `torgetQuery` (type: `string`):

Free-text keyword matched against classified ads, e.g. `sykkel`, `iphone`, `sofa`. Example: "sykkel". Default: empty.

## `torgetPriceFrom` (type: `integer`):

Lowest asking price in NOK. Example: 500. Default: no minimum.

## `torgetPriceTo` (type: `integer`):

Highest asking price in NOK. Example: 5000. Default: no maximum.

## `scrapeDetails` (type: `boolean`):

Fetch each listing's own page for the full payload — property: description, energy label, construction year, floor, shared cost, collective debt, tax value, facilities, all photos, viewing times and agent phone numbers; jobs: full ad text, employment type, deadline, sector, industry, keywords, contact people and the apply URL; cars: the full spec table (registration number, VIN, owners, CO₂, towing capacity, next EU inspection) plus description and all photos; Torget: description, brand, condition and category. Roughly doubles the requests. Ad URLs you paste are always fully detailed. Example: true. Default: false.

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

Hard cap on rows across the entire run; each row is one paid result. Free-tier accounts are additionally capped at 100. Example: 200. Default: 1000.

## `maxItemsPerSearch` (type: `integer`):

Cap per search URL. Property searches return 50 listings per page, job searches about 50 cards per page. Example: 500. Default: 1000.

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

How many HTTP requests run at once. Raise for speed, lower to be gentler on the site. Example: 6. Default: 6.

## `maxRequestRetries` (type: `integer`):

Per-request retry budget for transient 403/429/5xx and network errors, with exponential backoff. Example: 8. Default: 8.

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

Leave empty. FINN.no serves datacenter IPs without any bot challenge, so the actor runs direct by default and costs you no proxy traffic. Set this only if you specifically need requests to exit through your own proxy. Example: {"useApifyProxy": true}. Default: no proxy.

## Actor input object example

```json
{
  "startUrls": [],
  "vertical": "realestate",
  "section": "homes",
  "locations": [
    "Oslo"
  ],
  "propertyTypes": [],
  "ownershipTypes": [],
  "energyLabels": [],
  "privateSellerOnly": false,
  "publishedToday": false,
  "jobOccupations": [],
  "jobIndustries": [],
  "scrapeDetails": false,
  "maxItems": 1000,
  "maxItemsPerSearch": 1000,
  "maxConcurrency": 6,
  "maxRequestRetries": 8
}
```

# 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 = {
    "startUrls": [],
    "locations": [
        "Oslo"
    ],
    "propertyTypes": [],
    "ownershipTypes": [],
    "energyLabels": [],
    "jobOccupations": [],
    "jobIndustries": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/finn-no-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 = {
    "startUrls": [],
    "locations": ["Oslo"],
    "propertyTypes": [],
    "ownershipTypes": [],
    "energyLabels": [],
    "jobOccupations": [],
    "jobIndustries": [],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/finn-no-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 '{
  "startUrls": [],
  "locations": [
    "Oslo"
  ],
  "propertyTypes": [],
  "ownershipTypes": [],
  "energyLabels": [],
  "jobOccupations": [],
  "jobIndustries": []
}' |
apify call memo23/finn-no-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/finn-no-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/tHyZM7Fhyip6U43Vn/builds/Q9x5K2XKsqIO43sBw/openapi.json
