{
  "openapi": "3.0.1",
  "info": {
    "title": "Jobindex Scraper - Denmark Job Listings",
    "description": "Scrape jobindex.dk, it-jobbank.dk, and ofir.dk - Denmark's largest job portals. Search multiple queries, parse salary ranges, and monitor new or changed listings with incremental mode.",
    "version": "0.2",
    "x-build-id": "0Fuv1Kmk8bTHtJI8A"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~jobindex-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-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/blackfalcondata~jobindex-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-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/blackfalcondata~jobindex-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-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 Term(s)",
            "type": "string",
            "description": "Job search keywords (e.g. 'software engineer', 'sygeplejerske', 'data analyst'). Use 'queries' for multiple keywords in one run."
          },
          "queries": {
            "title": "🔍 Search Queries (multiple)",
            "type": "array",
            "description": "Run multiple keyword searches in one actor run. Results are deduplicated across queries. Each query respects maxResults independently. Use instead of — or together with — the single 'query' field.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "One or more Jobindex, IT-Jobbank, or Ofir search page URLs to scrape directly (e.g. https://www.jobindex.dk/jobsoegning?q=developer&l=K%C3%B8benhavn). Ofir.dk URLs are mapped to Jobindex automatically. Pagination is handled automatically. Portal, query, location and filter params are parsed from the URL. Can be combined with 'query' and 'queries'.",
            "items": {
              "type": "string"
            }
          },
          "portal": {
            "title": "🌐 Portal",
            "enum": [
              "jobindex.dk",
              "it-jobbank.dk"
            ],
            "type": "string",
            "description": "Which portal to search. Applies to 'query' and 'queries' inputs. startUrls auto-detect portal from the URL. jobindex.dk is the main site (~30K+ jobs). it-jobbank.dk is the IT-vertical subset. Ofir.dk redirects to Jobindex.",
            "default": "jobindex.dk"
          },
          "location": {
            "title": "📍 Location",
            "type": "string",
            "description": "City, municipality, or region (e.g. 'København', 'Aarhus', 'Fyn'). Applies to 'query' and 'queries' inputs."
          },
          "employmentType": {
            "title": "💼 Employment Type",
            "enum": [
              "",
              "permanent",
              "temporary",
              "student",
              "apprentice",
              "graduate",
              "internship",
              "flex",
              "volunteer",
              "freelance",
              "hourly"
            ],
            "type": "string",
            "description": "Filter by employment type."
          },
          "workPlace": {
            "title": "🏠 Work Place",
            "enum": [
              "",
              "onsite",
              "remote",
              "hybrid"
            ],
            "type": "string",
            "description": "Filter by workplace arrangement."
          },
          "workHours": {
            "title": "⏰ Working Hours",
            "enum": [
              "",
              "fulltime",
              "parttime"
            ],
            "type": "string",
            "description": "Filter by working hours."
          },
          "radiusKm": {
            "title": "📡 Radius (km)",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Search radius in kilometres around the specified location (e.g. 30 = jobs within 30 km of 'København'). Requires a location to be set. Ignored when location is empty."
          },
          "subCategories": {
            "title": "🗂️ Job Categories",
            "type": "array",
            "description": "Filter by one or more Jobindex job categories. Applies to 'query' and 'queries' inputs. Results from different categories are combined and deduplicated.",
            "items": {
              "type": "string",
              "enum": [
                "Akademisk og politisk arbejde",
                "Bibliotek",
                "Blik og rør",
                "Bud og udbringning",
                "Bygge og anlæg",
                "Bygge- og anlægsteknik",
                "Børnepasning",
                "Database",
                "Design og formgivning",
                "Detailhandel",
                "Detailledelse",
                "Ejendomsmægler",
                "Ejendomsservice",
                "Elektriker",
                "Elektroteknik",
                "Finans og forsikring",
                "Forskning",
                "Forsvar og efterretning",
                "Frisør og personlig pleje",
                "Grafisk",
                "Hotel, restaurant og køkken",
                "IT-drift og support",
                "IT-ledelse",
                "Industriel produktion",
                "Indkøb",
                "Internet og WWW",
                "Jern og metal",
                "Jura",
                "Kemi og bioteknik",
                "Kommunikation og journalistik",
                "Kontor",
                "Kultur og kirke",
                "Lager",
                "Landbrug, skov og fiskeri",
                "Ledelse",
                "Ledelse inden for ingeniør og teknik",
                "Logistik og spedition",
                "Læge",
                "Lægesekretær",
                "Lærer",
                "Maling og overfladebehandling",
                "Marketing",
                "Maskinteknik",
                "Medicinal og levnedsmiddel",
                "Mekanik og auto",
                "Nærings- og nydelsesmiddel",
                "Offentlig administration",
                "Oversættelse og sprog",
                "Personale og HR",
                "Pleje og omsorg",
                "Produktions- og procesteknik",
                "Projektledelse",
                "Psykologi og psykiatri",
                "Pædagog",
                "Rengøring",
                "Salg",
                "Salgsledelse",
                "Sekretær og reception",
                "Selvstændig virksomhedsdrift",
                "Service",
                "Sikkerhed",
                "Socialrådgivning",
                "Sygeplejerske og jordemoder",
                "Systemudvikling og programmering",
                "Tandlæge og klinikpersonale",
                "Teknisk sundhedsarbejde",
                "Tele- og datakommunikation",
                "Telemarketing",
                "Terapi og genoptræning",
                "Tekstil og kunsthåndværk",
                "Topledelse og bestyrelse",
                "Transport",
                "Tømrer og snedker",
                "Træ- og møbelindustri",
                "Voksenuddannelse",
                "Virksomhedsudvikling",
                "Økonomi og regnskab",
                "Økonomi- og virksomhedssystemer",
                "Økonomiledelse",
                "Øvrige"
              ]
            }
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum results to return per query / start URL (0 = unlimited). When using multiple queries, this limit applies to each query independently.",
            "default": 25
          },
          "includeDetails": {
            "title": "📋 Include Full Details",
            "type": "boolean",
            "description": "Enrich results with company social media links, career page, about text, and ratings. Disable for faster runs.",
            "default": true
          },
          "fetchJobDetail": {
            "title": "📄 Fetch Job Detail Pages",
            "type": "boolean",
            "description": "Fetch each job's detail page to extract structured salary data (salaryMin, salaryMax, salaryPeriod in DKK) and the full job description. Slower — off by default.",
            "default": false
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate description to N characters. 0 = no truncation.",
            "default": 0
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Return core fields only (ideal for AI-agent/MCP workflows).",
            "default": false
          },
          "phoneExtractionMode": {
            "title": "📞 Phone Extraction Mode",
            "enum": [
              "strict",
              "lenient"
            ],
            "type": "string",
            "description": "Strict (Tel:/+CC prefix only) or Lenient (also bare local numbers).",
            "default": "strict"
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Pick a single description representation. `all` keeps every variant; `text` / `html` / `markdown` drop the others.",
            "default": "all"
          },
          "excludeEmptyFields": {
            "title": "Exclude empty fields from output",
            "type": "boolean",
            "description": "Drop null, empty-string, and empty-array fields from each record before push. Smaller payloads for AI agents and dashboards.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Only return new and changed jobs. Requires stateKey.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Unique identifier for incremental state. Defaults to a hash of your search parameters."
          },
          "emitUnchanged": {
            "title": "♻️ Emit Unchanged",
            "type": "boolean",
            "description": "Also emit jobs that have not changed since the last run.",
            "default": false
          },
          "emitExpired": {
            "title": "⚰️ Emit Expired",
            "type": "boolean",
            "description": "Also emit jobs that have disappeared since the last run.",
            "default": false
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "When incremental, skip jobs whose content matches a previously expired job.",
            "default": false
          },
          "telegramToken": {
            "title": "🔑 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token (from @BotFather)."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat ID",
            "type": "string",
            "description": "Telegram chat or channel ID. Required when telegramToken is set."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL."
          },
          "whatsappAccessToken": {
            "title": "📱 WhatsApp Access Token",
            "type": "string",
            "description": "WhatsApp Cloud API access token."
          },
          "whatsappPhoneNumberId": {
            "title": "📞 WhatsApp Phone Number ID",
            "type": "string",
            "description": "WhatsApp Business phone-number ID."
          },
          "whatsappTo": {
            "title": "📲 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone in E.164 format without +."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Receives a JSON POST with {metadata, items} after each run."
          },
          "webhookHeaders": {
            "title": "📋 Webhook Headers",
            "type": "object",
            "description": "Optional JSON object of custom headers."
          },
          "notificationLimit": {
            "title": "📊 Max Jobs Per Notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of jobs included in each notification message (1–20).",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When Incremental Mode is on, only send notifications for NEW and UPDATED jobs.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}