# Jobnet Scraper - Denmark Official Public Job Bank (`studio-amba/jobnet-scraper`) Actor

Scrape job listings from Jobnet.dk, Denmark's official public employment service job board run by STAR. Extract job titles, employers, CVR numbers, locations, deadlines and application links. No login or cookies required.

- **URL**: https://apify.com/studio-amba/jobnet-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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

### What does Jobnet Scraper do?

**Jobnet Scraper** extracts job listings from [Jobnet.dk](https://jobnet.dk) — Denmark's official public employment service job board, run by STAR (Styrelsen for Arbejdsmarked og Rekruttering, the Danish Agency for Labour Market and Recruitment). Jobnet is the country's public job bank: every Danish municipality, region, hospital, and public employer posts vacancies there, alongside private-sector jobs fed in from external job boards. No login or cookies required — the actor talks directly to Jobnet's public search API and returns structured data.

### Why use Jobnet Scraper?

- **Public-sector coverage** — Jobnet is the primary channel for Danish municipal, regional, and government vacancies (healthcare, education, administration) that don't always appear on commercial job boards.
- **Market research** — Track hiring demand by occupation, region, or postal code across the full Danish labour market.
- **Recruitment analytics** — Build dashboards of open positions, filter by full-time/part-time, application deadline, and employer.
- **Company data** — Every listing includes the employer's Danish CVR (business registration) number, useful for cross-referencing with company registries.

### How to scrape Jobnet.dk data

1. Go to the Jobnet Scraper [input page](https://console.apify.com/actors/jobnet-scraper/input).
2. Enter a Danish search keyword (e.g. "sygeplejerske" for nurse), or leave it empty to browse the entire public job bank.
3. Optionally set a postal code and search radius to limit results to a region.
4. Click **Start** and wait for the run to finish.
5. Download your data as JSON, CSV, Excel, or connect via API.

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `searchQuery` | String | No | Danish search keyword (e.g. "sygeplejerske" = nurse, "elektriker" = electrician, "lærer" = teacher). Leave empty to browse all public listings. |
| `postalCode` | String | No | Danish postal code to search near (e.g. "2100" for Copenhagen Ø). |
| `kmRadius` | Integer | No | Search radius in km around the postal code (default: 50). Only used if `postalCode` is set. |
| `maxResults` | Integer | No | Maximum number of job listings to return (default: 100). |
| `proxyConfiguration` | Object | No | Proxy settings. Residential (country DK) recommended for large runs. |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `jobTitle` | String | `"Sygeplejerske"` |
| `occupation` | String | `"Sygeplejerske"` |
| `company` | String | `"Odense Kommune"` |
| `cvr` | String | `"35209115"` |
| `location` | String | `"5220 Odense SØ"` |
| `postalCode` | String | `"5220"` |
| `municipality` | String | `"Odense"` |
| `fullTime` | Boolean | `true` |
| `jobAnnouncementType` | String | `"Almindelige vilkår"` |
| `isExternal` | Boolean | `false` |
| `description` | String | Full job description text (HTML stripped) |
| `postedDate` | String | `"2026-07-28T22:00:00.000Z"` |
| `deadline` | String or null | `"2026-08-23T22:00:00.000Z"` |
| `deadlineDisclosed` | Boolean | `true` |
| `logoUrl` | String or null | Employer logo URL, if available |
| `jobAdId` | String | `"ece4f62b-e784-4073-ab70-847d2566e8c2"` |
| `url` | String | Direct link to the listing |
| `scrapedAt` | String | ISO 8601 timestamp |

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Example output

```json
{
    "jobTitle": "Sygeplejerske",
    "occupation": "Sygeplejerske",
    "company": "Odense Kommune",
    "cvr": "35209115",
    "location": "5220 Odense SØ",
    "postalCode": "5220",
    "municipality": "Odense",
    "fullTime": true,
    "jobAnnouncementType": "Almindelige vilkår",
    "isExternal": false,
    "description": "Sygeplejerske til Sygeplejeteamet Korsløkkehaven. Du bliver en del af et sygeplejersketeam...",
    "postedDate": "2026-07-28T22:00:00.000Z",
    "deadline": "2026-08-23T22:00:00.000Z",
    "deadlineDisclosed": true,
    "logoUrl": null,
    "jobAdId": "ece4f62b-e784-4073-ab70-847d2566e8c2",
    "url": "https://jobnet.dk/find-job/ece4f62b-e784-4073-ab70-847d2566e8c2",
    "scrapedAt": "2026-08-04T19:39:55.974Z"
}
```

### How much does it cost to scrape Jobnet.dk?

This actor calls Jobnet's own JSON search API directly (no browser rendering needed), which keeps compute usage low:

- **~1-2 compute units per 100 results**
- At standard Apify pricing, that's roughly **$0.05-$0.10 per 100 jobs** (per-result cost estimate)
- Note: usage cost only settles once a run reports **SUCCEEDED** — reading the dataset mid-run will undercount what the run actually costs.

### Tips

- Leave `searchQuery` empty to pull from the full public job bank (tens of thousands of live listings at any time).
- Use `postalCode` + `kmRadius` to limit results to a specific Danish region.
- `isExternal: true` listings redirect to the employer's own careers page or a third-party board — `url` points there directly.
- Danish public-sector jobs frequently omit a fixed application deadline ("snarest muligt" = as soon as possible); in that case `deadline` is `null` and `deadlineDisclosed` is `false`.
- Use `maxResults` to control costs during testing.

### FAQ and support

- **Is it legal?** This actor scrapes publicly available data from Jobnet.dk, Denmark's official public job bank. Always respect the website's terms of service and use data responsibly.
- **Do I need a login?** No — Jobnet's job search is fully public. No account or CV upload required to read listings.
- **Found a bug?** Open an issue in the [Issues tab](https://console.apify.com/actors/jobnet-scraper/issues) and we will fix it quickly.
- **Need a custom solution?** Contact us for tailored scraping solutions.

### Support and maintenance

This Actor is actively maintained by [Studio Amba](https://apify.com/studio-amba). We monitor health daily and fix breaking changes within 24 hours.

- **Found a bug?** Open an issue on the [Issues tab](https://console.apify.com/actors) — we reply within one business day.
- **Need a schema change?** Request it in the issues tab; most field additions ship within a week.
- **Need a custom integration?** Reach out via [studioamba.dev](https://studioamba.dev) for tailored scraping solutions.

### About Studio Amba

We build reliable, production-grade scrapers for European websites. Our actors share a common core:

- **No cookies, no login** — public data only, no account management headaches
- **Fast APIs over headless browsers** where possible — lower cost, higher throughput
- **Proactive health monitoring** — we watch every actor 24/7 and ship fixes before you notice

### Related Scrapers

- [Jobindex Scraper](https://apify.com/studio-amba/jobindex-scraper) — Denmark's largest commercial job board, the natural complement to Jobnet's public-sector listings
- [Pracuj Scraper](https://apify.com/studio-amba/pracuj-scraper) — Poland's #1 job board
- [Infojobs Scraper](https://apify.com/studio-amba/infojobs-scraper) — Spain's leading job board
- [TotalJobs Scraper](https://apify.com/studio-amba/totaljobs-scraper) — UK job listings
- [NoFluffJobs Scraper](https://apify.com/studio-amba/nofluffjobs-scraper) — IT/tech job listings across Central Europe

### Changelog

See commit history in the [GitHub repo](https://github.com/studio-amba/actors) for a full changelog of bug fixes and schema changes.

# Actor input Schema

## `searchQuery` (type: `string`):

Danish search keyword (e.g. 'sygeplejerske' = nurse, 'elektriker' = electrician, 'lærer' = teacher). Leave empty to browse the full public job bank (tens of thousands of live listings).

## `postalCode` (type: `string`):

Optional Danish postal code to search near (e.g. '2100' for Copenhagen Ø, '8000' for Aarhus). Combined with 'Search Radius' below. Leave empty to search all of Denmark.

## `kmRadius` (type: `integer`):

Radius in kilometers around the postal code to search. Only used if a Postal Code is set.

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

Maximum number of job listings to scrape.

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

Proxy settings. Jobnet.dk's API works reliably over datacenter proxies, but residential (country DK) is recommended for large runs to avoid rate limits.

## Actor input object example

```json
{
  "searchQuery": "sygeplejerske",
  "kmRadius": 50,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DK"
  }
}
```

# 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 = {
    "searchQuery": "sygeplejerske",
    "kmRadius": 50,
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DK"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/jobnet-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 = {
    "searchQuery": "sygeplejerske",
    "kmRadius": 50,
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DK",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/jobnet-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 '{
  "searchQuery": "sygeplejerske",
  "kmRadius": 50,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DK"
  }
}' |
apify call studio-amba/jobnet-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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