# Platsbanken Job Scraper - Swedish Job Ads API (`interconnected_seaport/sweden-jobs-official`) Actor

Scrape Swedish job ads from Platsbanken via the official Arbetsförmedlingen API. Live and historical jobs, salary, skills, employer org. no. No proxies.

- **URL**: https://apify.com/interconnected_seaport/sweden-jobs-official.md
- **Developed by:** [Zenith Ops](https://apify.com/interconnected_seaport) (community)
- **Categories:** Jobs, Business
- **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 Job Scraper - Swedish Job Ads API

Scrape **lediga jobb** and historical jobbannonser from Platsbanken through Arbetsförmedlingen's official JobTech APIs. This Sweden job scraper uses no HTML scraping, proxies, or evasion and returns clean JSON, CSV, or Excel dataset rows.

### Use cases

- Daily hiring-signal monitor: schedule `onlyNew` hourly or daily and alert recruiting teams.
- Skills trends: export historical ads to measure Python, AI, language, and occupation demand.
- Recruitment agency leads: filter by municipality, region, occupation, employer, and remote work.
- Job boards, labour-market research, and recruitment analytics via Apify, Zapier, or Make.

### Input

```json
{"query":"utvecklare","maxResults":20,"onlyNew":true}
```

Municipality and region accept taxonomy IDs or names such as `Stockholm`; names are resolved through the JobTech taxonomy API when available and otherwise passed through unchanged. The safe per-query limit is 2,000 ads; split broad searches for larger exports.

### Output fields

| Field | Meaning |
|---|---|
| `id`, `url`, `headline` | Platsbanken ad identity and title |
| `employer`, `employerOrgNumber` | Employer and organisation number |
| `occupation`, `occupationGroup`, `occupationField` | JobTech labels |
| `municipality`, `municipalityCode`, `region`, `regionCode`, `city` | Location labels and reusable IDs |
| `coordinates` | `[longitude, latitude]` when supplied |
| `employmentType`, `workingHours`, `duration`, `workplaceModel` | Work arrangement |
| `salaryType`, `salaryDescription`, `vacancies` | Salary/vacancy data (often null) |
| `publishedAt`, `applicationDeadline`, `applicationUrl`, `applicationEmail` | Dates and application details |
| `mustHaveSkills`, `niceToHaveSkills`, `description` | Skills and cleaned description |
| `scrapedAt`, `mode`, `source` | Retrieval metadata and licence source |

#### Sample

```json
{"id":"31609340","headline":"FPGA Validation Engineer","employer":"Ericsson AB","municipality":"Stockholm","municipalityCode":"AvNB_uwa_6n6","region":"Stockholms län","regionCode":"CifL_Rzy_Mku","publishedAt":"2026-10-16T18:25:02","mode":"live","mustHaveSkills":[]}
```

### Pricing examples

Approximately **$1.50 per 1,000 successful job-ad events** plus a small run fee: 100 ads ≈ **$0.15**, 2,100 ads ≈ **$3.15**, and a daily 100-ad monitor ≈ **$4.50/month** before run fees. Only successfully pushed items are charged.

### FAQ

**Why only 2,000 ads?** The official search API has an offset limit. Split broad searches by region or occupation.

**How do I find codes?** Enter names such as `Stockholm`; the actor resolves them via `https://taxonomy.api.jobtechdev.se/v1/taxonomy/`, or provide IDs directly.

**What does `onlyNew` do?** It stores IDs per filter set and emits each matching ad once. Failed pushes are not marked as seen.

**How is this different from scrapers?** It uses official Arbetsförmedlingen APIs, not browser automation, HTML parsing, proxies, or anti-bot workarounds.

### Legal and data protection

Job-ad data is published by Arbetsförmedlingen under **CC0** ([source](https://data.arbetsformedlingen.se/dataset/job-ads/)). CC0 applies to published data, not automatically to recruiter personal data in an ad. Processing names, email addresses, or phone numbers requires a lawful GDPR basis, minimised retention, and data-subject rights. This actor is not affiliated with Arbetsförmedlingen.

### Changelog and support

See version history in the Apify Console. For issues, include the run ID, input, and a redacted error message.

# Actor input Schema

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

Free text (Swedish or English), e.g. 'utvecklare', 'sjuksköterska', 'python'. Leave empty for all ads.

## `mode` (type: `string`):

Live = ads open on Platsbanken now. Historical = ads that have been removed.

## `municipality` (type: `array`):

Taxonomy concept IDs, e.g. AvNB_uwa_6n6 (Stockholm), PVZL_BQT_XtL (Göteborg), oYPt_yRA_Smm (Malmö).

## `region` (type: `array`):

Taxonomy concept IDs, e.g. CifL_Rzy_Mku (Stockholms län).

## `occupationField` (type: `array`):

e.g. apaJ_2ja_LuF (Data/IT).

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

Only ads flagged as remote work.

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

ISO datetime e.g. 2026-10-01T00:00:00, or minutes back e.g. 1440.

## `historicalFrom` (type: `string`):

Historical mode, e.g. 2023-01-01T00:00:00

## `historicalTo` (type: `string`):

Historical mode, e.g. 2023-12-31T23:59:59

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

API allows up to 2,000 per query (narrow filters for more). Apify free-plan users: max 1,000 per run.

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

Skip ads returned in previous runs (stored in a named key-value store). Ideal for schedules.

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

Include full description

## Actor input object example

```json
{
  "query": "utvecklare",
  "mode": "live",
  "municipality": [],
  "region": [],
  "occupationField": [],
  "remoteOnly": false,
  "maxResults": 20,
  "onlyNew": false,
  "includeDescription": true
}
```

# Actor output Schema

## `jobs` (type: `string`):

Swedish job ads (headline, employer, municipality, occupation, employment type, publish date, deadline, URL and optionally the full description) from the default dataset.

# 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"
};

// Run the Actor and wait for it to finish
const run = await client.actor("interconnected_seaport/sweden-jobs-official").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" }

# Run the Actor and wait for it to finish
run = client.actor("interconnected_seaport/sweden-jobs-official").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"
}' |
apify call interconnected_seaport/sweden-jobs-official --silent --output-dataset

```

## MCP server setup

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

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/jaFCsNuStzM8r273R/builds/VTKhJbWWQwhegqgtb/openapi.json
