# FINN.no Job Scraper (`solidcode/finn-no-scraper`) Actor

\[💰 $1.0 / 1K] Extract job listings from FINN.no, Norway's largest classifieds and job marketplace. Search by keyword and county, filter by occupation, employment type, contract, remote work and sector, and get titles, employers, locations, salaries, deadlines and full descriptions.

- **URL**: https://apify.com/solidcode/finn-no-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## FINN.no Job Scraper

Pull job listings from FINN.no — Norway's dominant classifieds and job marketplace — at scale, with employer names, locations down to the county (fylke), salaries, application deadlines, contact persons, and full Norwegian job descriptions in one clean row per posting. Filter by 16 counties, 13 occupation categories, employment type, contract type, remote work, sector, and work language. Built for Norwegian recruiters, HR-tech platforms, labor-market analysts, and relocation services who need structured finn.no/job data without copy-pasting ads one page at a time.

### Why This Scraper?

- **All 16 Norwegian counties (fylke)** — from Oslo and Akershus to Troms, Finnmark, and Svalbard, target one region or sweep the whole country in a single run.
- **13 occupation categories (yrkeskategori)** — narrow to Nursing, Healthcare staff, Engineering, Skilled trades, Teaching, Childcare, Logistics, Management, and more without crafting search links by hand.
- **Six precision filters in one actor** — full-time vs. part-time, four contract types (permanent, temporary, engagement, seasonal), partial or fully remote, private vs. public sector, work language (Norwegian or English), and management-roles-only.
- **Norwegian-language job descriptions, deadlines, and contacts** — opt-in detail enrichment returns each ad's full description (text and HTML), application deadline, street address, and named contact person with title.
- **Structured salary and open-position counts** — captures the listed salary text and `positions` (how many seats the employer is hiring for) straight from the source ad.
- **"Posted today" and newest-first sorting** — surface fresh listings the moment they hit finn.no, or sort by relevance for broad market sweeps.
- **Up to ~2,500 jobs per search** — paginates to FINN.no's own ceiling; combine county and occupation facets to push total coverage far beyond that.
- **Direct FINN.no URL replay** — paste any filtered finn.no/job search you built in the browser and the scraper honors those exact filters, with automatic de-duplication across overlapping keyword searches.

### Use Cases

**Recruitment & Talent Sourcing**
- Build candidate-outreach lists from named contact persons on every detail-enriched ad
- Track competitor job postings by employer across counties
- Monitor newly posted roles in a single occupation category daily
- Map open-position counts to gauge which employers are hiring at volume

**Labor Market Research**
- Measure hiring demand by county, occupation, and sector over time
- Compare full-time vs. part-time and permanent vs. temporary mix across regions
- Track salary signals and remote-work adoption across Norwegian industries
- Quantify public-sector vs. private-sector hiring activity

**Competitive Hiring Intelligence**
- Watch a rival employer's open roles, job functions, and deadlines
- Benchmark your job-ad volume against sector peers
- Detect expansion signals from sudden spikes in a company's postings
- Identify which roles competitors recruit for in English vs. Norwegian

**Relocation & Immigration Services**
- Surface English-language roles for international candidates relocating to Norway
- Filter remote-eligible positions for clients working from abroad
- Map opportunities by county to advise on where to settle
- Pull application deadlines so clients never miss a closing date

**Aggregators & Data Products**
- Feed a job board or vertical search engine with fresh Norwegian listings
- Enrich an existing CRM with employer, location, and contact data
- Power salary-benchmarking and hiring-trend dashboards
- Build alerting systems for new postings in target categories

### Getting Started

#### Simple Keyword Search

The fastest way to start — one keyword, default limit:

```json
{
    "searchQueries": ["utvikler"],
    "maxResults": 50
}
````

#### Filtered County + Occupation Search

The most useful combination — narrow by region, category, and freshness:

```json
{
    "searchQueries": ["sykepleier"],
    "counties": ["Oslo", "Akershus"],
    "occupations": ["Nursing"],
    "employmentExtent": "fulltime",
    "sortBy": "published",
    "maxResults": 500
}
```

#### Advanced Multi-Filter Run

Most options populated for deep, targeted research:

```json
{
    "searchQueries": ["prosjektleder", "ingeniør"],
    "counties": ["Vestland", "Rogaland"],
    "occupations": ["Engineering", "Management"],
    "employmentExtent": "fulltime",
    "contractType": "permanent",
    "remoteWork": "partial",
    "sector": "private",
    "workLanguage": "english",
    "managerRole": true,
    "postedToday": false,
    "sortBy": "published",
    "fetchJobDetails": true,
    "maxResults": 1000
}
```

#### Replay a Direct FINN.no Search

Already dialed in a search on finn.no? Paste the URL as-is:

```json
{
    "startUrls": ["https://www.finn.no/job/fulltime/search.html?q=utvikler&location=0.20061"],
    "maxResults": 200
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQueries` | array | `["utvikler"]` | Job titles or keywords. Each keyword runs a separate search; results are merged and de-duplicated. Up to 50 keywords. |
| `startUrls` | array | `[]` | Full FINN.no job-search URLs. Filters baked into each URL are scraped exactly as-is. Up to 50 URLs. |
| `maxResults` | integer | `100` | Max jobs per search keyword or URL. Set to `0` for all available. The last page is kept in full, so the count can slightly overshoot. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `counties` | array | `[]` | One or more of 16 Norwegian counties (Oslo, Akershus, Vestland, Rogaland, Trøndelag, Innlandet, Agder, Østfold, Buskerud, Vestfold, Nordland, Møre og Romsdal, Telemark, Troms, Finnmark, Svalbard). Empty = all of Norway. |
| `occupations` | array | `[]` | One or more of 13 categories: Childcare, Retail, Healthcare staff, Skilled trades, Engineering, Office & administration, Customer service, Management, Logistics & warehouse, Food & hospitality, Care & social work, Nursing, Teaching & education. |
| `employmentExtent` | string | `""` (Any) | Working hours: `fulltime` (heltid) or `parttime` (deltid). |
| `contractType` | string | `""` (Any) | Contract: `permanent` (fast), `temporary` (vikariat), `engagement` (engasjement), or `seasonal` (sommer/sesong). |
| `remoteWork` | string | `""` (Any) | Remote arrangement: `partial` (delvis hjemmekontor) or `full` (kun hjemmekontor). |
| `sector` | string | `""` (Any) | Employer sector: `private` (privat) or `public` (offentlig). |
| `workLanguage` | string | `""` (Any) | Working language: `norwegian` (norsk) or `english` (engelsk). |
| `managerRole` | boolean | `false` | Only return management / leadership positions (leder, direktør, fagleder). |
| `postedToday` | boolean | `false` | Only return jobs posted today (Nye i dag). |

#### Sorting & Detail

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sortBy` | string | `"relevant"` | `relevant` (Most relevant) or `published` (Newest first). |
| `fetchJobDetails` | boolean | `false` | Turn on to fetch full description, deadline, contact person, and structured fields from each ad's detail page. Off by default for fast scans; enable it whenever you need descriptions, deadlines, or contacts. |

### Output

Each job is one flat row. Detail fields (description, deadline, address, contact person, and a few structured labels) populate only when `fetchJobDetails` is on.

```json
{
    "adId": "338211456",
    "title": "Senior Backend Developer",
    "employer": "Acme Tech AS",
    "companyUrl": "https://www.acmetech.no",
    "logoUrl": "https://images.finncdn.no/dynamic/logo/acme.png",
    "location": "Oslo",
    "county": "Oslo",
    "address": "Storgata 1, 0155 Oslo",
    "coordinates": { "lat": 59.9139, "lng": 10.7522 },
    "sector": "Privat",
    "industry": "IT, Software",
    "occupations": ["Ingeniør"],
    "jobFunction": "Utvikling",
    "employmentType": "Fast",
    "extent": "Heltid",
    "managerRole": false,
    "remoteWork": "Delvis hjemmekontor",
    "positions": 2,
    "salary": "Etter avtale",
    "workLanguages": ["Norsk", "Engelsk"],
    "published": "2026-05-28T08:00:00Z",
    "deadline": "2026-06-15",
    "contactName": "Kari Nordmann",
    "contactTitle": "Teamleder",
    "descriptionText": "Vi søker en erfaren backend-utvikler...",
    "descriptionHtml": "<p>Vi søker en erfaren backend-utvikler...</p>",
    "labels": ["Fast", "Heltid"],
    "searchQuery": "utvikler",
    "url": "https://www.finn.no/job/ad/338211456",
    "scrapedAt": "2026-05-30T11:42:00Z"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `adId` | string | FINN.no ad identifier (finnkode). |
| `title` | string | Job title as posted. |
| `jobFunction` | string | Job function / role family. |
| `employmentType` | string | Contract type (Fast, Vikariat, etc.). |
| `extent` | string | Working hours (Heltid / Deltid). |
| `managerRole` | boolean | Whether the role is a management position. |
| `remoteWork` | string | Remote-work arrangement, if any. |
| `positions` | number | Number of open seats for the role. |
| `salary` | string | Listed salary text. |
| `occupations` | array | Occupation categories assigned to the ad. |
| `url` | string | Link to the live job ad on FINN.no. |

#### Company

| Field | Type | Description |
|-------|------|-------------|
| `employer` | string | Employer / company name. |
| `companyUrl` | string | Company website, when available. |
| `logoUrl` | string | Employer logo image URL. |
| `sector` | string | Private or public sector (Privat / Offentlig). |
| `industry` | string | Industry / bransje of the employer. |

#### Location

| Field | Type | Description |
|-------|------|-------------|
| `location` | string | Work location as displayed on the ad. |
| `county` | string | Norwegian county (fylke). |
| `address` | string | Street address, when present on the detail page. |
| `coordinates` | object | `{ lat, lng }` geographic coordinates. |

#### Job Details

| Field | Type | Description |
|-------|------|-------------|
| `descriptionText` | string | Full job description as plain text. |
| `descriptionHtml` | string | Full job description with original HTML formatting. |
| `deadline` | string | Application deadline. |
| `contactName` | string | Named contact person for the role. |
| `contactTitle` | string | Contact person's title. |
| `workLanguages` | array | Working languages required for the role. |
| `labels` | array | Badges shown on the listing (Fast, Heltid, etc.). |

#### Metadata

| Field | Type | Description |
|-------|------|-------------|
| `published` | string | Publication date and time (ISO 8601). |
| `searchQuery` | string | The keyword or URL that surfaced this row. |
| `scrapedAt` | string | When the row was collected (ISO 8601). |

### Tips for Best Results

- **Break the ~2,500-per-search ceiling by faceting** — FINN.no caps any single search at roughly 2,500 ads. Split a broad keyword across counties or occupation categories and merge the runs to collect far more.
- **Turn on `fetchJobDetails` for deadlines and contacts** — application deadlines, full descriptions, street addresses, and named contact persons only appear when detail enrichment is enabled. It's off by default for fast scans, so flip it on whenever you need that richer data.
- **Replay browser searches with `startUrls`** — dial in the exact filters you want on finn.no, copy the URL, and paste it. The scraper honors every filter baked into the URL, which is handy for niche facets not exposed as inputs.
- **Use `sortBy: "published"` with `postedToday` for daily monitors** — newest-first ordering plus the "posted today" filter gives you a clean feed of fresh listings for alerting workflows.
- **Target English-language roles for international hiring** — set `workLanguage` to `english` to surface jobs aimed at non-Norwegian speakers, ideal for relocation and global-talent use cases.
- **Combine `sector` and `managerRole` for executive search** — `public` or `private` sector plus management-roles-only narrows straight to leadership openings.
- **Run multiple keywords in one go** — `searchQueries` accepts up to 50 terms; results merge and de-duplicate automatically, so synonyms like "utvikler" and "developer" won't double-count.

### Pricing

**$1.00 per 1,000 results** — flat, predictable pay-per-result pricing with no surprises.

| Results | Estimated Cost |
|---------|----------------|
| 100 | $0.10 |
| 1,000 | $1.00 |
| 10,000 | $10.00 |
| 100,000 | $100.00 |

A "result" is one job row returned to your dataset. **No compute charges — you only pay per result returned.** Apify platform fees may apply separately depending on your subscription plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new job listings
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This scraper collects publicly available job listings from FINN.no for legitimate purposes such as recruitment, labor-market research, and business analysis. You are responsible for using the collected data in compliance with FINN.no's terms of service, applicable data-protection laws (including Norwegian and EU/EEA GDPR rules), and any restrictions on personal data. Do not use contact details for unsolicited bulk outreach that violates anti-spam regulations. Always respect the rights of data subjects and use the data ethically and responsibly.

# Actor input Schema

## `searchQueries` (type: `array`):

Job titles or keywords to search for, such as 'utvikler', 'sykepleier', or 'prosjektleder'. Each keyword runs a separate search and results are merged and de-duplicated. Up to 50 keywords per run. Leave empty to list all jobs (optionally narrowed by the filters below), or if you are only using direct search URLs.

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

Paste full FINN.no job-search URLs (for example https://www.finn.no/job/fulltime/search.html?q=utvikler\&location=0.20061). The filters baked into each URL are scraped exactly as-is. Useful when you have already dialed in a search on the FINN.no website. Up to 50 URLs per run.

## `maxResults` (type: `integer`):

Maximum number of jobs to collect per search keyword (or per URL). Use 50 for a quick scan or a higher number for deep research. The last page is always kept in full, so the final count can slightly overshoot this number. Set to 0 to collect all available results. Note: FINN.no returns at most ~2,500 jobs for any single search — to gather more, split your search across counties or occupation categories.

## `counties` (type: `array`):

Limit results to one or more Norwegian counties. Leave empty to search all of Norway.

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

Limit results to one or more job categories (yrkeskategori). Leave empty for all categories.

## `employmentExtent` (type: `string`):

Filter by working hours. Leave on 'Any' for both.

## `contractType` (type: `string`):

Filter by the type of employment contract. Leave on 'Any' for all contract types.

## `remoteWork` (type: `string`):

Filter by home-office / remote arrangement. Leave on 'Any' for jobs with or without remote work.

## `sector` (type: `string`):

Filter by employer sector. Leave on 'Any' for both private and public.

## `managerRole` (type: `boolean`):

Only return management / leadership positions (leder, direktør, fagleder).

## `workLanguage` (type: `string`):

Only return jobs where the working language is the one selected. Leave on 'Any' to include all.

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

Only return jobs that were posted today. Leave off to include jobs from any date. (FINN.no only supports a 'new today' filter — older posted-within windows such as 3 or 7 days are not offered by the site.)

## `sortBy` (type: `string`):

How to order the search results.

## `fetchJobDetails` (type: `boolean`):

Turn on to fetch each job's detail page, adding the full description, application deadline, named contact person, street address and structured fields. Off by default for fast, lightweight scans (detail fetching makes a run several times slower because it loads every ad individually). Enable this whenever you need descriptions, deadlines, or contacts.

## Actor input object example

```json
{
  "searchQueries": [
    "utvikler"
  ],
  "startUrls": [],
  "maxResults": 100,
  "counties": [],
  "occupations": [],
  "employmentExtent": "",
  "contractType": "",
  "remoteWork": "",
  "sector": "",
  "managerRole": false,
  "workLanguage": "",
  "postedToday": false,
  "sortBy": "relevant",
  "fetchJobDetails": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped job listings with key fields.

## `detail` (type: `string`):

Complete job data including descriptions, deadlines, employer details, and structured fields.

# 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 = {
    "searchQueries": [
        "utvikler"
    ],
    "startUrls": [],
    "maxResults": 100,
    "counties": [],
    "occupations": [],
    "employmentExtent": "",
    "contractType": "",
    "remoteWork": "",
    "sector": "",
    "managerRole": false,
    "workLanguage": "",
    "postedToday": false,
    "sortBy": "relevant",
    "fetchJobDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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 = {
    "searchQueries": ["utvikler"],
    "startUrls": [],
    "maxResults": 100,
    "counties": [],
    "occupations": [],
    "employmentExtent": "",
    "contractType": "",
    "remoteWork": "",
    "sector": "",
    "managerRole": False,
    "workLanguage": "",
    "postedToday": False,
    "sortBy": "relevant",
    "fetchJobDetails": False,
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "utvikler"
  ],
  "startUrls": [],
  "maxResults": 100,
  "counties": [],
  "occupations": [],
  "employmentExtent": "",
  "contractType": "",
  "remoteWork": "",
  "sector": "",
  "managerRole": false,
  "workLanguage": "",
  "postedToday": false,
  "sortBy": "relevant",
  "fetchJobDetails": false
}' |
apify call solidcode/finn-no-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/finn-no-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "FINN.no Job Scraper",
        "description": "[💰 $1.0 / 1K] Extract job listings from FINN.no, Norway's largest classifieds and job marketplace. Search by keyword and county, filter by occupation, employment type, contract, remote work and sector, and get titles, employers, locations, salaries, deadlines and full descriptions.",
        "version": "1.0",
        "x-build-id": "0QcriCsFhWEkdRfks"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~finn-no-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-finn-no-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~finn-no-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-finn-no-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~finn-no-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-finn-no-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "Search Keywords",
                        "maxItems": 50,
                        "type": "array",
                        "description": "Job titles or keywords to search for, such as 'utvikler', 'sykepleier', or 'prosjektleder'. Each keyword runs a separate search and results are merged and de-duplicated. Up to 50 keywords per run. Leave empty to list all jobs (optionally narrowed by the filters below), or if you are only using direct search URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Direct FINN.no Search URLs",
                        "maxItems": 50,
                        "type": "array",
                        "description": "Paste full FINN.no job-search URLs (for example https://www.finn.no/job/fulltime/search.html?q=utvikler&location=0.20061). The filters baked into each URL are scraped exactly as-is. Useful when you have already dialed in a search on the FINN.no website. Up to 50 URLs per run.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max Results per Search",
                        "minimum": 0,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of jobs to collect per search keyword (or per URL). Use 50 for a quick scan or a higher number for deep research. The last page is always kept in full, so the final count can slightly overshoot this number. Set to 0 to collect all available results. Note: FINN.no returns at most ~2,500 jobs for any single search — to gather more, split your search across counties or occupation categories.",
                        "default": 100
                    },
                    "counties": {
                        "title": "Counties (fylke)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Limit results to one or more Norwegian counties. Leave empty to search all of Norway.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Oslo",
                                "Akershus",
                                "Vestland",
                                "Rogaland",
                                "Trøndelag",
                                "Innlandet",
                                "Agder",
                                "Østfold",
                                "Buskerud",
                                "Vestfold",
                                "Nordland",
                                "Møre og Romsdal",
                                "Telemark",
                                "Troms",
                                "Finnmark",
                                "Svalbard"
                            ],
                            "enumTitles": [
                                "Oslo",
                                "Akershus",
                                "Vestland",
                                "Rogaland",
                                "Trøndelag",
                                "Innlandet",
                                "Agder",
                                "Østfold",
                                "Buskerud",
                                "Vestfold",
                                "Nordland",
                                "Møre og Romsdal",
                                "Telemark",
                                "Troms",
                                "Finnmark",
                                "Svalbard"
                            ]
                        },
                        "default": []
                    },
                    "occupations": {
                        "title": "Occupation Categories",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Limit results to one or more job categories (yrkeskategori). Leave empty for all categories.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Barnehage",
                                "Butikkansatt",
                                "Helsepersonell",
                                "Håndverker",
                                "Ingeniør",
                                "Kontor og administrasjon",
                                "Kundeservice",
                                "Ledelse",
                                "Logistikk og lager",
                                "Mat og servering",
                                "Omsorg og sosialt arbeid",
                                "Sykepleier",
                                "Undervisning og pedagogikk"
                            ],
                            "enumTitles": [
                                "Childcare / Kindergarten",
                                "Retail / Shop staff",
                                "Healthcare staff",
                                "Skilled trades / Craftsperson",
                                "Engineering",
                                "Office & administration",
                                "Customer service",
                                "Management",
                                "Logistics & warehouse",
                                "Food & hospitality",
                                "Care & social work",
                                "Nursing",
                                "Teaching & education"
                            ]
                        },
                        "default": []
                    },
                    "employmentExtent": {
                        "title": "Full-time / Part-time",
                        "enum": [
                            "",
                            "fulltime",
                            "parttime"
                        ],
                        "type": "string",
                        "description": "Filter by working hours. Leave on 'Any' for both.",
                        "default": ""
                    },
                    "contractType": {
                        "title": "Contract Type",
                        "enum": [
                            "",
                            "permanent",
                            "temporary",
                            "engagement",
                            "seasonal"
                        ],
                        "type": "string",
                        "description": "Filter by the type of employment contract. Leave on 'Any' for all contract types.",
                        "default": ""
                    },
                    "remoteWork": {
                        "title": "Remote Work",
                        "enum": [
                            "",
                            "partial",
                            "full"
                        ],
                        "type": "string",
                        "description": "Filter by home-office / remote arrangement. Leave on 'Any' for jobs with or without remote work.",
                        "default": ""
                    },
                    "sector": {
                        "title": "Sector",
                        "enum": [
                            "",
                            "private",
                            "public"
                        ],
                        "type": "string",
                        "description": "Filter by employer sector. Leave on 'Any' for both private and public.",
                        "default": ""
                    },
                    "managerRole": {
                        "title": "Management Roles Only",
                        "type": "boolean",
                        "description": "Only return management / leadership positions (leder, direktør, fagleder).",
                        "default": false
                    },
                    "workLanguage": {
                        "title": "Work Language",
                        "enum": [
                            "",
                            "norwegian",
                            "english"
                        ],
                        "type": "string",
                        "description": "Only return jobs where the working language is the one selected. Leave on 'Any' to include all.",
                        "default": ""
                    },
                    "postedToday": {
                        "title": "Posted Today Only",
                        "type": "boolean",
                        "description": "Only return jobs that were posted today. Leave off to include jobs from any date. (FINN.no only supports a 'new today' filter — older posted-within windows such as 3 or 7 days are not offered by the site.)",
                        "default": false
                    },
                    "sortBy": {
                        "title": "Sort Order",
                        "enum": [
                            "relevant",
                            "published"
                        ],
                        "type": "string",
                        "description": "How to order the search results.",
                        "default": "relevant"
                    },
                    "fetchJobDetails": {
                        "title": "Fetch Full Job Details",
                        "type": "boolean",
                        "description": "Turn on to fetch each job's detail page, adding the full description, application deadline, named contact person, street address and structured fields. Off by default for fast, lightweight scans (detail fetching makes a run several times slower because it loads every ad individually). Enable this whenever you need descriptions, deadlines, or contacts.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
