# Platsbanken Jobs Scraper (`parsebird/platsbanken-jobs-scraper`) Actor

Scrape job listings from Platsbanken (Arbetsformedlingen) via the JobTech public API. Extract titles, employers, salaries, locations, skills, and 35+ fields from Sweden's official job database.

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

## Pricing

from $3.19 / 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/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

### Platsbanken Jobs Scraper

Scrape job ads from [Platsbanken](https://arbetsformedlingen.se/platsbanken) — the Swedish Public Employment Service (Arbetsförmedlingen) job board, which lists nearly every job vacancy advertised in Sweden.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search by keyword, occupation field, region, publication recency, and remote status — collect structured job data including salary type, employer contact details, required skills, and 35+ fields per ad, ready for analysis or integration.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/platsbanken-jobs-scraper. Scrapes Swedish job ads from Platsbanken (Arbetsformedlingen) via the public JobTech API. Call via ApifyClient: client.actor("parsebird/platsbanken-jobs-scraper").call(run_input={"query": "sjukskoterska", "publishedAfterDays": 30, "maxResults": 1000}). Supports query (free-text string), occupationFields (array of JobTech occupation-field concept IDs), regions (array of JobTech region/lan concept IDs), publishedAfterDays (integer, 0-365, 0 = all time), remoteOnly (boolean), maxResults (integer), proxyConfiguration (object). Automatically splits large queries across occupation fields and regions to work around the API's 2,000-row page limit. Returns 35+ fields per ad: jobId, title, occupation, occupationField, employerName, organisationNumber, city, region, streetAddress, latitude/longitude, employmentType, workingHoursType, salaryType, salaryDescription, numberOfVacancies, mustHaveSkills, niceToHaveSkills, applicationDeadline, applicationUrl, publicationDate, adUrl, description, and more. Full API spec: https://apify.com/parsebird/platsbanken-jobs-scraper/api. Get your token: https://console.apify.com/settings/integrations.
```

### What does Platsbanken Jobs Scraper do?

**Platsbanken Jobs Scraper** extracts structured job ad data from [Platsbanken](https://arbetsformedlingen.se/platsbanken), the official job bank operated by Arbetsförmedlingen (the Swedish Public Employment Service). It queries the public [JobTech](https://arbetsformedlingen.se/other-languages/english-engelska/about-the-website/apis-and-open-data) `JobSearch` API directly — no browser rendering, login, or API key required — which makes it fast and cost-efficient.

You can search by free-text keyword, restrict results to specific occupation fields or regions, filter by publication recency and remote-work status, or leave every filter empty to pull every currently published ad in Sweden — roughly 40,000 ads at any given moment. This makes it a practical **Platsbanken API alternative** and a direct competitor to existing Platsbanken scraping tools, without needing to write any API integration code yourself.

- 🔍 **Free-text keyword search** — match job title, description, and employer, e.g. "utvecklare", "sjuksköterska", or "warehouse"
- 🇸🇪 **Full coverage of the Swedish job market** — pull every currently published Platsbanken ad, or narrow to a specific occupation field or region (län)
- 📊 **35+ fields per ad** — job title, employer, organisation number, salary type, skills, contact details, coordinates, and more
- 🧩 **Automatic 2,000-row limit workaround** — the JobTech API caps deep pagination per query; this Actor auto-splits large runs across occupation fields and regions so large exports still complete
- 🏠 **Remote-only filter** — return only ads the employer flagged as remote-friendly
- 📅 **Recency filter** — restrict to ads published in the last N days
- ⚡ **API-based extraction** — no browser overhead means faster runs and lower compute costs
- 🔄 **Schedule recurring runs** — monitor the Swedish job market over time with [Apify scheduling](https://docs.apify.com/platform/schedules)
- 🔗 **API access and integrations** — connect to Google Sheets, Zapier, Make, webhooks, or any workflow via the [Apify API](https://docs.apify.com/api/v2)

### What data can you extract from Platsbanken?

| Field | Description |
|-------|-------------|
| `jobId` | Unique JobTech ad ID |
| `title` | Job title as advertised |
| `occupation` / `occupationField` / `occupationGroup` | Normalised occupation classification (JobTech taxonomy) |
| `employerName` / `employerWorkplace` / `organisationNumber` | Employer identity and Swedish organisation number |
| `employerPhone` / `employerEmail` / `employerUrl` | Employer contact details, when published |
| `city` / `region` / `streetAddress` / `postcode` | Workplace location |
| `latitude` / `longitude` | Workplace coordinates |
| `employmentType` / `durationType` / `workingHoursType` | Contract type, duration, and full/part-time status |
| `scopeOfWorkMin` / `scopeOfWorkMax` | Employment scope in percent |
| `salaryType` / `salaryDescription` | Salary structure and free-text salary note |
| `mustHaveSkills` / `niceToHaveSkills` | Required and preferred skills, comma-separated |
| `applicationDeadline` / `applicationUrl` / `applicationEmail` | How and when to apply |
| `publicationDate` / `lastPublicationDate` | When the ad was first and most recently published |
| `adUrl` | Public Platsbanken ad page |
| `description` | Full ad text |

Some fields may be empty when the original ad does not include that information.

### How to scrape Platsbanken job ads

1. Go to the [Platsbanken Jobs Scraper](https://apify.com/parsebird/platsbanken-jobs-scraper) page on Apify Store
2. Click **Try for free** to open the Actor console
3. Enter a **Search keyword** (e.g. "utvecklare", "sjuksköterska", "lager") or leave it empty for every published ad
4. Optionally restrict to specific **Occupation field IDs** or **Region IDs**
5. Set **Published within the last N days** and **Remote jobs only** to narrow recency and work location
6. Set **Maximum results** to control how many ads to collect
7. Click **Start** and wait for the run to finish
8. Download your data in **JSON, CSV, Excel**, or connect via the **Apify API**

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `query` | string | No | — | Free-text search across job title, description, and employer |
| `occupationFields` | array | No | `[]` | JobTech occupation-field concept IDs to restrict the run |
| `regions` | array | No | `[]` | JobTech region (län) concept IDs to restrict the run |
| `publishedAfterDays` | integer | No | `0` | Only return ads published in the last N days (0–365). `0` disables the filter |
| `remoteOnly` | boolean | No | `false` | Return only ads flagged as remote-friendly |
| `maxResults` | integer | No | `1000` | Stop after this many ads |
| `proxyConfiguration` | object | No | Apify Proxy (datacenter) | The feed is a keyless public API, so the default proxy is enough |

#### How the 2,000-row limit workaround works

The JobTech `JobSearch` API caps deep pagination at roughly 2,000 rows per unique query. When a run's `maxResults` needs more than that from a single query, the Actor automatically splits the request across JobTech's occupation-field taxonomy (and, if a single field is still too large, further by region) so you can still export the full Swedish job market without missing ads or duplicating them.

### Example inputs

#### Keyword search

```json
{
    "query": "sjuksköterska",
    "publishedAfterDays": 30,
    "maxResults": 5000
}
```

#### Region and remote filter

```json
{
    "regions": ["CifL_Rzy_Mku"],
    "remoteOnly": true,
    "maxResults": 200
}
```

#### Full-market export

```json
{
    "maxResults": 40000
}
```

### Output example

```json
{
    "jobId": "31281556",
    "title": "Systemutvecklare .NET",
    "occupation": "Systemutvecklare/Programmerare",
    "occupationField": "Data/IT",
    "employerName": "HÖGSKOLAN I HALMSTAD",
    "organisationNumber": "2021003203",
    "employerUrl": "http://www.hh.se/omhogskolan/jobbahososs.2064.html",
    "city": "Halmstad",
    "region": "Hallands län",
    "streetAddress": "Kristian IV:s väg 3",
    "employmentType": "Vanlig anställning",
    "workingHoursType": "Heltid",
    "salaryType": "Fast månads- vecko- eller timlön",
    "numberOfVacancies": 1,
    "applicationDeadline": "2026-09-06T23:59:59",
    "applicationUrl": "https://hh.varbi.com/se/what:job/jobID:907946/type:job/where:125/apply:1",
    "publicationDate": "2026-07-20T00:01:23",
    "adUrl": "https://arbetsformedlingen.se/platsbanken/annonser/31281556",
    "source": "platsbanken_jobtech"
}
```

Download results in **JSON, CSV, or Excel** format.

### How to use Platsbanken Jobs Scraper with the API

#### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("parsebird/platsbanken-jobs-scraper").call(run_input={
    "query": "sjuksköterska",
    "publishedAfterDays": 30,
    "maxResults": 1000,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['title']} — {item['employerName']} — {item['city']}")
```

#### JavaScript API example

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

const client = new ApifyClient({ token: "YOUR_API_TOKEN" });

const run = await client.actor("parsebird/platsbanken-jobs-scraper").call({
    query: "sjuksköterska",
    publishedAfterDays: 30,
    maxResults: 1000,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.log(`${item.title} — ${item.employerName} — ${item.city}`);
});
```

Get your API token at [console.apify.com/settings/integrations](https://console.apify.com/settings/integrations). See the full [API documentation](https://apify.com/parsebird/platsbanken-jobs-scraper/api) for details.

### Use cases

- **Swedish job market research** — analyze which occupations, regions, and industries are hiring most actively across Sweden using Arbetsförmedlingen's official data.
- **Recruiting and talent sourcing** — build structured datasets of current openings to support candidate sourcing and outreach, filtered by occupation field or region.
- **Competitive hiring intelligence** — monitor which employers are actively posting and for which roles, with recurring scheduled runs to detect hiring trends.
- **Salary and skills benchmarking** — aggregate `salaryType`, `mustHaveSkills`, and `niceToHaveSkills` across ads to understand market demand.
- **Regional labor market analysis** — compare vacancy volume and job type across Sweden's 21 län using the `region` and `occupationField` fields.
- **Job aggregation and integration** — feed structured Platsbanken data into your own job board, newsletter, or data warehouse via the Apify API.

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

This Actor uses the [Pay-Per-Event](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-ppe) pricing model — you pay only for job ads actually returned, at a rate based on your Apify plan tier.

| Plan tier | Price per event | Price per 1,000 |
|-----------|-----------------|------------------|
| Free | $0.00399 | **$3.99** |
| Bronze | $0.00379 | **$3.79** |
| Silver | $0.00349 | **$3.49** |
| Gold | $0.00319 | **$3.19** |

One `job-ad-scraped` event is charged for every ad collected and pushed to the dataset. Apify offers a **free trial** with platform credits — enough to scrape over 1,200 Platsbanken ads at no cost on the Free tier.

### Tips for best results

**Leave `query` empty for full coverage** — an empty keyword pulls every currently published ad in Sweden, which is useful for market-wide research or building your own search index.

**Use `occupationFields` and `regions` to narrow scope** — combining both filters produces smaller, more targeted datasets that require less downstream filtering.

**Start small, then scale** — begin with a low `maxResults` to validate the output structure, then raise it once you're confident in the query.

**Use `publishedAfterDays` for monitoring** — set it to `1` or `7` for fresh job signals, and combine with [Apify scheduling](https://docs.apify.com/platform/schedules) for daily or weekly monitoring runs.

**Expect some empty fields** — not every ad includes salary, phone, or skills data. Empty values reflect what the employer or Arbetsförmedlingen system provides, not a scraper limitation.

### FAQ

**How many job ads can I scrape from Platsbanken?**
Set `maxResults` to control how many ads to collect. Sweden has roughly 40,000 active ads at any time; leave `maxResults` high and every filter empty for a full-market export.

**Why does the Actor split my query into multiple sub-requests?**
The JobTech `JobSearch` API only allows paging up to roughly 2,000 rows per unique query. When your `maxResults` needs more than that, the Actor automatically re-runs the query per occupation field (and per region within a field, if needed) so you still get full, deduplicated coverage.

**Does the Actor need a proxy?**
No. The JobTech API is a keyless public feed that works from datacenter IPs. The default Apify Proxy configuration is enough — no residential proxy or login is required.

**Can I search in English?**
The underlying data is in Swedish, so Swedish keywords (e.g. "sjuksköterska" rather than "nurse") generally return more accurate matches. English job titles may still match some listings.

**Can I filter by a specific Swedish region (län)?**
Yes. Pass one or more concept IDs in `regions`, e.g. `CifL_Rzy_Mku` for Stockholms län. See the Input parameters table for the full list of available region and occupation-field options in the Console.

**Can I schedule recurring runs?**
Yes. Use [Apify scheduling](https://docs.apify.com/platform/schedules) to run the scraper daily, weekly, or at any interval. Combine with [webhooks](https://docs.apify.com/platform/integrations/webhooks) or [integrations](https://docs.apify.com/platform/integrations) to automate your Swedish job data pipeline.

**Can I access the data via API?**
Yes. Every run produces a dataset accessible via the [Apify API](https://docs.apify.com/api/v2). Integrate with Python, JavaScript, Google Sheets, Zapier, Make, or any HTTP-capable tool. See the [API tab](https://apify.com/parsebird/platsbanken-jobs-scraper/api) for code examples.

### Is it legal to scrape Platsbanken?

This Actor collects publicly available job ad data from [Platsbanken](https://arbetsformedlingen.se/platsbanken) through the [JobTech `JobSearch` API](https://arbetsformedlingen.se/other-languages/english-engelska/about-the-website/apis-and-open-data), a keyless public API that Arbetsförmedlingen (the Swedish Public Employment Service) provides as part of its open data program. The Actor does not bypass login walls, access private accounts, or collect personal user data — it reads job ads that employers and Arbetsförmedlingen have intentionally published for recruitment purposes. Users are responsible for ensuring their use of the data complies with applicable laws and Arbetsförmedlingen's terms. For more information, read Apify's blog post on [web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

### Related job scrapers

| Actor | Description |
|-------|-------------|
| [Arbeitsagentur Scraper](https://apify.com/parsebird/arbeitsagentur-scraper) | Extract job listings from Germany's public employment agency, Arbeitsagentur.de |
| [Karriere.at Jobs Scraper](https://apify.com/parsebird/karriere-at-jobs-scraper) | Scrape Austrian job listings from Karriere.at |
| [XING Jobs Scraper](https://apify.com/parsebird/xing-jobs-scraper) | Extract job listings from XING, the DACH region's professional network |
| [Jobicy Remote Jobs Scraper](https://apify.com/parsebird/jobicy-remote-jobs-scraper) | Scrape remote job listings aggregated from multiple sources |
| [Hiring.cafe Jobs Scraper](https://apify.com/parsebird/hiring-cafe-scraper) | Scrape 2.8M+ job listings aggregated from 46 ATS platforms |

Browse all ParseBird actors on the [Apify Store](https://apify.com/parsebird).

# Actor input Schema

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

Free-text search across job title, description, and employer, e.g. "utvecklare", "sjuksköterska", or "warehouse". Leave empty to pull every currently published ad in Sweden.

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

Restrict the run to one or more JobTech occupation fields. Leave empty and the Actor discovers them automatically when a run needs to pass the API's 2,000-row page limit.

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

Restrict the run to one or more Swedish regions (län). Leave empty for all of Sweden.

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

Only return ads published in the last N days. 0 disables the filter and returns every ad currently online.

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

Return only ads flagged as remote-friendly by the employer.

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

Stop after this many ads. Sweden publishes roughly 40,000 ads at any moment, so raise this for a full-market export.

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

The feed is a keyless public API, so the default datacenter proxy is enough.

## Actor input object example

```json
{
  "query": "utvecklare",
  "occupationFields": [],
  "regions": [],
  "publishedAfterDays": 30,
  "remoteOnly": false,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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",
    "publishedAfterDays": 30,
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/platsbanken-jobs-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": "utvecklare",
    "publishedAfterDays": 30,
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/platsbanken-jobs-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": "utvecklare",
  "publishedAfterDays": 30,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/platsbanken-jobs-scraper --silent --output-dataset

```

## MCP server setup

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