# Finn.no Scraper - Norway's #1 Classifieds Data Extractor (`fervent_bus/finn-no-scraper`) Actor

Scrape real estate, cars, jobs & classifieds from finn.no with Playwright automation. Extract titles, prices, locations, images, seller info. Pagination support, anti-detection, category detection.

- **URL**: https://apify.com/fervent\_bus/finn-no-scraper.md
- **Developed by:** [Archit Khurana](https://apify.com/fervent_bus) (community)
- **Categories:** Real estate, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

Scrapes listings from Finn.no, Norway's largest classifieds platform. This actor extracts comprehensive data from real estate, car, job, and other listings.

### Features

- 🏠 **Real Estate Listings** - Homes, apartments, cabins, commercial properties
- 🚗 **Car Listings** - Used and new vehicles with specifications
- 💼 **Job Listings** - Job postings with company and position details
- 📦 **Other Categories** - Electronics, furniture, services, and more
- 🖼️ **Image Extraction** - Captures listing images (up to 10 per listing)
- 📊 **Comprehensive Data** - Title, price, location, description, seller info, attributes
- 🔄 **Pagination Support** - Automatically follows next page links
- 🛡️ **Anti-Detection** - Uses Playwright with stealth techniques
- ⚡ **Efficient** - Rate-limited and respectful scraping

### Input Parameters

#### Start URL (required)

The URL of the Finn.no search or category page to scrape.

**Examples:**

- Real estate: `https://www.finn.no/realestate/homes/search.html`
- Cars: `https://www.finn.no/car/used/search.html`
- Jobs: `https://www.finn.no/job/fulltime/search.html`
- Electronics: `https://www.finn.no/bap/forsale/search.html?category=0.93`

You can also use filtered search URLs with location, price range, etc.

#### Maximum Pages (optional)

Maximum number of search result pages to scrape. Default: 10

Each page typically contains 20-50 listings depending on the category.

### Output Format

The actor outputs a dataset with the following fields:

```json
{
  "url": "https://www.finn.no/ad/...",
  "title": "Beautiful apartment in Oslo",
  "price": "5 000 000 kr",
  "priceNumeric": 5000000,
  "location": "Oslo, Grünerløkka",
  "description": "Spacious 3-bedroom apartment...",
  "category": "real_estate",
  "seller": "Real Estate Agency AS",
  "images": [
    "https://images.finn.no/...",
    "..."
  ],
  "imageCount": 8,
  "attributes": {
    "Property type": "Apartment",
    "Bedrooms": "3",
    "Square meters": "95",
    "Year built": "2015"
  },
  "scrapedAt": "2024-01-15T10:30:00.000Z"
}
```

#### Field Descriptions

- **url** - Direct link to the listing page
- **title** - Listing title/headline
- **price** - Price as displayed (with currency and formatting)
- **priceNumeric** - Price as a number (for sorting/filtering)
- **location** - Address or location description
- **description** - Full listing description
- **category** - Detected category: `real_estate`, `car`, `job`, or `other`
- **seller** - Seller/advertiser name
- **images** - Array of image URLs
- **imageCount** - Number of images
- **attributes** - Category-specific attributes (varies by listing type)
- **scrapedAt** - ISO timestamp of when the data was scraped

### Usage Examples

#### Scrape Real Estate Listings in Oslo

```json
{
  "startUrl": "https://www.finn.no/realestate/homes/search.html?location=0.20061",
  "maxPages": 5
}
```

#### Scrape Used Cars

```json
{
  "startUrl": "https://www.finn.no/car/used/search.html",
  "maxPages": 10
}
```

#### Scrape Job Listings

```json
{
  "startUrl": "https://www.finn.no/job/fulltime/search.html",
  "maxPages": 3
}
```

### Rate Limiting

The actor includes built-in rate limiting:

- 1 second delay between listings
- 2 seconds delay between pages

This ensures respectful scraping and reduces the chance of being blocked.

### robots.txt Compliance

The actor respects Finn.no's robots.txt file. Finn.no generally allows crawling of public listing pages but may have restrictions on certain areas.

### Data Quality

The scraper uses multiple fallback selectors to ensure robust data extraction even if Finn.no updates their HTML structure. If a field cannot be extracted, it will be omitted from the output rather than returning null values.

### Common Issues

#### No listings found

- Verify the start URL is a valid Finn.no search/category page
- Some categories may use different URL structures
- Check if the page requires login or has regional restrictions

#### Incomplete data

- Some listing types have different structures
- Private sellers may have less information than professional advertisers
- Very old listings may use different HTML templates

### Technical Details

- **Browser**: Playwright Chromium with anti-detection
- **Language**: Python 3.11
- **SDK**: Apify SDK 2.x
- **Concurrency**: Sequential processing to avoid overloading the site
- **Memory**: Recommended 2GB minimum
- **Timeout**: 30 seconds per page load

### Support

For issues, feature requests, or questions, please contact the actor developer.

### License

This actor is provided as-is for educational and commercial use. Please ensure you comply with Finn.no's Terms of Service and applicable data protection regulations (GDPR) when using this actor.

# Actor input Schema

## `startUrl` (type: `string`):

The URL of the Finn.no search/category page to start scraping from. For example: https://www.finn.no/realestate/homes/search.html or https://www.finn.no/car/used/search.html

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

Maximum number of search result pages to scrape. Each page typically contains 20-50 listings.

## Actor input object example

```json
{
  "startUrl": "https://www.finn.no/realestate/homes/search.html",
  "maxPages": 10
}
```

# Actor output Schema

## `datasetLink` (type: `string`):

Complete scraped data

# 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 = {
    "startUrl": "https://www.finn.no/realestate/homes/search.html"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fervent_bus/finn-no-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrl": "https://www.finn.no/realestate/homes/search.html" }

# Run the Actor and wait for it to finish
run = client.actor("fervent_bus/finn-no-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrl": "https://www.finn.no/realestate/homes/search.html"
}' |
apify call fervent_bus/finn-no-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fervent_bus/finn-no-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4ERj3241moXlhjNki/builds/rmLjYlwyt5aDqhDYp/openapi.json
