# FINN Eiendom Scraper: Norway Homes and Rentals (`automation_craft/finn-eiendom-scraper`) Actor

FINN eiendom across Norway: homes for sale, rentals, new builds, holiday homes, plots and commercial property, by place, FINN's filters, agency or link, no login. Rows: prisantydning, totalpris, felleskostnader, BRA-i, price per m², eieform, agency, sales history. Pay per home, Excel, API, MCP.

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

## Pricing

from $1.04 / 1,000 homes

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 Eiendom Scraper: Norway Homes and Rentals

**FINN real estate data** from FINN eiendom, the real estate part of FINN.no: search FINN's real estate ads by place, by
FINN's own filters, by agency, on a drawn map area, by a pasted FINN search link or by ad link and FINN code, in all 12 sections
(homes for sale, rentals, new builds, holiday homes, homes abroad, plots, holiday plots, commercial property to rent or for sale,
commercial plots, companies for sale, wanted ads), and get every ad as one row: asking price (prisantydning), total price
(totalpris), shared costs (felleskostnader), area, bedrooms, property and ownership type (eieform), agency, viewings, map point,
the price per square metre and the days on market. Turn on the ad page for the full property record (sales costs, common debt,
tax value, BRA-i, BRA-e, P-rom, plot, energy label, building year, the housing cooperative, a project's units with their prices and
sale status, a sold home's sale time), and add FINN's price statistics, the registered sales history and FINN's area profile per
home. No login, no cookies.

Who uses it: real estate agents and agencies watching the market and every agency's stock, property investors screening
prices per square metre, analysts and valuers tracking asking prices, days on market and sales by area, rental and relocation
services, home buyers comparing one area, and teams feeding FINN eiendom data into their own sheets, apps or AI
agents.

### Quick start

1. Open the **Input** tab and pick **Sections** (homes for sale is the default; `Homes to rent`, `New builds`,
   `Holiday homes for sale` and the others) and **Places** (`Oslo`, `Bergen`, `Trøndelag`, `Grünerløkka`).
2. Narrow it with FINN's real estate filters: **Lowest price** and **Highest price**, **Smallest area (m²)**, **Bedrooms (at least)**, **Property types**, **Ownership**, **Energy labels**, **Built in or after**, **Floor**, **Viewing days**, **Seller**,
   **Lowest price per m²** and the section filters for rentals, holiday homes, wanted ads and companies.
3. Or paste FINN links: search pages into **Search links**, ad links or FINN codes into **Ad links or FINN codes**, or give
   **Agency ids** to read every ad of one agency office.
4. Keep **Include the ad page** on for the full property record (no extra charge), turn on the add-ons you want (**Add FINN's price statistics**, **Add the sales history**, **Add the area profile**), 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 homes for sale in Oslo with their ad pages (measured on the final build 0.1.7: about 31 seconds; FINN's pace varied from about 30 seconds to 4 minutes that day). For a daily feed,
schedule the run in Apify (set **Posted within (hours)** to 24 for the last day's ads) and keep the FINN codes you have seen in your
own sheet or flow: this Actor keeps no memory between runs.

### What you get

One row per ad (`type: "listing"`, `vertical: "realestate"`), one free coverage row per search (`type: "search"`), free status
rows for anything that could not be delivered (`type: "status"`) and a run summary (`type: "summary"`).

Every fill figure below is counted on the rows of the real actor runs of 2026-10-23 (matrix er8 and er9: this Actor, build 0.1.4; the final build 0.1.7 adds the Results page event, withholds a private seller's local area that holds a number and changes no other field,
33 runs with rows, the national sweep left out): 1,190 rows without the ad page ("search row", 1,068 distinct ads) and 652 rows with
it ("ad page", 352 distinct ads), all with the personal data switch off, over all 12 sections (homes 1,748, lettings 27, leisuresale 17, ad links 14, newbuildings 7, businessrent 7, wanted 7, companyforsale 5, abroad 2, plots 2, leisureplots 2, businesssale 2, businessplots 2). A field FINN does not
show for an ad is `null`. "N of M" counts the rows where the field holds a value; "above 0" leaves out zeros.

#### On every row

| Field | What it is | Search row | Ad page |
|---|---|---|---|
| `adId`, `url`, `title` | the FINN code (finnkode), the ad's link, its title | 1,190 of 1,190 | 652 of 652 |
| `kind` | the FINN section it came from (`homes`, `lettings`, `newbuildings`, `leisuresale`, `abroad`, `plots` ...; null on an ad link row) | 1,190 of 1,190 | 638 of 652 |
| `price`, `priceSuggestion` | the asking price (prisantydning); on a rental, the rent a month | 1,116 of 1,190 (1,084 above 0) | 615 of 652 (599 above 0) |
| `priceTotal` | the total price with common debt and costs (totalpris) | 1,116 of 1,190 (1,080 above 0) | 615 of 652 (597 above 0) |
| `priceRange`, `priceTotalRange`, `bedroomsRange` | a new build project's span of prices and bedrooms | 74 of 1,190 | 37 of 652 |
| `sharedCost` | shared costs a month (felleskostnader) | 1,116 of 1,190 (634 above 0) | 615 of 652 (355 above 0) |
| `area` | the area FINN shows on the search row, with its kind (`p-rom`, `size` ...) | 1,190 of 1,190 (1,152 above 0) | 638 of 652 (622 above 0) |
| `bedrooms`, `plotArea` | bedrooms, the plot in m² | 1,116 of 1,190, 981 | 615 of 652, 547 |
| `propertyType`, `ownershipType` | `Leilighet`, `Enebolig`, `Hytte` ...; `Selveier`, `Andel`, `Aksje` (eieform) | 1,186 of 1,190, 1,144 | 649 of 652, 643 |
| `location`, `localArea` | the place as FINN shows it (a private seller's street address only with **Include personal data**), the local area as the seller wrote it (it can be a street name; on a private seller's ad a local area that holds a number is withheld) | 1,172 of 1,190, 805 | 652 of 652, 441 |
| `latitude`, `longitude`, `coordinateAccuracy` | the map point and FINN's accuracy code | 1,176 of 1,190 (accuracy 1,182) | 652 of 652 |
| `imageUrl`, `imageUrls`, `imageCount` | photo links (never downloaded) and their count | photos 1,187 of 1,190 (the count on every row) | photos 651 of 652 (the count on every row) |
| `publishedAt` | FINN's latest publication (a renewed ad is new again) | 1,190 of 1,190 | 651 of 652 |
| `daysOnMarket`, `daysOnMarketSince` | days from the first publication (ad page) or the latest one (search row) to the sale or the read, and which date it counts from | 1,190 of 1,190 | 651 of 652 |
| `status`, `soldAt` | `active` or `sold`, and the sale time | 1,190 of 1,190, sale time 0 | 652 of 652, sale time 10 (every sold ad) |
| `sellerType`, `agencyName`, `companyName`, `companyLogo` | `private` or `business`; the agency (megler), always delivered | 1,190 of 1,190; agency 1,151 | 652 of 652; agency 632 |
| `companyId` | FINN's agency id (use it in **Agency ids**); on a search row the id in the agency's logo address | 1,144 of 1,190 | 632 of 652 |
| `companyWebsite`, `agencyAdsUrl` | the agency's website, FINN's search of the agency's ads ("more ads from this broker") | ad page only | 484 and 441 of 652 |
| `pricePerSqm`, `totalPricePerSqm`, `sqmPriceArea`, `sqmPriceAreaBasis` | asking and total price per m², over the area named in the basis: BRA-i, else P-rom, else BRA, else the search row's single area | 1,071, 1,067 and 1,100 (area and basis) of 1,190 | 599, 597 and 610 of 652 |
| `viewings` | viewing times (visning), and the agency's viewing note when it writes one | 977 of 1,190 | 581 of 652 |
| `facilities` | facilities (balcony, lift, parking ...) | 916 of 1,190 | 591 of 652 |
| `labels` | FINN's labels on the ad (`Visning i dag` ...) | 65 of 1,190 | 43 of 652 |
| `promoted`, `promotion` | FINN's paid highlight of the search row (`pluss`, `premium`) | `true` on 1,154 of 1,190 | `true` on 627 of 652 |
| `viewingToday`, `searchFlags` | FINN's "viewing today" badge, every flag of the search row | badge on 1, flags 1,183 of 1,190 | badge on none, flags 638 of 652 |
| `searchKey`, `searchLabel`, `source`, `position`, `detailsIncluded`, `deliveryId`, `runId`, `scrapedAt` | which search delivered the row, `search` or `link`, its place in the search, whether the ad page was read, run facts | every row | every row (the search fields empty on an ad link row) |

`companyPhone` and `companyOrgNumber` stay empty: FINN shows no agency phone or organisation number on its real estate pages.
`companyEmail`, `companyAddress`, `municipality` and `county` were empty on every measured row too.

#### With the ad page

With **Include the ad page** on (the prefill), and on every ad link row, each row also carries its ad page, read for each ad and
included in the Home price. Counted on the 652 rows with the ad page:

| Field | What it is | Filled (measured) |
|---|---|---|
| `description`, `descriptionText`, `attributes`, `textSections`, `contentHash` | the description as served and as text, every key fact as FINN labels it, the ad's text sections, a short hash of the description | 652 of 652 (text sections 650) |
| `firstPublishedAt`, `editedAt` | the first publication, the last change | 565 and 652 of 652 |
| `streetAddress`, `postalCode`, `postalName` | the street (a private seller's only with **Include personal data**), the post code and town | street 632, post code 652 of 652 |
| `usableArea`, `usableAreaI`, `usableAreaE`, `usableAreaB`, `openArea`, `primaryRoomArea`, `grossArea`, `areaDescription` | BRA, BRA-i, BRA-e, BRA-b, open area (TBA), P-rom, gross area, the area text | BRA 586, BRA-i 580, BRA-e 500, open area 481, P-rom 44 of 652 |
| `rooms`, `floor`, `constructionYear`, `energyLabel`, `energyLabelColour` | rooms, floor, building year, energy label and colour | 479, 398, 573 and 509 of 652 |
| `collectiveDebt`, `collectiveAssets`, `municipalFees`, `propertyTax`, `taxValue` | fellesgjeld, fellesformue, kommunale avgifter, eiendomsskatt, ligningsverdi | 196, 230, 298, 146 and 504 of 652 |
| `salesCost`, `salesCostIncludes`, `sharedCostIncludes` | the buyer's costs (omkostninger) and what they and the shared costs include | 586, 564 and 342 of 652 |
| `pricePerSqmWithDebt` | FINN's own price per m²: asking price plus common debt over the area, rounded down as FINN shows it | 599 of 652 |
| `plotOwned`, `cadastre`, `mapImageUrl` | owned or leased plot, the land register numbers (gnr, bnr), FINN's map image (a private seller's only with **Include personal data**) | 573, 618 and 632 of 652 |
| `housingCooperativeName`, `housingCooperativeOrgNumber`, `preemption`, `changeOfOwnershipInsurance`, `regulations` | the housing cooperative (borettslag) and its organisation number, preemption (forkjøpsrett), change of ownership insurance, zoning text | 137, 137, 72, 577 and 190 of 652 |
| `viewingDetails`, `moreInfoLinks` | each viewing with date, times and note; the agency's links (viewing sign up, valuation) | 581 and 619 of 652 |
| `prospectusUrl`, `floorPlanUrls`, `bidUrl`, `documents` | the sales prospectus, floor plans, the electronic bidding link, attached documents | 570, 550, 554 and 4 of 652 |
| `videoUrl`, `virtualViewingUrl` | a video and a 360 degree viewing | 360 viewing 5 of 5 rows found with **Video or 360 viewing** set to `360 viewing` |
| `privateSaleService` | the service a private owner sells through (such as Propr.no), business data; the seller is a private seller | 5 of 652 |
| `externalAdId`, `advertiserRef`, `adViewType`, `externalPartner` | the agency's own ad id and reference, FINN's ad type, a partner site | 622, 615 and 652 of 652 |
| `monthlyRent`, `deposit`, `rentPerSqm`, `rentIncludes`, `rentalFrom`, `rentalTo`, `furnishing`, `animalsAllowed`, `refugeesWelcome` | a rental's rent a month, deposit, rent per m², what the rent includes, the period, furnishing, pets, FINN hjerterom | rent 5 of 5 rentals, deposit 2, available from 5 |
| `projectName`, `projectPhases`, `units`, `unitsTotal`, `unitsSold`, `unitsAvailable` | a new build project: every unit with its FINN code, sold or not, bedrooms, floor, areas, asking and total price, and the counts | units 3 of 5 new build rows (the other two carry no unit list) |
| `soldText`, `finnSqmPrice`, `areaSales`, `clicks` | a sold ad's page: FINN's sold text, FINN's price per m², the last year's sales in its local area by price per m² (with the middle bucket), its click count | 10 of 10 sold rows |
| `companyForSale` | a company for sale: its facts | 3 of 3 companies for sale |
| `brokers`, `contacts` | the agency's brokers and contact persons (name, title, phone, mobile, e-mail) | only with **Include personal data**: 5 of 5 rows of the run with the switch on (run k28VQMb9ndfw3CGoV) |

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

#### Example row

A home for sale in Oslo from the prefilled run, with its ad page (shortened; personal data off; run 0mQAZC6dB3VkXkxvW of
2026-10-23):

```json
{
  "type": "listing", "vertical": "realestate", "kind": "homes", "adId": "479323754", "url": "https://www.finn.no/realestate/homes/ad.html?finnkode=479323754",
  "title": "Innholdsrik 4-roms selveierleilighet i 2. etasje med to solrike uteplasser og garasjeplass med EL. Varmtvann inkludert!",
  "priceSuggestion": 5800000, "priceTotal": 6068726, "sharedCost": 6502, "collectiveDebt": 122636, "propertyType": "Leilighet",
  "ownershipType": "Selveier", "bedrooms": 3, "usableAreaI": 102, "constructionYear": 1989, "energyLabel": "E", "floor": 2,
  "pricePerSqm": 56863, "pricePerSqmWithDebt": 58065, "sqmPriceAreaBasis": "usableAreaI", "daysOnMarket": 0.2, "status": "active",
  "location": "Gamle Enebakkvei 65, Oslo", "postalCode": "1188", "postalName": "Oslo", "latitude": 59.8657, "longitude": 10.8348,
  "agencyName": "DNB Eiendom AS", "companyId": "-3", "sellerType": "business", "viewings": ["2026-10-29T16:30", "2026-11-01T15:15"],
  "facilities": ["Balkong/Terrasse", "Barnevennlig", "Bredbåndstilknytning", "Garasje/P-plass"], "housingCooperativeName": null,
  "brokers": null, "detailsIncluded": true, "source": "search"
}
```

#### 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
(`adsOnFinn`) and how many units (`unitsOnFinn`; a new build project counts its units), the slices, pages and rows read, the ads met
and delivered, how many were left out and by which filter (`filteredOutBy`), 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 asking price of the ads met. From the add-on run of homes for sale in Bergen (TaQhKfiw0xwprHRZS):

```json
{ "type": "search", "vertical": "realestate", "kind": "homes", "searchLabel": "in Homes for sale", "order": "newest first (FINN's default order here)",
  "filtersSent": ["location=1.22046.20220"], "adsOnFinn": 663, "unitsOnFinn": 1205, "slicesRead": 0, "pagesRead": 1,
  "rowsRead": 50, "distinctAdsMet": 50, "adsBeyondReach": 0, "adsDelivered": 20, "filteredOut": 0, "filteredOutBy": {},
  "priceSummary": {"count": 50, "withoutPrice": 0, "currency": "NOK", "min": 0, "p25": 3090000, "median": 4240000, "p75": 5700000, "max": 12990000, "mean": 4877800},
  "complete": false, "stoppedBy": "maxItems" }
```

### The add-ons

Each add-on is off by default, reads one more FINN page per delivered row, and is billed as its own event only on a row whose field
carries its data (`<field>Status: "delivered"`). Every other row says why its field is empty, free: `notOffered` (a kind of ad the
page does not serve), `personalData` (a private seller's or landlord's home with **Include personal data** off),
`noRegisteredSales`, `shareFlatNotRegistered`, `noStatistics`, `noProfile`, `unavailable` (FINN's area profile page says the
profile is not available right now, often on the newest ads; run them again later), `failed` or `notRead`. The page is read only for the rows chosen for delivery, after every
filter and cap. Each add-on page is read once (a page FINN fails to serve is `failed`, free; run the home again later). Each add-on
has a budget of its own for reads that bring nothing to bill (USD 0.003, plus a share of each of its events delivered): when FINN's page for one add-on keeps failing, that add-on stops for the rest of the run (status `notRead`,
one free row says so) and the homes and the other add-ons go on.

Measured on the real actor runs of 2026-10-23 (matrix er8 and er9, build 0.1.4): 200 homes for sale across Norway with the ad page: 184 of 200 carried price statistics, 139 of 200 carried a sales history, 197 of 200 carried an area profile; 20 homes for sale in Bergen with the ad page: 19 of 20 carried price statistics, 11 of 20 carried a sales history, 20 of 20 carried an area profile; 10 holiday homes without the ad page: 8 of 10 carried price statistics, 4 of 10 carried a sales history, 10 of 10 carried an area profile; 5 rentals in Oslo (both `notOffered`, free): 0 of 5 carried price statistics, 0 of 5 carried a sales history. Earlier the same day (09:44 to 10:01 UTC, build 0.1.2) FINN's area profile service failed: those rows carry `unavailable`, `failed` or `notRead`, and the area profile was billed on none of them. The add-ons work the same without the ad page.

#### Price statistics

With **Add FINN's price statistics** on, a resale home or holiday home gets `priceStatistics` from FINN's price statistics page
(prisstatistikk): FINN's price per m² of the ad (`finnSqmPrice`: asking price plus common debt per m²), its click count on FINN
(`clicks`), and the last year's sales in its local area and county for its property type (`areaSales`: area, property type,
number of sales and the histogram by price per m² in buckets of 1,000 kroner, with `middleSqmPriceBucket`). A sold ad whose own
page carries the block gets it free (`fromAdPage`, no event). Rentals, new builds and the other sections: `notOffered`, free.

#### Sales history

With **Add the sales history** on, a resale home or holiday home gets `salesHistory`: its earlier registered sales, each with its
date and price, as FINN shows them from Norkart's land register data (grunnboken). A home with no registered sale is
`noRegisteredSales`, a share flat (aksjeleilighet) is `shareFlatNotRegistered` (share flats are not in the register), both free. A
private seller's home only with **Include personal data** on.

#### Area profile

With **Add the area profile** on, an ad gets `areaProfile`: FINN's neighbourhood profile (Nabolagsprofil) of its place, by section
as FINN serves it (`general`, `people`, `family`, `transport`, `environment`, `leisure`, `shopping`): people by age, families and
children, education, housing stock and ownership, resident ratings (safety, noise and others), and the nearest public transport,
schools, kindergartens, shops and sport with walking and driving times. Every section but homes abroad, wanted ads and companies
for sale; a private seller's or landlord's home only with **Include personal data** on (the profile names its street and exact
point).

### How much does it cost to scrape FINN eiendom?

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

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Home (one real estate row, any section, its ad page included) | $1.45 per 1,000 | $1.33 per 1,000 | $1.20 per 1,000 | $1.04 per 1,000 |
| Results page (a search page that brings a home new in the run and delivers a home, up to 50 homes) | $0.70 per 1,000 | $0.64 per 1,000 | $0.58 per 1,000 | $0.50 per 1,000 |
| Price statistics (add-on, one per row that carries them) | $1.40 per 1,000 | $1.28 per 1,000 | $1.16 per 1,000 | $1.00 per 1,000 |
| Sales history (add-on, one per row with an earlier sale) | $1.40 per 1,000 | $1.28 per 1,000 | $1.16 per 1,000 | $1.00 per 1,000 |
| Area profile (add-on, one per row that carries it) | $1.40 per 1,000 | $1.28 per 1,000 | $1.16 per 1,000 | $1.00 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 same prices per 1,000 events: "$1.04 / 1,000" on the Home row means one home costs about a
tenth of a cent at Gold ($0.00104), and "$1.40 / 1,000" on an add-on row means one price statistics, sales history or area profile
costs $0.0014 on the Free plan.

- **Home** is charged once per ad delivered as a row, from a search, an agency or a link, with or without its ad page.
- **Results page** is charged once per FINN search page the run reads that brings at least one home not met before in the run and
  from which a home is delivered (up to 50 homes a page, so about $0.01 per 1,000 homes at Gold). A page of repeats, a page whose
  homes are all left out by a filter (on the search row or on the ad page), a page FINN did not apply, the first page of a split, an empty search, ad
  links and every page of a run's restarted attempt are free. It keeps many small searches (one home each)
  worth reading on a slow FINN hour.
- **Price statistics**, **Sales history** and **Area profile** are charged only with their add-on on, and only on a row whose field
  carries the add-on's data. A row whose page has nothing (no registered sale, a share flat, a kind the page does not serve, a
  failed read) pays nothing for it.
- Never billed: the ad page, a search page with nothing new, repeats in the run, ads left out by a filter (the price per m² window included), a
  missing or removed ad, a refused setting, a search that finds nothing, coverage rows, status rows and the summary.
- **Every run is charged the Actor start fee ($0.0049), also when it 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: 1,000 homes for sale from one search on the Gold plan cost $0.0049 (start) + 1,000 homes ($1.04) + 20 Results pages
  ($0.01) = $1.0549, as measured on this Actor (run siUiH62ZyepzUvffj). On the Free plan $0.0049 + $1.45 + $0.014 = $1.4689.
- Example with the ad page: the same 1,000 homes with **Include the ad page** on cost the same, $1.0549 on the Gold plan,
  since the ad page has no event of its own.
- Example with many small searches: 50 keyword searches of one home each with the ad page (run vcDfMi03y9rpISfLx) billed 50
  homes and 43 Results pages (7 pages brought only homes already met): $0.0049 + $0.052 + $0.0215 = $0.0784 on the Gold plan.
- Example with all three add-ons: 200 homes for sale across Norway with the ad page, as measured on this Actor (run
  PDd5vYIo5FPG0rjpV, 2026-10-23): 183 carried billed price statistics, 142 a sales history and 197 an area profile, in 5 Results
  pages: $0.0049 + 200 homes ($0.208) + 522 add-on events ($0.522) + 5 Results pages ($0.0025) = $0.7374 on the Gold plan, $1.0292
  on the Free plan. In the hour FINN's area profile service failed (run j2PajCMH9CGwz9No3) the same input carried no area profile,
  free. If every one of the 200 carried all three, the Gold plan total would be $0.8154.

Measured on this Actor (matrix er8 and er9, 2026-10-23, Norway's working day): the prefilled 20 homes with their ad pages in about 75
seconds (earlier prefilled runs the same day took from about 30 seconds to about 4 minutes); 1,000 homes for sale without the ad page
in about 42 seconds; 300 homes with the ad page in about 6 minutes; 200 homes with the ad page and all three add-ons in about 14
minutes; 20 homes in Bergen with all three add-ons in about 97 seconds.

### Input

The Actor has 76 settings; every one is in the **Input** tab with its own help text. The main ones:

| Setting | What it does |
|---|---|
| `propertyTypes` | The sections, each its own search: `homes` (the default), `lettings`, `newbuildings`, `leisuresale`, `abroad`, `plots`, `leisureplots`, `businessrent`, `businesssale`, `businessplots`, `companyforsale`, `wanted`. |
| `keywords` | Search words, each its own search (`sjøutsikt`, `garasje`, `peis`). FINN matches them in the ad texts. |
| `agencyIds` | FINN agency ids, each a search of every ad of that office (FINN's own agency filter, which can also return a few ads of a sister office of the same chain; each row's `companyId` names its own office); negative for a whole chain. The id is a row's `companyId` with the ad page, and the number in the agency's logo address (`companyLogo`). |
| `listingStatuses` | `forSale`, `soldLast3Days` (FINN keeps sold ads up for 3 days, with the sale time), `comingForSale`. |
| `searchUrls` | FINN eiendom search links, read with all their filters (a travel time area or a drawn map area included). |
| `adUrls` | Ad links or FINN codes (up to 5,000, new build units included), each read with its full ad page. A removed or unknown ad is a free status row. |
| `locations` | Counties, municipalities or districts by FINN's Norwegian name (`Oslo`, `Bergen`, `Trøndelag`, `Grünerløkka`, `Utlandet`) or value. Several places are one search. |
| `latitude`, `longitude`, `radiusKm` | FINN's own map radius around a point in Norway (1 to 500 km). |
| `polygon`, `boundingBox` | A drawn area (3 to 100 points) or a rectangle, sent as FINN's own map area filters. |
| `minPrice`, `maxPrice`, `minTotalPrice`, `maxTotalPrice` | Asking price (on rentals the rent a month) and total price in kroner, sent to FINN. |
| `minPricePerSqm`, `maxPricePerSqm` | The asking price per m² window, checked on every row (`pricePerSqm`); a row whose price per m² cannot be worked out is left out, free. |
| `minArea`, `maxArea`, `minPlotArea`, `maxPlotArea`, `minBedrooms` | Usable area, plot and bedrooms (1 to 5, FINN's "N+"). |
| `propertyKinds`, `ownershipTypes`, `facilities`, `energyLabels` | FINN's names: `Leilighet`, `Enebolig`, `Rekkehus`, `Hytte` ...; `Selveier`, `Andel`, `Aksje`, `Obligasjon`; `Balkong/Terrasse`, `Heis`, `Garasje/P-plass` ...; `A` to `G`. |
| `minConstructionYear`, `maxConstructionYear`, `floors`, `newBuildOnly`, `usedHomesOnly`, `sellerType` | Building year, floor (`Ikke 1. etasje` and the others), new or resale homes, private sellers or agencies only (`sellerType` is sent as FINN's own private seller filter where the section has one; a section without it refuses that search free, with a status row that says so). |
| `viewingDates`, `digitalViewings`, `postedToday` | A viewing on given days, a video or 360 degree viewing, FINN's "Nye i dag". |
| `furnishing`, `petsAllowed`, `rentalStartMonths`, `refugeesWelcome` | Rentals: furnished or not, pets allowed, the month it is free from, FINN hjerterom. |
| `leisureSituations`, `plotOwnedOnly`, `occupants`, `companyCategories` | Holiday homes and homes abroad (mountains, sea, inland; owned plot), wanted ads (occupants), companies for sale (category). |
| `attributeFilters` | Any other filter of the section's own FINN filter list, by FINN's name or label: `{"plot_area": {"min": 1000}}`. |
| `postedAfter`, `postedWithinHours`, `includeKeywords`, `requireAllKeywords`, `excludeKeywords`, `titleOnly`, `excludeAdIds` | Filters checked on every row; an ad left out is free. |
| `maxItems`, `maxItemsPerSearch`, `maxPagesPerSearch`, `maxRowsPerSearch` | Paid rows per run (default 100), per search, pages per search (50 ads a page), rows read per search, the rows left out by a filter included (no limit by default). |
| `includeDetails` | The ad page (on in the prefill, off by default through the API), included in the Home price. |
| `includePriceStatistics`, `includeSalesHistory`, `includeAreaProfile` | The three add-ons (above). |
| `includePersonalData` | The personal data switch (below). |
| `priceSummary`, `includeRawData`, `descriptionFormat`, `descriptionMaxLength`, `outputFields`, `compactOutput`, `excludeEmptyFields`, `extractContacts`, `phoneExtractionMode` | The price summary per search (on by default); FINN's search row; description `asServed`, `text` or `markdown` and a length cut; your own field list or core fields only; empty fields left out; e-mails, phones, websites and social profiles found in the texts. |
| `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 4), retries (0 to 5, default 2). |

A run reads at most 300 searches. A setting that belongs to another FINN part (cars, Torget, jobs) is refused with a free row, a
monitor or alert setting (`monitorName`, `trackChanges`, a Telegram, Slack, Discord, WhatsApp or webhook setting) refuses the run
with a free row that says this Actor keeps no monitor, and an empty input is refused with a free row (only the run's start fee is
charged).

#### Example inputs

Rentals in Oslo that allow pets, furnished, with the ad page:

```json
{ "propertyTypes": ["lettings"], "locations": ["Oslo"], "petsAllowed": true, "furnishing": ["furnished"], "includeDetails": true, "maxItems": 100 }
```

Resale flats in Bergen between 60,000 and 90,000 kroner per m², with price statistics and the sales history:

```json
{ "locations": ["Bergen"], "propertyKinds": ["Leilighet"], "usedHomesOnly": true, "minPricePerSqm": 60000, "maxPricePerSqm": 90000,
  "includeDetails": true, "includePriceStatistics": true, "includeSalesHistory": true, "maxItems": 200 }
```

Homes sold in the last 3 days in Oslo, with FINN's price per m² and the area's sales from the sold ad's page:

```json
{ "listingStatuses": ["soldLast3Days"], "locations": ["Oslo"], "includeDetails": true, "maxItems": 50 }
```

Holiday homes by the sea on an owned plot, with the area profile:

```json
{ "propertyTypes": ["leisuresale"], "leisureSituations": ["seaside"], "plotOwnedOnly": true, "includeAreaProfile": true, "maxItems": 100 }
```

#### Every filter is checked

Every named filter is resolved against the section's own FINN filter list. A value the list does not offer (a place, a property
type, an energy label) 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 2,500 ad cap

FINN serves at most 50 pages of one search, 2,500 ads at 50 a page, while homes for sale alone counted 26,684 ads (40,239 units,
a new build project counting each of its units) on 2026-10-23. When FINN counts more ads than that and you want more, the search is split into slices by FINN's own place counts
(county, municipality, district), then into price bands. 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`), and a search is `complete` only when its slices met
about every ad FINN counted. Measured on the private test copy of this Actor: every home for sale in Norway, 26,684 of FINN's
26,684 ads in 22 slices and 549 pages, in 954 seconds and USD 0.15 of platform usage (run 2pctggG4TA10Raetc, 2026-10-23).
The same sweep on this Actor itself: 26,684 of 26,684 in 22 slices and 549 pages, in 1,482 seconds and USD 0.16 of platform
usage (run EvsRDjzh6la2eMVk8, 2026-10-23). On the final build 0.1.7: 26,754 ads against FINN's count of 26,749 (FINN's count moves while a sweep reads), in 22 slices and
549 pages, with 0 ads beyond reach and the search `complete`, in 1,074 seconds and USD 0.15 of platform usage (run
FeLCT0to7SpvYCoI0, 2026-10-23); at the Gold price that is 26,754 homes ($27.82) and 545 Results pages ($0.27) plus the start fee.

#### Personal data

A private seller is an ad FINN flags as private, or a private owner selling through a service such as Propr.no (FINN's
`thirdPartyAdvertiser`; `privateSaleService` names the service). With **Include personal data** off (the default), these fields
are null: the agency's brokers and contact persons (`brokers`,
`contacts`: names, titles, phones and e-mails), a private seller's or landlord's FINN id (`sellerId`), street (`streetAddress`; the
place shown is then the local area, which a private seller may have written as the street name; one that holds a house number is withheld too), land register numbers (`cadastre`), map image (`mapImageUrl`), the sales history and the area
profile of a private seller's or landlord's home (status `personalData`, free), the contacts found in the texts of private 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. The agency's name, FINN id, website, logo and its search of
ads (`agencyAdsUrl`) are business data and always delivered; FINN shows no agency phone or organisation number on its real
estate pages. Titles, descriptions, viewing notes (`viewings`, `viewingDetails`) and the pre-emption text are delivered
exactly as FINN serves them, so an ad's own text can name a person (a broker, a cooperative's board chair) or give a phone number
or e-mail. You are responsible for a lawful use of personal data, GDPR included.

### What this Actor does NOT do

- **No monitor and no alerts.** It keeps no memory between runs: no "new only" rows, no price change, sold or removal tracking
  against an earlier run, and no Telegram, Slack, Discord, WhatsApp or webhook messages. Schedule it in Apify, use **Posted within
  (hours)** or **New today** for the newest ads, and compare the rows (`adId`, `price`, `status`) in your own sheet, n8n or
  Make flow. A monitor or alert setting refuses the run with a free row.
- **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 (the coverage row names it). A pasted link's sort is dropped with a warning. The price per m² window and the price
  summary per search answer price questions without it.
- **No map tiles.** FINN's robots.txt closes its map pages to robots; the drawn area (`polygon`) and the box (`boundingBox`) give a
  map area on the search itself.
- **No login and no FINN app gateway.** No FINN account, saved searches or signed app routes; only the pages FINN shows logged out.
- **No Torget, cars or jobs.** Only FINN eiendom; FINN's Torget products (Nybrukt included), cars and jobs are other FINN parts and
  their settings are refused with a free row.
- **No neighbourhood address list.** FINN's ad page carries an empty list of nearby addresses (0 of 24 active home pages read on
  2026-10-23), so there is no such field.
- **No sold price and no price history from FINN.** FINN never shows what a home sold for and keeps no history of an ad's asking
  price; keep each run's rows to build your own.
- **No sales history beyond the register.** The sales history is the registered past sales from Norkart's land register data as
  FINN shows it; share flats (aksjeleiligheter) are not in the register.
- **No phone reveal.** FINN has no reveal call; brokers' phones and e-mails come from the ad page, with **Include personal data**.
- **No expired homes as rows.** An ad FINN no longer shows, or shows as expired or no longer active, is a free status row.
- **No unpaid crawling.** A run stops with a status row when its unpaid work (pages whose ads 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 the run's slowest read so one slow FINN answer
  never stops a run on its own, plus a share of every billed event): narrow the search or loosen the filters checked on each row. A list of ad links whose first links are gone stops the
  same way before any home is delivered (measured on this Actor: 40 gone links before 10 live ones stopped after 30 reads):
  put live links first, or read old links in a run of their own. The ads and links not reached are free and counted in the
  summary.

### 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-eiendom-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"propertyTypes": ["homes"], "locations": ["Oslo"], "includeDetails": true, "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-eiendom-scraper').call({ propertyTypes: ['lettings'], locations: ['Bergen'], 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-eiendom-scraper").call(run_input={"locations": ["Trondheim"], "includeDetails": True, "includeSalesHistory": True, "maxItems": 100})
homes = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "listing"]
```

AI agents can run it as a tool through Apify's MCP server (`https://mcp.apify.com`, tool `automation_craft/finn-eiendom-scraper`);
set `compactOutput` or `outputFields` and keep `maxItems` small. 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 eiendom listings?

Pick the sections and places, add FINN's filters or paste a FINN eiendom search link, set **Maximum rows** and start the run: no
code, no login and no proxy setup. Each home comes as one row with its price, total price, shared costs, area, bedrooms, agency and
price per m², and with **Include the ad page** its full property record, as JSON, CSV or Excel or through the Apify API.

#### Is there a FINN eiendom API?

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

#### Can I see what a home sold for on FINN?

FINN never shows a sold price. A sold ad stays on FINN for 3 days with its sale time; with **Sale status** set to `soldLast3Days`
and the ad page on, the row carries the sale time, FINN's price per m² of the ad and the last year's sales in its area by price per
m². With **Add the sales history**, a resale home or holiday home also gets its earlier registered sales (date and price) as FINN
shows them from Norkart.

#### How do I get the newest homes on FINN every day?

Schedule the run in the Apify Console (daily or more often) with **Posted within (hours)** set to 24, or **New today** on:
each run delivers the homes FINN published in that window, each billed as a Home. This Actor keeps no memory between runs and sends
no alerts, so a home still in the window is delivered again; keep the FINN codes (`adId`) you have seen in your own sheet, or let an
n8n, Make or Zapier flow drop them and send the rest wherever you want.

#### 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. Limited permissions keep your other Apify data out of its reach.

### Changelog

- 0.1 (2026-10-23): first release: FINN eiendom ads in all 12 sections by place, FINN's real estate filters, agency, drawn map area,
  search link or FINN code; the ad page in the Home price; price per m², days on market, project units and sold ad facts; the price
  statistics, sales history and area profile add-ons; searches split past FINN's 2,500 ad cap with a free coverage row; brokers and private sellers' data behind the personal data switch. Full
  history in the Changelog tab.

### More data tools by Automation Craft

- [FINN.no Scraper: Torget, Cars, Homes and Jobs](https://apify.com/automation_craft/finn-scraper)
- [FINN Jobs Scraper: Norway Job Ads, Employers](https://apify.com/automation_craft/finn-jobs-scraper)
- [SeLoger Scraper: Listings, Prices and Agencies](https://apify.com/automation_craft/seloger-scraper)
- [Bien'ici Scraper: France Real Estate Ads & DPE](https://apify.com/automation_craft/bienici-scraper)
- [Immowelt Scraper: Rents, Prices and Energy Data](https://apify.com/automation_craft/immowelt-scraper)
- [PAP Scraper: pap.fr Real Estate Ads & Phones](https://apify.com/automation_craft/pap-scraper)
- [willhaben Scraper: Immobilien, Cars, Jobs & Ads](https://apify.com/automation_craft/willhaben-scraper)

# Changelog

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

# Actor input Schema

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

Which FINN eiendom sections to read, each its own search: homes for sale, rentals, new builds, holiday homes, homes abroad, plots, holiday plots, commercial property to rent or for sale, commercial plots, companies for sale, wanted ads. Left empty: homes for sale.

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

Search words, each one its own search ("sjøutsikt", "garasje", "peis", "Grünerløkka"). FINN matches them in the ad texts. Left empty, each section is searched without words, newest first.

## `agencyIds` (type: `array`):

Every ad of one real estate agency office: FINN agency ids (the companyId of a row, such as "2492100" for one office or "-3" for a whole chain), each its own search (FINN's own agency filter, the one behind "more ads from this broker").

## `listingStatuses` (type: `array`):

FINN's sale status filter: for sale, sold in the last 3 days (FINN keeps sold ads up for 3 days, with the sale time) or coming for sale. Left empty: what FINN shows by default (for sale and sold in the last 3 days).

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

Search pages copied from FINN eiendom (https://www.finn.no/realestate/<section>/search.html?...), read with all their filters, a travel time area or a drawn map area included. FINN's sort order in a link is not sent (FINN asks robots not to); the link is read in FINN's default order, newest first.

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

Real estate ad links (https://www.finn.no/realestate/<kind>/ad.html?finnkode=<FINN code>, new build units included) or FINN codes (finnkode): each read with its full ad page and billed as one Home. A removed, sold out of sight or unknown ad is a free status row.

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

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

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

With longitude and radiusKm: ads around a point (FINN's own map radius).

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

With latitude and radiusKm.

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

With latitude and longitude: the distance in kilometres.

## `polygon` (type: `array`):

An area drawn on the map: 3 to 100 points, each \[latitude, longitude], such as \[\[59.91, 10.74], \[59.91, 10.76], \[59.92, 10.76], \[59.92, 10.74]]. Sent as FINN's own map area filter (the ring is closed for you). Not together with the radius or boundingBox.

## `boundingBox` (type: `object`):

A rectangle on the map: {"minLatitude": 59.91, "minLongitude": 10.74, "maxLatitude": 59.92, "maxLongitude": 10.76}. Sent as FINN's own box filter. Not together with the radius or polygon.

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

Asking price in kroner (for rentals the monthly rent), sent to FINN.

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

Asking price in kroner (for rentals the monthly rent).

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

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

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

Homes, new builds, holiday homes, abroad and plots.

## `minPricePerSqm` (type: `integer`):

Checked on every row: the asking price per square metre (pricePerSqm) at least this many kroner. A row whose price per square metre cannot be worked out is left out, free.

## `maxPricePerSqm` (type: `integer`):

Checked on every row: the asking price per square metre at most this many kroner.

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

The usable area in square metres.

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

The usable area in square metres.

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

1 to 5 (FINN's "N+").

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

Homes, holiday homes and plots.

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

Homes, holiday homes and plots.

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

"Leilighet", "Enebolig", "Tomannsbolig", "Rekkehus", "Hytte", "Gårdsbruk/Småbruk" and the other types FINN lists in the section (on commercial property "Kontor", "Butikk/Handel", "Lager/Logistikk").

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

"Selveier" (owned), "Andel" (cooperative), "Aksje" (share), "Obligasjon".

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

"Balkong/Terrasse", "Garasje/P-plass", "Heis", "Peis/Ildsted", "Strandlinje", "Utsikt" and the other facilities FINN lists.

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

FINN's energy label filter: "A" to "G".

## `minConstructionYear` (type: `integer`):

The building year (homes, holiday homes, abroad).

## `maxConstructionYear` (type: `integer`):

The building year.

## `floors` (type: `array`):

"1. etasje", "Ikke 1. etasje" (not the ground floor), "2. etasje" to "6. etasje", "Over 6. etasje".

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

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

## `usedHomesOnly` (type: `boolean`):

Homes for sale and holiday homes: only resale homes ("Brukt bolig"). Not together with newBuildOnly.

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

Private sellers only, or agencies only (FINN's "Privat" or "Megler").

## `viewingDates` (type: `array`):

Only ads with a viewing on one of these days (YYYY-MM-DD, FINN lists the next two weeks).

## `digitalViewings` (type: `array`):

Only ads with a video or a 360 degree viewing.

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

Only ads FINN marks as new ("Nye i dag", the last 24 hours).

## `furnishing` (type: `array`):

Homes to rent: furnished, partly furnished or unfurnished.

## `petsAllowed` (type: `boolean`):

Homes to rent: only ads where pets are allowed ("Dyrehold tillatt").

## `rentalStartMonths` (type: `array`):

Months the home is free from (homes to rent) or wanted from (wanted ads), written YYYY-MM such as "2026-11".

## `refugeesWelcome` (type: `boolean`):

Homes to rent: only ads open to refugees (FINN hjerterom).

## `leisureSituations` (type: `array`):

Holiday homes and homes abroad: in the mountains, by the sea or inland.

## `plotOwnedOnly` (type: `boolean`):

Holiday homes and homes abroad: only owned plots ("Selveiet"), not leased ones.

## `occupants` (type: `array`):

Wanted ads: how many people want to move in.

## `companyCategories` (type: `array`):

"Restaurant/Kafé", "Butikk/Kiosk", "Frisør/Velvære", "Hotell/Overnatting", "Nettbutikk/Nettsted", "Agentur", "Annet".

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

Any other filter of the section'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 {"plot_area": {"min": 1000}, "property_type": \["Hytte"]}. A filter the section 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 an ad must contain (its title, and its 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 ad.

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

Ads 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.

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

The most paid rows (homes) the run delivers, 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 ads a page).

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

How many rows of each search are read at most, the rows left out by a filter included (no limit by default).

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

Read each ad's page: the full description, every key fact, all images, costs (sales costs, shared costs and what they include, municipal fees, common debt, property tax and tax value), areas (BRA-i, BRA-e, P-rom), plot, land register numbers, energy label, facilities, viewings, the housing cooperative, preemption, the agency card, floor plans, the prospectus and bid links, a project's units with their prices and sale status, a sold ad's sale time, click count and FINN's price per m². Included in the Home price, no extra event; it takes about a second per row.

## `includePriceStatistics` (type: `boolean`):

Resale homes and holiday homes: FINN's price per square metre of the ad (asking price plus common debt per m²), its click count on FINN, and the last year's sales in its local area and county for its property type by price per m² (FINN's price statistics page). One extra read per row; billed as one Price statistics per row that carries them. Other kinds of ad: empty and free.

## `includeSalesHistory` (type: `boolean`):

Resale homes and holiday homes: the home's earlier registered sales (date and price), as FINN shows them from Norkart's land register data. One extra read per row; billed as one Sales history per row that has at least one earlier sale. Share flats are not in the register; other kinds of ad: empty and free. A private seller's home only with includePersonalData.

## `includeAreaProfile` (type: `boolean`):

FINN's neighbourhood profile of the ad's place: people by age, families and children, education, housing stock and ownership, resident ratings (safety, noise, quiet and others), and the nearest public transport, schools, kindergartens, shops and sport with walking and driving times. One extra read per row; billed as one Area profile per row that carries it. Homes abroad, wanted ads and companies for sale: empty and free. A private seller's or landlord's home only with includePersonalData (the profile names its street and exact point).

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

Deliver the fields that name or reach a private person: brokers' and contact persons' names, titles, phones and e-mails, a private seller's or landlord's FINN id, street, land register numbers, exact map point and map image, the sales history and the area profile of a private seller's or landlord's home, and the contacts found in the texts of private ads. Off: those fields are empty; the agency's name, FINN id, website, logo and its search of ads are business data and always delivered (FINN shows no agency phone or organisation number on its real estate pages). You are responsible for a lawful use, GDPR included.

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

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

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

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

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

How the ad description is delivered.

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

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

## `outputFields` (type: `array`):

Keep only these row fields, by the names the rows carry ("adId", "url", "priceSuggestion", "pricePerSqm", "area", "salesHistory"); the row's identity, title, price, place, status and image count, and the fields of every add-on that is billed, always stay. Not together with compactOutput.

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

Deliver only the most used fields (handy for AI agents).

## `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 (agencies' ads always; private ads with includePersonalData on).

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

With extractContacts.

## `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 eiendom 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 (FINN is never asked more than requestsPerSecond requests a second): ad pages and add-on pages are read on this many lanes.

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

Tries of a failed read after the first.

## Actor input object example

```json
{
  "propertyTypes": [
    "homes"
  ],
  "locations": [
    "Oslo"
  ],
  "newBuildOnly": false,
  "usedHomesOnly": false,
  "sellerType": "any",
  "postedToday": false,
  "petsAllowed": false,
  "refugeesWelcome": false,
  "plotOwnedOnly": false,
  "requireAllKeywords": false,
  "titleOnly": false,
  "maxItems": 20,
  "includeDetails": true,
  "includePriceStatistics": false,
  "includeSalesHistory": false,
  "includeAreaProfile": false,
  "includePersonalData": false,
  "priceSummary": true,
  "includeRawData": false,
  "descriptionFormat": "asServed",
  "compactOutput": false,
  "excludeEmptyFields": false,
  "extractContacts": false,
  "failIfIncomplete": false,
  "requestsPerSecond": 1,
  "maxConcurrency": 4,
  "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 = {
    "propertyTypes": [
        "homes"
    ],
    "locations": [
        "Oslo"
    ],
    "maxItems": 20,
    "includeDetails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/finn-eiendom-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 = {
    "propertyTypes": ["homes"],
    "locations": ["Oslo"],
    "maxItems": 20,
    "includeDetails": True,
}

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

```

## MCP server setup

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