{
  "openapi": "3.0.1",
  "info": {
    "title": "UK Government & NHS Jobs Scraper",
    "description": "Scrape NHS Jobs, Civil Service Jobs (every department) and Ministry of Justice vacancies in one run. Add keywords and a location and get parsed salary, grade or band, contract, working pattern, posting and closing dates, full description, person specification and apply link. $0.80 per 1,000 jobs.",
    "version": "1.0",
    "x-build-id": "f5ovvZTDIaWKTQAne"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/boncross~uk-public-sector-jobs/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-boncross-uk-public-sector-jobs",
        "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/boncross~uk-public-sector-jobs/runs": {
      "post": {
        "operationId": "runs-sync-boncross-uk-public-sector-jobs",
        "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/boncross~uk-public-sector-jobs/run-sync": {
      "post": {
        "operationId": "run-sync-boncross-uk-public-sector-jobs",
        "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": {
          "sources": {
            "title": "Boards",
            "type": "array",
            "description": "Which boards to search. Civil Service Jobs carries every department (Home Office, HMRC, HMCTS, DWP, MoD and the rest), so use the departments field to narrow it.",
            "items": {
              "type": "string",
              "enum": [
                "nhs",
                "csj",
                "moj"
              ],
              "enumTitles": [
                "NHS Jobs (jobs.nhs.uk)",
                "Civil Service Jobs (all departments)",
                "Ministry of Justice careers"
              ]
            },
            "default": [
              "nhs",
              "csj",
              "moj"
            ]
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "One search per keyword per location. An empty entry searches everything.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Town, city or postcode. NHS Jobs and Civil Service Jobs search within the radius you set. On NHS Jobs, a name shared by places in different nations (\"Newport\") is searched where the board has the most adverts for it; add the nation after a comma to choose (\"Newport, England\", \"Newport, Wales\"). Civil Service overseas adverts are included when the location is left empty, or when the location is the overseas place itself (\"Cyprus\", \"Falkland Islands\", \"Belgium\"): then the adverts whose own location names it are returned, whatever the radius. A place Civil Service Jobs does not recognise returns no UK adverts from it. The MoJ board only knows regions (London, North West, Scotland and so on), so a major city is mapped to its region.",
            "items": {
              "type": "string"
            }
          },
          "distanceMiles": {
            "title": "Distance (miles)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Radius around each location on NHS Jobs and Civil Service Jobs.",
            "default": 10
          },
          "maxJobsPerSearch": {
            "title": "Max jobs per search",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap per keyword, location and board.",
            "default": 100
          },
          "maxItems": {
            "title": "Maximum results for the whole run",
            "minimum": 0,
            "type": "integer",
            "description": "A run-wide ceiling across every target. The per-target limit above applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.",
            "default": 0
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "newest",
              "closing",
              "relevance",
              "salaryDesc",
              "salaryAsc",
              "distance"
            ],
            "type": "string",
            "description": "Newest first, closing date, relevance, salary or nearest first (nearest to each location; needs a location). NHS Jobs and Civil Service Jobs apply it; MoJ has no sort parameter, so its rows come back in the board's own order. Measured 2026-09-18. Rows are grouped by board either way.",
            "default": "newest"
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 0,
            "type": "integer",
            "description": "Drop jobs posted more than this many days ago, where the board shows a posting date (NHS Jobs does; MoJ after the detail fetch; Civil Service Jobs never does). 0 means any age.",
            "default": 0
          },
          "closingAfter": {
            "title": "Closing on or after (YYYY-MM-DD)",
            "type": "string",
            "description": "Drop adverts that close before this date. By default, adverts that have already closed are dropped."
          },
          "salaryMin": {
            "title": "Minimum salary (GBP per year)",
            "minimum": 0,
            "type": "integer",
            "description": "Drop jobs whose top-of-range annual salary is below this. Jobs with no parsed salary are kept.",
            "default": 0
          },
          "titleInclude": {
            "title": "Title must contain",
            "type": "array",
            "description": "Keep only titles containing one of these, case-insensitive. Applied before any paid detail fetch.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "titleExclude": {
            "title": "Title must not contain",
            "type": "array",
            "description": "Drop titles containing any of these.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Civil Service departments",
            "type": "array",
            "description": "Keep only adverts whose organisation name contains one of these, on every board, for example \"Home Office\", \"HM Revenue and Customs\" or \"HM Courts and Tribunals Service\". Selecting a Civil Service department with NHS Jobs also selected drops the NHS adverts that do not match.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "csjGrades": {
            "title": "Civil Service grades",
            "type": "array",
            "description": "Civil Service Jobs' own grade filter, applied by the board itself.",
            "items": {
              "type": "string",
              "enum": [
                "Administrative Assistant",
                "Administrative Officer",
                "Executive Officer",
                "Higher Executive Officer",
                "Senior Executive Officer",
                "Grade 7",
                "Grade 6",
                "SCS Pay Band 1",
                "SCS Pay Band 2",
                "SCS Pay Band 3",
                "SCS Pay Band 4",
                "Industrial",
                "Other"
              ]
            },
            "default": []
          },
          "csjRoleTypes": {
            "title": "Civil Service job categories",
            "type": "array",
            "description": "Civil Service Jobs' own job-category filter, for example \"Policy\", \"Digital\", \"Human Resources\" or \"Operational Delivery\". The site's category names; anything else is ignored with a warning.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "csjWorkingPatterns": {
            "title": "Civil Service working patterns",
            "type": "array",
            "description": "Civil Service Jobs' own working-pattern filter.",
            "items": {
              "type": "string",
              "enum": [
                "Annualised hours",
                "Compressed hours",
                "Flexible working",
                "Full-time",
                "Homeworking",
                "Job share",
                "Part year",
                "Part-time",
                "Shift working",
                "Term time working"
              ]
            },
            "default": []
          },
          "csjContractTypes": {
            "title": "Civil Service contract types",
            "type": "array",
            "description": "Civil Service Jobs' own contract-type filter.",
            "items": {
              "type": "string",
              "enum": [
                "Apprenticeship",
                "Assisted transfer",
                "Fixed term",
                "Internship",
                "Loan",
                "Overseas",
                "Permanent",
                "Returner",
                "Secondment",
                "Short notice appointment",
                "Temporary",
                "Temporary (not fair and open)",
                "Work experience"
              ]
            },
            "default": []
          },
          "employers": {
            "title": "NHS employers",
            "type": "array",
            "description": "Keep only adverts whose organisation name contains one of these, on every board, for example \"Guy's and St Thomas'\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "nhsContractTypes": {
            "title": "NHS contract types",
            "type": "array",
            "description": "NHS Jobs' own contract-type filter.",
            "items": {
              "type": "string",
              "enum": [
                "Permanent",
                "Fixed-Term",
                "Apprenticeship",
                "Voluntary",
                "Locum",
                "Training",
                "Secondment",
                "Honorary",
                "Bank",
                "NHS Reservist"
              ]
            },
            "default": []
          },
          "nhsWorkingPatterns": {
            "title": "NHS working patterns",
            "type": "array",
            "description": "NHS Jobs' own working-pattern filter.",
            "items": {
              "type": "string",
              "enum": [
                "full-time",
                "part-time",
                "job-share",
                "flexible-working",
                "remote-working",
                "compressed-hours",
                "term-time-hours",
                "annualised-hours"
              ]
            },
            "default": []
          },
          "nhsPayBands": {
            "title": "NHS pay bands",
            "type": "array",
            "description": "NHS Jobs' own pay-band filter, covering Agenda for Change bands and medical grades.",
            "items": {
              "type": "string",
              "enum": [
                "BAND_2",
                "BAND_3",
                "BAND_4",
                "BAND_5",
                "BAND_6",
                "BAND_7",
                "BAND_8A",
                "BAND_8B",
                "BAND_8C",
                "BAND_8D",
                "BAND_9",
                "SPECIALTY_DOCTOR",
                "FOUNDATION_DOCTOR",
                "CONSULTANT",
                "SPECIALTY_REGISTRAR",
                "DOCTOR_OTHER",
                "SPECIALIST",
                "VERY_SENIOR_MANAGER"
              ]
            },
            "default": []
          },
          "nhsPayRanges": {
            "title": "NHS pay ranges",
            "type": "array",
            "description": "NHS Jobs' own pay-range filter, in £ thousands a year (\"40-50\" is £40,000 to £50,000; \"100\" is £100,000 and over). Hourly-paid adverts are matched on their yearly equivalent.",
            "items": {
              "type": "string",
              "enum": [
                "0-10",
                "10-20",
                "20-30",
                "30-40",
                "40-50",
                "50-60",
                "60-70",
                "70-80",
                "80-90",
                "90-100",
                "100"
              ],
              "enumTitles": [
                "Up to £10k",
                "£10k to £20k",
                "£20k to £30k",
                "£30k to £40k",
                "£40k to £50k",
                "£50k to £60k",
                "£60k to £70k",
                "£70k to £80k",
                "£80k to £90k",
                "£90k to £100k",
                "£100k and over"
              ]
            },
            "default": []
          },
          "nhsSalaryFrom": {
            "title": "NHS salary from (GBP per year)",
            "minimum": 0,
            "type": "integer",
            "description": "NHS Jobs' own salary-range filter, lower end, in whole pounds a year. Applied by the board before anything is read. 0 means no lower end.",
            "default": 0
          },
          "nhsSalaryTo": {
            "title": "NHS salary to (GBP per year)",
            "minimum": 0,
            "type": "integer",
            "description": "NHS Jobs' own salary-range filter, upper end, in whole pounds a year. 0 means no upper end.",
            "default": 0
          },
          "nhsStaffGroups": {
            "title": "NHS staff groups",
            "type": "array",
            "description": "NHS Jobs' own staff-group filter.",
            "items": {
              "type": "string",
              "enum": [
                "ADMINISTRATIVE_AND_CLERICAL",
                "CLINICAL_SERVICES",
                "PROF_SCIENTIFIC_AND_TECHNICAL",
                "ALLIED_HEALTH_PROF",
                "ESTATES_AND_ANCILLARY",
                "HEALTHCARE_SCIENTISTS",
                "MEDICAL_AND_DENTAL",
                "NURSING_AND_MIDWIFERY_REGD",
                "STUDENTS"
              ]
            },
            "default": []
          },
          "mojRegions": {
            "title": "MoJ regions",
            "type": "array",
            "description": "The MoJ board's own region filter. Overrides the region worked out from your locations. Use the names on jobs.justice.gov.uk: London, North West, Wales, National and so on.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mojEmployment": {
            "title": "MoJ employment options",
            "type": "array",
            "description": "The MoJ board's own employment filter: Permanent, Fixed Term, Apprenticeship, Loan, Detached Duty, Internship, Graduate Placement, Expression of Interest.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mojGrades": {
            "title": "MoJ grades",
            "type": "array",
            "description": "The MoJ board's own grade filter: AA, AO, EO, HEO, SEO, Grade 7, Grade 6, SCS PB1 to PB4.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mojWorkingPatterns": {
            "title": "MoJ working patterns",
            "type": "array",
            "description": "The MoJ board's own working-pattern filter: Full Time, Part Time, Part Time/Job Share, Flexible Working, Compressed Hours, Other.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mojRoleTypes": {
            "title": "MoJ role types",
            "type": "array",
            "description": "The MoJ board's own role-type filter, for example \"Prison Officer\", \"Probation Officer\", \"Operational Support Grade\", \"Legal Services\" or \"Administration / Corporate Support\". Several are combined as either-or. The site's role-type names; anything else is ignored with a warning.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mojOrganisation": {
            "title": "MoJ organisation",
            "type": "string",
            "description": "The MoJ board's own organisation filter, one value, for example \"HMPPS - Public Sector Prisons\", \"HMPPS - Probation Service\", \"HMPPS - Youth Custody Estate\" or \"AGY - HMCTS\". The site's organisation names; anything else is ignored with a warning."
          },
          "mojPlaces": {
            "title": "MoJ places (prisons and courts)",
            "type": "array",
            "description": "The MoJ board's own \"Where\" filter: named prisons, courts and probation offices, for example \"Belmarsh\", \"HMP Wandsworth\" or \"Wandsworth County Court\". A prison goes by its name with or without HMP. Several are combined as either-or. When set, these replace your locations on the MoJ board. A name the board does not list is ignored with a warning, and if none is found the MoJ board is not searched.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mojSalaryBands": {
            "title": "MoJ salary bands",
            "type": "array",
            "description": "The MoJ board's own salary-band filter. Several are combined as either-or. An advert spanning two bands matches either.",
            "items": {
              "type": "string",
              "enum": [
                "10000-20000",
                "20001-30000",
                "30001-40000",
                "40001-50000",
                "50001-60000",
                "60001+",
                "Unpaid"
              ],
              "enumTitles": [
                "£10,000 to £20,000",
                "£20,001 to £30,000",
                "£30,001 to £40,000",
                "£40,001 to £50,000",
                "£50,001 to £60,000",
                "£60,001 and over",
                "Unpaid"
              ]
            },
            "default": []
          },
          "fetchDetails": {
            "title": "Fetch full job pages",
            "type": "boolean",
            "description": "On, you get the description, person specification, grade, benefits, contact and apply link, charged as job-detail. Off, you get listing fields only, charged at the cheaper job-listed rate.",
            "default": true
          },
          "maxNewJobs": {
            "title": "Max jobs to return",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many jobs have been pushed. 0 means no cap.",
            "default": 0
          },
          "dedupStoreName": {
            "title": "Only-new store name",
            "type": "string",
            "description": "Name a key-value store and the actor remembers every job it has returned, so scheduled runs give you only new adverts."
          },
          "csjScope": {
            "title": "Civil Service Jobs: whole board",
            "enum": [
              "search",
              "wholeBoard",
              "changedSinceLastRun"
            ],
            "type": "string",
            "description": "Search (the default) runs your keywords and locations on Civil Service Jobs like the other boards. Whole board returns every live Civil Service advert, newest change first, including adverts returned before; the per-search cap does not apply, so use the run-wide maximum to cap it. Changed since last run returns only adverts that are new or were edited since the previous run with the same dedupStoreName, which suits a daily schedule (without a store name it reads the whole board). In both whole-board options keywords, locations, distance and sort do not apply to Civil Service Jobs; the title, department, employer, salary, closing-date and Civil Service filters are applied after each advert is read, so an advert they remove is still billed as a detailed job. NHS Jobs and MoJ are searched as usual.",
            "default": "search"
          },
          "includeRawData": {
            "title": "Include extra raw fields",
            "type": "boolean",
            "description": "Keep board-specific extras such as vacancy ids and distance text on each record.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 32,
            "type": "integer",
            "description": "How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.",
            "default": 16
          },
          "delayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 0,
            "maximum": 2000,
            "type": "integer",
            "description": "Optional pause before each call, in milliseconds, up to 2,000. 0 (the default) runs as fast as the parallel limit allows.",
            "default": 0
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}