# Jobindex Scraper — Denmark Jobs | $1.5/1k (`trev0n/jobindex-scraper`) Actor

Scrape jobindex.dk and it-jobbank.dk — Denmark's largest job boards. Keyword, category, location and radius search, apply-link resolution, and incremental monitoring that emits only new/changed jobs.

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

## Pricing

from $1.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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## 💼 Jobindex Scraper — Denmark Job Listings

🎯 **Get every job posting from Denmark's #1 job board — searchable, filterable and monitorable, delivered as clean structured data in seconds.**

This scraper collects job listings from **jobindex.dk** (Denmark's largest job site) and **it-jobbank.dk** (its IT vertical). For every job you get the title, company, location with GPS coordinates, publish date, application deadline, teaser text, salary mentions, apply links and company details — ready to export as JSON, CSV or Excel.

---

### 🚀 What Does It Do?

- 🔍 **Searches any keyword** — "software engineer", "sygeplejerske", "elektriker", anything
- 🗂️ **Filters like the site itself** — category, subcategory, location, radius, employment type, full/part-time, remote work, publish date
- 📍 **Understands Danish locations** — type "København", "Aarhus" or "Fyn" and it finds the right area automatically
- 🔗 **Resolves apply links** — optionally follows each job's apply button to the employer's own posting and records the final URL
- ♻️ **Monitors for changes** — run it on a schedule and receive only NEW, UPDATED or REAPPEARED jobs (80–95% cheaper than re-scraping everything)
- 🔔 **Notifies you instantly** — Telegram, Discord, Slack or your own webhook when fresh jobs appear
- 🇩🇰 **Covers both portals** — jobindex.dk for everything, it-jobbank.dk for IT roles

---

### 👥 Who Is This For?

| Who                                   | Why                                                                                 |
| ------------------------------------- | ----------------------------------------------------------------------------------- |
| 🎯 **Recruiters & staffing agencies** | Track which companies are hiring, spot new openings the minute they appear          |
| 📊 **Market researchers**             | Analyze the Danish labour market — volumes, categories, regions, remote-work trends |
| 💼 **Job seekers & career coaches**   | Build personal job alerts sharper than any newsletter                               |
| 🏢 **HR & competitive intelligence**  | Monitor competitors' hiring activity and growth signals                             |
| 🤖 **Developers & AI builders**       | Feed fresh Danish job data into apps, dashboards, agents and LLM workflows          |
| 📈 **Lead generation teams**          | Companies that hire are companies that buy — turn postings into prospect lists      |

---

### ✨ Features

- ⚡ **Fast and lightweight** — collects hundreds of jobs per minute, no browser overhead
- 🧠 **Smart location matching** — free-text Danish place names resolved automatically, plus radius search around major cities
- 🎛️ **Full filter set** — 10 categories, 90+ subcategories, 110+ locations, 11 employment types, remote/hybrid/on-site, publish window
- 📄 **Teaser text included** — every job comes with its description snippet at no extra cost
- 💰 **Salary detection** — salary mentions in job texts are parsed into structured min/max fields
- ♻️ **Incremental monitoring** — state is remembered between runs; you only pay for what changed
- 🔁 **Repost detection** — the same ad re-posted under a new id gets flagged (and can be skipped)
- 📦 **Compact mode** — trimmed-down records for AI agents and automations
- 🔔 **Built-in alerts** — Telegram, Discord, Slack and generic webhooks

---

### 🎛️ Filters & Options

| Option                                                                      | What it does                                                                 |
| --------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| 🔍 `query`                                                                  | Keywords to search for                                                       |
| 🌐 `portal`                                                                 | `jobindex.dk` (all jobs) or `it-jobbank.dk` (IT jobs)                        |
| 📍 `location`                                                               | City, municipality, region or area — free text, e.g. "København", "Fyn"      |
| 📡 `radiusKm`                                                               | Search radius in km around the location (with optional explicit coordinates) |
| 🗂️ `category`                                                               | One of the 10 top-level categories (IT, engineering, health care…)           |
| 🧩 `subCategories`                                                          | Any number of the 90+ subcategories                                          |
| 💼 `employmentType`                                                         | Permanent, temporary, student, graduate, internship, freelance…              |
| ⏰ `workHours`                                                              | Full-time or part-time                                                       |
| 🏠 `workplace`                                                              | On-site, 100% remote, or hybrid                                              |
| 📅 `publishedWithin`                                                        | Today, last 24h, 3 days, 7 days or 30 days                                   |
| 🏢 `companyId`                                                              | Only jobs from one company                                                   |
| 🔗 `startUrls`                                                              | Paste any jobindex.dk / it-jobbank.dk search or job URL directly             |
| 💯 `maxResults`                                                             | Cap the number of jobs collected (0 = everything available)                  |
| ✅ `includeKeywords` / ❌ `excludeKeywords`                                 | Keep or drop jobs by words in title/company/teaser                           |
| 🔗 `resolveApplyUrls`                                                       | Follow apply links to the employer's own posting                             |
| ♻️ `incrementalMode`                                                        | Only new/changed jobs on recurring runs                                      |
| 🔔 `telegramBotToken`, `discordWebhookUrl`, `slackWebhookUrl`, `webhookUrl` | Instant notifications                                                        |

---

### 📦 Output Fields

#### Job basics

| Field               | Example                                                      |
| ------------------- | ------------------------------------------------------------ |
| `jobId`             | `"h1681161"`                                                 |
| `title`             | `"Senior Legal Counsel"`                                     |
| `company`           | `"Muehlhan Wind Service A/S"`                                |
| `area`              | `"Fredericia"`                                               |
| `teaser`            | `"Are you an experienced legal professional looking for..."` |
| `publishedDate`     | `"2026-07-07"`                                               |
| `lastDate`          | `"2026-08-04"`                                               |
| `applyDeadline`     | `"2026-07-31"`                                               |
| `applyDeadlineAsap` | `true`                                                       |
| `portal`            | `"jobindex.dk"`                                              |

#### Location

| Field                    | Example                                                                                                            |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------ |
| `addresses`              | `[{"street": "Navervej 10", "zipCode": "7000", "city": "Fredericia", "latitude": 55.53307, "longitude": 9.71269}]` |
| `latitude` / `longitude` | `55.53307` / `9.71269`                                                                                             |
| `geoAreaIds`             | `[5, 26, 968, 1221]`                                                                                               |

#### Links & application

| Field         | Example                                                   |
| ------------- | --------------------------------------------------------- |
| `url`         | `"https://www.jobindex.dk/vis-job/h1681161"`              |
| `applyUrl`    | `"https://www.jobindex.dk/c?t=h1681161&ctx=w"`            |
| `appApplyUrl` | `"https://candidate.hr-manager.net/ApplicationForm/..."`  |
| `resolvedUrl` | `"https://www.muehlhan.com/careers/senior-legal-counsel"` |

#### Company & extras

| Field                             | Example                                                                                                                                                                     |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `companyDetails`                  | `{"id": 53516, "name": "Muehlhan Wind Service A/S", "website": "https://www.muehlhan.com/", "logo": "https://www.jobindex.dk/img/logo/Logo-Muehlhan.png", "followers": 42}` |
| `salaryMin` / `salaryMax`         | `38000` / `42000`                                                                                                                                                           |
| `salaryCurrency` / `salaryPeriod` | `"DKK"` / `"month"`                                                                                                                                                         |
| `salaryText`                      | `"kr. 38.000-42.000"`                                                                                                                                                       |
| `isHostedAd`                      | `true`                                                                                                                                                                      |
| `homeWorkplace`                   | `false`                                                                                                                                                                     |
| `logo`                            | `"https://www.jobindex.dk/img/logo/Logo-Muehlhan.png"`                                                                                                                      |
| `rating` / `ratingCount`          | `4.2` / `17`                                                                                                                                                                |
| `scrapedAt`                       | `"2026-07-07T20:31:02.115Z"`                                                                                                                                                |

#### Monitoring fields (incremental mode)

| Field                        | Example                                           |
| ---------------------------- | ------------------------------------------------- |
| `changeType`                 | `"NEW"`, `"UPDATED"`, `"REAPPEARED"`, `"EXPIRED"` |
| `firstSeenAt` / `lastSeenAt` | `"2026-07-01T06:00:00.000Z"`                      |
| `isRepost` / `repostOfId`    | `true` / `"h1650021"`                             |

---

### 📄 Example Output

```json
{
    "jobId": "h1681161",
    "title": "Senior Legal Counsel",
    "company": "Muehlhan Wind Service A/S",
    "companyDetails": {
        "id": 53516,
        "name": "Muehlhan Wind Service A/S",
        "profileUrl": "https://www.jobindex.dk/virksomhed/53516/muehlhan-wind-service-a-s#om-virksomhed",
        "website": "https://www.muehlhan.com/",
        "logo": "https://www.jobindex.dk/img/logo/Logo-Muehlhan.png",
        "followers": 42
    },
    "area": "Fredericia",
    "addresses": [
        {
            "street": "Navervej 10",
            "zipCode": "7000",
            "city": "Fredericia",
            "fullAddress": "Navervej 10, 7000 Fredericia",
            "latitude": 55.5330705,
            "longitude": 9.7126942
        }
    ],
    "latitude": 55.5330705,
    "longitude": 9.7126942,
    "teaser": "Are you an experienced legal professional who wants to make a difference in the green transition? Muehlhan Wind Service is looking for a Senior Legal Counsel to join our team in Fredericia...",
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "publishedDate": "2026-07-07",
    "lastDate": "2026-08-04",
    "applyDeadline": null,
    "applyDeadlineAsap": true,
    "url": "https://www.jobindex.dk/vis-job/h1681161",
    "applyUrl": "https://www.jobindex.dk/c?t=h1681161&ctx=w",
    "appApplyUrl": "https://candidate.hr-manager.net/ApplicationForm/SinglePageApplicationForm.aspx?cid=2765&ProjectId=143822",
    "resolvedUrl": null,
    "isHostedAd": true,
    "isArchived": false,
    "homeWorkplace": false,
    "logo": "https://www.jobindex.dk/img/logo/Logo-Muehlhan.png",
    "portal": "jobindex.dk",
    "searchQuery": "legal",
    "scrapedAt": "2026-07-07T20:31:02.115Z"
}
````

***

### 📊 Dataset Views

- 👀 **Overview** — title, company, location, dates and link at a glance
- ♻️ **Monitoring** — change type, first/last seen, repost flag for incremental runs
- 🔗 **Apply Links** — deadlines and direct application URLs
- 📋 **Full Details** — every field

***

### ❓ FAQ

**💰 How much does it cost?**
You pay per result. A typical search of 100 jobs completes in well under a minute. With incremental monitoring enabled, recurring runs return only the handful of new/changed jobs — that's where the real savings are.

**🕐 How fresh is the data?**
Live. Every run queries jobindex.dk directly, so you see exactly what a visitor sees — including jobs posted minutes ago.

**♻️ How does incremental monitoring work?**
The first run saves a snapshot of your search. Every following run compares against it and emits only jobs that are NEW, UPDATED or REAPPEARED (optionally also EXPIRED ones). Schedule it hourly or daily and pay only for the diff.

**🌍 Can I search in English?**
Yes — search keywords work in Danish and English. Many IT and engineering ads are posted in English.

**📍 Can I search around a specific place?**
Yes. Set a location plus `radiusKm` (e.g. "Aarhus" + 30 km), or pass exact coordinates for pinpoint radius searches.

**🔢 Is there a limit on results?**
The site serves at most 1,000 jobs per search. Need more? Split the run by category or region — or reach out and we'll help you set it up.

**⚖️ Is scraping job listings legal?**
This scraper only collects publicly available data — the same information any visitor sees in a browser. Always review the target site's terms of service and consult a lawyer for your specific use case.

***

### 💬 Need Something Custom?

Missing a filter? Want salary parsing tuned for your use case, a different output format, direct delivery to your database, or a scraper for another job board?

**📩 Send me a private message on Apify — custom modifications and dedicated scrapers are my daily bread.** Response usually within 24 hours.

***

### ⚖️ Legal Disclaimer

This Actor collects only publicly accessible data from jobindex.dk and it-jobbank.dk. It does not access any password-protected areas or personal accounts. You are responsible for how you use the collected data and for compliance with applicable laws (including GDPR) and the target website's terms of service.

# Actor input Schema

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

What to search for (e.g. "software engineer", "sygeplejerske", "elektriker"). Leave empty to browse by category/location only or to use Start URLs.

## `queries` (type: `array`):

Run several keyword searches in one go (results are deduplicated). Use instead of — or together with — the single query field.

## `portal` (type: `string`):

Which site to search. jobindex.dk is Denmark's largest job board; it-jobbank.dk is its IT vertical. Start URLs auto-detect the portal.

## `location` (type: `string`):

City, municipality, region or area (e.g. "København", "Aarhus", "Fyn", "Storkøbenhavn"). Free text — resolved against the site's own location index.

## `radiusKm` (type: `integer`):

Search radius in kilometres around the location (0 = off). Works with major city names or explicit coordinates below.

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

Optional explicit latitude for radius search (e.g. "55.6761").

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

Optional explicit longitude for radius search (e.g. "12.5683").

## `category` (type: `string`):

Limit results to one top-level Jobindex category.

## `subCategories` (type: `array`):

One or more Jobindex subcategories, e.g. "systemudvikling-og-programmering", "sygeplejerske-og-jordemoder", "laerer", "transport", "marketing". Numeric subids are accepted too. Combine freely with or without a top-level category.

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

Filter by employment type.

## `workHours` (type: `string`):

Full-time or part-time.

## `workplace` (type: `string`):

Remote-work arrangement.

## `publishedWithin` (type: `string`):

Only jobs published within this window.

## `companyId` (type: `string`):

Only jobs from one company (the numeric id from a jobindex.dk/virksomhed/<id>/… company URL).

## `sortBy` (type: `string`):

Ordering of search results.

## `startUrls` (type: `array`):

Optional jobindex.dk / it-jobbank.dk search or job URLs to scrape directly instead of (or alongside) a keyword search. Ofir.dk search URLs are mapped to Jobindex automatically.

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

Maximum number of jobs to collect (0 = unlimited). Note: the site serves at most 1,000 results per search — split broad searches by category or area to get more.

## `maxPages` (type: `integer`):

Cap on result pages to fetch per search (0 = no cap). The site serves at most 50 pages (20 jobs each) per search.

## `includeKeywords` (type: `array`):

Keep only jobs whose title/company/teaser contains at least one of these terms.

## `excludeKeywords` (type: `array`):

Drop jobs whose title/company/teaser contains any of these terms.

## `maxAgeDays` (type: `integer`):

Drop jobs published more than this many days ago (0 = no limit).

## `includeTeaser` (type: `boolean`):

Extract each job's teaser/description snippet. Costs nothing extra per job — turn off only for the leanest possible output.

## `resolveApplyUrls` (type: `boolean`):

Follow each job's apply link to the employer's own posting and record the final URL (resolvedUrl). One extra request per job — slower.

## `descriptionMaxLength` (type: `integer`):

Truncate teasers to this many characters (0 = no limit).

## `compact` (type: `boolean`):

Output only the core fields — handy for AI workflows.

## `excludeEmptyFields` (type: `boolean`):

Omit null / empty fields from each record.

## `detailConcurrency` (type: `integer`):

How many apply-redirect requests to run in parallel (1-20). Higher is faster.

## `useProxyForDetails` (type: `boolean`):

Route apply-redirect requests through the proxy. Off by default — employer sites respond faster fetched directly. Turn on only if you start hitting rate limits.

## `incrementalMode` (type: `boolean`):

Track state across runs and emit only NEW / UPDATED / REAPPEARED jobs. The first run builds a baseline; later runs charge only for the diff — ideal for cheap recurring monitoring.

## `stateKey` (type: `string`):

Custom identifier for the monitoring baseline. Leave empty to derive it from the search config automatically.

## `emitUnchanged` (type: `boolean`):

Also output jobs whose content didn't change since the last run.

## `emitExpired` (type: `boolean`):

Also output a record for jobs that disappeared since the last run (changeType = EXPIRED).

## `skipReposts` (type: `boolean`):

Drop new jobs detected as reposts of a recently expired one (same content, new id).

## `notifyOnlyChanges` (type: `boolean`):

Only send notifications when there are new/updated jobs.

## `notificationLimit` (type: `integer`):

Maximum number of jobs listed in a single notification message.

## `includeRunSummary` (type: `boolean`):

Attach the run summary object to the generic webhook payload.

## `webhookUrl` (type: `string`):

Generic webhook to POST results to (JSON).

## `telegramBotToken` (type: `string`):

Telegram bot token for notifications.

## `telegramChatId` (type: `string`):

Telegram chat id to send notifications to.

## `discordWebhookUrl` (type: `string`):

Discord channel webhook for notifications.

## `slackWebhookUrl` (type: `string`):

Slack incoming webhook for notifications.

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

Proxy settings. The API works without a proxy, but a proxy helps for large or frequent runs.

## Actor input object example

```json
{
  "query": "developer",
  "portal": "jobindex.dk",
  "radiusKm": 0,
  "category": "",
  "employmentType": "",
  "workHours": "",
  "workplace": "",
  "publishedWithin": "",
  "sortBy": "relevance",
  "maxResults": 100,
  "maxPages": 0,
  "maxAgeDays": 0,
  "includeTeaser": true,
  "resolveApplyUrls": false,
  "descriptionMaxLength": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "detailConcurrency": 10,
  "useProxyForDetails": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "notifyOnlyChanges": true,
  "notificationLimit": 10,
  "includeRunSummary": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (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": "developer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("trev0n/jobindex-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": "developer" }

# Run the Actor and wait for it to finish
run = client.actor("trev0n/jobindex-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": "developer"
}' |
apify call trev0n/jobindex-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Jobindex Scraper — Denmark Jobs | $1.5/1k",
        "description": "Scrape jobindex.dk and it-jobbank.dk — Denmark's largest job boards. Keyword, category, location and radius search, apply-link resolution, and incremental monitoring that emits only new/changed jobs.",
        "version": "1.0",
        "x-build-id": "BlvpAreYQW0kmYKJR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/trev0n~jobindex-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-trev0n-jobindex-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/trev0n~jobindex-scraper/runs": {
            "post": {
                "operationId": "runs-sync-trev0n-jobindex-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/trev0n~jobindex-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-trev0n-jobindex-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "query": {
                        "title": "Search keywords",
                        "type": "string",
                        "description": "What to search for (e.g. \"software engineer\", \"sygeplejerske\", \"elektriker\"). Leave empty to browse by category/location only or to use Start URLs."
                    },
                    "queries": {
                        "title": "Search queries (multiple)",
                        "type": "array",
                        "description": "Run several keyword searches in one go (results are deduplicated). Use instead of — or together with — the single query field.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "portal": {
                        "title": "Portal",
                        "enum": [
                            "jobindex.dk",
                            "it-jobbank.dk"
                        ],
                        "type": "string",
                        "description": "Which site to search. jobindex.dk is Denmark's largest job board; it-jobbank.dk is its IT vertical. Start URLs auto-detect the portal.",
                        "default": "jobindex.dk"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, municipality, region or area (e.g. \"København\", \"Aarhus\", \"Fyn\", \"Storkøbenhavn\"). Free text — resolved against the site's own location index."
                    },
                    "radiusKm": {
                        "title": "Radius (km)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Search radius in kilometres around the location (0 = off). Works with major city names or explicit coordinates below.",
                        "default": 0
                    },
                    "latitude": {
                        "title": "Latitude",
                        "type": "string",
                        "description": "Optional explicit latitude for radius search (e.g. \"55.6761\")."
                    },
                    "longitude": {
                        "title": "Longitude",
                        "type": "string",
                        "description": "Optional explicit longitude for radius search (e.g. \"12.5683\")."
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "",
                            "informationsteknologi",
                            "ingenioer-og-teknik",
                            "ledelse-og-personale",
                            "handel-og-service",
                            "industri-og-haandvaerk",
                            "salg-og-kommunikation",
                            "undervisning",
                            "kontor-og-oekonomi",
                            "social-og-sundhed",
                            "oevrige-stillinger"
                        ],
                        "type": "string",
                        "description": "Limit results to one top-level Jobindex category.",
                        "default": ""
                    },
                    "subCategories": {
                        "title": "Subcategories",
                        "type": "array",
                        "description": "One or more Jobindex subcategories, e.g. \"systemudvikling-og-programmering\", \"sygeplejerske-og-jordemoder\", \"laerer\", \"transport\", \"marketing\". Numeric subids are accepted too. Combine freely with or without a top-level category.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "employmentType": {
                        "title": "Employment type",
                        "enum": [
                            "",
                            "permanent",
                            "temporary",
                            "student",
                            "apprentice",
                            "graduate",
                            "internship",
                            "flex",
                            "volunteer",
                            "youth",
                            "freelance",
                            "hourly"
                        ],
                        "type": "string",
                        "description": "Filter by employment type.",
                        "default": ""
                    },
                    "workHours": {
                        "title": "Working hours",
                        "enum": [
                            "",
                            "fulltime",
                            "parttime"
                        ],
                        "type": "string",
                        "description": "Full-time or part-time.",
                        "default": ""
                    },
                    "workplace": {
                        "title": "Workplace",
                        "enum": [
                            "",
                            "onsite",
                            "remote",
                            "hybrid"
                        ],
                        "type": "string",
                        "description": "Remote-work arrangement.",
                        "default": ""
                    },
                    "publishedWithin": {
                        "title": "Published within",
                        "enum": [
                            "",
                            "today",
                            "1d",
                            "3d",
                            "7d",
                            "30d"
                        ],
                        "type": "string",
                        "description": "Only jobs published within this window.",
                        "default": ""
                    },
                    "companyId": {
                        "title": "Company ID",
                        "type": "string",
                        "description": "Only jobs from one company (the numeric id from a jobindex.dk/virksomhed/<id>/… company URL)."
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "relevance",
                            "date"
                        ],
                        "type": "string",
                        "description": "Ordering of search results.",
                        "default": "relevance"
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Optional jobindex.dk / it-jobbank.dk search or job URLs to scrape directly instead of (or alongside) a keyword search. Ofir.dk search URLs are mapped to Jobindex automatically.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of jobs to collect (0 = unlimited). Note: the site serves at most 1,000 results per search — split broad searches by category or area to get more.",
                        "default": 100
                    },
                    "maxPages": {
                        "title": "Max pages per search",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap on result pages to fetch per search (0 = no cap). The site serves at most 50 pages (20 jobs each) per search.",
                        "default": 0
                    },
                    "includeKeywords": {
                        "title": "Include keywords",
                        "type": "array",
                        "description": "Keep only jobs whose title/company/teaser contains at least one of these terms.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "excludeKeywords": {
                        "title": "Exclude keywords",
                        "type": "array",
                        "description": "Drop jobs whose title/company/teaser contains any of these terms.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxAgeDays": {
                        "title": "Max age (days)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop jobs published more than this many days ago (0 = no limit).",
                        "default": 0
                    },
                    "includeTeaser": {
                        "title": "Include teaser text",
                        "type": "boolean",
                        "description": "Extract each job's teaser/description snippet. Costs nothing extra per job — turn off only for the leanest possible output.",
                        "default": true
                    },
                    "resolveApplyUrls": {
                        "title": "Resolve apply redirects",
                        "type": "boolean",
                        "description": "Follow each job's apply link to the employer's own posting and record the final URL (resolvedUrl). One extra request per job — slower.",
                        "default": false
                    },
                    "descriptionMaxLength": {
                        "title": "Teaser max length",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Truncate teasers to this many characters (0 = no limit).",
                        "default": 0
                    },
                    "compact": {
                        "title": "Compact output",
                        "type": "boolean",
                        "description": "Output only the core fields — handy for AI workflows.",
                        "default": false
                    },
                    "excludeEmptyFields": {
                        "title": "Exclude empty fields",
                        "type": "boolean",
                        "description": "Omit null / empty fields from each record.",
                        "default": false
                    },
                    "detailConcurrency": {
                        "title": "Redirect concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many apply-redirect requests to run in parallel (1-20). Higher is faster.",
                        "default": 10
                    },
                    "useProxyForDetails": {
                        "title": "Use proxy for redirects",
                        "type": "boolean",
                        "description": "Route apply-redirect requests through the proxy. Off by default — employer sites respond faster fetched directly. Turn on only if you start hitting rate limits.",
                        "default": false
                    },
                    "incrementalMode": {
                        "title": "Incremental monitoring mode",
                        "type": "boolean",
                        "description": "Track state across runs and emit only NEW / UPDATED / REAPPEARED jobs. The first run builds a baseline; later runs charge only for the diff — ideal for cheap recurring monitoring.",
                        "default": false
                    },
                    "stateKey": {
                        "title": "State key",
                        "type": "string",
                        "description": "Custom identifier for the monitoring baseline. Leave empty to derive it from the search config automatically."
                    },
                    "emitUnchanged": {
                        "title": "Emit unchanged jobs",
                        "type": "boolean",
                        "description": "Also output jobs whose content didn't change since the last run.",
                        "default": false
                    },
                    "emitExpired": {
                        "title": "Emit expired jobs",
                        "type": "boolean",
                        "description": "Also output a record for jobs that disappeared since the last run (changeType = EXPIRED).",
                        "default": false
                    },
                    "skipReposts": {
                        "title": "Skip reposts",
                        "type": "boolean",
                        "description": "Drop new jobs detected as reposts of a recently expired one (same content, new id).",
                        "default": false
                    },
                    "notifyOnlyChanges": {
                        "title": "Notify only on changes",
                        "type": "boolean",
                        "description": "Only send notifications when there are new/updated jobs.",
                        "default": true
                    },
                    "notificationLimit": {
                        "title": "Jobs per notification",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of jobs listed in a single notification message.",
                        "default": 10
                    },
                    "includeRunSummary": {
                        "title": "Include run summary in webhook",
                        "type": "boolean",
                        "description": "Attach the run summary object to the generic webhook payload.",
                        "default": true
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "Generic webhook to POST results to (JSON)."
                    },
                    "telegramBotToken": {
                        "title": "Telegram bot token",
                        "type": "string",
                        "description": "Telegram bot token for notifications."
                    },
                    "telegramChatId": {
                        "title": "Telegram chat ID",
                        "type": "string",
                        "description": "Telegram chat id to send notifications to."
                    },
                    "discordWebhookUrl": {
                        "title": "Discord webhook URL",
                        "type": "string",
                        "description": "Discord channel webhook for notifications."
                    },
                    "slackWebhookUrl": {
                        "title": "Slack webhook URL",
                        "type": "string",
                        "description": "Slack incoming webhook for notifications."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. The API works without a proxy, but a proxy helps for large or frequent runs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
