# Sweden & Norway Jobs Scraper: Platsbanken & NAV Arbeidsplassen (`latamdatatools/nordic-public-jobs`) Actor

Job ads from Sweden's Platsbanken (Arbetsförmedlingen JobTech API, open data) and Norway's arbeidsplassen.no (NAV job feed) in one schema: title, employer and org number, municipality, occupation, employment type, salary type, deadline and apply link. Keyword filters, dedupe, only-new alerts.

- **URL**: https://apify.com/latamdatatools/nordic-public-jobs.md
- **Developed by:** [Julian Genuario](https://apify.com/latamdatatools) (community)
- **Categories:** Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 job ad delivereds

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/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

## Sweden & Norway Jobs Scraper: Platsbanken & NAV Arbeidsplassen

Get **job ads from Sweden and Norway in one clean schema**, straight from the two public employment services:

- **Sweden: Platsbanken** (Arbetsförmedlingen), through the official **JobTech JobSearch API** (open data, no key needed).
- **Norway: arbeidsplassen.no** (NAV), through the official **NAV job vacancy feed** (free token).

Every ad comes with title, occupation and occupation code (SSYK / STYRK), **employer and organisation number**, municipality, county and city (with GPS for Sweden), employment type, full / part time, duration, salary type, number of positions, deadline, publish date, description and the **apply link**.

### What does Sweden & Norway Jobs Scraper do?

It searches Platsbanken by keywords and publication date, walks the NAV feed for the ads changed in the last days (keeping only active ads), filters by keywords, location and excluded words, removes duplicates and returns one row per ad in the same schema for both countries. Turn on **"only new"** for a daily Nordic job alert.

Names, e-mail addresses and phone numbers of contact persons are **never** returned.

### How to use it

1. Click **Try for free** on this page.
2. Pick the countries and type keywords in any language (e.g. `utvecklare`, `utvikler`, `developer`, `sjuksköterska`, `sykepleier`).
3. For Norway, paste your NAV token (free, see below) or turn on the NAV public test token to try it.
4. Click **Start** and download the results from the **Output** tab as JSON, CSV, Excel or HTML, or use the Apify API.
5. Optional: a **Schedule** with "only new" and Slack, email, Google Sheets or webhook integrations.

#### Norway: your free NAV token

NAV gives a personal token to anyone who accepts its API terms: e-mail **nav.team.arbeidsplassen@nav.no** with your name / company, contact e-mail and phone, and a line saying you accept the terms at [arbeidsplassen.nav.no/vilkar-api](https://arbeidsplassen.nav.no/vilkar-api). NAV also publishes a rotating **public token for experiments**, which the actor can use when you turn on "Use NAV public test token".

NAV's terms: you may republish the ads, but you must remove them when they become inactive and keep the apply link pointing to the original. Run the actor on a schedule to stay up to date.

### Who uses it

- **Job seekers and relocation services**: new jobs in Sweden and Norway for one profession, every morning.
- **Recruiters and staffing agencies**: who is hiring, with organisation numbers to match against company registers.
- **Job boards and newsletters**: a clean Nordic job feed with source credit and original links.
- **Labour-market analysts**: demand by occupation code, municipality and contract type.

### Features

- 2 official sources, 1 schema (`country`, `source`, `sourceId`, same fields).
- Keywords (Sweden: full text; Norway: title and employer), locations (municipality, county or city), excluded words, remote only (Sweden), published / updated in the last 1-30 days.
- Occupation and occupation group with codes (SSYK for Sweden, STYRK-08 for Norway).
- Employer organisation number (Bolagsverket / Brønnøysund).
- **Only new** mode with separate memory per alert name; inactive NAV ads are never returned.
- Max ads per country, retries and polite pacing.

### Input example

```json
{
  "countries": ["SE", "NO"],
  "keywords": ["developer", "utvecklare", "utvikler"],
  "locations": ["Stockholm", "Göteborg", "Oslo", "Bergen"],
  "publishedWithinDays": 3,
  "navToken": "••••••••",
  "onlyNew": true,
  "alertName": "nordic-dev"
}
```

### Output

```json
{
  "id": "se:31642801",
  "country": "Sweden",
  "countryCode": "SE",
  "source": "Platsbanken (Arbetsförmedlingen)",
  "title": "Javautvecklare inom integration och Kubernetes",
  "occupation": "Systemutvecklare/Programmerare",
  "occupationGroup": "Mjukvaru- och systemutvecklare m.fl.",
  "occupationCode": "2512",
  "employer": "Maxitech AB",
  "employerOrgNumber": "5593107765",
  "municipality": "Stockholm",
  "region": "Stockholms län",
  "latitude": 59.3269,
  "longitude": 18.0486,
  "employmentType": "Vanlig anställning",
  "workingHours": "Heltid",
  "duration": "6 månader eller längre",
  "salaryType": "Fast månads- vecko- eller timlön",
  "positions": 1,
  "publishedAt": "2026-10-26T09:28:14",
  "applicationDeadline": "2026-11-17T23:59:59",
  "url": "https://arbetsformedlingen.se/platsbanken/annonser/31642801",
  "applyUrl": "https://maxitech-se.intelliplan.net/jobb/1184/ansokningssida",
  "matchedKeywords": ["developer"],
  "attribution": "Job ad from Platsbanken (Arbetsförmedlingen), via the JobTech JobSearch API (open data). Apply through the original link.",
  "description": "..."
}
```

Norwegian ads have the same fields (`id` starts with `no:`), plus `sector` (public / private) and `startDate`.

### Pricing

Pay per event:

- **USD 0.80 per 1,000 job ads** returned (USD 0.0008 each).

Filtered ads, duplicates, inactive NAV ads and (in "only new" mode) ads already delivered are **not charged**. If no source can be read, the run fails and nothing is charged.

### FAQ

**Is this allowed?** Yes. JobTech data is open data from Arbetsförmedlingen, and NAV's feed terms allow republishing the ads (removing inactive ones and linking to the original application).

**Why do Norwegian keywords only match the title and employer?** The NAV feed lists every change; the actor fetches the full ad only for matching, active ads to keep runs fast and cheap.

**How many ads are there?** Platsbanken has about 40,000-60,000 active ads; NAV around 20,000-30,000. Sweden returns at most 2,100 ads per keyword (API limit), so use specific keywords or a schedule.

**Can I call it from my own code or from an AI agent?** Yes. Use the Apify API or the JavaScript / Python clients, or the Apify MCP server (`mcp.apify.com`).

**Which export formats are available?** JSON, JSONL, CSV, Excel (XLSX), XML, RSS and HTML table.

### Changelog

- 0.1 (2026-10): first version.

# Actor input Schema

## `countries` (type: `array`):

Sweden (Platsbanken, no key needed) and/or Norway (arbeidsplassen.no, needs a free NAV token, see below).

## `keywords` (type: `array`):

Job titles, skills or employers in any language (e.g. utvecklare, sjuksköterska, developer, sykepleier). Sweden: full-text search. Norway: matched against the ad title and employer name. Empty = all ads.

## `locations` (type: `array`):

Keep ads whose municipality, county or city contains any of these (e.g. Stockholm, Göteborg, Oslo, Bergen, Vestland).

## `publishedWithinDays` (type: `integer`):

Sweden: published after this date. Norway: ads changed in the feed after this date.

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

Platsbanken ads marked as remote work.

## `excludeKeywords` (type: `array`):

Drop ads whose title contains any of these words.

## `navToken` (type: `string`):

Free: e-mail nav.team.arbeidsplassen@nav.no accepting the API terms (arbeidsplassen.nav.no/vilkar-api) and NAV sends you a personal token. Stored encrypted.

## `useNavPublicToken` (type: `boolean`):

NAV publishes a rotating public token for experiments. Fine for trying the actor; for regular use get your own token.

## `maxFeedPages` (type: `integer`):

The NAV feed has roughly 10-15 pages of changes per day.

## `includeDescription` (type: `boolean`):

Plain-text job description.

## `maxDescriptionChars` (type: `integer`):

Longer descriptions are cut.

## `maxItems` (type: `integer`):

Stop after this many ads in each country.

## `onlyNew` (type: `boolean`):

Skip ads already delivered in earlier runs with the same alert name. Skipped ads are not charged.

## `alertName` (type: `string`):

Separate memory for each scheduled alert.

## Actor input object example

```json
{
  "countries": [
    "SE",
    "NO"
  ],
  "keywords": [
    "developer",
    "utvecklare",
    "utvikler"
  ],
  "publishedWithinDays": 3,
  "remoteOnly": false,
  "useNavPublicToken": false,
  "maxFeedPages": 400,
  "includeDescription": true,
  "maxDescriptionChars": 5000,
  "maxItems": 300,
  "onlyNew": false,
  "alertName": "default"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `runSummary` (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 = {
    "keywords": [
        "developer",
        "utvecklare",
        "utvikler"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("latamdatatools/nordic-public-jobs").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 = { "keywords": [
        "developer",
        "utvecklare",
        "utvikler",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("latamdatatools/nordic-public-jobs").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 '{
  "keywords": [
    "developer",
    "utvecklare",
    "utvikler"
  ]
}' |
apify call latamdatatools/nordic-public-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,latamdatatools/nordic-public-jobs"
        }
    }
}
```

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/TT1rhzSjI9yyivaBx/builds/ec1VtMKnSB9hMRuCq/openapi.json
