# TechJob.dk Scraper - Danish Tech, IT & Engineering Jobs (`studio-amba/techjob-dk-scraper`) Actor

Scrape job listings from TechJob.dk, Denmark's tech, IT and engineering sector job board. Extract job titles, employers, locations, deadlines, categories and full descriptions. No login or cookies required.

- **URL**: https://apify.com/studio-amba/techjob-dk-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/actors/running/actors-in-store.md#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

## TechJob.dk Scraper

Scrape job listings from TechJob.dk, Denmark's tech, IT and engineering
sector job board, run by Teknologiens Mediehus.

### Why use this actor?

TechJob.dk carries several hundred live tech, IT and engineering vacancies
at any time, including postings that never make it to the general Danish
boards (jobnet.dk, LinkedIn) because employers list them specifically on a
sector site their target candidates already read. Each result includes the
full job description, the posted date and application deadline, and the
site's own category tags, not just the headline fields shown on the
listing page — those only appear once you open the individual job, which
is exactly what this actor does for every result. That is the difference
between a quick scrape of the search page and a dataset you can actually
filter and analyze (by deadline, by category, by how recently a role was
posted).

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Danish search keyword (e.g. `ingeniør` = engineer, `udvikler` = developer, `projektleder` = project manager). Leave empty to browse every live listing on the site. |
| `maxResults` | Integer | No | Maximum number of job listings to return (default: 50). |
| `fetchFullDescription` | Boolean | No | Visit each job's detail page for the posted date, deadline, categories and full description (default: `true`). Set to `false` for a faster run limited to the listing-card fields (title, company, job type, location). |
| `proxyConfiguration` | Object | No | Proxy settings. TechJob.dk has no anti-bot protection — the default Apify proxy is enough, no residential proxy needed. |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `jobTitle` | String | `"Civil Engineer"` |
| `company` | String | `"Aarhus Havn"` |
| `companyUrl` | String | `"https://techjob.dk/virksomhed/aarhus-havn"` |
| `location` | String | `"Aarhus"` |
| `jobType` | String | `"Fastansættelse"` (permanent position) |
| `categories` | Array | `["Havne", "Anlæg", "Konstruktioner"]` |
| `description` | String | Full job description text, HTML stripped |
| `postedDate` | String | `"2026-08-28"` (ISO 8601, year inferred — see Limitations) |
| `postedDateRaw` | String | `"28. aug"` (exactly as shown on the site) |
| `deadline` | String or null | `"2026-09-28"`, or `null` if no deadline is disclosed |
| `deadlineRaw` | String or null | `"28. sep"` |
| `applyUrl` | String | TechJob.dk's own outbound application link |
| `isNew` | Boolean | Whether the listing carries the site's "Nyt job" badge |
| `isTop` | Boolean | Whether the listing carries the site's "Top job" (featured) badge |
| `jobId` | String | TechJob.dk's internal listing ID, e.g. `"106405"` |
| `url` | String | Direct URL to the job listing |
| `scrapedAt` | String | ISO 8601 timestamp of when the data was collected |
| `searchQuery` | String or null | The search keyword used to find this job (echoed from input) |

### Example output

```json
{
    "jobTitle": "Civil Engineer",
    "company": "Aarhus Havn",
    "companyUrl": "https://techjob.dk/virksomhed/aarhus-havn",
    "location": "Aarhus",
    "jobType": "Fastansættelse",
    "categories": ["Havne", "Anlæg", "Konstruktioner"],
    "description": "Aarhus Havn søger en Civil Engineer til...",
    "postedDate": "2026-08-28",
    "postedDateRaw": "28. aug",
    "deadline": "2026-09-28",
    "deadlineRaw": "28. sep",
    "applyUrl": "https://techjob.dk/job/apply/106405",
    "isNew": false,
    "isTop": false,
    "jobId": "106405",
    "url": "https://techjob.dk/job/civil-engineer-106405",
    "scrapedAt": "2026-09-06T14:08:37.188Z",
    "searchQuery": "ingeniør"
}
```

### How to scrape techjob.dk data

1. Open this actor on the Apify Store and click **Try for free**.
2. Optionally fill in `searchQuery` with a Danish keyword (e.g. `udvikler`,
   `ingeniør`, `projektleder`). Leave it empty to pull every live listing
   on the site.
3. Set `maxResults` to how many job listings you want.
4. Click **Start**. The actor first paginates the search results page to
   collect job listing URLs, then opens each job's detail page to pull
   the posted date, deadline, category tags and full description.
5. Download the results as JSON, CSV, or Excel from the **Dataset** tab,
   or pull them via the Apify API into your own pipeline.

No login, account, or cookies are required — TechJob.dk's listings and job
pages are fully public.

### Cost estimate

This actor uses approximately **0.3–0.5 compute units per 1,000 results**
on the default 1 GB memory setting (plain HTTP requests, no browser
rendering). At standard Apify pricing, that is a few cents per 1,000
listings. A run's usage cost only settles once the run finishes with
status SUCCEEDED — a run you abort early is billed for what it used up to
that point, not a fixed per-listing price agreed up front.

### Limitations

- TechJob.dk publishes the posted date and deadline as a day + month only
  (e.g. "28. aug"), with no year. The actor infers the year from the
  scrape date; this is reliable except right at a year boundary for a
  handful of old listings, which is why both the parsed ISO date
  (`postedDate`/`deadline`) and the raw site text
  (`postedDateRaw`/`deadlineRaw`) are included.
- Not every listing discloses a fixed application deadline — `deadline`
  is `null` in that case rather than a guessed value.
- Category tags are the site's own free-text taxonomy; there is no stable
  category ID mapping exposed for filtering by category in this actor.
- Data is scraped from the public website and may change without notice.
- Respect the website's terms of service and use responsibly.

### Maintained by Studio Amba

We run 700+ scrapers for European websites, and the priority is keeping
every one of them working. Automated runs test this actor against the live
site and verify the output is complete. When the website changes, the
scraper usually gets repaired the same day, without you having to report
anything. Questions and issues go straight to the people who built it, and
most get an answer the same day.

### Related scrapers

- **Jobnet Scraper** — Denmark's official public employment service job
  bank, run by STAR (all sectors, tens of thousands of listings).
- Other Danish and Nordic job board scrapers in the Studio Amba catalog.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs,
deduplication, delta detection, and delivery to your inbox, Google Sheets,
or API, maintenance included. We can also build a custom version with your
exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email
<hello@studioamba.dev> for a free data sample.

# Actor input Schema

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

Danish search keyword (e.g. 'ingeniør' = engineer, 'udvikler' = developer, 'projektleder' = project manager). Leave empty to browse every live listing on TechJob.dk.

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

Maximum number of job listings to scrape.

## `fetchFullDescription` (type: `boolean`):

Visit each job's detail page to collect the posted date, application deadline, categories and full description. Disable for a faster run that only returns the listing-card fields (title, company, job type, location).

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

Proxy settings. TechJob.dk has no anti-bot protection (confirmed live) -- the default Apify proxy works reliably, no residential proxy needed.

## Actor input object example

```json
{
  "searchQuery": "udvikler",
  "maxResults": 20,
  "fetchFullDescription": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchQuery": "udvikler",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/techjob-dk-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": "udvikler",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/techjob-dk-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 '{
  "searchQuery": "udvikler",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/techjob-dk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/techjob-dk-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/OjIngRsxLJl2dDjSa/builds/DapthtMu7EtHVw0PT/openapi.json
