{
  "openapi": "3.0.1",
  "info": {
    "title": "Jobindex.dk Scraper",
    "description": "Turn jobindex.dk — Denmark's largest job board — into clean, structured job data. Filter by keyword, location, employment type and category, monitor for new postings, and get alerts on Slack, Telegram, Discord or webhook. Company info, salaries and apply links included.",
    "version": "0.1",
    "x-build-id": "KvmnPJvHHctv6FFNz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/corvuslab~jobindex-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-corvuslab-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/corvuslab~jobindex-scraper/runs": {
      "post": {
        "operationId": "runs-sync-corvuslab-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/corvuslab~jobindex-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-corvuslab-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 query 🔍",
            "type": "string",
            "description": "Search query, e.g. \"python\" or \"sygeplejerske\". Operators: +word (require), -word (exclude), \"exact phrase\". Tip: \"+python +ai\" returns only jobs matching both."
          },
          "queries": {
            "title": "Search queries 📑",
            "type": "array",
            "description": "Run several keyword searches in one run. Results are deduplicated by job ID across all queries.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location 📍",
            "type": "string",
            "description": "Optional Danish city or region to filter by (e.g. \"København\", \"Aarhus\", \"Odense\", \"Region Hovedstaden\"). Leave blank to search all of Denmark."
          },
          "employmentType": {
            "title": "Employment type 💼",
            "type": "array",
            "description": "Filter by type of employment. Select one or more; leave empty for any.",
            "items": {
              "type": "string",
              "enum": [
                "permanent",
                "temporary",
                "student",
                "apprentice",
                "graduate",
                "internship",
                "flexJob",
                "volunteer",
                "youth",
                "freelance",
                "hourly"
              ],
              "enumTitles": [
                "Permanent (Fastansættelse)",
                "Temporary (Tidsbegrænset)",
                "Student job (Studiejob)",
                "Apprentice (Elev/lærling)",
                "Graduate/trainee",
                "Internship (Praktikplads)",
                "Flex job (Fleksjob)",
                "Volunteer (Frivillig)",
                "Youth/part-time (Ungarbejder)",
                "Freelance",
                "Hourly/on-call (Timeansat)"
              ]
            }
          },
          "workPlace": {
            "title": "Workplace 🏠",
            "type": "array",
            "description": "Filter by where the work is done. Select one or more; leave empty for any. Note: fully remote jobs are rare on jobindex.",
            "items": {
              "type": "string",
              "enum": [
                "onsite",
                "remote",
                "hybrid"
              ],
              "enumTitles": [
                "On-site (Tilbydes ikke)",
                "Remote (100% hjemmearbejde)",
                "Hybrid (Muligt)"
              ]
            }
          },
          "workHours": {
            "title": "Working hours ⏰",
            "type": "array",
            "description": "Filter by full-time or part-time. Select one or more; leave empty for any.",
            "items": {
              "type": "string",
              "enum": [
                "fulltime",
                "parttime"
              ],
              "enumTitles": [
                "Full-time (Fuldtid)",
                "Part-time (Deltid)"
              ]
            }
          },
          "subCategories": {
            "title": "Job categories 🗂️",
            "type": "array",
            "description": "Filter by one or more jobindex job categories. Leave empty for all categories.",
            "items": {
              "type": "string",
              "enum": [
                "Courier & delivery",
                "Childcare",
                "Retail",
                "Retail management",
                "Property service",
                "Hairdressing & personal care",
                "Hotel, restaurant & kitchen",
                "Cleaning",
                "Service",
                "Security",
                "Plumbing & sheet metal",
                "Construction & civil works",
                "Electrician",
                "Industrial production",
                "Iron & metal",
                "Warehouse",
                "Agriculture, forestry & fishing",
                "Painting & surface treatment",
                "Mechanics & automotive",
                "Food & beverage",
                "Textile & craft",
                "Transport",
                "Wood & furniture",
                "Carpentry & joinery",
                "Database",
                "Internet & web",
                "IT operations & support",
                "IT management",
                "Software development & programming",
                "Telecom & data communication",
                "ERP & business systems",
                "Civil engineering",
                "Electrical engineering",
                "Chemistry & biotech",
                "Engineering management",
                "Mechanical engineering",
                "Pharma & food technology",
                "Production & process engineering",
                "Academic & policy work",
                "Real estate agent",
                "Finance & insurance",
                "Purchasing",
                "Law",
                "Office & administration",
                "Logistics & freight",
                "Public administration",
                "Translation & languages",
                "Secretary & reception",
                "Financial management",
                "Finance & accounting",
                "School & institution management",
                "Management",
                "HR & personnel",
                "Project management",
                "Sales management",
                "Executive & board",
                "Business development",
                "Design",
                "Graphics",
                "Communication & journalism",
                "Culture & church",
                "Marketing",
                "Sales",
                "Self-employment",
                "Telemarketing",
                "Doctor / physician",
                "Medical secretary",
                "Care & nursing assistance",
                "Psychology & psychiatry",
                "Social work",
                "Nurse & midwife",
                "Dentist & clinic staff",
                "Technical health work",
                "Therapy & rehabilitation",
                "Library",
                "Research",
                "Teacher",
                "Pedagogue / educator",
                "Adult education",
                "Defense & intelligence",
                "Other"
              ],
              "enumTitles": [
                "Courier & delivery (Bud og udbringning)",
                "Childcare (Børnepasning)",
                "Retail (Detailhandel)",
                "Retail management (Detailledelse)",
                "Property service (Ejendomsservice)",
                "Hairdressing & personal care (Frisør og personlig pleje)",
                "Hotel, restaurant & kitchen (Hotel, restaurant og køkken)",
                "Cleaning (Rengøring)",
                "Service (Service)",
                "Security (Sikkerhed)",
                "Plumbing & sheet metal (Blik og rør)",
                "Construction & civil works (Bygge og anlæg)",
                "Electrician (Elektriker)",
                "Industrial production (Industriel produktion)",
                "Iron & metal (Jern og metal)",
                "Warehouse (Lager)",
                "Agriculture, forestry & fishing (Landbrug, skov og fiskeri)",
                "Painting & surface treatment (Maling og overfladebehandling)",
                "Mechanics & automotive (Mekanik og auto)",
                "Food & beverage (Nærings- og nydelsesmiddel)",
                "Textile & craft (Tekstil og kunsthåndværk)",
                "Transport (Transport)",
                "Wood & furniture (Træ- og møbelindustri)",
                "Carpentry & joinery (Tømrer og snedker)",
                "Database (Database)",
                "Internet & web (Internet og WWW)",
                "IT operations & support (IT-drift og support)",
                "IT management (IT-ledelse)",
                "Software development & programming (Systemudvikling og programmering)",
                "Telecom & data communication (Tele- og datakommunikation)",
                "ERP & business systems (Økonomi- og virksomhedssystemer)",
                "Civil engineering (Bygge- og anlægsteknik)",
                "Electrical engineering (Elektroteknik)",
                "Chemistry & biotech (Kemi og bioteknik)",
                "Engineering management (Ledelse inden for ingeniør og teknik)",
                "Mechanical engineering (Maskinteknik)",
                "Pharma & food technology (Medicinal og levnedsmiddel)",
                "Production & process engineering (Produktions- og procesteknik)",
                "Academic & policy work (Akademisk og politisk arbejde)",
                "Real estate agent (Ejendomsmægler)",
                "Finance & insurance (Finans og forsikring)",
                "Purchasing (Indkøb)",
                "Law (Jura)",
                "Office & administration (Kontor)",
                "Logistics & freight (Logistik og spedition)",
                "Public administration (Offentlig administration)",
                "Translation & languages (Oversættelse og sprog)",
                "Secretary & reception (Sekretær og reception)",
                "Financial management (Økonomiledelse)",
                "Finance & accounting (Økonomi og regnskab)",
                "School & institution management (Institutions- og skoleledelse)",
                "Management (Ledelse)",
                "HR & personnel (Personale og HR)",
                "Project management (Projektledelse)",
                "Sales management (Salgsledelse)",
                "Executive & board (Topledelse og bestyrelse)",
                "Business development (Virksomhedsudvikling)",
                "Design (Design og formgivning)",
                "Graphics (Grafisk)",
                "Communication & journalism (Kommunikation og journalistik)",
                "Culture & church (Kultur og kirke)",
                "Marketing (Marketing)",
                "Sales (Salg)",
                "Self-employment (Selvstændig virksomhedsdrift)",
                "Telemarketing (Telemarketing)",
                "Doctor / physician (Læge)",
                "Medical secretary (Lægesekretær)",
                "Care & nursing assistance (Pleje og omsorg)",
                "Psychology & psychiatry (Psykologi og psykiatri)",
                "Social work (Socialrådgivning)",
                "Nurse & midwife (Sygeplejerske og jordemoder)",
                "Dentist & clinic staff (Tandlæge og klinikpersonale)",
                "Technical health work (Teknisk sundhedsarbejde)",
                "Therapy & rehabilitation (Terapi og genoptræning)",
                "Library (Bibliotek)",
                "Research (Forskning)",
                "Teacher (Lærer)",
                "Pedagogue / educator (Pædagog)",
                "Adult education (Voksenuddannelse)",
                "Defense & intelligence (Forsvar og efterretning)",
                "Other (Øvrige)"
              ]
            }
          },
          "maxResults": {
            "title": "Max results per query 🔢",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum number of jobs to return per query. Use 0 for unlimited (hard-capped at 5000).",
            "default": 25
          },
          "sortBy": {
            "title": "Sort by ↕️",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "Order results by jobindex relevance or by posting date (newest first).",
            "default": "relevance"
          },
          "maxAgeDays": {
            "title": "Max age (days) 🗓️",
            "minimum": 1,
            "maximum": 60,
            "type": "integer",
            "description": "Only include jobs posted within the last N days. Leave empty for no age limit."
          },
          "fetchJobDetail": {
            "title": "Fetch job details 📄",
            "type": "boolean",
            "description": "Open each job's detail page to add a summary, full description, and any stated salary (DKK). Slower and uses more requests. Note: most Danish ads don't state a salary.",
            "default": false
          },
          "descriptionMaxLength": {
            "title": "Description max length ✂️",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate the description/summary text to this many characters. Use 0 for no limit. Only applies when 'Fetch job details' is enabled.",
            "default": 0
          },
          "descriptionFormat": {
            "title": "Description format 📝",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Which description representations to include (only with 'Fetch job details'): all, plain text, HTML, or Markdown.",
            "default": "all"
          },
          "compact": {
            "title": "Compact output 📦",
            "type": "boolean",
            "description": "Return only core fields (title, company, location, dates, URLs) — handy for AI/agent workflows.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "Exclude empty fields 🧹",
            "type": "boolean",
            "description": "Remove fields that are null or empty from each output record.",
            "default": false
          },
          "incrementalMode": {
            "title": "Incremental mode 🔁",
            "type": "boolean",
            "description": "Only emit jobs that are NEW, UPDATED or REAPPEARED since the previous run. The first run builds a baseline (everything is NEW). Each record gets a 'changeType' field.",
            "default": false
          },
          "emitUnchanged": {
            "title": "Also emit unchanged jobs",
            "type": "boolean",
            "description": "When incremental mode is on, also include jobs with no detected changes (changeType UNCHANGED).",
            "default": false
          },
          "emitExpired": {
            "title": "Also emit expired jobs",
            "type": "boolean",
            "description": "When incremental mode is on, also emit jobs that have disappeared since the last run (changeType EXPIRED). Requires a complete scrape — set Max results to 0 for reliable expiry tracking.",
            "default": false
          },
          "skipReposts": {
            "title": "Skip reposts",
            "type": "boolean",
            "description": "When incremental mode is on, suppress new listings whose content matches a previously expired job (re-posted ads).",
            "default": false
          },
          "stateKey": {
            "title": "State key 🔑",
            "type": "string",
            "description": "Identifier for the incremental state. Leave blank to derive it automatically from your search settings. Set a fixed value to share one state across runs even if you tweak the search, or a unique value to keep separate monitors apart."
          },
          "telegramToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Bot token from @BotFather. Requires a Telegram chat ID too."
          },
          "telegramChatId": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Chat or channel ID to send messages to (e.g. from @userinfobot)."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. The run summary is posted to its channel."
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL",
            "type": "string",
            "description": "Discord channel webhook URL. The run summary is posted to its channel."
          },
          "webhookUrl": {
            "title": "Generic webhook URL",
            "type": "string",
            "description": "Receives a JSON POST of {metadata, items} after every run (fires even with zero results). Use it to integrate any service."
          },
          "webhookHeaders": {
            "title": "Webhook headers",
            "type": "object",
            "description": "Optional custom HTTP headers for the generic webhook (e.g. an Authorization header), as a JSON object."
          },
          "notificationLimit": {
            "title": "Jobs per notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of jobs listed in each chat message (Telegram/Slack/Discord). The webhook always receives the full list.",
            "default": 10
          },
          "notifyOnlyChanges": {
            "title": "Notify only about changes",
            "type": "boolean",
            "description": "With incremental mode on, only notify about NEW and UPDATED jobs (skip unchanged/reappeared/expired).",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}