{
  "openapi": "3.0.1",
  "info": {
    "title": "Jobindex.dk Jobs Scraper — Danish Job Ads & Employers",
    "description": "From $0.50 per 1,000 ads. Scrape Denmark's largest job board by keyword, one of 81 job categories, any of 110 locations, address radius, employer, contract type or date posted. Employer name + website, address & coordinates, deadline, rating. Optional full ad text and contact e-mail.",
    "version": "0.1",
    "x-build-id": "BgjpBXRp8yfg6qNAR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~jobindex-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-jobindex-jobs-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/scrapersdelight~jobindex-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-jobindex-jobs-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/scrapersdelight~jobindex-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-jobindex-jobs-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": {
          "searchUrls": {
            "title": "Search URLs (paste from the browser)",
            "type": "array",
            "description": "Paste any jobindex.dk/jobsoegning URL straight out of your browser after building a search in their UI — the query string is parsed and used as-is. This is the fastest way to reproduce a filter you already made on the site. When you supply URLs, the individual filter fields below are IGNORED (each URL is its own search); \"Sort order\", \"Max pages per search\" and all the output toggles still apply.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "queries": {
            "title": "Keywords (q)",
            "type": "array",
            "description": "Free-text keywords, one search per entry. Danish terms match best. Measured hit counts on 2026-09-05: \"udvikler\" 8,322 · \"sygeplejerske\" 1,609 · \"elektriker\" 385. Leave empty to search the whole corpus (18,970 live ads measured 2026-09-05).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "subcategoryIds": {
            "title": "Job categories (subid)",
            "type": "array",
            "description": "Jobindex's own 81-value subcategory taxonomy, grouped by its 10 parent families. Several categories are OR-ed together (measured: subid 1 = 431 ads, subid 17 = 755 ads, both together = 1,186 = the exact sum). Combined with a region or keyword they are AND-ed (subid 1 + København = 132).",
            "items": {
              "type": "string",
              "enum": [
                "99",
                "23",
                "70",
                "124",
                "98",
                "56",
                "67",
                "73",
                "71",
                "112",
                "96",
                "24",
                "80",
                "44",
                "90",
                "74",
                "25",
                "97",
                "95",
                "36",
                "92",
                "83",
                "104",
                "40",
                "93",
                "6",
                "4",
                "3",
                "1",
                "7",
                "2",
                "8",
                "11",
                "94",
                "121",
                "85",
                "10",
                "122",
                "126",
                "60",
                "35",
                "53",
                "52",
                "18",
                "54",
                "38",
                "106",
                "21",
                "33",
                "81",
                "79",
                "14",
                "12",
                "61",
                "75",
                "13",
                "125",
                "110",
                "89",
                "49",
                "65",
                "55",
                "58",
                "120",
                "57",
                "16",
                "63",
                "47",
                "91",
                "77",
                "17",
                "51",
                "100",
                "41",
                "37",
                "45",
                "28",
                "27",
                "103",
                "127",
                "15"
              ],
              "enumTitles": [
                "Handel og service › Bud og udbringning (99)",
                "Handel og service › Børnepasning (23)",
                "Handel og service › Detailhandel (70)",
                "Handel og service › Detailledelse (124)",
                "Handel og service › Ejendomsservice (98)",
                "Handel og service › Frisør og personlig pleje (56)",
                "Handel og service › Hotel, restaurant og køkken (67)",
                "Handel og service › Rengøring (73)",
                "Handel og service › Service (71)",
                "Handel og service › Sikkerhed (112)",
                "Industri og håndværk › Blik og rør (96)",
                "Industri og håndværk › Bygge og anlæg (24)",
                "Industri og håndværk › Elektriker (80)",
                "Industri og håndværk › Industriel produktion (44)",
                "Industri og håndværk › Jern og metal (90)",
                "Industri og håndværk › Lager (74)",
                "Industri og håndværk › Landbrug, skov og fiskeri (25)",
                "Industri og håndværk › Maling og overfladebehandling (97)",
                "Industri og håndværk › Mekanik og auto (95)",
                "Industri og håndværk › Nærings- og nydelsesmiddel (36)",
                "Industri og håndværk › Tekstil og kunsthåndværk (92)",
                "Industri og håndværk › Transport (83)",
                "Industri og håndværk › Træ- og møbelindustri (104)",
                "Industri og håndværk › Tømrer og snedker (40)",
                "Informationsteknologi › Database (93)",
                "Informationsteknologi › Internet og WWW (6)",
                "Informationsteknologi › IT-drift og support (4)",
                "Informationsteknologi › IT-ledelse (3)",
                "Informationsteknologi › Systemudvikling og programmering (1)",
                "Informationsteknologi › Tele- og datakommunikation (7)",
                "Informationsteknologi › Økonomi- og virksomhedssystemer (2)",
                "Ingeniør og teknik › Bygge- og anlægsteknik (8)",
                "Ingeniør og teknik › Elektroteknik (11)",
                "Ingeniør og teknik › Kemi og bioteknik (94)",
                "Ingeniør og teknik › Ledelse inden for ingeniør og teknik (121)",
                "Ingeniør og teknik › Maskinteknik (85)",
                "Ingeniør og teknik › Medicinal og levnedsmiddel (10)",
                "Ingeniør og teknik › Produktions- og procesteknik (122)",
                "Kontor og økonomi › Akademisk og politisk arbejde (126)",
                "Kontor og økonomi › Ejendomsmægler (60)",
                "Kontor og økonomi › Finans og forsikring (35)",
                "Kontor og økonomi › Indkøb (53)",
                "Kontor og økonomi › Jura (52)",
                "Kontor og økonomi › Kontor (18)",
                "Kontor og økonomi › Logistik og spedition (54)",
                "Kontor og økonomi › Offentlig administration (38)",
                "Kontor og økonomi › Oversættelse og sprog (106)",
                "Kontor og økonomi › Sekretær og reception (21)",
                "Kontor og økonomi › Økonomi og regnskab (33)",
                "Kontor og økonomi › Økonomiledelse (81)",
                "Ledelse og personale › Institutions- og skoleledelse (79)",
                "Ledelse og personale › Ledelse (14)",
                "Ledelse og personale › Personale og HR (12)",
                "Ledelse og personale › Projektledelse (61)",
                "Ledelse og personale › Salgsledelse (75)",
                "Ledelse og personale › Topledelse og bestyrelse (13)",
                "Ledelse og personale › Virksomhedsudvikling (125)",
                "Salg og kommunikation › Design og formgivning (110)",
                "Salg og kommunikation › Grafisk (89)",
                "Salg og kommunikation › Kommunikation og journalistik (49)",
                "Salg og kommunikation › Kultur og kirke (65)",
                "Salg og kommunikation › Marketing (55)",
                "Salg og kommunikation › Salg (58)",
                "Salg og kommunikation › Selvstændig virksomhedsdrift (120)",
                "Salg og kommunikation › Telemarketing (57)",
                "Social og sundhed › Læge (16)",
                "Social og sundhed › Lægesekretær (63)",
                "Social og sundhed › Pleje og omsorg (47)",
                "Social og sundhed › Psykologi og psykiatri (91)",
                "Social og sundhed › Socialrådgivning (77)",
                "Social og sundhed › Sygeplejerske og jordemoder (17)",
                "Social og sundhed › Tandlæge og klinikpersonale (51)",
                "Social og sundhed › Teknisk sundhedsarbejde (100)",
                "Social og sundhed › Terapi og genoptræning (41)",
                "Undervisning › Bibliotek (37)",
                "Undervisning › Forskning (45)",
                "Undervisning › Lærer (28)",
                "Undervisning › Pædagog (27)",
                "Undervisning › Voksenuddannelse (103)",
                "Øvrige stillinger › Forsvar og efterretning (127)",
                "Øvrige stillinger › Øvrige (15)"
              ]
            },
            "default": []
          },
          "geoAreaIds": {
            "title": "Locations (geoareaid)",
            "type": "array",
            "description": "The live 110-value location vocabulary in four tiers — Land (Danmark, Grønland, Færøerne, Udlandet), Region, Område (Storkøbenhavn, Nordsjælland, Fyn, Sydjylland, Skåne) and all 98 kommuner. OR-ed together (measured: København 2,567 + Aarhus 1,419 → both 3,940, the 46-ad difference being ads listed in both).",
            "items": {
              "type": "string",
              "enum": [
                "1221",
                "15799",
                "15271",
                "2",
                "3",
                "4",
                "15179",
                "15187",
                "16149",
                "15182",
                "15180",
                "15185",
                "10",
                "11",
                "12",
                "13",
                "14",
                "15",
                "16",
                "17",
                "18",
                "19",
                "20",
                "22",
                "23",
                "24",
                "25",
                "26",
                "27",
                "28",
                "29",
                "30",
                "21",
                "31",
                "32",
                "33",
                "34",
                "35",
                "36",
                "37",
                "38",
                "39",
                "40",
                "41",
                "42",
                "43",
                "44",
                "47",
                "48",
                "49",
                "50",
                "45",
                "46",
                "51",
                "52",
                "53",
                "54",
                "55",
                "58",
                "56",
                "57",
                "60",
                "61",
                "62",
                "63",
                "64",
                "59",
                "65",
                "66",
                "67",
                "69",
                "70",
                "71",
                "68",
                "72",
                "73",
                "74",
                "75",
                "76",
                "77",
                "78",
                "80",
                "81",
                "79",
                "82",
                "83",
                "84",
                "85",
                "86",
                "88",
                "89",
                "90",
                "91",
                "92",
                "93",
                "87",
                "95",
                "96",
                "94",
                "97",
                "98",
                "99",
                "100",
                "101",
                "102",
                "103",
                "9",
                "6",
                "7",
                "8"
              ],
              "enumTitles": [
                "Land › Danmark (1221)",
                "Land › Færøerne (15799)",
                "Land › Grønland (15271)",
                "Region › Region Midtjylland (2)",
                "Region › Region Nordjylland (3)",
                "Region › Region Sjælland (4)",
                "Område › Fyn (15179)",
                "Område › Nordsjælland (15187)",
                "Område › Skåne (16149)",
                "Område › Storkøbenhavn (15182)",
                "Område › Sydjylland (15180)",
                "Område › Udlandet (15185)",
                "Kommune › Albertslund (10)",
                "Kommune › Allerød (11)",
                "Kommune › Assens (12)",
                "Kommune › Ballerup (13)",
                "Kommune › Billund (14)",
                "Kommune › Bornholm (15)",
                "Kommune › Brøndby (16)",
                "Kommune › Brønderslev (17)",
                "Kommune › Dragør (18)",
                "Kommune › Egedal (19)",
                "Kommune › Esbjerg (20)",
                "Kommune › Fanø (22)",
                "Kommune › Favrskov (23)",
                "Kommune › Faxe (24)",
                "Kommune › Fredensborg (25)",
                "Kommune › Fredericia (26)",
                "Kommune › Frederiksberg (27)",
                "Kommune › Frederikshavn (28)",
                "Kommune › Frederikssund (29)",
                "Kommune › Furesø (30)",
                "Kommune › Faaborg-Midtfyn (21)",
                "Kommune › Gentofte (31)",
                "Kommune › Gladsaxe (32)",
                "Kommune › Glostrup (33)",
                "Kommune › Greve (34)",
                "Kommune › Gribskov (35)",
                "Kommune › Guldborgsund (36)",
                "Kommune › Haderslev (37)",
                "Kommune › Halsnæs (38)",
                "Kommune › Hedensted (39)",
                "Kommune › Helsingør (40)",
                "Kommune › Herlev (41)",
                "Kommune › Herning (42)",
                "Kommune › Hillerød (43)",
                "Kommune › Hjørring (44)",
                "Kommune › Holbæk (47)",
                "Kommune › Holstebro (48)",
                "Kommune › Horsens (49)",
                "Kommune › Hvidovre (50)",
                "Kommune › Høje Taastrup (45)",
                "Kommune › Hørsholm (46)",
                "Kommune › Ikast-Brande (51)",
                "Kommune › Ishøj (52)",
                "Kommune › Jammerbugt (53)",
                "Kommune › Kalundborg (54)",
                "Kommune › Kerteminde (55)",
                "Kommune › Kolding (58)",
                "Kommune › København (56)",
                "Kommune › Køge (57)",
                "Kommune › Langeland (60)",
                "Kommune › Lejre (61)",
                "Kommune › Lemvig (62)",
                "Kommune › Lolland (63)",
                "Kommune › Lyngby-Taarbæk (64)",
                "Kommune › Læsø (59)",
                "Kommune › Mariagerfjord (65)",
                "Kommune › Middelfart (66)",
                "Kommune › Morsø (67)",
                "Kommune › Norddjurs (69)",
                "Kommune › Nordfyn (70)",
                "Kommune › Nyborg (71)",
                "Kommune › Næstved (68)",
                "Kommune › Odder (72)",
                "Kommune › Odense (73)",
                "Kommune › Odsherred (74)",
                "Kommune › Randers (75)",
                "Kommune › Rebild (76)",
                "Kommune › Ringkøbing-Skjern (77)",
                "Kommune › Ringsted (78)",
                "Kommune › Roskilde (80)",
                "Kommune › Rudersdal (81)",
                "Kommune › Rødovre (79)",
                "Kommune › Samsø (82)",
                "Kommune › Silkeborg (83)",
                "Kommune › Skanderborg (84)",
                "Kommune › Skive (85)",
                "Kommune › Slagelse (86)",
                "Kommune › Solrød (88)",
                "Kommune › Sorø (89)",
                "Kommune › Stevns (90)",
                "Kommune › Struer (91)",
                "Kommune › Svendborg (92)",
                "Kommune › Syddjurs (93)",
                "Kommune › Sønderborg (87)",
                "Kommune › Thisted (95)",
                "Kommune › Tønder (96)",
                "Kommune › Tårnby (94)",
                "Kommune › Vallensbæk (97)",
                "Kommune › Varde (98)",
                "Kommune › Vejen (99)",
                "Kommune › Vejle (100)",
                "Kommune › Vesthimmerland (101)",
                "Kommune › Viborg (102)",
                "Kommune › Vordingborg (103)",
                "Kommune › Ærø (9)",
                "Kommune › Aabenraa (6)",
                "Kommune › Aalborg (7)",
                "Kommune › Aarhus (8)"
              ]
            },
            "default": []
          },
          "address": {
            "title": "Address / place for a radius search",
            "type": "string",
            "description": "A town, postcode or street (\"Aarhus\", \"8000 Aarhus C\", \"Odense\"). Only has an effect together with \"Radius\" below — on its own it is ignored by the site and you get the whole corpus back. Measured from Aarhus: 5 km 812 ads · 10 km 1,235 · 25 km 1,705 · 50 km 2,698 · 100 km 6,989."
          },
          "radiusKm": {
            "title": "Radius (km) around that address",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "Distance in kilometres from \"Address\" above. Must be 1 or more — jobindex.dk answers radius=0 with a 404, so the actor drops a 0 rather than sending it. Ignored unless an address is set."
          },
          "companyIds": {
            "title": "Employer IDs (companyid)",
            "type": "array",
            "description": "Watch specific employers: every open ad for one company. The id is the number in a jobindex.dk/virksomhed/<ID>/<slug> profile URL, and the actor also returns it as companyId on every row, so you can pull a list once and then monitor those accounts forever. Measured: companyid 24096 = 39 open ads.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "jobTitleIds": {
            "title": "Normalised job-title IDs (jobtitleid) — advanced",
            "type": "array",
            "description": "Jobindex's normalised job-title taxonomy. There is no public list of these ids; take them from a jobtitleid= parameter in a search URL you built on the site. Verified as a real filter (jobtitleid=100 → 3 ads, jobtitleid=2000 → 0). Most users should use Keywords or Job categories instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "employmentTypes": {
            "title": "Employment type (employment_type)",
            "type": "array",
            "description": "OR-ed together (measured: Studiejob 1,869 → Studiejob + Praktikplads 1,988).",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "10",
                "4",
                "5",
                "6",
                "8",
                "9",
                "11",
                "12",
                "-1"
              ],
              "enumTitles": [
                "Fastansættelse (1)",
                "Tidsbegrænset (2)",
                "Studiejob (3)",
                "Ungarbejder/fritidsjob (10)",
                "Elev/lærling (4)",
                "Graduate/trainee (5)",
                "Praktikplads (6)",
                "Fleksjob (8)",
                "Frivillig (9)",
                "Freelance (11)",
                "Timeansat/tilkaldevikar (12)",
                "Vis job uden angivet ansættelsestype (-1)"
              ]
            },
            "default": []
          },
          "workingHoursTypes": {
            "title": "Working hours (workinghours_type)",
            "type": "array",
            "description": "Full-time / part-time. Measured: Deltid (part-time) = 4,374 ads.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "-1"
              ],
              "enumTitles": [
                "Fuldtid (1)",
                "Deltid (2)",
                "Vis job uden angivet arbejdstid (-1)"
              ]
            },
            "default": []
          },
          "remoteMode": {
            "title": "Home working (employment_place)",
            "enum": [
              "",
              "3",
              "1",
              "2",
              "4"
            ],
            "type": "string",
            "description": "WARNING — \"100 % hjemmearbejde\" is a genuinely tiny slice of the Danish market: measured 9 live ads today, against 630 for \"Muligt\" (remote possible). If you pick it and get ~9 rows, the run is not broken.",
            "default": ""
          },
          "postedWithin": {
            "title": "Posted within (jobage)",
            "enum": [
              "",
              "0",
              "7",
              "30",
              "9999"
            ],
            "type": "string",
            "description": "The monitoring lever. Jobindex's own hit counts, measured 2026-09-05: \"Sidste 7 dage\" 7,480 · \"Sidste 30 dage\" 21,176 · \"Online\" 23,706 · no filter 18,970. \"Fra i dag\" tracks the current day and so swings from a handful late at night to the low hundreds by late afternoon. Run this daily or weekly with \"Sidste 7 dage\" and you get a live feed of newly hiring Danish employers instead of one static dump.",
            "default": ""
          },
          "sortBy": {
            "title": "Sort order (sort) — leave on \"Newest first\"",
            "enum": [
              "date",
              "score"
            ],
            "type": "string",
            "description": "CORRECTNESS SETTING, not cosmetics. Jobindex paginates by offset over a live re-ranked index. Measured on contiguous page bands: relevance order returned 240 raw / 198 unique rows over pages 1-12 (17.5% duplicates) and silently lost about a sixth of the corpus, while date order returned 431 raw / 431 unique over the full 23-page depth of a 431-ad search — exactly the hit count, zero duplicates. Keep \"Newest first\" unless you specifically want relevance ranking.",
            "default": "date"
          },
          "maxItems": {
            "title": "Max jobs to return",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on delivered — and therefore billed — rows across the whole run. 0 means no cap. Duplicates and rows dropped by your filters never count against it and are never charged.",
            "default": 100
          },
          "maxPagesPerQuery": {
            "title": "Max pages per search",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "20 ads per page. The site itself stops at page 50, so anything above 50 is clamped to 50.",
            "default": 50
          },
          "partitionBy": {
            "title": "Split searches by (breaks the 1,000-ad ceiling)",
            "enum": [
              "none",
              "subcategory",
              "geoArea",
              "subcategoryAndGeoArea"
            ],
            "type": "string",
            "description": "By default all the categories/locations you picked are OR-ed into ONE search, which the site caps at 1,000 ads. Splitting runs a SEPARATE search per category and/or per location, so each cell stays under the cap and you can pull far more of the corpus. Measured 2026-09-05: only 3 of the 81 categories exceed 1,000 on their own (Pædagog 1,841 · Pleje og omsorg 1,508 · Detailhandel 1,275) and splitting those by region drops every cell well below it. Rows are still de-duplicated on the ad id across every partition, so an ad filed under two categories is delivered and billed once.",
            "default": "none"
          },
          "onlyNewSince": {
            "title": "Only ads first posted on/after this date",
            "type": "string",
            "description": "ISO date, e.g. 2026-09-01. Compared against the ad's own first-published date. Older ads are dropped before delivery, so they are never billed — this is the cheap way to run the same saved search on a schedule and pay only for what is new."
          },
          "excludeSponsored": {
            "title": "Drop sponsored / branded placements",
            "type": "boolean",
            "description": "Jobindex re-injects paid, branded placements into result pages. They are real ads, but if you are building a clean corpus you may not want them. Dropped rows are never billed.",
            "default": false
          },
          "dedupeByTid": {
            "title": "De-duplicate on the ad id",
            "type": "boolean",
            "description": "Collapse repeats on the stable ad id (tid) BEFORE delivery and before billing. Leave this on — it is what stops you paying twice for the same ad when it appears in two categories or on two pages.",
            "default": true
          },
          "fetchFullDescription": {
            "title": "Fetch the FULL ad text + contact details (1 extra request per ad)",
            "type": "boolean",
            "description": "OFF by default. The search payload already carries a free teaser (measured 30-399 characters, median ~300). Turn this on and the actor also opens each ad's own page at jobindex.dk/jobannonce/<id>, which for most ads redirects to the employer's own careers/ATS page — and mines the full advert text, any contact e-mail and any phone number from it. Measured on 50 consecutive live ads 2026-09-05 (run aQj5NkYyWihxUc0TG): 43/50 returned a usable advert, all 43 longer than the teaser (median 7,467 characters), 25/50 yielded a contact e-mail, 22/50 a phone number, 36/50 landed on the employer's own domain; 6 third-party sites did not answer and 1 served a PDF instead of a page, and those rows keep the free teaser. It costs one extra HTTP request per ad — the 50-ad run took 73 seconds end to end at the default concurrency of 4 — and it is NOT charged as a separate event: it is included in the per-ad price.",
            "default": false
          },
          "includeDescription": {
            "title": "Include the ad teaser text",
            "type": "boolean",
            "description": "The ad teaser rendered from the markup that ships with the search results. Measured across 2,300 ads on 2026-09-05: 30–399 characters, median 286–300. Free — no extra request. Verified present on 100% of ads.",
            "default": true
          },
          "includeGeo": {
            "title": "Include geo fields",
            "type": "boolean",
            "description": "Street address, postcode, city, latitude and longitude. Measured fill: ~84% of ads carry a mapped address.",
            "default": true
          },
          "includeCompanyRatings": {
            "title": "Include employer rating + follower count",
            "type": "boolean",
            "description": "Jobindex's own employer rating (1-5), the number of reviews behind it, and how many people follow the company. Measured fill: ~60% of ads have a rating.",
            "default": true
          },
          "includeRawHtml": {
            "title": "Include the raw ad HTML",
            "type": "boolean",
            "description": "Adds the ad's raw markup blob (roughly 9-20 KB per row). Useful if you want to re-parse yourself; it will bloat your dataset badly on large runs.",
            "default": false
          },
          "addressFormat": {
            "title": "Address shape",
            "enum": [
              "flat",
              "nested"
            ],
            "type": "string",
            "description": "Flat inlines the first address into the row (best for CSV/Sheets). Nested keeps jobindex's full addresses[] array and its GeoJSON feature collection intact (best for ads with several worksites).",
            "default": "flat"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify DATACENTER proxy is measured-sufficient here: 195+ live calls, zero 403s, zero CAPTCHAs, no rate limiting. Residential is NOT needed and only costs you more; switch only if you want Danish exit IPs or you are bringing your own proxies.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many pages/ad pages to fetch at once. 3-5 is polite and was measured clean; the site showed no rate limiting at these levels.",
            "default": 4
          },
          "requestRetries": {
            "title": "Retries per request",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Keep at 3 or more. The single failure across 195 measured live calls was a transient \"HTTP/2 stream early terminated\" that succeeded on retry — it was not a block.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}