# Platsbanken Jobs Scraper: Swedish Job Ads (Arbetsförmedlingen) (`cprussin/platsbanken-jobs`) Actor

Swedish job ads from Platsbanken (Arbetsförmedlingen) via the open JobTech API: employer, org number, occupation, municipality, region, coordinates, employment type, salary, skills, deadline, apply link. Filter by keyword, location, occupation field, date. $1.50 per 1,000 ads.

- **URL**: https://apify.com/cprussin/platsbanken-jobs.md
- **Developed by:** [Connor Prussin](https://apify.com/cprussin) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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

## Platsbanken Jobs Scraper: Swedish Job Ads from Arbetsförmedlingen

**Platsbanken Jobs Scraper** exports job ads from Platsbanken, the job board of Arbetsförmedlingen (the Swedish Public Employment Service) and Sweden's largest list of open positions, as clean JSON, CSV or Excel. It reads the official open **JobTech JobSearch API**, whose ads are published under the **CC0** public-domain licence, so you can reuse the data freely. No login, no API key, no browser, no proxy.

- ✅ **All of Sweden**: about 40,000+ open ads at any time, newest first.
- ✅ **Filters**: free-text search, municipality (kommun), region (län), occupation field (yrkesområde) and publication date.
- ✅ **Employer and organisation number** (organisationsnummer) for lead generation and company matching.
- ✅ **Occupation, occupation group (SSYK) and field** with JobTech taxonomy concept IDs.
- ✅ **Location**: municipality, region, postcode, city and coordinates.
- ✅ **Terms**: employment type, duration, full or part time, salary type and salary text, experience and driving licence requirements.
- ✅ **Skills and languages** (must-have and nice-to-have), deadline, apply link and optional full description.
- ✅ **Delta mode**: `publishedAfter` returns only ads published since your last run. Pay only for ads written to your dataset.

### Start in one minute

Click **Start** with the prefilled input:

```json
{
  "query": "utvecklare",
  "maxItems": 20
}
```

You get: the 20 newest developer ads in Sweden with `headline`, `employerName`, `employerOrgNumber`, `occupation`, `municipality`, `region`, `employmentType`, `salaryType`, `applicationDeadline` and `webpageUrl`.

**Cost:** $0.03: 20 ads × $0.0015, plus the $0.00005 actor-start fee.

### Use with an AI assistant

Connect the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client (`https://mcp.apify.com?tools=cprussin/platsbanken-jobs` loads only this actor), then paste:

```text
Use the Apify actor cprussin/platsbanken-jobs to find 50 nurse (sjuksköterska) jobs in Skåne published this week and list employer, municipality, employment type and deadline.
```

### Recipes

#### IT jobs in Stockholm and Gothenburg

```json
{
  "municipalities": ["Stockholm", "Göteborg"],
  "occupationFields": ["apaJ_2ja_LuF"],
  "maxItems": 500
}
```

#### Daily delta feed for a region

Schedule a task and set `publishedAfter` to yesterday's date: only new ads are returned and billed.

```json
{
  "regions": ["12"],
  "publishedAfter": "2026-10-30",
  "maxItems": 5000
}
```

#### Full export with descriptions

```json
{
  "query": "lagerarbetare",
  "includeDescription": true,
  "maxItems": 2000
}
```

### Who uses Platsbanken data?

- **Recruiters and staffing agencies**: find Swedish employers that are hiring, with organisation numbers to match to your CRM.
- **Job boards and HR tech**: feed Swedish job ads into a search, alert or matching product.
- **Labour-market analysts and journalists**: hiring by occupation, region and employment type.
- **Sales teams**: companies hiring for a role are often buying related services.
- **AI agents**: give an LLM live Swedish job ads through the Apify API or MCP server.

### Input

| Field                | Description                                                     | Example                      |
| -------------------- | --------------------------------------------------------------- | ---------------------------- |
| `query`              | Free text in headline, description and employer name            | `"python"`                   |
| `municipalities`     | Municipality names, four-digit codes or taxonomy concept IDs    | `["Malmö", "0180"]`          |
| `regions`            | Region (län) codes                                              | `["01", "14"]`               |
| `occupationFields`   | Occupation field concept IDs (pick from the list in the editor) | `["apaJ_2ja_LuF"]` (Data/IT) |
| `publishedAfter`     | Only ads published on or after this date/time (Swedish time)    | `"2026-10-30"`               |
| `maxItems`           | Max ads, newest first (default 100)                             | `1000`                       |
| `includeDescription` | Add the full ad text                                            | `true`                       |

Municipalities and regions are combined with OR; other filters with AND.

### What data do you get for each ad?

```json
{
  "id": "31667517",
  "headline": "Embedded Software Engineer – Java",
  "employerName": "Agile Resources AB",
  "employerOrgNumber": "5593595258",
  "workplaceName": "Agile Resources AB",
  "occupation": "Mjukvaruutvecklare",
  "occupationConceptId": "rQds_YGd_quU",
  "occupationGroup": "Mjukvaru- och systemutvecklare m.fl.",
  "occupationGroupConceptId": "DJh5_yyF_hEM",
  "occupationField": "Data/IT",
  "occupationFieldConceptId": "apaJ_2ja_LuF",
  "municipality": "Göteborg",
  "municipalityCode": "1480",
  "region": "Västra Götalands län",
  "regionCode": "14",
  "country": "Sverige",
  "city": "Göteborg",
  "postcode": "41753",
  "latitude": 57.70834641547789,
  "longitude": 11.937006084431701,
  "workplaceModel": null,
  "employmentType": "Vanlig anställning",
  "duration": "Tills vidare",
  "workingHours": "Heltid",
  "scopeOfWorkMin": 100,
  "scopeOfWorkMax": 100,
  "numberOfVacancies": 1,
  "salaryType": "Fast månads- vecko- eller timlön",
  "salaryDescription": null,
  "experienceRequired": true,
  "drivingLicenceRequired": false,
  "drivingLicences": [],
  "ownCarRequired": false,
  "mustHaveSkills": [],
  "niceToHaveSkills": [],
  "mustHaveLanguages": [],
  "niceToHaveLanguages": [],
  "mustHaveExperience": [],
  "publicationDate": "2026-10-30T15:23:15",
  "applicationDeadline": "2026-11-29T23:59:59",
  "applicationUrl": "https://recruit.agile.nu/apply/jp-00c10e3cf8e3d860?source=platsbanken",
  "webpageUrl": "https://arbetsformedlingen.se/platsbanken/annonser/31667517",
  "scrapedAt": "2026-10-31T12:00:00.000Z"
}
```

Labels are in Swedish, as published. With **Include full description** on, `description` holds the full ad text. Contact persons' names and phone numbers are not exported.

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

Pay per event:

- **$0.0015 per ad** ($1.50 per 1,000), with or without description.
- $0.00005 per run start. Platform compute is included.

### FAQ

**Is this legal?** Yes. The ads come from Arbetsförmedlingen's open JobTech JobSearch API, published as open data under CC0 (no rights reserved). The actor makes plain, polite API requests and identifies itself.

**How many ads can I get per run?** Up to 50,000. The API serves 2,100 results per query, so the actor pages past that limit by publication date automatically.

**How do I get only new ads?** Set `publishedAfter` to the time of your last run (e.g. a scheduled daily task with yesterday's date).

**Why are some fields empty?** Employers fill in different fields; salary text, coordinates and skills are often missing.

### Related actors

- [France Travail Jobs](https://apify.com/cprussin/france-travail-jobs): job offers in France from France Travail.
- [Foundit Jobs](https://apify.com/cprussin/foundit-jobs): jobs in India from Foundit (Monster India).

# Actor input Schema

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

Free text searched in the ad headline, description and employer name, e.g. <code>python</code>, <code>sjuksköterska</code>, <code>lagerarbetare</code>. Leave empty for all ads.

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

Swedish municipality names or codes, e.g. <code>Stockholm</code>, <code>Göteborg</code>, <code>Malmö</code>, <code>1480</code>. Ads matching any listed municipality or region are returned.

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

Swedish counties (län). Leave empty for all of Sweden.

## `occupationFields` (type: `array`):

Occupation fields from the JobTech taxonomy. Leave empty for all occupations.

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

Only ads published on or after this date or time (Swedish time), e.g. <code>2026-10-30</code> or <code>2026-10-30T08:00:00</code>. Set it to your last run's time for a daily delta feed.

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

Stop after this many ads (newest first). Each ad is billed once.

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

Add the full ad text as <code>description</code> (plain text, often 2-5 KB per ad). No extra charge.

## Actor input object example

```json
{
  "query": "utvecklare",
  "maxItems": 20,
  "includeDescription": false
}
```

# 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 = {
    "query": "utvecklare",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cprussin/platsbanken-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 = {
    "query": "utvecklare",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("cprussin/platsbanken-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 '{
  "query": "utvecklare",
  "maxItems": 20
}' |
apify call cprussin/platsbanken-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cprussin/platsbanken-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/QPlIwYcvMLWKJJji7/builds/CHkBlj2oYieM8eVdY/openapi.json
