{
  "openapi": "3.0.1",
  "info": {
    "title": "NHS Jobs Scraper",
    "description": "Scrape NHS Jobs vacancies by keyword and location. Just add a job title and a town or postcode and get employer, pay band, salary as numbers, contract type, working pattern, posting and closing dates, the full advert, person specification, contact and apply link. $0.80 per 1,000 jobs.",
    "version": "1.0",
    "x-build-id": "cRgsSQg9Vh7ZDsOdI"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/boncross~nhs-jobs/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-boncross-nhs-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~nhs-jobs/runs": {
      "post": {
        "operationId": "runs-sync-boncross-nhs-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~nhs-jobs/run-sync": {
      "post": {
        "operationId": "run-sync-boncross-nhs-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": {
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Job titles, skills or reference words to search NHS Jobs for, for example \"staff nurse\", \"healthcare assistant\" or \"medical secretary\". One search per keyword per location. Leave empty to take every advert in the locations.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Town, city or postcode; each is searched within the distance below. Leave empty to search the whole of NHS Jobs. A name shared by places in different nations (\"Newport\") is searched where NHS Jobs has the most adverts for it; add the nation after a comma to choose (\"Newport, England\", \"Newport, Wales\").",
            "items": {
              "type": "string"
            }
          },
          "distanceMiles": {
            "title": "Distance (miles)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Radius around each location.",
            "default": 10
          },
          "maxJobsPerSearch": {
            "title": "Max jobs per search",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap per keyword and location.",
            "default": 100
          },
          "maxItems": {
            "title": "Maximum results for the whole run",
            "minimum": 0,
            "type": "integer",
            "description": "A run-wide ceiling across every search. The per-search limit above applies to each keyword and location separately, so ten searches at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report a search that could not be run are not counted here and are never charged for.",
            "default": 0
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "newest",
              "closing",
              "relevance",
              "salaryDesc",
              "salaryAsc",
              "distance"
            ],
            "type": "string",
            "description": "The order NHS Jobs lists each search in: newest first, closing soonest, most relevant, salary, or nearest first (nearest to each location; needs a location). With a cap, this decides which adverts you get.",
            "default": "newest"
          },
          "payBands": {
            "title": "Pay bands",
            "type": "array",
            "description": "Agenda for Change bands and medical grades. Several are combined as either-or.",
            "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"
              ],
              "enumTitles": [
                "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": []
          },
          "staffGroups": {
            "title": "Staff groups",
            "type": "array",
            "description": "NHS staff groups, for example nursing and midwifery, administrative and clerical, or estates and ancillary. Several are combined as either-or.",
            "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"
              ],
              "enumTitles": [
                "Administrative and clerical",
                "Additional clinical services",
                "Additional professional, scientific and technical",
                "Allied health professionals",
                "Estates and ancillary",
                "Healthcare scientists",
                "Medical and dental",
                "Nursing and midwifery registered",
                "Students"
              ]
            },
            "default": []
          },
          "contractTypes": {
            "title": "Contract types",
            "type": "array",
            "description": "Permanent, fixed-term, bank and the other contract types NHS Jobs lists.",
            "items": {
              "type": "string",
              "enum": [
                "Permanent",
                "Fixed-Term",
                "Apprenticeship",
                "Voluntary",
                "Locum",
                "Training",
                "Secondment",
                "Honorary",
                "Bank",
                "NHS Reservist"
              ]
            },
            "default": []
          },
          "workingPatterns": {
            "title": "Working patterns",
            "type": "array",
            "description": "Full-time, part-time, job share, flexible, home or remote working and the other patterns NHS Jobs lists.",
            "items": {
              "type": "string",
              "enum": [
                "full-time",
                "part-time",
                "job-share",
                "flexible-working",
                "remote-working",
                "compressed-hours",
                "term-time-hours",
                "annualised-hours"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Job share",
                "Flexible working",
                "Home or remote working",
                "Compressed hours",
                "Term time hours",
                "Annualised hours"
              ]
            },
            "default": []
          },
          "payRanges": {
            "title": "Pay ranges",
            "type": "array",
            "description": "NHS Jobs' pay-range boxes, 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": []
          },
          "salaryFrom": {
            "title": "Salary from (GBP per year)",
            "minimum": 0,
            "type": "integer",
            "description": "Lower end of a salary range, in whole pounds a year. 0 means no lower end.",
            "default": 0
          },
          "salaryTo": {
            "title": "Salary to (GBP per year)",
            "minimum": 0,
            "type": "integer",
            "description": "Upper end of a salary range, in whole pounds a year. 0 means no upper end.",
            "default": 0
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 0,
            "type": "integer",
            "description": "Drop adverts posted more than this many days ago. 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. Adverts that have already closed are always dropped."
          },
          "employers": {
            "title": "Employers",
            "type": "array",
            "description": "Keep only adverts whose employer name contains one of these, case-insensitive, for example \"Guy's and St Thomas'\" or \"Ambulance Service\". Applied before a job is charged as detailed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "titleInclude": {
            "title": "Title must contain",
            "type": "array",
            "description": "Keep only titles containing one of these, case-insensitive.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "titleExclude": {
            "title": "Title must not contain",
            "type": "array",
            "description": "Drop titles containing any of these, case-insensitive.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch full adverts",
            "type": "boolean",
            "description": "On, each row carries the full advert: description, duties, person specification, band, address, contact and apply link, charged as job-detail. Off, you get the search-result fields only (title, employer, location, salary, dates, contract type and working pattern), 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 returned. 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."
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}