FINN.no Scraper - Norway Property Listings
Pricing
from $3.00 / 1,000 listings
FINN.no Scraper - Norway Property Listings
Extract FINN.no property listings in Norway, including prices, sizes, locations, photos and available agent contacts. Search categories or collect specific ads. Billed per delivered row plus a start event.
Pricing
from $3.00 / 1,000 listings
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
5
Total users
4
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
FINN.no Scraper
Extract FINN.no property listings in Norway, with prices, sizes, locations and published contact details in rows you can export.
- Search homes for sale, rentals, holiday homes, plots and new projects.
- Collect specific ads, company profiles, vehicles, jobs or used goods.
- Add available viewing times, facilities and photos to listing rows.
- Export results or use them through the Apify API and MCP.
- Pay $3.00 per 1,000 delivered rows, plus a $0.005 start event at default memory.
What does FINN.no Scraper do?
FINN.no Scraper collects public information from finn.no. Start with a location, keyword or listing URL. Each row represents a listing, office profile or service result, depending on your input.
- Search: choose a
channeland enterlocationorq. - Specific ads: use
detailUrlsinstead of searching. - Office profiles: use
channel: "office"withofficeUrl. - Discovery: use feeds, sitemaps or map areas to find ads.
- Additional data: select an
appsgwService, or browse refurbished electronics withchannel: "nybrukt".
enrichDetails is on by default. Optional neighborhood, ownership-history, area-profile and office enrichment is off by default and adds fields to the listing row, not separate billed rows. Nybrukt variant expansion is also off by default; each delivered variant row is billed.
What data can you extract from FINN.no?
Listing rows
Fields vary by channel and what FINN publishes. Search-only rows can contain fewer details than individual ads.
| Field | Description | Example |
|---|---|---|
listingId | FINN identifier; also available as finnkode for ads | 123456789 |
name | Listing headline | Example apartment in Oslo |
listingUrl | Source ad URL | https://www.finn.no/realestate/homes/ad.html?finnkode=123456789 |
channel | Selected listing category | sale |
priceDisplay | Published price text, usually NOK | 3 900 000 kr |
bedrooms | Number of bedrooms | 2 |
areaSqm | Property area in square metres | 65 |
address | Location text or structured address | Oslo |
propertyType | Property category | Leilighet |
ownershipType | Ownership category | Selveier |
imageUrls | Available photo URLs | [] |
facilities | Published amenities | ["Balkong"] |
viewings | Viewing information, when available | [] |
phones | Published contact numbers | [{"value":"+1 555 0100","type":"mobile"}] |
emails | Published contact emails | [{"value":"name@example.com","type":"work"}] |
person | Contact name and role | {"name":"Jane Doe","role":"Agent"} |
org | Brokerage or company | {"name":"Example Agency"} |
leadAbsences | Reasons contact information is missing | {} |
enrichment | Optional supplementary information | {} |
scrapedAt | Collection timestamp | 2026-10-24T08:00:00+00:00 |
Office rows
These use type: "office"; a profile title is not a guarantee of complete contact information.
| Field | Description | Example |
|---|---|---|
officeName | Profile heading | Example Agency |
officeUrl | Supplied FINN profile URL | https://www.finn.no/realestate/agent/ |
Nybrukt rows
Products and reseller variants use listing rows with additional fields when available.
| Field | Description | Example |
|---|---|---|
sku | Variant identifier | EXAMPLE-SKU |
condition | Published condition | Grade A |
storage | Storage capacity | 128 GB |
seller_name | Reseller name | Example Seller |
price_currency | Currency code | NOK |
Service rows
| Field | Description | Example |
|---|---|---|
service | Requested service | location_autocomplete |
serviceDataJson | Structured service result stored as a JSON string | "{\"name\":\"Oslo\"}" |
httpStatus | Service response status | 200 |
How to scrape FINN.no
- Open FINN.no Scraper in Apify Console.
- Enter
location, such asOslo, or paste a listing intodetailUrls. - Set
maxResultsto3for a small first run. - Click Start and inspect the dataset when the run finishes.
- Download rows or read them through the API.
Empty input starts an example requesting 3 homes for sale in Oslo from the form's sample values. It is billed normally; it is not a free preview. A place, keyword or listing URL can be the only target field. Specialized channels still need the settings described below; there is no mode input.
Search
Real-estate channels are sale, rent, projects, leisure, leisure_plots, plot, commercial, abroad and planned. Other search channels are torget, car, mc, boat, caravan and job. A keyword without a location uses Oslo. For abroad, leave location unset; Norwegian location filters can exclude overseas listings.
Specific ads
Fill detailUrls with one or more FINN ad URLs. These replace the usual search. FINN subdomains, addresses without a scheme and http:// addresses are normalized to https://www.finn.no.
Office profiles
Set channel to office and provide officeUrl or profile URLs in detailUrls. Do not rely on officeUrl alone to select this channel.
Discovery
feed: true reads recent entries for torget or job. enumerateMode: "sitemap" discovers listing URLs; seed_pool uses previously discovered URLs with a sitemap fallback. Map options use mapBbox and optional mapLayers. Discovery does not guarantee every active ad.
Services and Nybrukt
Use appsgwService with the matching term or identifier. Service results are not necessarily property listings. For refurbished electronics, set channel: "nybrukt" and use nybruktCategory or nybruktProduct. nybruktExpandVariants changes category collection to reseller-variant rows.
What to fill in
| Field | What to enter | Default |
|---|---|---|
location | Norwegian place or FINN location code | Oslo when omitted |
channel | Category listed above | sale |
q | Search words, preferably Norwegian | Empty |
detailUrls | Array of FINN ad URLs | Empty |
officeUrl | FINN profile URL with channel: "office" | Empty |
maxResults | Row limit per input, 1–2,000 | 70; form sample 3 |
maxPages | Search-page setting, 1–100; collection can expand it to meet the row limit | 1 |
fetchAllPages | Continue through available pages within the row limit | false |
priceFrom, priceTo | Price range in NOK | Empty |
priceCollectiveFrom, priceCollectiveTo | Collective-price range | Empty |
areaFrom, areaTo | Property size range, m² | Empty |
plotAreaFrom, plotAreaTo | Plot size range, m² | Empty |
minBedrooms | Minimum bedroom count | Empty |
propertyType, ownershipType | FINN category IDs or labels | Empty |
constructionYearFrom, constructionYearTo | Construction-year range | Empty |
published, videoType | FINN recency or video filters | Empty |
sort | Form option, such as PRICE_ASC | Unset |
enrichDetails | Add available ad details | true |
enrichOffice, enrichAreaProfile, enrichOwnershipHistory, enrichNeighborhood | Optional supplementary fields | false |
incremental | Skip previously seen listing IDs across runs | false |
feed | Recent feed entries | false |
enumerateMode | Sitemap, saved URL collection or map discovery | Unset |
mapBbox | min_lon,min_lat,max_lon,max_lat | Southern Norway |
mapZoom, mapLayers | Zoom 3–16 and FINN map-layer identifiers | 10; available layers |
appsgwService | Service name, such as location_autocomplete | Empty |
appsgwTerm, appsgwId, appsgwIds | Matching term, single ID or ID list | Empty |
appsgwLimit | Suggestion limit, 1–100 | Service default |
nybruktCategory, nybruktProduct | Category or product slug | mobil on Nybrukt; no product |
nybruktExpandVariants | Expand category products into variants | false |
revealPhones | Request available vehicle-ad phone numbers | false |
includeRaw | Include extra source fields when available | false |
fields | Optional output-field selection; leave empty for full rows | Empty |
webhookUrl | HTTPS address for result notification | Empty |
Search:
{"location":"Bergen","channel":"rent","maxResults":3}
Specific ads; replace the example identifier with your ad:
{"detailUrls":["https://www.finn.no/realestate/homes/ad.html?finnkode=123456789"],"maxResults":1}
Office profile; replace the example URL with an actual profile:
{"channel":"office","officeUrl":"https://www.finn.no/realestate/agent/","maxResults":1}
Recent feed:
{"channel":"torget","q":"sykkel","feed":true,"maxResults":3}
Sitemap discovery:
{"enumerateMode":"sitemap","channel":"sale","maxResults":3}
Saved URL discovery:
{"enumerateMode":"seed_pool","channel":"sale","maxResults":3}
Map discovery:
{"enumerateMode":"mapBbox","mapBbox":"10.70,59.88,10.80,59.95","maxResults":3}
Location suggestions:
{"appsgwService":"location_autocomplete","appsgwTerm":"Oslo","maxResults":3}
Refurbished electronics:
{"channel":"nybrukt","nybruktCategory":"mobil","nybruktExpandVariants":false,"maxResults":3}
maxItems and limit are aliases for maxResults; city and place mean location; keyword and query mean q; urls and startUrls mean detailUrls.
Close field-name misspellings are corrected when possible; other unknown fields are ignored with a note. An invalid sort is dropped. Invalid targets fail with INVALID_INPUT: followed by the field and correction, before rows are charged; a start event can still apply. Every run writes its input interpretation to INPUT_REPORT in the default key-value store. No automatic date-window advancement is provided.
Output example
Illustrative property row; the identifier and address are placeholders, not a captured ad:
{"listingId": "123456789","finnkode": "123456789","name": "Example apartment in Oslo","type": "listing","status": "active","country": "NO","authority": "finn.no","channel": "sale","listingUrl": "https://www.finn.no/realestate/homes/ad.html?finnkode=123456789","priceDisplay": "3 900 000 kr","bedrooms": 2,"areaSqm": 65,"address": "Example Street 1, Oslo","phones": [],"emails": [],"scrapedAt": "2026-10-24T08:00:00+00:00"}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. Nested fields are easier to retain in JSON than a flat spreadsheet.
Why use this FINN.no scraper?
- Pay per delivered row: unsuccessful page attempts are not billed as rows.
- Keep partial results: available partial rows are delivered when collection ends early; rows already saved remain available.
- Understand failures:
ERROR_SUMMARYandRUN_SUMMARYprovide failure or partial-result information. - Avoid invented details: unavailable source fields remain empty or absent.
- Batch specific inputs: provide several
detailUrlsor supportedappsgwIdsin one run. - No proxy configuration: you do not need to set up proxies.
How much does it cost to scrape FINN.no?
The Actor uses pay-per-event pricing. At the default 512 MB memory, one start event costs $0.005. Memory billing uses one start event per GB, with a minimum of one.
| Apify plan | Start event at 512 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.003 | $3.00 |
| Business | $0.005 | $0.003 | $3.00 |
These are event prices. The current Actor configuration marks platform usage as user-paid, so do not assume platform usage is included; check the run's pricing before starting.
maxResultsapplies to each input. Its default is 70; larger requests are collected in parts of 70.- Free-plan users have up to 200 rows per run and 10 runs of this Actor. Paid plans remove the 10-run restriction, not the input limits.
- Set Maximum cost per run (
maxTotalChargeUsdin the API) to cap event charges across all inputs.
Example: 5 delivered rows cost 5 × $0.003 + $0.005 = $0.020 in events at 512 MB, before any separately charged platform usage. Empty runs have no row charge, but a start charge can still apply.
What happens when the run timeout is too short
A run can pause rather than fail when results are expected after its remaining timeout. It displays “Queued on the collection backend; this run will resume automatically when results are ready (about N s).” and temporarily appears as ABORTED.
When results are ready, the same run resumes and delivers to the same dataset. Delivery skips rows already saved; the resumed-delivery message is “Resumed: delivering N rows.” Successful delivery finishes as SUCCEEDED. No manual restart is needed for this pause. A genuine collection failure can still produce an error or partial result.
The pause mechanism has a limit of 3 attempts. Keep the default timeout of 3,600 seconds to reduce interruptions. The synchronous endpoints run-sync and run-sync-get-dataset-items wait at most 300 seconds and can return no rows during a pause. For longer jobs, start asynchronously and read the dataset after SUCCEEDED, or use a succeeded-event webhook.
Use with AI agents and the API
Apify MCP server
In Claude, ChatGPT, Cursor, VS Code or another compatible remote MCP client, add:
https://mcp.apify.com?tools=lentic_clockss/finn-scraper
Sign in through Apify OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool returns run and dataset IDs; read results with get-dataset-items. Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/finn-scraper with APIFY_TOKEN set locally.
Example prompt: “Collect three rental listings in Bergen and return their prices, sizes and URLs.”
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/finn-scraper").call(run_input={"location": "Bergen", "channel": "rent", "maxResults": 3})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/finn-scraper').call({location: 'Bergen', channel: 'rent', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For asynchronous HTTP runs, send the JSON input to POST https://api.apify.com/v2/acts/lentic_clockss~finn-scraper/runs with an Authorization: Bearer token header. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.
Integrations
Use the Integrations tab for Google Sheets, Make, Zapier, n8n, Slack, Airtable or webhooks. Apify Schedules can repeat saved searches; use incremental when you want to skip previously seen listing IDs.
På norsk
FINN.no Scraper henter offentlig tilgjengelige annonser fra FINN og gjør dem om til rader som kan lastes ned. For boliger fyller du inn location, for eksempel Oslo eller Bergen, og velger channel: sale for salg eller rent for leie. Bruk detailUrls hvis du vil hente bestemte annonser. Start gjerne med maxResults satt til 3. Du får pris, størrelse, beliggenhet og andre opplysninger som annonsen faktisk viser. Kontaktinformasjon kan mangle, særlig i private leieannonser. Resultatene faktureres per levert rad, i tillegg til en startavgift og eventuell plattformbruk. Tomt input starter et lite, betalbart eksempel fra Oslo. Du kan laste ned radene som Excel, CSV eller JSON.
FAQ
Is it legal to scrape FINN.no?
Public availability does not remove your obligations. You are responsible for FINN's terms and applicable data-protection law. Collecting or using personal data requires a lawful basis; this Actor does not grant one.
Why did my run end as ABORTED?
Check the status message. An automatic pause can appear as ABORTED before resuming. A manually stopped run is different and is not guaranteed to restart.
How many results can I get?
maxResults accepts up to 2,000 per input. Availability, pagination, the charge limit and the free-plan cap can reduce delivery. A request is a ceiling, not a promised count.
Why are some fields empty?
Search cards contain fewer fields than details. FINN may omit size, price or contact information. Private rentals can offer only a contact form, which the Actor does not submit.
Does it collect listing details?
Yes. enrichDetails defaults to true; turn it off for search-only collection. Additional enrichment is optional and depends on the source.
Can I use this as a FINN.no API?
Use the Apify API examples above. This is an independent scraper, not an official FINN API.
Why did my free-plan run stop after 10 runs?
The Actor limits free-plan users to 10 runs. The status message identifies the limit. Paid Apify plans are not subject to that run-count restriction.
Does incremental collection detect changed prices?
No. incremental skips stored listing IDs, rather than comparing prices. Leave it off when revisiting known ads for changes.
Limitations
- FINN coverage is not a complete inventory of Norway's property market.
- Filters and field availability differ between channels; property filters do not apply universally.
- Office profiles do not guarantee phone numbers, emails or individual agent details.
enumerateMode: "bare_id"has no dedicated collection path; usedetailUrlsfor known ads.- Map and sitemap discovery may return limited details. No complete historical archive is promised.
- A forced stop cannot guarantee delivery of information not yet saved to the dataset.
Related scrapers
More real estate and property data scrapers from the same publisher:
- Zumper Scraper
- Booli Scraper
- Craigslist Scraper
- PropertyGuru Scraper
- OpenSooq Scraper
- Apartments.com Rental Scraper
- Dot Property Scraper
- Immobiliare.it Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report problems or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.