# NAV Norway Scraper — Job Listings from arbeidsplassen.nav.no (`studio-amba/nav-scraper`) Actor

Scrape job listings, employers, locations, and posting dates from NAV Arbeidsplassen, Norway's public employment service job board. Public API access, no login.

- **URL**: https://apify.com/studio-amba/nav-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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 Norway Scraper

Extract **job listings from [arbeidsplassen.nav.no](https://arbeidsplassen.nav.no/stillinger)**, the job board run by NAV — Norway's public employment service (Arbeids- og velferdsetaten) and the country's largest single source of open positions.

This Actor pulls **job titles, employers, locations, posting dates, employment types, and descriptions** directly from NAV's official `pam-stilling-feed` open-data API. No login, no cookies, no browser automation, no anti-bot workaround needed — it reads structured JSON straight from the source.

### What does NAV Norway Scraper do?

Give it a Norwegian keyword (for example `sykepleier`, `selger`, or `lærer`) and, optionally, a municipality or county. The Actor pages through NAV's public job-ad feed, filters for active postings matching your query, fetches full ad detail for each match, and returns clean, structured records you can download as JSON, CSV, Excel, or HTML — or pull through the Apify API into your own systems.

Because it runs on the Apify platform, you also get scheduling, monitoring, and integrations (webhooks, Make, Zapier, Google Sheets) out of the box.

### Why use NAV Norway Scraper?

- **Largest job pool in Norway.** NAV aggregates vacancies directly registered by employers plus postings imported from third-party ATS systems nationwide.
- **Labour-market research.** Track hiring demand by occupation, municipality, or sector over time.
- **Recruitment and sourcing.** Build lead lists of Norwegian companies actively hiring for a role.
- **Job aggregators.** Feed a niche job site or newsletter with fresh, structured Norwegian listings.
- **No anti-bot headaches.** NAV's feed API is public and open, so runs are fast and reliable.
- **Fills the Nordic PES gap.** Companion to our Arbetsförmedlingen (Sweden) scraper — together they cover the two largest Nordic public employment services.

### How to scrape NAV data

1. Open the Actor and go to the **Input** tab.
2. Enter a **Search Query** in Norwegian (e.g., `sykepleier`, `elektriker`, `renholder`).
3. Optionally set a **Location** — a Norwegian municipality or county name (e.g., `OSLO`, `BERGEN`, `AKERSHUS`).
4. Set **Max Results** to control how many listings you want (capped at 500 per run).
5. Click **Start**. When the run finishes, open the **Output** tab and download your data as JSON, CSV, Excel, or HTML.

That's it. You can also schedule the Actor to run daily and be notified of new listings.

### How the data is sourced

Unlike a typical keyword-search API, `arbeidsplassen.nav.no`'s official open-data
API (`pam-stilling-feed`, documented at
[navikt.github.io/pam-stilling-feed](https://navikt.github.io/pam-stilling-feed/))
is a **paginated change feed** of ad events, not a `?q=keyword` search endpoint.
This Actor:

1. Fetches a fresh public access token from NAV's token endpoint (rotates
   periodically — the Actor always grabs a current one, never a hardcoded value).
2. Jumps into the feed near the present using NAV's `If-Modified-Since` header,
   then pages forward through feed events (1000 per page — the API's fixed
   page size, not configurable).
3. Filters for `status: ACTIVE` ads whose title matches your search query.
4. Fetches full detail (employer, work locations, description, employment
   type) for each match, applies the location filter if set, and pushes
   results until `maxResults` is reached.

This means result volume for very narrow search terms combined with a tight
location filter can be lower than on a true search API — the Actor pages up
to 25 feed pages (~25,000 events, comfortably covering the last week+ of
NAV activity) before giving up and returning whatever it found.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `searchQuery` | string | Norwegian keyword to match against job titles. Defaults to `sykepleier`. |
| `location` | string | Norwegian municipality or county name. Leave empty to search all of Norway. |
| `maxResults` | integer | Maximum number of job listings to return (default 100, hard cap 500). |
| `proxyConfiguration` | object | Proxy settings. Apify datacenter proxies work well since this is a public API. |

#### Example input

```json
{
  "searchQuery": "sykepleier",
  "location": "OSLO",
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

### Output

Each job is returned as one dataset record. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Example output item

```json
{
  "id": "5682dc63-a73b-459b-ad5e-0039e171faa5",
  "title": "Sykepleier",
  "company": "Byåsen hjemmetjeneste, Trondheim kommune",
  "locationRaw": "TRONDHEIM",
  "locationParsed": {
    "city": "TRONDHEIM",
    "country": "NO"
  },
  "language": "no",
  "postedAt": "2026-07-29T00:00:00+02:00",
  "descriptionSnippet": "Vil du være med på å skape trygghet og livskvalitet for hjemmeboende i Byåsen? Byåsen hjemmetjeneste har ledig en fast 100 prosent stilling som sykepleier med oppstart etter avtale...",
  "url": "https://arbeidsplassen.nav.no/stillinger/stilling/5682dc63-a73b-459b-ad5e-0039e171faa5",
  "employmentType": "Fast, Heltid",
  "salaryRaw": null,
  "source": "arbeidsplassen.nav.no",
  "scrapedAt": "2026-08-04T17:27:46.060Z"
}
```

#### Data fields

| Field | Description |
| --- | --- |
| `id` | NAV job ad UUID — stable identifier, used for de-duplication |
| `title` | Job posting title |
| `company` | Hiring employer name |
| `locationRaw` | Work location(s) as NAV lists them (municipality/county), comma-separated |
| `locationParsed.city` / `.country` | Parsed city and country code (always `"NO"`) |
| `language` | Detected posting language (ISO 639-1) — usually `no`, occasionally `en` |
| `postedAt` | ISO 8601 publish date, or `null` if missing |
| `descriptionSnippet` | Plain-text excerpt of the job description (300–400 chars, HTML stripped) |
| `url` | Absolute URL to the posting on arbeidsplassen.nav.no |
| `employmentType` | Engagement type + extent as NAV expresses it (e.g. `"Fast, Heltid"` = permanent, full-time) |
| `salaryRaw` | Always `null` — NAV's feed schema has no salary field |
| `source` | Always `"arbeidsplassen.nav.no"` |
| `scrapedAt` | ISO 8601 collection timestamp |

### How much does it cost to scrape NAV?

The Actor reads a lightweight JSON API, so runs are cheap and fast. Cost
estimate: roughly one API call per result (fetched in small concurrent
batches to keep runs fast) — a typical run of 100 listings finishes in a
couple of minutes and uses a small amount of compute. Pricing follows this
Actor's pay-per-result configuration on the Apify Store — check the pricing
box on the Actor page for the current rate.

**Note:** usage cost only settles once a run reports status `SUCCEEDED`.
If you read the dataset mid-run or check cost before the run finishes, the
number you see will undercount — always check final cost after the run
has completed, not before.

### Tips and advanced options

- **Norwegian keywords.** The board is Norwegian. Use Norwegian job titles
  (`sykepleier`, `selger`, `lærer`, `sjåfør`, `renholder`, `butikk`) for the
  best coverage. English terms will mostly miss, since the vast majority of
  postings are written in Norwegian.
- **Location names.** Use Norwegian municipality or county names in
  uppercase-style spelling as NAV itself uses (e.g., `BERGEN`, `TRØNDELAG`).
  Matching is case-insensitive and substring-based, so `"oslo"` also works.
- **Broaden if you get fewer results than expected.** Because this is a feed
  API rather than a true search index, very narrow query + location
  combinations can return fewer matches than `maxResults` within the
  Actor's page budget — try a broader keyword or drop the location filter.
- **Deduplication.** Results are de-duplicated by ad UUID within a run.

### Limitations

- This Actor searches **recent feed activity** (roughly the last one to two
  weeks of postings, depending on how quickly the feed's event volume
  advances), not NAV's full historical archive back to 2019.
- No salary data — NAV's own schema doesn't carry it.
- Search is a client-side title match against a change feed, not a
  full-text search index — see "How the data is sourced" above.

### FAQ, disclaimers, and support

**Is scraping NAV legal?** This Actor reads NAV's own official open-data API,
published for third-party consumption under NAV's [terms of
use](https://arbeidsplassen.nav.no/vilkar-api). Use the data responsibly and
in line with applicable terms and data-protection law. You are responsible
for how you use the extracted data.

**Do I need an account or API key?** No. The Actor fetches a fresh public
access token automatically at the start of every run. No registration,
login, or cookies are required.

**Why do I sometimes get fewer results than `maxResults`?** See "Tips and
advanced options" above — this is a feed-based search, not a keyword index,
so very narrow filters can run out of matches within the Actor's page
budget.

**Something's not working.** Open an issue on the Actor's **Issues** tab
with your input and the run link. Custom fields or a tailored version can
also be arranged.

### Related Scrapers

Looking for job data from other European public employment services? Check out our companion Actors:

- [Arbeitsagentur Scraper](https://apify.com/studio-amba/arbeitsagentur-scraper) — Germany's Federal Employment Agency
- [Arbetsförmedlingen Scraper](https://apify.com/studio-amba/arbetsformedlingen-scraper) — Sweden's public employment service
- [France Travail Scraper](https://apify.com/studio-amba/francetravail-scraper) — France's public employment service
- [VDAB Scraper](https://apify.com/studio-amba/vdab-scraper) — Flanders (Belgium) public employment service
- [Le Forem Scraper](https://apify.com/studio-amba/leforem-scraper) — Wallonia (Belgium) public employment service
- [Werk.nl Scraper](https://apify.com/studio-amba/werk-nl-scraper) — Netherlands' public employment service

# Actor input Schema

## `searchQuery` (type: `string`):

Keyword to match against job titles (mostly Norwegian). Examples: 'sykepleier' (nurse), 'selger' (sales), 'lærer' (teacher), 'sjåfør' (driver), 'butikk' (retail).

## `location` (type: `string`):

Filter by municipality or county (Norwegian names, e.g. 'OSLO', 'BERGEN', 'AKERSHUS'). Leave empty to search all of Norway.

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

Maximum number of job listings to return. Each result costs one extra API call to fetch full ad detail, so very large values take longer.

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

Proxy settings. The pam-stilling-feed API is public and open, so Apify datacenter proxies work well.

## Actor input object example

```json
{
  "searchQuery": "sykepleier",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "sykepleier",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/nav-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 = {
    "searchQuery": "sykepleier",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/nav-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 '{
  "searchQuery": "sykepleier",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/nav-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7NFQ8MHiRa5q6Szaw/builds/VeUPXDc6FI51u9JiZ/openapi.json
