# Platsbanken Scraper — Sweden Jobs, Salary & Employers (`logiover/platsbanken-jobs-scraper`) Actor

Scrape every public job ad in Sweden from the official Platsbanken/JobTech feed: title, employer name with phone, email and organisation number, workplace address, salary, employment type and apply URL. Keyless, no login. Export JSON, CSV or Excel.

- **URL**: https://apify.com/logiover/platsbanken-jobs-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 54 total users, 14 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

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 Scraper — Sweden Jobs, Salary & Employers

Export every publicly advertised job in Sweden — with the employer's phone number, e-mail and organisation number attached — straight to JSON, CSV or Excel.

### What does Platsbanken Scraper do?

This Actor reads Sweden's official job feed: every ad published to **Platsbanken** by Arbetsförmedlingen, exposed through the **JobTech Development** search API. There is no API key, no login and no cookie to supply — the source is open public-sector data, which makes runs stable and fast.

Around **40 000 ads** are online at any moment. The API refuses to page past offset 2000 on a single query, so a naive scraper stops at 2 000 rows. This Actor slices the country by **occupation field** (and optionally by region), paginates each slice independently and de-duplicates by ad ID, which is what lets one run return tens of thousands of unique rows.

Every row carries 44 fields, including the employer's registered **organisation number, phone and e-mail** — the details that turn a job listing into a usable B2B lead.

### Who is it for?

- **Recruitment agencies** mapping which employers are hiring, in which municipality, right now.
- **Staffing and RPO sales teams** who need a call list of companies with open vacancies.
- **HR-tech and ATS vendors** prospecting employers that publish roles regularly.
- **Labour-market analysts and economists** tracking demand by occupation, region and salary type.
- **Job-board operators** filling a Swedish market feed without negotiating a data licence.

### Use cases

- Build a weekly lead list of every Swedish employer hiring warehouse staff in Skåne, complete with phone numbers.
- Track how many nursing vacancies open per region per month to size a regional expansion.
- Feed a niche job board with fresh, licence-free Swedish listings including apply URLs.
- Alert a sales team the moment a target account posts its first developer role.
- Analyse which skills appear as required versus preferred across an occupation over time.

### Why use this Actor?

- **Keyless** — no account, no API key, no login. Runs work out of the box.
- **44 structured fields** per ad, including employer contact data and geo coordinates.
- **Breaks the 2000-row API ceiling** by slicing on occupation field automatically.
- **Real filters** — keyword, occupation field, region, published-within-N-days, remote-only.
- **Official source** — data comes from the government feed, not a fragile HTML page.
- **Export anywhere** — JSON, CSV, Excel, or straight into your database through the Apify API.

### What data can you extract?

| Field | Type | Description |
|---|---|---|
| `jobId` | string | Unique JobTech ad ID |
| `title` | string | Job title as advertised |
| `occupation` | string | Normalised occupation label |
| `occupationField` | string | Broad occupation field |
| `occupationGroup` | string | Occupation group (SSYK-based) |
| `employerName` | string | Registered employer name |
| `employerWorkplace` | string | Specific workplace or unit |
| `organisationNumber` | string | Swedish organisation number |
| `employerPhone` | string | Employer or contact phone |
| `employerEmail` | string | Employer or contact e-mail |
| `employerUrl` | string | Employer website |
| `contactName` | string | Named recruitment contact |
| `contactDescription` | string | Contact's role |
| `city` | string | Municipality (kommun) |
| `region` | string | Region (län) |
| `country` | string | Country |
| `streetAddress` | string | Workplace street address |
| `postcode` | string | Postcode |
| `latitude` / `longitude` | number | Workplace coordinates |
| `employmentType` | string | Permanent, temporary, seasonal … |
| `durationType` | string | Contract duration |
| `workingHoursType` | string | Full-time or part-time |
| `scopeOfWorkMin` / `scopeOfWorkMax` | number | Employment scope in percent |
| `salaryType` | string | Fixed, commission, by agreement … |
| `salaryDescription` | string | Free-text salary note |
| `numberOfVacancies` | number | Positions available in the ad |
| `experienceRequired` | boolean | Whether experience is required |
| `drivingLicenseRequired` | boolean | Driving licence required |
| `ownCarRequired` | boolean | Access to own car required |
| `mustHaveSkills` | string | Required skills, comma-separated |
| `niceToHaveSkills` | string | Preferred skills, comma-separated |
| `applicationDeadline` | string | Last application date |
| `applicationUrl` | string | Direct apply URL |
| `applicationEmail` | string | Application e-mail |
| `applicationReference` | string | Employer's reference code |
| `publicationDate` | string | First published |
| `lastPublicationDate` | string | Last republished |
| `adUrl` | string | Public ad page |
| `logoUrl` | string | Employer logo |
| `description` | string | Full ad text |
| `source` | string | Always `platsbanken_jobtech` |
| `scrapedAt` | string | Run timestamp (ISO 8601) |

#### Example output

```json
{
  "jobId": "29357771",
  "title": "Systemutvecklare .NET",
  "occupation": "Systemutvecklare/Programmerare",
  "occupationField": "Data/IT",
  "employerName": "HÖGSKOLAN I HALMSTAD",
  "organisationNumber": "2021003203",
  "employerPhone": "+46 35 16 71 00",
  "employerEmail": "jobb@hh.se",
  "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": 2,
  "mustHaveSkills": "C#, .NET, SQL",
  "applicationDeadline": "2026-09-01",
  "applicationUrl": "https://arbetsformedlingen.se/platsbanken/annonser/29357771",
  "publicationDate": "2026-08-05T09:12:00",
  "source": "platsbanken_jobtech"
}
```

### How to use it

1. Type a keyword — or leave it empty to export the whole market.
2. Optionally narrow by region, occupation field, remote-only, or a published-within-N-days window.
3. Set **Maximum results**. Under 2 000 the Actor runs one fast query; above that it automatically slices by occupation field to go deeper.
4. Run, then download JSON, CSV or Excel — or pull the dataset from the Apify API.

### Input example

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

### Notes and limits

- The feed contains ads **currently published**. Expired ads leave the feed, so run on a schedule to build history.
- Contact fields are populated only when the employer chose to publish them; roughly half of all ads carry a phone or e-mail.
- A single API query cannot page past 2 000 rows. The Actor works around this by slicing, but a very narrow keyword combined with a very high maximum will simply run out of matching ads.
- Data originates from Arbetsförmedlingen and is redistributed under Swedish open-data terms. You are responsible for how you use personal contact details, including under GDPR.

### FAQ

**Do I need an API key or a Swedish account?**
No. The JobTech feed is open public data and this Actor needs nothing from you.

**Can I get more than 2 000 results?**
Yes. Set a higher maximum and the Actor splits the run by occupation field automatically.

**Is the employer's phone number always there?**
No — it is present when the employer published it. `employerPhone`, `employerEmail` and `contactName` are `null` otherwise, so you can filter on them.

**How fresh is the data?**
Ads appear in the feed as soon as they go live on Platsbanken, typically within minutes.

**How am I charged?**
Pay per result: you pay for the job ads the Actor delivers, nothing else.

# 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`):

Optional JobTech occupation-field concept IDs to restrict the run. Leave empty and the Actor discovers them automatically when a run needs to pass the API's 2000-row page limit.

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

Optional JobTech region concept IDs (län), e.g. "CifL\_Rzy\_Mku" for Stockholm. 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; the default datacenter proxy is enough.

## Actor input object example

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

# Actor output Schema

## `jobId` (type: `string`):

No description

## `title` (type: `string`):

No description

## `occupation` (type: `string`):

No description

## `occupationField` (type: `string`):

No description

## `occupationGroup` (type: `string`):

No description

## `employerName` (type: `string`):

No description

## `employerWorkplace` (type: `string`):

No description

## `organisationNumber` (type: `string`):

No description

## `employerPhone` (type: `string`):

No description

## `employerEmail` (type: `string`):

No description

## `employerUrl` (type: `string`):

No description

## `contactName` (type: `string`):

No description

## `contactDescription` (type: `string`):

No description

## `city` (type: `string`):

No description

## `region` (type: `string`):

No description

## `country` (type: `string`):

No description

## `streetAddress` (type: `string`):

No description

## `postcode` (type: `string`):

No description

## `latitude` (type: `string`):

No description

## `longitude` (type: `string`):

No description

## `employmentType` (type: `string`):

No description

## `durationType` (type: `string`):

No description

## `workingHoursType` (type: `string`):

No description

## `scopeOfWorkMin` (type: `string`):

No description

## `scopeOfWorkMax` (type: `string`):

No description

## `salaryType` (type: `string`):

No description

## `salaryDescription` (type: `string`):

No description

## `numberOfVacancies` (type: `string`):

No description

## `experienceRequired` (type: `string`):

No description

## `drivingLicenseRequired` (type: `string`):

No description

## `ownCarRequired` (type: `string`):

No description

## `mustHaveSkills` (type: `string`):

No description

## `niceToHaveSkills` (type: `string`):

No description

## `applicationDeadline` (type: `string`):

No description

## `applicationUrl` (type: `string`):

No description

## `applicationEmail` (type: `string`):

No description

## `applicationReference` (type: `string`):

No description

## `publicationDate` (type: `string`):

No description

## `lastPublicationDate` (type: `string`):

No description

## `adUrl` (type: `string`):

No description

## `logoUrl` (type: `string`):

No description

## `description` (type: `string`):

No description

## `source` (type: `string`):

No description

## `scrapedAt` (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",
    "occupationFields": [],
    "regions": [],
    "publishedAfterDays": 30,
    "remoteOnly": false,
    "maxResults": 1000,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/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",
    "occupationFields": [],
    "regions": [],
    "publishedAfterDays": 30,
    "remoteOnly": False,
    "maxResults": 1000,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/thbW539CzSMKwUUmS/builds/a81mLmLYChqYt8IhI/openapi.json
