# NAV Arbeidsplassen Scraper — Norway Jobs & Employers (`logiover/nav-arbeidsplassen-scraper`) Actor

Scrape every public job ad in Norway from NAV's official Arbeidsplassen feed: title, employer, municipality and county, sector, extent, required education and experience, work language, deadline and ad link. Keyless, no login. JSON, CSV or Excel.

- **URL**: https://apify.com/logiover/nav-arbeidsplassen-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 19 total users, 9 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## NAV Arbeidsplassen Scraper — Norway Jobs & Employers

Export every publicly advertised job in Norway from NAV's official Arbeidsplassen feed — employer, location, sector, requirements and deadlines — to JSON, CSV or Excel.

### What does NAV Arbeidsplassen Scraper do?

NAV, the Norwegian Labour and Welfare Administration, publishes every vacancy advertised on **arbeidsplassen.nav.no** through a keyless public endpoint. This Actor reads that feed directly: no API key, no login, no cookies.

Roughly **14 000 ads** are live at any moment. The endpoint caps deep paging on a single query, so a naive scraper stalls after a few hundred rows. This Actor detects when a request exceeds that ceiling and splits the run across Norway's **17 counties**, paginating each slice separately and de-duplicating on the ad UUID. That is what turns a capped query into a full-market export.

Each row carries 38 fields — employer name, municipality and county, sector, employment extent, required education and experience, work language, application deadline and NAV's generated summary of the role.

### Who is it for?

- **Recruitment and staffing agencies** tracking which Norwegian employers are hiring, and where.
- **B2B sales teams** using hiring signals to spot companies that are growing.
- **Job boards and aggregators** that need a licence-free Norwegian feed.
- **Labour-market analysts** measuring demand by county, sector and occupation.
- **HR-tech vendors** prospecting employers who post roles regularly.

### Use cases

- Build a weekly list of every employer hiring nurses in Vestland, with ad links.
- Detect the moment a target account posts its first engineering role.
- Compare public-sector versus private-sector hiring volume across counties.
- Feed a niche Norwegian job board without negotiating a data licence.
- Track which education levels and work languages employers actually require.

### Why use this Actor?

- **Keyless** — nothing to sign up for, nothing to configure.
- **38 structured fields** per ad, including sector, extent and requirements.
- **Passes the paging cap** by splitting the country into counties automatically.
- **Real filters** — keyword, county, municipality, remote-only, published-in-last-N-days.
- **Official source** — NAV's own feed, not a brittle HTML page.
- **Honest columns** — every field is populated from the feed; nothing is shipped as a permanently empty column.

### What data can you extract?

| Field | Type | Description |
|---|---|---|
| `jobId` | string | NAV ad UUID |
| `title` | string | Job title as advertised |
| `jobTitle` | string | Normalised job title |
| `employerName` | string | Employer name |
| `businessName` | string | Business/trading name |
| `employerDescription` | string | About-the-employer text |
| `occupationLevel1` | string | Broad occupation group |
| `occupationLevel2` | string | Specific occupation |
| `categories` | string | NAV/ESCO/STYRK category labels |
| `municipality` | string | Municipality (kommune) |
| `city` | string | City |
| `county` | string | County (fylke) |
| `country` | string | Country |
| `streetAddress` | string | Workplace address |
| `postalCode` | string | Postal code |
| `remote` | string | Remote/home-office flag |
| `engagementType` | string | Permanent, temporary, seasonal … |
| `extent` | string | Full-time or part-time |
| `positions` | string | Number of positions |
| `sector` | string | Public or private sector |
| `workLanguage` | string | Required work languages |
| `education` | string | Required education |
| `experience` | string | Required experience |
| `needDriversLicense` | string | Driving licence requirement |
| `keywords` | string | Employer keywords |
| `searchTags` | string | NAV search tags |
| `aiTags` | string | NAV-generated topic tags |
| `summary` | string | Short generated summary |
| `applicationDue` | string | Application deadline |
| `applicationEmail` | string | Application e-mail |
| `hasInterestForm` | boolean | Interest form available |
| `source` | string | Origin system of the ad |
| `medium` | string | Publishing medium |
| `reference` | string | Employer reference |
| `published` | string | Publication timestamp |
| `expires` | string | Expiry timestamp |
| `adUrl` | string | Public ad page |
| `scrapedAt` | string | Run timestamp (ISO 8601) |

#### Example output

```json
{
  "jobId": "168c3ffc-5d26-4143-a8d2-58ae0dd81ecf",
  "title": "Welders for rotational work",
  "employerName": "LYS BEMANNING AS",
  "occupationLevel1": "Håndverkere",
  "occupationLevel2": "Platearbeider og sveiser",
  "municipality": "NAMSOS",
  "county": "TRØNDELAG",
  "country": "NORGE",
  "workLanguage": "Norsk, Engelsk, Skandinavisk",
  "summary": "Welders needed for workshop work with rotation options.",
  "aiTags": "MAG-sveising, Sveiser, rotasjonsarbeid, stålkonstruksjon",
  "published": "2026-08-07T18:24:25+02:00",
  "expires": "2026-08-28T00:00:00+02:00",
  "adUrl": "https://arbeidsplassen.nav.no/stillinger/stilling/168c3ffc-5d26-4143-a8d2-58ae0dd81ecf",
  "source": "Stillingsregistrering"
}
```

### How to use it

1. Enter a keyword — or leave it empty to export everything currently online.
2. Optionally filter by county, municipality, remote-only, or a recency window.
3. Set **Maximum results**. Small runs use one fast query; larger ones slice by county automatically.
4. Run, then export JSON, CSV or Excel, or read the dataset from the Apify API.

### Input example

```json
{
  "query": "sykepleier",
  "counties": ["OSLO", "VESTLAND"],
  "publishedAfterDays": 7,
  "maxResults": 3000
}
```

### Notes and limits

- The feed carries ads that are **currently published**; expired ads drop out. Schedule the Actor to build a history.
- NAV supports 1, 3, 7 and 30-day recency windows. Other values round up to the nearest supported window.
- Applications go through the ad page (`adUrl`) or NAV's interest form; `hasInterestForm` tells you which. The feed does not expose a separate direct apply link.
- Data comes from NAV under Norwegian open-data terms. You are responsible for how you use it, including under GDPR.

### FAQ

**Do I need a NAV account or API key?**
No. The feed is open and this Actor needs nothing from you.

**Can I export more than a few hundred ads?**
Yes. Raise the maximum and the Actor splits the run across counties to get past the deep-paging cap.

**Is the full ad text included?**
No. NAV's search feed carries a generated `summary` plus tags and requirements, but the full body loads client-side on the ad page. Use `adUrl` to open the original when you need the complete text.

**How fresh is the data?**
Ads appear as soon as they are published on Arbeidsplassen.

**How am I charged?**
Pay per result — you pay for the ads delivered, nothing else.

# Actor input Schema

## `query` (type: `string`):

Free-text search across title, employer and ad body, e.g. "sykepleier", "utvikler" or "driver". Leave empty to pull every ad currently published in Norway.

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

Restrict to Norwegian counties, e.g. OSLO, VESTLAND, TRØNDELAG. Leave empty and the Actor uses every county automatically when a large export needs slicing.

## `municipality` (type: `string`):

Optional municipality (kommune) filter, e.g. BERGEN or TRONDHEIM.

## `remoteOnly` (type: `boolean`):

Return only ads NAV flags as home-office friendly.

## `publishedAfterDays` (type: `integer`):

Limit to recently published ads. NAV supports 1, 3, 7 and 30 day windows; other values round up. 0 disables the filter.

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

Stop after this many ads. Norway keeps roughly 14 000 ads live, so raise this for a full-market export.

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

NAV's feed is a keyless public API; the default datacenter proxy is enough.

## Actor input object example

```json
{
  "query": "utvikler",
  "counties": [],
  "remoteOnly": false,
  "publishedAfterDays": 30,
  "maxResults": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `jobId` (type: `string`):

No description

## `title` (type: `string`):

No description

## `jobTitle` (type: `string`):

No description

## `employerName` (type: `string`):

No description

## `businessName` (type: `string`):

No description

## `employerDescription` (type: `string`):

No description

## `occupationLevel1` (type: `string`):

No description

## `occupationLevel2` (type: `string`):

No description

## `categories` (type: `string`):

No description

## `municipality` (type: `string`):

No description

## `city` (type: `string`):

No description

## `county` (type: `string`):

No description

## `country` (type: `string`):

No description

## `streetAddress` (type: `string`):

No description

## `postalCode` (type: `string`):

No description

## `remote` (type: `string`):

No description

## `engagementType` (type: `string`):

No description

## `extent` (type: `string`):

No description

## `positions` (type: `string`):

No description

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

No description

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

No description

## `education` (type: `string`):

No description

## `experience` (type: `string`):

No description

## `needDriversLicense` (type: `string`):

No description

## `keywords` (type: `string`):

No description

## `searchTags` (type: `string`):

No description

## `aiTags` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `applicationDue` (type: `string`):

No description

## `applicationEmail` (type: `string`):

No description

## `hasInterestForm` (type: `string`):

No description

## `source` (type: `string`):

No description

## `medium` (type: `string`):

No description

## `reference` (type: `string`):

No description

## `published` (type: `string`):

No description

## `expires` (type: `string`):

No description

## `adUrl` (type: `string`):

No description

## `scrapedAt` (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 = {
    "query": "utvikler",
    "counties": [],
    "municipality": "",
    "remoteOnly": false,
    "publishedAfterDays": 30,
    "maxResults": 1000,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/nav-arbeidsplassen-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 = {
    "query": "utvikler",
    "counties": [],
    "municipality": "",
    "remoteOnly": False,
    "publishedAfterDays": 30,
    "maxResults": 1000,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/nav-arbeidsplassen-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 '{
  "query": "utvikler",
  "counties": [],
  "municipality": "",
  "remoteOnly": false,
  "publishedAfterDays": 30,
  "maxResults": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/nav-arbeidsplassen-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/nav-arbeidsplassen-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/DFdPjehS8ADm2oqrc/builds/SQxCUsVjeIyqm7r70/openapi.json
