# FINN.no Scraper: Torget, Cars, Homes and Jobs (`automation_craft/finn-scraper`) Actor

Norway's FINN.no in one Actor: Torget, cars, MC and boats, homes and rentals, jobs, by keyword, place, FINN filters or links, no login, read past the 50 page cap. Rows carry price, totalpris, felleskostnader, bedrooms, make, mileage, employer, deadline. Monitor alerts, pay per row, Excel, API.

- **URL**: https://apify.com/automation_craft/finn-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** E-commerce, Jobs, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.04 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

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

## How to integrate an Actor?

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

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

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

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

# README

### FINN.no Scraper: Torget, Cars, Homes and Jobs

**FINN.no scraper** for Norway's largest marketplace: search all four parts of FINN.no in one run, Torget (the general
marketplace), cars and other vehicles (17 FINN motor searches: cars, MC, boats, caravans, motorhomes, trucks, tractors and more),
real estate (12 FINN eiendom sections: homes for sale, homes to rent, new builds, holiday homes, plots, commercial property,
companies for sale) and jobs, by keyword, by place, by FINN's own filters, by a pasted FINN search link or by ad link and FINN code.
Each ad is one row with its price, place, map point, published time, photos and the vertical's own facts (make, model, year,
mileage, fuel; total price, shared costs, area, bedrooms; employer, deadline, apply link). Turn on the ad page, at no extra
charge, for the full description, every key fact, car equipment and EU control dates, property costs, energy label and viewings. A search FINN caps at
50 pages is split by FINN's own facets so the run reads past the cap, and a free coverage row says what FINN counts and what was
read. No login, no cookies. A monitor delivers only ads it never delivered before, with price changes and removed ads if you like,
and can send them to Telegram, Slack, Discord, WhatsApp or your own webhook.

Who uses it: car dealers and buyers watching new Tesla, Volvo or Toyota ads, flat hunters and property investors following new
homes and rentals in Oslo, Bergen or Trondheim, resellers watching Torget bargains, recruiters and analysts reading Norwegian job
ads, and teams feeding FINN data into their own sheets, apps or AI agents.

### Quick start

1. Open the **Input** tab and pick the **Verticals**: `torget`, `vehicles`, `realestate`, `jobs` (several at once if you like).
2. Narrow them: **Vehicle types** (`car`, `mc`, `boat` ...), **Real estate sections** (`homes`, `lettings` ...), **Job searches**,
   **Torget categories** (`Sofaer`, `Møbler og interiør`), **Keywords** (`sofa`, `tesla model y`, `sykepleier`) and **Places**
   (`Oslo`, `Bergen`, `Trøndelag`, `Grünerløkka`).
3. Or paste FINN links: search pages into **Search links**, ad links or FINN codes into **Ad links or FINN codes**.
4. Add filters (price, seller type, make, model, year, mileage, bedrooms, total price, occupation, extent ...), set **Maximum
   rows** and click **Start**. Download the rows as JSON, CSV or Excel, or read them through the Apify API.

The prefilled input reads 20 used cars in Oslo: measured, 4 seconds and 2 requests (run dWfBgSx71Jdc1SNUH on the test build of
2026-10-22). To receive new ads only, give the run a **Monitor name** and schedule it (daily or more often).

### What you get

One row per ad (`type: "listing"`, with `vertical` set to `torget`, `vehicles`, `realestate` or `jobs`), one coverage row per
search (`type: "search"`), free status rows for anything that could not be delivered (`type: "status"`), a run summary
(`type: "summary"`), and in a monitor with **Track changes** a row per ad that left FINN (`type: "removed"`).

Every fill figure below is measured, and each one appears only in these four tables. They were counted on real FINN answers saved
during the build spike of 2026-10-21 and 2026-10-22: search rows de-duplicated by ad id, and real ad pages read by this Actor's own
ad page parser. "Search row" means the row without the ad page; "ad page" means the row with **Include the ad page** on (or from an
ad link). A field FINN does not show for an ad is `null`.

#### On every row

| Field | What it is |
|---|---|
| `adId`, `url`, `title`, `vertical`, `kind` | the FINN code, the ad's link, its title, the vertical and the FINN search it came from (`car`, `homes`, `all` ...; null on an ad link row) |
| `price`, `currency` | the price in kroner (`NOK`; jobs have none) |
| `status`, `soldAt` | `active` or `sold`, and when FINN gives it, the time it was sold |
| `publishedAt`, `firstPublishedAt`, `editedAt` | FINN's latest publication (the time of the search row: a renewed ad is new again; on an ad link row the ad page's date), the first publication from the ad page, the last change (ad page) |
| `location`, `streetAddress`, `postalCode`, `postalName` | the place as FINN shows it, and from the ad page the street and post code |
| `latitude`, `longitude`, `coordinateAccuracy` | the map point and FINN's accuracy code |
| `imageUrl`, `imageUrls`, `imageCount` | photo links (never downloaded) |
| `sellerType`, `sellerId` | `private` or `business`; the seller's FINN id |
| `companyName`, `companyId`, `companyOrgNumber`, `companyPhone`, `companyEmail`, `companyWebsite`, `companyAddress`, `companyLogo` | a business seller's (dealer, shop, agency, employer) data, always delivered |
| `labels`, `description`, `descriptionText`, `attributes`, `contentHash` | FINN's labels, the description of the ad page as served and as text, every key fact as label and value, a short hash of the description |
| `searchKey`, `searchLabel`, `source`, `position`, `detailsIncluded` | which search delivered the row, `search` or `link`, its place in the search, whether the ad page was read |
| `monitorName`, `deliveryId`, `runId`, `scrapedAt`, `change`, `possibleRepostOf` | monitor and run facts; `change` in monitor runs with **Track changes** |

With **Extract contacts from texts**: `emails`, `phoneNumbers`, `websites`, `socialProfiles`. With **Include raw search row**: `raw`.

#### Torget

Measured on 1,054 Torget search rows and 50 Torget ad pages.

| Field | What it is | Filled (measured) |
|---|---|---|
| `price` | asking price in kroner (0 for a give away) | 1,054 of 1,054 search rows (1,003 above 0) |
| `tradeType` | `Til salgs`, `Gis bort`, `Ønskes kjøpt` | 1,054 of 1,054 search rows |
| `location`, `latitude`, `longitude`, `publishedAt` | place, map point, published time | 1,054 of 1,054 search rows |
| `imageUrls` | photo links | 1,052 of 1,054 search rows; 50 of 50 ad pages |
| `companyName` | the shop or business seller | 197 of 1,054 search rows (every business row) |
| `brand` | the brand FINN shows (`IKEA`, `Apple`) | 261 of 1,054 search rows; 13 of 50 ad pages |
| `shippingAvailable`, `buyNow`, `sellerPaysShipping` | Fiks ferdig shipping and buy now | 50 of 50 ad pages |
| `description`, `categoryPath`, `category` | full description, FINN's category tree | 50 of 50 ad pages |
| `condition` | `Som ny - Ikke synlig brukt` and the other FINN conditions | 30 of 50 ad pages |
| `attributes` | the ad page's key facts | 31 of 50 ad pages |
| `postalCode`, `postalName` | post code and town | 50 of 50 ad pages |
| `companyPhone`, `companyAddress`, `companyOrgNumber` | the shop card | 3 of the 3 business ad pages among the 50 |

#### Cars and other vehicles

Measured on 1,165 car search rows (584 dealer and 581 private) and 286 vehicle ad pages (cars, motorcycles, boats and other kinds).

| Field | What it is | Filled (measured) |
|---|---|---|
| `make`, `model`, `year`, `mileage`, `fuel`, `price`, `dealerSegment` | the car's basics and `Privat`, `Forhandler` or `Merkeforhandler` | 1,165 of 1,165 search rows |
| `transmission` | `Automat` or `Manuell` | 1,163 of 1,165 search rows |
| `series`, `modelSpecification`, `registrationClass`, `drivingRangeKm`, `warrantyMonths`, `serviceDocuments` | more search row facts | when FINN shows them |
| `companyName` | the dealer | 584 of 584 dealer search rows |
| `vin`, `plate` | chassis number and registration plate | dealer search rows: VIN 581 of 584, plate 459 of 584; private sellers only with **Include personal data** |
| `sellerKnowledge`, `knownDamages`, `damagesDetails`, `majorRepairs` | the seller's own answers on a private car ("Selgers kjennskap til bilen": damages, repairs, tuning), as served | `sellerKnowledge` 80, `knownDamages` 64, `damagesDetails` 33, `majorRepairs` 61 of 286 ad pages |
| `vehicleRegisterUrl` | the Statens vegvesen lookup the ad page links to (it carries the plate) | 192 of 286 ad pages; private sellers only with **Include personal data** |
| `description` | the full description | 278 of 286 ad pages |
| `colour`, `powerHp`, `seats`, `doors`, `bodyType`, `wheelDrive`, `engineVolume`, `weight` | the specification | colour 235, power 210, seats 181, body type 155, wheel drive 164, weight 240 of 286 ad pages |
| `firstRegistration`, `owners`, `nextEuControl`, `lastEuControl` | registration and EU control (EU-kontroll) | 163, 118, 99 and 26 of 286 ad pages |
| `priceExclRegistration`, `registrationFee`, `priceTotal` | price without and with the registration fee | 231, 221 and 160 of 286 ad pages |
| `equipment` | the equipment list | 155 of 286 ad pages |
| `warranty`, `conditionReport`, `condition`, `salesForm` | warranty, condition report, condition, sales form | 80, 20, 64 and 158 of 286 ad pages |
| `batteryCapacity`, `co2` | electric and emission facts | 39 and 86 of 286 ad pages |
| `dealer`, `companyPhone`, `companyEmail`, `companyWebsite`, `companyAddress` | the dealer card | dealer card 142 of 286 ad pages (the dealer ads); phone 108, e-mail 122, website 108, address 141 |
| `boatClass`, `lengthFeet`, `widthCm`, `motorType`, `motorSize`, `maxSpeedKnots`, `hoursUsed` | boat and machine facts of the search row | boat and machine searches |

#### Real estate

Measured on 4,547 real estate search rows over all 12 sections (1,817 homes for sale, 1,000 homes to rent) and 269 real estate ad pages.

| Field | What it is | Filled (measured) |
|---|---|---|
| `price`, `priceSuggestion`, `priceTotal` | asking price (prisantydning) and total price (totalpris) | 4,547 of 4,547 search rows; 188 and 187 of 269 ad pages |
| `sharedCost` | shared costs a month (felleskostnader) | 4,344 of 4,547 search rows; 92 of 269 ad pages |
| `area`, `bedrooms`, `propertyType` | area (with its kind, such as p-rom), bedrooms, property type (`Leilighet`, `Enebolig`) | 4,544, 4,543 and 4,474 of 4,547 search rows |
| `ownershipType` | `Selveier`, `Andel`, `Aksje` | 2,745 of 4,547 search rows (1,817 of 1,817 homes for sale) |
| `agencyName` | the agency | 3,433 of 4,547 search rows; 228 of 269 ad pages |
| `viewings` | viewing times (visning) | 1,968 of 4,547 search rows of the research sample (1,691 of 1,817 homes for sale), 1,141 of 3,586 homes of one real run (Oslo and Hurdal, many without a viewing set yet); 207 of 269 ad pages |
| `latitude`, `longitude`, `imageUrls` | map point and photos | 4,547 and 4,510 of 4,547 search rows |
| `localArea`, `priceRange`, `priceTotalRange`, `bedroomsRange`, `isProject`, `comingForSale`, `furnished` | search row facts of projects and rentals | when FINN shows them |
| `description` | the full description | 269 of 269 ad pages |
| `usableArea`, `primaryRoomArea`, `grossArea`, `plotArea` | areas in m2 | 203, 52, 8 and 185 of 269 ad pages |
| `rooms`, `floor`, `constructionYear`, `energyLabel` | rooms, floor, year built, energy label | 135, 162, 189 and 170 of 269 ad pages |
| `collectiveDebt`, `collectiveAssets`, `municipalFees`, `propertyTax` | fellesgjeld, fellesformue, kommunale avgifter, eiendomsskatt | 48, 52, 109 and 54 of 269 ad pages |
| `monthlyRent`, `deposit` | rent a month and deposit of a rental | 56 and 28 of 269 ad pages |
| `facilities`, `cadastre`, `projectUnits` | facilities, the cadastre numbers (a private seller's only with **Include personal data**), the units of a new build project | 230, 214 and 14 of 269 ad pages |
| `clicks` | the ad's click count where the ad page shows one | 6 of 269 ad pages |
| `prospectusUrl`, `floorPlanUrls`, `documents`, `bidUrl` | the sales prospectus, floor plan images, attached documents, the electronic bidding link | 172, 171, 15 and 174 of 269 ad pages |
| `mapImageUrl` | FINN's map image of the ad's point | 266 of 269 ad pages; a private seller's only with **Include personal data** |
| `brokers` | the agency's brokers | 228 of 269 ad pages, only with **Include personal data** |

#### Jobs

Every job row carries its ad page (billed as one Job). Measured on 137 job ad pages (582 job search rows for the search fields).

| Field | What it is | Filled (measured) |
|---|---|---|
| `jobTitle`, `heading`, `occupationTitle` | the job title, the ad's heading, FINN's structured title | 135, 137 and 107 of 137 |
| `employerName`, `companyOrgNumber`, `companyAddress`, `companyWebsite`, `companyLogo` | the employer | 137, 136, 132, 125 and 126 of 137 |
| `employerDescription` | the employer's own text | when the ad has one |
| `description`, `descriptionText`, `finnSummary` | the job text and FINN's own summary | 137 of 137 |
| `positions`, `duration`, `sector`, `occupations` | positions, `Fast` or temporary, sector, occupation fields | 137 of 137 |
| `jobType`, `industries` | job type and industries | 126 of 137 |
| `deadline`, `deadlineText` | application deadline (søknadsfrist) | 97 and 91 of 137 ad pages; 471 of 582 search rows |
| `applyUrl`, `easyApply`, `jobLabels` | the apply link and the "Enkel søknad" label | apply link 131 of 137 |
| `skills`, `skillsDetail`, `keywords` | skills and keywords | 121, 121 and 102 of 137 |
| `workLanguage`, `remote` | working language and home office | 80 and 58 of 137 |
| `extent`, `leadershipCategory`, `startDate` | full or part time, manager level, start | few ads state them: extent 11 and manager level 15 of 137 saved ad pages; extent and start 0 of 200 jobs of one real run |
| `salary`, `salaryType`, `salaryExtra` | the salary as FINN shows it | 4 of 137 (few FINN job ads give one) |
| `municipality`, `county`, `latitude`, `longitude`, `workLocations` | where the job is | 132 of 137 |
| `jobSource` | `FINN` for FINN's own job ads, `NAV` for the NAV ads FINN shows beside them | every row |
| `videoUrl`, `sourceUrl`, `externalAdId` | video, the original ad, the employer's own ad id | 20, 11 and 88 of 137 |
| `contacts` | contact persons (name, title, phone, mobile, e-mail) | 136 of 137, only with **Include personal data** |

#### Example rows

A car from the prefilled run (shortened; a private seller, personal data off, run dWfBgSx71Jdc1SNUH):

```json
{
  "type": "listing", "vertical": "vehicles", "kind": "car", "adId": "479278405",
  "url": "https://www.finn.no/mobility/item/479278405", "title": "Volkswagen Golf IV",
  "price": 56942, "currency": "NOK", "status": "active", "publishedAt": "2026-10-21T23:22:22.000Z",
  "location": "Oslo", "latitude": 59.87, "longitude": 10.81991, "coordinateAccuracy": 5, "imageCount": 30,
  "sellerType": "private", "sellerId": null, "companyName": null,
  "make": "Volkswagen", "series": "Golf-Serie", "model": "Golf IV", "year": 2002, "mileage": 142200,
  "fuel": "Bensin", "transmission": "Automat", "registrationClass": "Personbil", "dealerSegment": "Privat",
  "plate": null, "vin": null, "source": "search", "position": 2, "detailsIncluded": false
}
```

A Torget ad with its ad page (shortened, run 5akUXSLAGaJ0QJxvm):

```json
{
  "type": "listing", "vertical": "torget", "kind": "all", "adId": "479261704",
  "url": "https://www.finn.no/recommerce/forsale/item/479261704", "title": "Sofaer gis bort",
  "price": 0, "currency": "NOK", "publishedAt": "2026-10-21T23:09:47.000Z", "location": "Hønefoss",
  "postalCode": "3513", "postalName": "Hønefoss", "imageCount": 4, "sellerType": "private", "sellerId": null,
  "attributes": [{ "label": "Tilstand", "value": "Godt brukt - Synlig brukt" }],
  "categoryPath": [{ "id": "78", "name": "Møbler og interiør" }, { "id": "7756", "name": "Sofaer og lenestoler" }, { "id": "8374", "name": "Sofaer" }],
  "category": "Sofaer", "condition": "Godt brukt - Synlig brukt", "tradeType": "Gis bort",
  "shippingAvailable": false, "detailsIncluded": true
}
```

A home for sale with its ad page (shortened; an agency's ad, from the local end to end test of 2026-10-21):

```json
{
  "type": "listing", "vertical": "realestate", "kind": "homes", "adId": "459347131",
  "url": "https://www.finn.no/realestate/homes/ad.html?finnkode=459347131",
  "price": 3100000, "priceSuggestion": 3100000, "priceTotal": 3178590, "sharedCost": 3000,
  "location": "Eidsveien 480E, Blaker", "streetAddress": "Eidsveien 480E", "postalCode": "1925", "postalName": "Blaker",
  "sellerType": "business", "companyName": "EiendomsMegler 1 Lillestrøm", "agencyName": "EiendomsMegler 1 Lillestrøm",
  "propertyType": "Leilighet", "ownershipType": "Selveier",
  "area": { "from": 89, "to": 89, "unit": "m²", "kind": "size" }, "usableArea": 102, "plotArea": 1284,
  "bedrooms": 2, "rooms": 3, "floor": 2, "constructionYear": 1960, "energyLabel": "F", "brokers": null,
  "detailsIncluded": true
}
```

A job (shortened, from the same local test):

```json
{
  "type": "listing", "vertical": "jobs", "adId": "479273514", "url": "https://www.finn.no/job/ad/479273514",
  "jobTitle": "Boutique Manager - butikksjef i 100% fast stilling", "employerName": "L'Occitane Norge AS",
  "companyOrgNumber": "912473902", "companyAddress": "Brodtkorbsgate 7, 1338 Sandvika",
  "municipality": "Bærum", "county": "Akershus", "positions": 1, "deadline": "2026-11-12", "duration": "Fast",
  "sector": "Privat", "industries": ["Butikk og varehandel", "Velvære"], "occupations": ["Butikksjef"],
  "workLanguage": ["Norsk", "Engelsk"], "salary": null, "applyUrl": "https://www.finn.no/job-apply/479273514/job/apply",
  "jobSource": "FINN", "contacts": null, "source": "search", "detailsIncluded": true
}
```

#### The coverage row of each search (free)

Each search gets one free row: FINN's order it was read in (`order`), the filters sent (`filtersSent`), how many ads FINN counts for it (`adsOnFinn`), the slices, pages
and rows read, the ads met and delivered, how many were left out and by which filter (`filteredOutBy`), how many a monitor already
knew (`knownToMonitor`), the ads still beyond reach (`adsBeyondReach`), whether the search was read to its end (`complete`) and why
it stopped (`stoppedBy`). With **Price summary per search** (on by default) it also carries `priceSummary`: count, lowest,
quartiles, median, mean and highest price of the ads met. From the prefilled run (dWfBgSx71Jdc1SNUH):

```json
{ "type": "search", "vertical": "vehicles", "kind": "car", "searchLabel": "in Used cars (vans, new, leasing and auctions by filter)",
  "filtersSent": ["location=0.20061"], "adsOnFinn": 4298, "slicesRead": 0, "pagesRead": 1, "rowsRead": 50, "distinctAdsMet": 50,
  "adsBeyondReach": 0, "adsDelivered": 20, "filteredOut": 0, "filteredOutBy": {},
  "priceSummary": { "count": 50, "withoutPrice": 0, "currency": "NOK", "min": 16942, "p25": 74532, "median": 319900, "p75": 419900, "max": 2399900, "mean": 349059.16 },
  "complete": false, "stoppedBy": "maxItems" }
```

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

You pay per event, with Apify's store discounts by plan. Each vertical has its own row event, and the ad page is included in the
row price: with **Include the ad page** on, on every ad link row and on every job row, it costs nothing extra.

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Listing (one Torget ad row) | $1.45 per 1,000 | $1.33 per 1,000 | $1.20 per 1,000 | $1.04 per 1,000 |
| Vehicle (one car, MC, boat or other vehicle row) | $1.45 per 1,000 | $1.33 per 1,000 | $1.20 per 1,000 | $1.04 per 1,000 |
| Home (one real estate row, any section) | $1.45 per 1,000 | $1.33 per 1,000 | $1.20 per 1,000 | $1.04 per 1,000 |
| Job (one job row, its ad page included) | $0.94 per 1,000 | $0.94 per 1,000 | $0.94 per 1,000 | $0.90 per 1,000 |
| Results page (monitor runs only, one search page read) | $0.70 per 1,000 | $0.64 per 1,000 | $0.58 per 1,000 | $0.50 per 1,000 |
| Actor start (once per run) | $0.0049 | $0.0049 | $0.0049 | $0.0049 |

Platinum and Diamond plans pay the Gold price. The Actor start is a flat fee per run, with no plan discount.

The Store pricing card shows these prices per 1,000 events: "$1.45 / 1,000" on the Listing row means one Torget ad row costs
$0.00145, about a seventh of a cent.

- **Listing**, **Vehicle**, **Home** and **Job** are charged once per ad delivered as a row, from a search or a link, with or
  without its ad page. In a monitor with **Track changes** they are also charged per row delivered again because the ad changed or
  came back, and per removed row; with **Deliver unchanged ads too**, per unchanged row.
- **Results page** is charged only in a monitor run (**Monitor name** set): one per search page read, whatever it held, so a monitor
  pays for checking even on a day with nothing new. A read that failed or that FINN did not apply is free. Runs without a monitor
  never pay it.
- Never billed: the ad page, repeats in the run, rows left out by a filter, NAV job ads left out, ads a monitor already delivered,
  a missing or removed ad, a refused setting, a search that finds nothing, coverage rows, status rows, the summary and every
  notification.
- **The Actor start ($0.0049) is charged once per run, also when the run finds nothing** (a keyword with no ads, a filter no ad
  passes, an input with nothing valid in it): such a run costs $0.0049.
- Example on the Bronze plan: 1,000 Torget rows cost $0.0049 (start) + 1,000 listings ($1.33) = $1.3349. The Free plan pays
  $1.4549, the Silver plan $1.2049, the Gold plan $1.0449.
- Example with the ad page on the Gold plan: 1,000 cars with equipment, EU control and the dealer card cost $0.0049 + 1,000
  vehicles ($1.04) = $1.0449, the same as without the ad page. On the Free plan $0.0049 + $1.45 = $1.4549.
- Example of 1,000 jobs: $0.0049 + 1,000 jobs ($0.94) = $0.9449 on the Free, Bronze and Silver plans; $0.9049 on the Gold plan.
- Example of a daily monitor of homes for sale in one place on the Gold plan, with the default window of 100 rows (2 pages of 50)
  and 10 new homes: start ($0.0049) + 2 results pages ($0.001) + 10 homes ($0.0104) = $0.0163. A day with nothing new: $0.0059.
- Example of a monitor of 50 saved Torget searches (one page each with the default window) on the Gold plan, on a day with
  nothing new: $0.0049 + 50 results pages ($0.025) = $0.0299.
- The prefilled run of 20 cars costs $0.0049 + 20 vehicles ($0.029) = $0.0339 on the Free plan (measured event counts: run
  dWfBgSx71Jdc1SNUH charged 1 start and 20 Vehicle events).

### Input

| Setting | What it does |
|---|---|
| `verticals` | `torget`, `vehicles`, `realestate`, `jobs`: each searched on its own, once per keyword. Left empty, the vertical comes from the vertical settings you give, else Torget. |
| `keywords` | Search words, each its own search (up to 300, 100 characters each). Left empty, the vertical is searched without words in FINN's default order (newest first on vehicles and real estate, relevance on Torget and jobs). |
| `torgetCategories` | Torget categories by FINN's Norwegian name or value (`Møbler og interiør`, `Sofaer`, `0.78`), each its own search. |
| `vehicleTypes` | 17 FINN motor searches: `car`, `mc`, `scooter`, `atv`, `snowmobile`, `boat`, `boatEngine`, `boatDock`, `caravan`, `mobileHome`, `truck`, `bus`, `construction`, `tractor`, `agriTools`, `threshers`, `b2bAll`. Left empty: used cars. |
| `propertyTypes` | 12 FINN eiendom sections: `homes`, `lettings`, `newbuildings`, `leisuresale`, `abroad`, `plots`, `leisureplots`, `businessrent`, `businesssale`, `businessplots`, `companyforsale`, `wanted`. Left empty: homes for sale. |
| `jobTypes` | `all` (the default), `parttime`, `management`, `nav` (the NAV job ads FINN shows beside its own). |
| `locations` | Counties, municipalities or districts by FINN's Norwegian name (`Oslo`, `Bergen`, `Trøndelag`, `Grünerløkka`) or value, in every vertical. Several places are one search. |
| `latitude`, `longitude`, `radiusKm` | FINN's own map radius around a point in Norway (1 to 500 km), every vertical. |
| `minPrice`, `maxPrice`, `sellerType`, `postedToday` | Price in kroner (for rentals the rent), private or business sellers (Torget, vehicles, real estate), FINN's "Nye i dag". |
| `conditions`, `tradeTypes`, `brands`, `shippingOnly` | Torget: condition, for sale, give away or wanted, brand, Fiks ferdig only. |
| `makes`, `models`, `minYear`, `maxYear`, `minMileage`, `maxMileage`, `minPowerHp`, `maxPowerHp`, `minSeats`, `maxSeats`, `fuelTypes`, `transmissions`, `bodyTypes`, `wheelDrives`, `colours`, `salesForms`, `vansOnly` | Vehicle filters by FINN's names (`Tesla`, `Model Y`, `El`, `Automat`, `SUV/Offroad`, `Firehjulsdrift`, `Leasing`). A model series answers to its name without FINN's "-Serie" suffix: `Golf` finds `Golf-Serie`. |
| `propertyKinds`, `minBedrooms`, `minArea`, `maxArea`, `minTotalPrice`, `maxTotalPrice`, `minPlotArea`, `maxPlotArea`, `ownershipTypes`, `facilities`, `newBuildOnly` | Real estate filters (`Leilighet`, `Enebolig`, `Selveier`, `Balkong/Terrasse` ...). |
| `occupations` or `industries`, `extents`, `sectors`, `remoteOptions`, `includeNavAds` | Job filters (`IT utvikling`, `Helse og omsorg`, `Heltid`, `Offentlig`, `Delvis hjemmekontor`); occupations and industries never together. NAV ads are left out free unless `includeNavAds` is on; job rows say `jobSource` `FINN` or `NAV`. |
| `attributeFilters` | Any other filter of the search's own FINN filter list by its name or label: `{"energy_label": ["A", "B"], "construction_year": {"min": 2015}, "job_duration": ["Fast"]}`. |
| `postedAfter`, `postedWithinHours` | A date (YYYY-MM-DD, Norway time) or a number of hours, checked on every row. |
| `includeKeywords`, `requireAllKeywords`, `excludeKeywords`, `titleOnly`, `excludeAdIds` | Words a row must hold (one or all) or must not hold, in the title only if you like; FINN codes you already have. A row left out is free. |
| `searchUrls` | FINN search links of the four verticals, read with all their filters (up to 300). |
| `adUrls` | Ad links of any vertical or FINN codes (up to 5,000), each read with its ad page. A removed or unknown one is a free status row. |
| `maxItems`, `maxItemsPerSearch`, `maxPagesPerSearch`, `maxRowsPerSearch` | Paid rows per run (default 100), rows per search, pages per search, rows read per search (a monitor's window, 100 by default). |
| `includeDetails`, `includePersonalData`, `includeRawData` | The ad page (included in the row price), the personal data switch, FINN's own search row. |
| `descriptionFormat`, `descriptionMaxLength`, `compactOutput`, `excludeEmptyFields`, `extractContacts`, `phoneExtractionMode`, `priceSummary` | Description `asServed`, `text` or `markdown`; a length cut; core fields only; empty fields left out; e-mails, phones, websites and social profiles found in the texts; the free price summary. |
| `monitorName`, `resetMonitor`, `trackChanges`, `changesToDeliver`, `emitUnchanged`, `markReposts`, `skipReposts` | The monitor (below). |
| `telegramBotToken`, `telegramChatId`, `slackWebhookUrl`, `discordWebhookUrl`, `whatsappAccessToken`, `whatsappPhoneNumberId`, `whatsappTo`, `webhookUrl`, `webhookSecret`, `webhookHeaders`, `notificationLimit`, `notifyOnlyChanges` | Free notifications of the rows a run delivered (below). |
| `failIfIncomplete`, `maxFailedRequestsPercent`, `proxyConfiguration`, `requestsPerSecond`, `maxConcurrency`, `maxRequestRetries` | Fail the run when a search is incomplete or too many reads failed; your own proxy links; the pace (0.2 to 2 requests a second, default 1), requests in flight (1 to 4, default 2), retries (0 to 5, default 2). |

A run reads at most 300 searches (verticals times their types times Torget categories times keywords, plus search links). A
vertical only setting (a make, a bedroom count, an occupation) given while the run also searches a vertical it does not apply to
refuses the run with a free row: a filter is never silently left out of some searches.

#### One input per vertical

Torget: sofas in Oslo between 500 and 3,000 kroner.

```json
{ "verticals": ["torget"], "keywords": ["sofa"], "locations": ["Oslo"], "minPrice": 500, "maxPrice": 3000, "maxItems": 200 }
```

Cars: private Tesla Model Y from 2021 with under 80,000 km, with the ad page.

```json
{ "verticals": ["vehicles"], "vehicleTypes": ["car"], "makes": ["Tesla"], "models": ["Model Y"], "minYear": 2021,
  "maxMileage": 80000, "sellerType": "private", "includeDetails": true, "maxItems": 100 }
```

Real estate: flats for sale in Bergen with 2 or more bedrooms, a total price up to 5 million and energy label A or B.

```json
{ "verticals": ["realestate"], "propertyTypes": ["homes"], "locations": ["Bergen"], "propertyKinds": ["Leilighet"],
  "minBedrooms": 2, "maxTotalPrice": 5000000, "attributeFilters": { "energy_label": ["A", "B"] }, "maxItems": 100 }
```

Jobs: full time nursing jobs in Trøndelag.

```json
{ "verticals": ["jobs"], "keywords": ["sykepleier"], "locations": ["Trøndelag"], "extents": ["Heltid"], "maxItems": 100 }
```

#### Every filter is checked

Every named setting is resolved against the search's own FINN filter list. A value the list does not offer (a make, a place, a
category) is a free row that lists the values it does offer, and the search delivers nothing: an unknown value never widens a
search. Every page FINN answers must echo back exactly the filters sent; a filter FINN dropped in silence makes that page a free
`search_not_applied` row and the search delivers nothing more.

#### Past FINN's 50 page cap

FINN serves at most 50 pages of one search: 2,500 ads at 50 a page, 10,000 on Torget at 200 a page. When FINN counts more ads than
that and you want more, the search is split into slices by FINN's own facets with their counts: Torget by category, sub category
and product category, then place; vehicles by make and model, then place; real estate by county, municipality and district; jobs by
place, then extent. A slice still past the cap is split again, and a scope no facet splits is cut into price bands (none on jobs).
An ad met in an earlier slice is skipped free. The coverage row says how many slices were read and how many ads stayed beyond
reach (`adsBeyondReach`) or sit on a place or category none of its parts holds (`adsNoSliceHolds`: FINN counts a few ads on a
municipality and none of its districts), and a search is `complete` only when its slices met about every ad FINN counted and no
such ad was left.

#### Ad pages

With **Include the ad page** on, each delivered row's ad page is read and merged: the full description, every key fact, all
images, the seller's or dealer's card, car equipment, EU control dates and the price with fees, property costs, energy label,
facilities and viewings. It is included in the row's Listing, Vehicle or Home price at no extra charge; it takes about a second per
row at the default pace. Ad links are always delivered with their page, and job rows always carry theirs. An ad that FINN no longer shows, or shows as no
longer active or expired, is a free status row.

#### Monitor: only new ads, with price changes and alerts

Give the run a **Monitor name** and schedule it. Each run reads the window of every search (**Rows read per search**, 100 by
default), pays a Results page per page it reads, and delivers only the ads this monitor never delivered before; each is delivered and
billed once per monitor, and the ones it knows are free. Vehicles and real estate come newest first, so a window of 100 sees
every new ad between daily runs of a narrow search; Torget and jobs answer in FINN's relevance order (newest first in every
read without words we measured, ranked by match with words), so a new ad can sit deeper in the search: give those a window that holds the whole search (the coverage row's `adsOnFinn`), and the coverage row sets
`newAdsMayLieBeyond` whenever the window did not. With **Track changes**, a known ad comes again when its price changed
(`priceChanged`, with the previous price, the first seen price and a price history), its title, photo count, place or status
changed (`updated`) or it came back (`reappeared`); **Changes to deliver** narrows it to price changes or price drops. With **Include the ad page**
on, a known ad's page is read again when its search row changed (price, title, place, the photos the search row shows,
status): a change only the ad page shows waits for such a run. When a run
read every search to its end, each tracked ad it no longer met is checked on its ad page and reported once as a `removed` row
(held back when more than half and more than 5 are missing at once). **Mark reposts** marks a new ad whose vertical, title, price
and seller match one the monitor delivered (`possibleRepostOf`); **Skip reposts** leaves them out free. **Reset the monitor**
starts it empty. One monitor name belongs to one set of settings: a run with other settings under the same name reads nothing and
says why. A monitor remembers up to 60,000 ads.

Because a monitor pays a Results page for every search page it reads, a monitor of many searches with nothing new pays the
start fee plus one Results page per search page read: 50 saved Torget searches checked on a day with nothing new cost
$0.0049 + 50 x $0.0005 = $0.0299 on the Gold plan. Fewer, wider searches keep this low: several
places in **Places** are one search, while each keyword and each Torget category is its own search.

Notifications are free and list the rows the run delivered, in a monitor run or any other: Telegram through your own bot (one
message per row, up to **Rows per notification** rows, default 10, at most 30, then a line naming the rest), one Slack, Discord or
WhatsApp Cloud API message listing up to that many rows, and a webhook that receives up to 1,000 rows per run in JSON batches of
100, signed with HMAC SHA-256 (header `x-signature-sha256`) when you give a secret, with up to 10 headers of your own. **Notify
changes only** leaves new ads out. A failed notification gets a free status row and never fails the run.

A monitor for new rentals in Oslo, with price changes and a Telegram alert:

```json
{ "verticals": ["realestate"], "propertyTypes": ["lettings"], "locations": ["Oslo"], "monitorName": "oslo-lettings",
  "trackChanges": true, "telegramBotToken": "YOUR_BOT_TOKEN", "telegramChatId": "YOUR_CHAT_ID" }
```

#### Free status rows

Nothing is billed for a FINN code or ad link that FINN no longer shows, a refused setting or list item (a free row names it by its
position and says why), a filter value FINN does not offer, a search FINN did not apply, a search that finds nothing (its coverage
row says `adsOnFinn: 0`), or a search or link the run did not reach. Measured on the test build: a nonsense keyword (run
M33oQgLiBib4sgsKD) and three refused items (run aMz9Cfglt1l3OGj5G) each charged only the Actor start. A run writes up to 20 such
rows plus one per billed event (and at most 200 of one kind); the summary counts all of them.

#### Personal data

With **Include personal data** off (the default), a private seller's FINN id (`sellerId`), the street of a private seller's ad
(`streetAddress`; on a private real estate ad the place shown is then the local area), its `cadastre` numbers and `mapImageUrl`, a
private seller's vehicle `plate`, `vin` (also left out of `attributes`) and `vehicleRegisterUrl`, every contact person (`contacts`: dealers', agencies' and employers' staff) and the real estate `brokers` are null, and so
are the contacts found in the texts of private ads and job ads (**Extract contacts from texts**) and the raw search row of a
private ad. A private seller's map point is rounded to 2 decimals (about 1 km) when FINN gives it to the address. Turning the
switch on adds all of these and the exact map point. A business's data (dealers, shops, agencies, employers: name, organisation
number, address, phone, e-mail, website, logo) is business data and always delivered. Titles and descriptions are delivered
exactly as FINN serves them, so an ad's own text can name a person or give a phone number. You are responsible for a lawful use
of personal data, GDPR included.

#### How long a run takes

FINN is read through Apify's datacenter proxy on one sticky session, at about one request a second with 2 in flight by default.
Measured on the platform (test build, 2026-10-22):

- Search rows are fast: the 20 car prefill in 4 seconds (2 requests), 60 Torget sofas in 4 seconds (2 requests).
- Ad pages take about a second each at the default pace: 6 Torget ads with their ad pages in 10 seconds (8 requests). So 1,000
  rows with ad pages take about 20 minutes.

When FINN refuses a request, the Actor pauses and asks once more on the same address; a second refusal in a row stops the run's
reads with a free status row. It never switches to fresh addresses to get past a refusal. What was delivered stays delivered, and
every search or link not reached is free and counted.

### What this Actor does NOT do

- **No other sites.** Only FINN.no.
- **No sort order.** FINN's robots.txt asks robots not to send its sort parameter, so searches are read in FINN's default order
  (newest first on vehicles and real estate, FINN's relevance order on Torget and jobs; the coverage row names it). A monitor
  of a Torget or job search sees every new ad only when its window (`maxRowsPerSearch`) holds the whole search. A pasted link with a sort is read in FINN's order, and a free status row (`sort_dropped`) says so.
  **Posted within** does not need an order: it checks each row's own date.
- **No private sellers' phone numbers on Torget and vehicle ads.** FINN serves none there to a visitor: a private seller is reached
  by FINN's messages. Business phones (dealers, shops, agencies) come from the ad page, and a private seller's phone on a real
  estate ad, where FINN shows it, is in `contacts` with **Include personal data**.
- **No login and no account data.** No saved searches, favourites, messages or Fiks ferdig purchases; nothing is posted and no
  contact form is sent.
- **No view or favourite counts.** FINN's statistics pages are not read; a real estate ad page's own click count is delivered as
  `clicks` where the page shows one.
- **No occupations and industries together.** FINN asks robots not to combine them; the run refuses that input with a free row.
- **No photo downloads.** Photo links only.
- **No salary estimates.** `salary` is what the job ad states, and few FINN job ads state one.
- **No unpaid crawling.** A run stops with a status row when its unpaid work (pages whose rows were all filtered out or already
  delivered, missing ads, the reads that check a search's filters) passes a small budget (USD 0.0004 plus a share of every billed
  event): narrow the search or loosen the filters checked on each row.
- **No large monitors of ad links.** A monitor with **Track changes** reads the page of every ad link again each run, and an
  unchanged ad is free, so such a run checks about 20 unchanged links before that budget ends. To watch many ads, monitor the
  searches that hold them (a Results page per page read pays for the check).

### Use it from an AI agent (MCP)

AI agents can run this Actor as a tool through Apify's MCP server: connect your MCP client to `https://mcp.apify.com` and add
`automation_craft/finn-scraper` to its tools. The agent then sends the same input as above (for example
`{"verticals": ["vehicles"], "makes": ["Volvo"], "locations": ["Bergen"], "maxItems": 20}`) and reads the rows back. For agents,
set `compactOutput` (only the core fields on each row) and `excludeEmptyFields`, keep `maxItems` small, and read the coverage row
(`type: "search"`) to see whether a search was read to its end and how many ads FINN counts.

### API and integrations

Run it and get the rows in one call (replace `YOUR_TOKEN`):

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~finn-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"verticals": ["realestate"], "propertyTypes": ["homes"], "locations": ["Trondheim"], "minBedrooms": 3, "maxItems": 100}'
```

Node.js:

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('automation_craft/finn-scraper').call({ verticals: ['vehicles'], vehicleTypes: ['car'], makes: ['Volvo'], models: ['XC60'], fuelTypes: ['Plug-in hybrid bensin'], includeDetails: true, maxItems: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'listing'));
```

Python:

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation_craft/finn-scraper").call(run_input={"verticals": ["jobs"], "keywords": ["utvikler"], "locations": ["Oslo"], "monitorName": "oslo-dev-jobs"})
jobs = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "listing"]
```

The Actor also runs from n8n, Make and Zapier through their Apify integrations, and on a schedule in the Apify Console.

### FAQ

#### How do I scrape FINN.no listings?

Pick the verticals (Torget, vehicles, real estate or jobs), type keywords or paste a FINN search link, set **Maximum rows** and
start the run: no code, no login and no proxy setup. Each ad comes as one row with its price, place, published time and the
vertical's own facts, as JSON, CSV or Excel or through the Apify API.

#### Is there a FINN.no API?

FINN's own API is open only to businesses with an agreement with FINN, such as advertisers listing their own ads. This Actor
works as one for public FINN ads: call it through the Apify API with verticals, keywords, filters, search links or FINN codes and
read the rows back as JSON, in one call with `run-sync-get-dataset-items`.

#### How many ads can I get from one FINN search?

All of them, up to your **Maximum rows**. FINN shows at most 50 pages of one search; past that, the Actor splits the search by
FINN's own categories, makes, places or price bands, skips repeats free, and the free coverage row says how many ads FINN counts
and how many stayed beyond reach.

#### How do I get alerts for new FINN ads?

Give the run a **Monitor name** and schedule it: each run delivers only the ads this monitor never delivered before and can send
them to Telegram, Slack, Discord, WhatsApp or your own webhook at no extra charge, with no FINN account. A monitor run pays a
Results page per search page it checks, so a day with nothing new costs the start fee plus those reads.

#### Do FINN job rows include the salary?

When the ad states one: `salary`, `salaryType` and `salaryExtra` hold it as FINN shows it, and few FINN job ads give one (4 of the
137 measured job ad pages). Every job row carries its full ad page: employer and organisation number, deadline, sector,
occupations, skills, FINN's own summary and the apply link.

#### Why does this Actor run with limited permissions?

It needs nothing more: it writes only to its own run's dataset and key-value store, and a monitor keeps its memory in a named
key-value store it creates itself. Limited permissions keep your other Apify data out of its reach.

### Changelog

- 0.1 (2026-10-22): first release: Torget, vehicles, real estate and jobs in one run; keywords, places, FINN's own filters checked
  against its own answer, search links, ad links and FINN codes; searches split past FINN's 50 page cap with a free coverage row;
  ad pages included in the row price; a monitor with change tracking, removals, reposts and free notifications; private sellers' data
  behind the personal data switch.

### More data tools by Automation Craft

- [willhaben Scraper: Immobilien, Cars, Jobs & Ads](https://apify.com/automation_craft/willhaben-scraper)
- [Marktplaats Scraper: Ads, Cars, Sellers & Alerts](https://apify.com/automation_craft/marktplaats-scraper)
- [Kleinanzeigen Scraper & API: Ads, Prices, Places](https://apify.com/automation_craft/kleinanzeigen-scraper)
- [Leboncoin Scraper: Ads, Prices, Real Estate & Cars](https://apify.com/automation_craft/leboncoin-scraper)
- [Facebook Marketplace Scraper with Sold Tracker](https://apify.com/automation_craft/facebook-marketplace-scraper)
- [AutoScout24 Scraper: EU Car Listings & Prices](https://apify.com/automation_craft/autoscout24-scraper)
- [Mobile.de Scraper: Cars, Prices, Dealers & Ratings](https://apify.com/automation_craft/mobile-de-scraper)
- [Immowelt Scraper: Rents, Prices and Energy Data](https://apify.com/automation_craft/immowelt-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/finn-scraper/changelog.md

# Actor input Schema

## `verticals` (type: `array`):

The parts of FINN.no to search: torget (the general marketplace), vehicles (cars, MC, boats, caravans, business vehicles), realestate (homes, rentals, new builds, plots, commercial), jobs. Each is searched on its own, once per keyword. Left empty, the vertical is taken from the vertical settings you give (vehicle types, property types, job types, a Torget category), else Torget.

## `keywords` (type: `array`):

Search words, each one its own search ("sofa", "tesla model y", "sykepleier", "balkong"). Left empty, the vertical is searched without words in FINN's default order (newest first on vehicles and real estate, relevance on Torget and jobs). Up to 100 characters each.

## `torgetCategories` (type: `array`):

Torget only: categories by FINN's Norwegian name or value ("Møbler og interiør", "Sofaer", "Kunst", or "0.78"), each its own search. A name FINN uses on two levels takes the wider one.

## `vehicleTypes` (type: `array`):

Vehicles only: which FINN motor searches to read (17 kinds). Left empty: used cars.

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

Real estate only: which FINN eiendom sections to read (12). Left empty: homes for sale.

## `jobTypes` (type: `array`):

Jobs only: all FINN jobs (the default), part time, management, or the NAV job ads FINN shows beside its own.

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

Counties, municipalities or districts by FINN's Norwegian name ("Oslo", "Bergen", "Trøndelag", "Grünerløkka") or FINN's value ("0.20061"). Several places are one search (any of them). Works in every vertical.

## `latitude` (type: `number`):

With longitude and radiusKm: search around a point in Norway (FINN's own map radius, every vertical).

## `longitude` (type: `number`):

With latitude and radiusKm.

## `radiusKm` (type: `integer`):

With latitude and longitude: the distance in kilometres.

## `minPrice` (type: `integer`):

Torget, vehicles and real estate: the lowest price in kroner (for rentals the monthly rent, for homes the asking price), sent to FINN.

## `maxPrice` (type: `integer`):

Torget, vehicles and real estate: the highest price in kroner.

## `sellerType` (type: `string`):

Private sellers only, or businesses only (dealers, shops, agencies), in Torget, vehicles and real estate. FINN's own filter.

## `postedToday` (type: `boolean`):

Only ads FINN marks as new today ("Nye i dag"), in every vertical.

## `conditions` (type: `array`):

Torget only: the item condition by FINN's name ("Helt ny - Uåpnet/med lapp", "Som ny - Ikke synlig brukt", "Pent brukt - I god stand", "Godt brukt - Synlig brukt", "Må fikses - Noen mangler/ødelagte deler").

## `tradeTypes` (type: `array`):

Torget only: "Til salgs" (for sale), "Gis bort" (given away), "Ønskes kjøpt" (wanted).

## `brands` (type: `array`):

Torget only: brands by FINN's name ("IKEA", "H\&M", "Apple").

## `shippingOnly` (type: `boolean`):

Torget only: ads that can be bought and shipped with FINN's Fiks ferdig.

## `makes` (type: `array`):

Vehicles only: makes by FINN's name ("Tesla", "Volvo", "Yamaha", "Bavaria").

## `models` (type: `array`):

Cars only, with makes: models or series by FINN's name ("Model Y", "XC60", "Golf").

## `minYear` (type: `integer`):

Vehicles only.

## `maxYear` (type: `integer`):

Vehicles only.

## `minMileage` (type: `integer`):

Vehicles only.

## `maxMileage` (type: `integer`):

Vehicles only.

## `minPowerHp` (type: `integer`):

Vehicles only.

## `maxPowerHp` (type: `integer`):

Vehicles only.

## `minSeats` (type: `integer`):

Cars only.

## `maxSeats` (type: `integer`):

Cars only.

## `fuelTypes` (type: `array`):

Vehicles only: "Bensin", "Diesel", "El", "Hybrid bensin", "Plug-in hybrid bensin" and the other names FINN lists.

## `transmissions` (type: `array`):

Cars only: "Automat" or "Manuell".

## `bodyTypes` (type: `array`):

Vehicles only: the body or type FINN lists for the vehicle type ("Stasjonsvogn", "SUV/Offroad", "Kombi 5-dørs"; MC types; boat classes).

## `wheelDrives` (type: `array`):

Cars only: "Firehjulsdrift", "Forhjulsdrift", "Bakhjulsdrift".

## `colours` (type: `array`):

Cars only: "Svart", "Hvit", "Grå", "Blå" and the other names FINN lists.

## `salesForms` (type: `array`):

Vehicles only: "Bruktbil til salgs", "Nybil til salgs", "Leasing", "Auksjon" on cars; "Brukt båt", "Båt til leie", "Båt ønskes" on boats.

## `vansOnly` (type: `boolean`):

Cars only: vans (FINN's registration class "Varebil").

## `propertyKinds` (type: `array`):

Real estate only: "Leilighet", "Enebolig", "Tomannsbolig", "Rekkehus", "Hytte" and the other names FINN lists in the section.

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

Real estate only: 1 to 5 (FINN's "N+").

## `minArea` (type: `integer`):

Real estate only: the usable area in square metres.

## `maxArea` (type: `integer`):

Real estate only.

## `minTotalPrice` (type: `integer`):

Homes, new builds, holiday homes and plots: the total price with shared debt, in kroner.

## `maxTotalPrice` (type: `integer`):

Homes, new builds, holiday homes and plots.

## `minPlotArea` (type: `integer`):

Real estate only.

## `maxPlotArea` (type: `integer`):

Real estate only.

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

Real estate only: "Selveier", "Andel", "Aksje", "Obligasjon".

## `facilities` (type: `array`):

Real estate only: "Balkong/Terrasse", "Garasje/P-plass", "Heis" and the other facilities FINN lists.

## `newBuildOnly` (type: `boolean`):

Homes for sale and holiday homes: only new builds ("Nybygg").

## `occupations` (type: `array`):

Jobs only: occupation fields by FINN's name ("Analyse", "Helse", "IT utvikling"). Not together with industries: FINN asks robots not to combine them.

## `industries` (type: `array`):

Jobs only: industries by FINN's name ("Bank, finans og forsikring", "Helse og omsorg"). Not together with occupations.

## `extents` (type: `array`):

Jobs only: "Heltid" (full time) or "Deltid" (part time).

## `sectors` (type: `array`):

Jobs only: "Privat", "Offentlig", "Organisasjoner", "Samvirke", "Franchise/Selvstendig næringsdrivende".

## `remoteOptions` (type: `array`):

Jobs only: "Kun hjemmekontor" (fully remote), "Delvis hjemmekontor" (hybrid), "Ingen hjemmekontor".

## `includeNavAds` (type: `boolean`):

Jobs: FINN also shows job ads copied from NAV (Arbeidsplassen); they are left out unless this is on (or the NAV job search is chosen). Rows say jobSource FINN or NAV.

## `attributeFilters` (type: `object`):

Any other filter of the search's own FINN filter list, by FINN's name or Norwegian label, with values by label or value, or {"min": n, "max": n} for a range. For example {"energy_label": \["A", "B"], "construction_year": {"min": 2015}, "job_duration": \["Fast"]}. A filter the search does not offer is refused with the filters it does offer.

## `postedAfter` (type: `string`):

Only ads published on or after this day in Norway (YYYY-MM-DD), checked on every row.

## `postedWithinHours` (type: `integer`):

Only ads published within this many hours of the run's start, checked on every row.

## `includeKeywords` (type: `array`):

Words a row must contain (title, and description when the ad page is read). Any one of them, or all with requireAllKeywords.

## `requireAllKeywords` (type: `boolean`):

With includeKeywords: every word must be in the row.

## `excludeKeywords` (type: `array`):

Rows holding any of these words are left out, free.

## `titleOnly` (type: `boolean`):

includeKeywords and excludeKeywords look at the title only.

## `excludeAdIds` (type: `array`):

FINN codes (finnkode) or ad links never to deliver.

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

Search pages copied from FINN.no: Torget (/recommerce/forsale/search), vehicles (/mobility/search/...), real estate (/realestate/<section>/search.html) and jobs (/job/search), read with all their filters. FINN's sort is never sent (its robots.txt asks robots not to): a link is read in FINN's own order.

## `adUrls` (type: `array`):

Ad links of any vertical or FINN codes (finnkode): each read with its ad page and billed as one row of its vertical (Listing, Vehicle, Home or Job), the ad page included. A removed or unknown ad is a free row.

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

The most paid rows the run delivers (ads, change rows, removed rows), across all searches and links.

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

The most paid rows from one search or search link.

## `maxPagesPerSearch` (type: `integer`):

The most result pages read for one search (50 rows a page, up to 200 on Torget).

## `maxRowsPerSearch` (type: `integer`):

How many rows of each search are read at most; a monitor reads this window of every search every run (100 by default).

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

Read each ad's page: the full description, every key fact, all images, the seller or dealer card, car equipment and inspection dates, property costs, viewings and agency. Included in the row price, no extra event; it takes about a second per row. Job rows always hold their ad page.

## `includePersonalData` (type: `boolean`):

Deliver the fields that name or reach a private person: a private seller's FINN id, street, cadastre numbers, exact map point and map image, a private seller's vehicle plate, VIN (also in the list of facts) and vehicle register link, contact persons (names, titles, phones, e-mails of dealers', agencies' and employers' staff and real estate brokers), and the contacts found in the texts of private ads and job ads. Off by default; you are responsible for using such data lawfully (GDPR). Business data is always delivered.

## `includeRawData` (type: `boolean`):

Add FINN's search row as served (a private seller's only with personal data on).

## `descriptionFormat` (type: `string`):

How the description of the ad page is delivered.

## `descriptionMaxLength` (type: `integer`):

Cut descriptions to this many characters (descriptionCut marks the row).

## `compactOutput` (type: `boolean`):

Deliver only the most used fields.

## `excludeEmptyFields` (type: `boolean`):

Drop fields that are empty on a row.

## `extractContacts` (type: `boolean`):

Add the e-mail addresses, phone numbers, websites and social profiles written in the title and description (business ads always; private ads and job ads only with personal data on).

## `phoneExtractionMode` (type: `string`):

With extractContacts.

## `priceSummary` (type: `boolean`):

Each search's coverage row carries the count, lowest, quartiles, median, mean and highest price of the ads it met (free).

## `monitorName` (type: `string`):

Name a monitor to deliver only ads new to it on every scheduled run (each ad billed once; each search page a monitor run reads is a Results page, also on a day with nothing new). The memory belongs to this Actor; up to 60 characters of letters, digits, spaces and . \_ , - : # ( ).

## `resetMonitor` (type: `boolean`):

Forget what the monitor delivered and start again (a run that restarts never resets).

## `trackChanges` (type: `boolean`):

With a monitor: deliver a known ad again when its price changed (priceChanged, with the previous price and a price history), its title, images, place or status changed (updated) or it came back (reappeared), and report ads no longer on FINN when every search was read to its end (removed rows, confirmed on the ad page). Each such row is billed as its vertical's row.

## `changesToDeliver` (type: `string`):

With trackChanges.

## `emitUnchanged` (type: `boolean`):

With a monitor: deliver known ads again as unchanged (billed as their row).

## `markReposts` (type: `boolean`):

With a monitor: mark a new ad whose vertical, title, price and seller match one the monitor delivered (possibleRepostOf).

## `skipReposts` (type: `boolean`):

With markReposts: leave reposts out, free.

## `telegramBotToken` (type: `string`):

Send the rows of the run to Telegram through your own bot (the token BotFather gave you).

## `telegramChatId` (type: `string`):

Your chat id, or a channel name starting with @.

## `slackWebhookUrl` (type: `string`):

A Slack incoming webhook link (https://hooks.slack.com/...).

## `discordWebhookUrl` (type: `string`):

A Discord webhook link.

## `whatsappAccessToken` (type: `string`):

Your WhatsApp Cloud API token.

## `whatsappPhoneNumberId` (type: `string`):

Your WhatsApp Cloud API phone number id.

## `whatsappTo` (type: `string`):

The number to send to, international form without +.

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

A link of your own that receives the delivered rows as JSON (POST, batches of 100).

## `webhookSecret` (type: `string`):

Signs each webhook call (HMAC SHA-256 in X-Signature-Sha256).

## `webhookHeaders` (type: `object`):

Extra headers for the webhook (at most 10).

## `notificationLimit` (type: `integer`):

How many rows a message lists (10 by default).

## `notifyOnlyChanges` (type: `boolean`):

With trackChanges: notify changed and removed ads, not new ones.

## `failIfIncomplete` (type: `boolean`):

End the run as failed when a search or link could not be read in full (the rows delivered stay).

## `maxFailedRequestsPercent` (type: `integer`):

End the run as failed when more of its reads failed.

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

Leave as is: FINN is read through Apify's datacenter proxy, which every FINN door answers. Your own proxy links replace it.

## `requestsPerSecond` (type: `number`):

The pace of the run's one exit (0.2 to 2).

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

At most this many requests in flight, inside the pace.

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

Tries of a failed read after the first.

## Actor input object example

```json
{
  "verticals": [
    "vehicles"
  ],
  "vehicleTypes": [
    "car"
  ],
  "locations": [
    "Oslo"
  ],
  "sellerType": "any",
  "postedToday": false,
  "shippingOnly": false,
  "vansOnly": false,
  "newBuildOnly": false,
  "includeNavAds": false,
  "requireAllKeywords": false,
  "titleOnly": false,
  "maxItems": 20,
  "includeDetails": false,
  "includePersonalData": false,
  "includeRawData": false,
  "descriptionFormat": "asServed",
  "compactOutput": false,
  "excludeEmptyFields": false,
  "extractContacts": false,
  "priceSummary": true,
  "resetMonitor": false,
  "trackChanges": false,
  "emitUnchanged": false,
  "markReposts": false,
  "skipReposts": false,
  "notifyOnlyChanges": false,
  "failIfIncomplete": false,
  "requestsPerSecond": 1,
  "maxConcurrency": 2,
  "maxRequestRetries": 2
}
```

# Actor output Schema

## `items` (type: `string`):

No description

## `report` (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 = {
    "verticals": [
        "vehicles"
    ],
    "vehicleTypes": [
        "car"
    ],
    "locations": [
        "Oslo"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/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 = {
    "verticals": ["vehicles"],
    "vehicleTypes": ["car"],
    "locations": ["Oslo"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/finn-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 '{
  "verticals": [
    "vehicles"
  ],
  "vehicleTypes": [
    "car"
  ],
  "locations": [
    "Oslo"
  ],
  "maxItems": 20
}' |
apify call automation_craft/finn-scraper --silent --output-dataset

```

## MCP server setup

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