# Sweden Job Ads API - Platsbanken (Arbetsförmedlingen) (`orange_briefcase_hrj/sweden-job-ads-platsbanken`) Actor

$2 per 1,000 job ads. Swedish job ads (lediga jobb, platsannonser) from Platsbanken via Arbetsförmedlingen's official JobTech API (CC0). Filter by keyword, occupation, county, municipality, employment type and remote; get only new ads with scheduled alerts.

- **URL**: https://apify.com/orange_briefcase_hrj/sweden-job-ads-platsbanken.md
- **Developed by:** [Fast Agent](https://apify.com/orange_briefcase_hrj) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 job ads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Price: $2 per 1,000 job ads** ($1.80 on Apify Scale, $1.60 on Business and above) · official JobTech API (CC0) · no key, browser or proxy

### På svenska

**Lediga jobb från Platsbanken som strukturerad data.** Aktören hämtar platsannonser från Arbetsförmedlingens officiella JobTech-API (JobSearch) och levererar dem som JSON, CSV eller Excel.
Annonserna är öppna data under CC0; varje post anger ändå källa och hämtningsdatum.
Filtrera på sökord, yrke, län, kommun, anställningsform, distansarbete och publiceringsdatum – eller slå på *Only new ads since last run* för att bara få nya annonser varje dag.
Exempel: `"keywords": "utvecklare", "regions": ["Stockholm"], "publishedWithinDays": 7` ger utvecklarjobb i Stockholms län från den senaste veckan.
Pris: 2 $ per 1 000 annonser plus 0,00005 $ per körning.
**Med AI-assistenter:** Fungerar även i ChatGPT, Claude och Cursor via Apifys MCP-server – se *Use it from ChatGPT, Claude or Cursor* nedan.

Get **Swedish job ads from Platsbanken**, the national job board of **Arbetsförmedlingen** (the Swedish Public Employment Service), as clean JSON, CSV or Excel. The Actor uses the official **JobTech JobSearch API**, where the ads are open data under **CC0**. There's no scraping, no browser and no proxies, so runs are fast and cheap.

Filter *lediga jobb* by **keyword, occupation (SSYK), county (län), municipality (kommun), employment type, full-/part-time, remote work, employer and publication date**. Turn on **alert mode** to get only new ads every day.

### What you get for each ad

- Headline, Platsbanken link and where to apply
- Employer name and **organisation number (organisationsnummer)**, workplace and website
- Occupation, occupation group (**SSYK code**) and occupation field from the JobTech Taxonomy
- Municipality, county, postcode, city and coordinates
- Employment type, working hours, scope (%), duration, salary type and salary text, number of vacancies, with **English labels** (`…En` fields)
- Published date, application deadline, required and preferred skills, languages, education, experience required, driving licence
- Full ad text, with **e-mail addresses and phone numbers removed by default**

### Use cases

- **Job alerts**: schedule a daily run with *Only new ads* and send new ads to Slack, e-mail or Google Sheets.
- **Recruitment and staffing lead generation**: find companies (with org numbers) hiring for specific roles and regions.
- **Labour-market analysis**: track demand by occupation, county or skill over time.
- **Job boards and aggregators**: feed Swedish vacancies into your own site or app.
- **Relocation and international hiring**: English labels make Swedish ads easier to filter.

### Use it from ChatGPT, Claude or Cursor

Ask your AI assistant about live Swedish job ads from Arbetsförmedlingen's Platsbanken, with English labels, and get answers with employer, deadline and application link.

This Actor works as a tool in any AI assistant that supports the [Model Context Protocol (MCP)](https://modelcontextprotocol.io), through the official [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). You ask in plain language; the assistant fills in the filters, runs the Actor and answers from the results.

**MCP server URL (this Actor only):**

```text
https://mcp.apify.com?tools=orange_briefcase_hrj/sweden-job-ads-platsbanken
```

**Set it up once (you need a free Apify account):**

- **Claude (claude.ai and Claude Desktop):** open **Settings → Connectors → Add → Add custom connector**. Enter a name (for example `Sweden jobs`), paste the URL above as the **Remote MCP server URL**, select **Continue**, keep the detected settings and select **Add**. Sign in to Apify when your browser opens. On Team and Enterprise plans, an Owner adds the connector for the organisation.
- **ChatGPT:** custom connectors need ChatGPT **Developer mode** (beta). Go to **Settings → Apps & Connectors → Create**, paste the URL above as the **MCP Server URL**, choose **OAuth** authentication and select **Create**, then sign in to Apify. In a new chat, select **+ → More** and pick the connector.
- **Cursor:** add this to `~/.cursor/mcp.json` (or `.cursor/mcp.json` in a project). Cursor opens your browser to sign in to Apify:

```json
{
  "mcpServers": {
    "sweden-job-ads-platsbanken": {
      "url": "https://mcp.apify.com?tools=orange_briefcase_hrj/sweden-job-ads-platsbanken"
    }
  }
}
```

- **VS Code, Windsurf and other MCP clients:** add the same URL as a remote (Streamable HTTP) MCP server. If a client can't do OAuth, send the header `Authorization: Bearer <YOUR_APIFY_TOKEN>` instead (token from **Apify Console → Settings → API & Integrations**).

Already connected to the full Apify server (`https://mcp.apify.com`) or the Apify plugin for Cursor, Claude Code or VS Code? Just mention `orange_briefcase_hrj/sweden-job-ads-platsbanken` in your request.

**Try asking:**

> "Find permanent full-time software developer jobs in Gothenburg published this week, and list the employer, deadline and application link in English."
>
> "List remote-friendly data analyst jobs anywhere in Sweden published in the last 3 days."
>
> "Which employers in Stockholm posted the most nurse (sjuksköterska) jobs in the last 14 days?"

**Cost:** a run started by your assistant is a normal run of this Actor, billed to your Apify account at the usual pay-per-event price ($2 per 1,000 job ads, see the pricing section below). This Actor charges nothing extra for runs that come through an assistant. Asking for a small number of results (for example "the top 20") keeps runs cheap, and the Apify Free plan's monthly credit covers plenty of tests.

### Screenshots

Real output from the saved example tasks (test runs on 26 October 2026):

![Developer jobs in Stockholm: headline, employer, organisation number, municipality, occupation, employment type, hours, published date and deadline](https://api.apify.com/v2/key-value-stores/NpvgdYoKm28QhbrG7/records/sweden-jobs-output.png)

![Nursing jobs in Skåne daily alert: headline, employer, municipality, employment type, hours, salary type and deadline](https://api.apify.com/v2/key-value-stores/NpvgdYoKm28QhbrG7/records/sweden-jobs-alert.png)

#### Ready-made example tasks

- **Developer jobs in Stockholm**: keyword `utvecklare`, Stockholm county, published in the last 7 days.
- **Nursing jobs in Skåne (daily alert)**: keyword `sjuksköterska`, Skåne county, only new ads.
- **Remote IT jobs in Sweden**: occupation field `Data/IT`, remote filter on.

### Input examples

Developer jobs in Stockholm county from the last 7 days:

```json
{ "keywords": "utvecklare", "regions": ["Stockholm"], "publishedWithinDays": 7, "maxResults": 200 }
```

Daily alert for permanent nursing jobs in Skåne:

```json
{ "keywords": "sjuksköterska", "regions": ["Skåne"], "employmentTypes": ["permanent"], "onlyNew": true, "stateKey": "nurses-skane" }
```

Remote-friendly IT jobs, by SSYK group:

```json
{ "occupations": ["2512"], "remote": "remoteOnly" }
```

Places accept Swedish names, codes or common English spellings (*Gothenburg*, *Malmo*, *Scania*). Occupations accept an occupation field (*Data/IT*), an SSYK-4 code (*2512*), a Swedish occupation name (*Systemutvecklare/Programmerare*) or a JobTech concept id.

### Output example

```json
{
  "id": "31644151",
  "url": "https://arbetsformedlingen.se/platsbanken/annonser/31644151",
  "headline": "Senior Frontendutvecklare",
  "employerName": "Quest Consulting Sverige AB",
  "employerOrgNumber": "5569456659",
  "occupation": "Systemutvecklare/Programmerare",
  "ssykCode": "2512",
  "municipality": "Stockholm",
  "region": "Stockholms län",
  "employmentType": "Vanlig anställning",
  "employmentTypeEn": "Regular employment",
  "workingHoursEn": "Full-time",
  "publishedAt": "2026-10-26T11:49:51",
  "applicationDeadline": "2026-11-16T23:59:59",
  "applicationUrl": "https://…",
  "languages": ["Svenska"],
  "description": "Vi söker en Senior Frontendutvecklare …",
  "isNew": false,
  "attribution": "Source: Arbetsförmedlingen … JobTech JobSearch API … CC0 1.0; retrieved 2026-10-26."
}
```

Dates are in Swedish local time, as the API provides them. Each run also saves a `SUMMARY` record with counts per county and the exact API parameters used.

### How it works

- **Official API**: [JobTech JobSearch](https://jobsearch.api.jobtechdev.se) by Arbetsförmedlingen, the search engine behind Platsbanken. Names are matched against the live [JobTech Taxonomy](https://atlas.jobtechdev.se).
- **Large searches**: the API returns at most 2,100 ads per query. With *Newest first* or *Oldest first*, the Actor moves the publication-date window forward and removes duplicates, so you can export tens of thousands of ads in one run.
- **Alerts**: ads already returned for a search are remembered in a named key-value store (`stateStoreName` / `stateKey`) until their publication ends.
- **Polite by default**: requests are sent one at a time with a delay, and the Actor backs off on HTTP 429/5xx. If you want a full copy of *all* ads, Arbetsförmedlingen recommends its JobStream API rather than search.

### Pricing

Pay per event, with Apify platform costs included:

| Apify plan (Store discount tier) | Price per job ad | Per 1,000 |
|---|---|---|
| Free, Starter (Bronze) | $0.002 | $2 |
| Scale (Silver) | $0.0018 | $1.80 |
| Business (Gold) and above | $0.0016 | $1.60 |

Each run also has an **Actor start** charge of $0.00005 (at the default 256 MB memory).

**Worked examples (Free/Starter prices):**

- **Daily alert with about 20 new ads a day:** 30 runs × $0.00005 + 600 ads × $0.002 = **about $1.20 a month**.
- **One-off export of 1,000 ads** (for example all developer ads in Stockholm county): $0.00005 + 1,000 × $0.002 = **about $2.00**.
- **Monthly labour-market snapshot of 10,000 ads:** $0.00005 + 10,000 × $0.002 = **about $20.00**.

The **Apify Free plan includes $5 of platform usage every month** (see [apify.com/pricing](https://apify.com/pricing)), and pay-per-event charges are paid from that credit. That covers about 2,500 job ads a month, or the daily alert above several times over. Use **Max results** and Apify's maximum cost per run to cap spend.

### Use via API (Python, JavaScript, cURL)

You can start the Actor from your own code with the official [Apify API clients](https://docs.apify.com/api/client). Get your API token from **Apify Console → Settings → API & Integrations**.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("orange_briefcase_hrj/sweden-job-ads-platsbanken").call(run_input={
    "keywords": "utvecklare",
    "regions": ["Stockholm"],
    "publishedWithinDays": 7,
    "maxResults": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

Install with `pip install apify-client`.

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('orange_briefcase_hrj/sweden-job-ads-platsbanken').call({
    keywords: 'utvecklare',
    regions: ['Stockholm'],
    publishedWithinDays: 7,
    maxResults: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Install with `npm install apify-client`.

#### cURL

This runs the Actor and returns the dataset items in the same request (best for short runs):

```bash
curl -X POST "https://api.apify.com/v2/acts/orange_briefcase_hrj~sweden-job-ads-platsbanken/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords": "utvecklare", "regions": ["Stockholm"], "publishedWithinDays": 7, "maxResults": 50}'
```

For longer runs, call `POST /v2/acts/orange_briefcase_hrj~sweden-job-ads-platsbanken/runs` and read the dataset when the run finishes. You can also add the Actor to Zapier, Make, n8n or a webhook from the **Integrations** tab.

### Data licence and attribution

The job ads are published by Arbetsförmedlingen as open data under **[CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/)** ("Ads are licensed under CC0", JobSearch API; see [data.arbetsformedlingen.se](https://data.arbetsformedlingen.se/)). CC0 doesn't require attribution, but every record still includes an `attribution` field with the source and **retrieval date**. This Actor is not affiliated with Arbetsförmedlingen or JobTech.

### Personal data (GDPR)

Ads can contain recruiters' and union representatives' names, phone numbers and e-mails. By default, the Actor **removes phone numbers and e-mail addresses** from the ad text and **leaves out contact persons**. Names written in the ad text itself are kept. If you have a lawful basis, for example applying for the job, you can opt in with *Include contact persons' details*. You are responsible for complying with the GDPR, including not using contacts for unsolicited marketing.

### Related tools

Other tools from the same publisher, all built on official open-data APIs:

| Tool | What it does |
|---|---|
| [UK Public Tender Alerts](https://apify.com/orange_briefcase_hrj/uk-tender-alerts) | Daily alerts for new UK government tenders and contract awards from Find a Tender and Contracts Finder. |
| [UK Company Check & Change Monitor](https://apify.com/orange_briefcase_hrj/uk-company-check) | Bulk Companies House checks with a RED/AMBER/GREEN risk flag, plus a monitor mode that outputs only changes. |
| [German Case Law Search & Ruling Alerts](https://apify.com/orange_briefcase_hrj/german-case-law-search) | Search BGH, BVerfG, BAG, BFH and other German federal court decisions, with full text and new-ruling alerts. |
| [Netherlands Public Tender Alerts (TenderNed)](https://apify.com/orange_briefcase_hrj/netherlands-tender-alerts) | Daily alerts for new Dutch government tenders from TenderNed, filtered by keyword, CPV and province. |

### FAQ

**Does Platsbanken have an API?** Yes: JobTech JobSearch. It's free and needs no key. This Actor adds name resolution, English labels, large-export pagination, alerts and contact masking on top of it.

**Does it include expired ads?** No, only ads currently published. Historical ads are a separate Arbetsförmedlingen dataset.

**Can I search in English?** Keywords are matched against the ad text, which is mostly in Swedish. English job titles work for many tech and international roles.

**Where can I see what changed?** See the Changelog tab. Each release is listed there.

# Changelog

This Actor's version history is a separate document: https://apify.com/orange_briefcase_hrj/sweden-job-ads-platsbanken/changelog.md

# Actor input Schema

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

Free text searched in headline, description and employer name. Swedish or English job titles work, e.g. "utvecklare", "sjuksköterska", "python".

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

Occupation field (e.g. Data/IT), occupation group (Swedish name or 4-digit SSYK code, e.g. 2512) or occupation name (e.g. Systemutvecklare/Programmerare), or a JobTech concept id.

## `regions` (type: `array`):

County names or codes, e.g. Stockholm, Skåne, Västra Götaland, 14.

## `municipalities` (type: `array`):

Municipality names or 4-digit codes, e.g. Göteborg / Gothenburg, Malmö, 0180.

## `employmentTypes` (type: `array`):

Empty = all.

## `workingHours` (type: `string`):

Full-time or part-time.

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

Based on Arbetsförmedlingen's remote-work phrase detection. Remote-friendly only also drops ads the employer marked as on-site.

## `noExperienceRequired` (type: `boolean`):

Only ads that don't require previous experience.

## `employers` (type: `array`):

Employer names or organisation numbers (organisationsnummer).

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

Only ads published in the last N days.

## `publishedAfter` (type: `string`):

Only ads published on or after this date.

## `sort` (type: `string`):

Newest/oldest can return more than 2,100 ads; relevance and deadline are limited to 2,100 by the API.

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

Maximum ads saved in this run (you pay per ad saved).

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

Ad description text. E-mail addresses and phone numbers are removed unless you opt in below.

## `englishLabels` (type: `boolean`):

Add English versions (…En fields) of employment type, working hours, duration, salary type and occupation field.

## `includeContactDetails` (type: `boolean`):

Adds named contact persons, their phone numbers and e-mails, and leaves them unmasked in the ad text. This is personal data: only turn on if you have a lawful basis under GDPR (e.g. applying for the job).

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

Schedule the Actor (e.g. daily) and receive only ads it has not returned before for this search.

## `firstRunBaselineOnly` (type: `boolean`):

If on, the first alert run saves nothing and only remembers current ads.

## `stateStoreName` (type: `string`):

Named key-value store that remembers ads already returned.

## `stateKey` (type: `string`):

Optional name for this alert. Defaults to a hash of the search.

## `requestIntervalSecs` (type: `number`):

Politeness delay between API calls.

## Actor input object example

```json
{
  "keywords": "utvecklare",
  "regions": [
    "Stockholm"
  ],
  "workingHours": "any",
  "remote": "any",
  "noExperienceRequired": false,
  "sort": "newest",
  "maxResults": 100,
  "includeDescription": true,
  "englishLabels": true,
  "includeContactDetails": false,
  "onlyNew": false,
  "firstRunBaselineOnly": false,
  "stateStoreName": "se-job-alerts-state",
  "requestIntervalSecs": 0.5
}
```

# Actor output Schema

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

No description

## `summary` (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": "utvecklare",
    "regions": [
        "Stockholm"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("orange_briefcase_hrj/sweden-job-ads-platsbanken").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": "utvecklare",
    "regions": ["Stockholm"],
}

# Run the Actor and wait for it to finish
run = client.actor("orange_briefcase_hrj/sweden-job-ads-platsbanken").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": "utvecklare",
  "regions": [
    "Stockholm"
  ]
}' |
apify call orange_briefcase_hrj/sweden-job-ads-platsbanken --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,orange_briefcase_hrj/sweden-job-ads-platsbanken"
        }
    }
}
```

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/CZvzwPTRKOwuT1aaU/builds/ib6gqMPD5eGZT3hwD/openapi.json
