{
  "openapi": "3.1.1",
  "info": {
    "title": "UK Labour Market Information API",
    "description": "Labour market information for the UK, built entirely from open data: what\r\noccupations pay, how many people work in them, and what the work involves.\r\n\r\n**Start here.** Resolve a job title to an occupation with\r\n`/v1/occupations/search?q=…`, then use its four-digit SOC 2020 code with the\r\nother endpoints.\r\n\r\n**Authentication.** Send your key in the `X-API-Key` header. The `/v1/meta`\r\nendpoints are open.\r\n\r\n**Before showing any figure**, check `presentable`. Survey estimates vary\r\nin reliability; a figure marked unreliable should not be shown as a number.\r\nRead `coverage`, which says what a figure counts and when - pay counts\r\nemployee jobs, employment counts people including the self-employed. A\r\nfigure ONS withholds is `null`, never zero.\r\n\r\n**Attribution.** The data is free to reuse, but its licences require you to\r\ncredit it wherever you show it. For pay, employment and occupations: \"Source:\r\nOffice for National Statistics licensed under the Open Government Licence\r\nv.3.0\". For skills: \"This service uses the ESCO classification of the\r\nEuropean Commission\". Each response's `provenance` names the exact release.\r\n\r\nThis service uses the ESCO classification of the European Commission.\r\n\r\nErrors use RFC 9457 problem details.",
    "version": "v1"
  },
  "paths": {
    "/v1/occupations/{soc}/employment": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get employment for an occupation.",
        "description": "How many people work in the occupation, how that has changed year by\r\nyear, and who they are - the shares who are women, part-time and\r\nself-employed - from the ONS Annual Population Survey.\r\n\r\nAvailable for the UK and each nation only; the breakdown is UK-only and\r\nnull for a nation. These figures count people, including the\r\nself-employed, so they differ from the job counts that accompany pay.\r\n`notes` flags when a large self-employed share means pay figures describe\r\nonly part of the occupation - worth passing on to users.",
        "operationId": "GetOccupationEmployment",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "area",
            "in": "query",
            "description": "uk (default), england, wales, scotland or northern-ireland.",
            "schema": {
              "enum": [
                "uk",
                "england",
                "wales",
                "scotland",
                "northern-ireland"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmploymentResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/projections": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get the employment outlook for an occupation.",
        "description": "Whether the occupation's broad group is projected to grow or shrink to\r\n2035, and how many job openings it is expected to have - from growth and\r\nfrom replacing people who retire or leave. Openings are usually large\r\neven for a shrinking group, which is often the more useful message.\r\n\r\nFrom the Department for Education's projections (The Skills Imperative\r\n2035). They exist only for SOC 2020 sub-major groups, each covering about\r\nsixteen occupations, so the figures are for the occupation's group and\r\n`derivation` says which. They are modelled trends, not forecasts; pass on\r\n`accuracy`. Figures for a group under 10,000 jobs in an area are null\r\nand marked not `presentable`: the publisher asks users not to publish them. Wherever the\r\nfigures are shown, the publisher requires `citation`.\r\n\r\n`byQualification` splits the outlook by the highest qualification\r\nworkers hold, so you can say which levels the openings are for. These\r\ncells are smaller and so more often below the 10,000 threshold,\r\nparticularly in regions.",
        "operationId": "GetOccupationProjections",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "area",
            "in": "query",
            "description": "uk (default), a nation, or an English region.",
            "schema": {
              "enum": [
                "uk",
                "england",
                "wales",
                "scotland",
                "northern-ireland",
                "north-east",
                "north-west",
                "yorkshire-and-the-humber",
                "east-midlands",
                "west-midlands",
                "east-of-england",
                "london",
                "south-east",
                "south-west"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectionResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/vacancies": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get skill shortages for an occupation.",
        "description": "How many vacancies employers had in the occupation, how many were hard to\r\nfill, and how many were hard to fill because applicants lacked the skills -\r\nthe standard measure of a skill shortage. From the Employer Skills Survey.\r\n\r\nThe survey withholds figures based on fewer than 30 employers, which rules\r\nout most four-digit occupations. The response uses the finest level the\r\nsurvey published - the occupation itself where possible, otherwise its\r\nminor, sub-major or major group - and `group` and `derivation` say which.\r\n`allOccupations` gives the same measures for the whole economy for comparison.",
        "operationId": "GetOccupationVacancies",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "area",
            "in": "query",
            "description": "uk (default) or a nation. The survey does not publish occupation figures for English regions.",
            "schema": {
              "enum": [
                "uk",
                "england",
                "wales",
                "scotland",
                "northern-ireland"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VacancyResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/demand": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get whether an occupation is in demand.",
        "description": "The occupation's level in the DfE / Skills England Occupations in Demand\r\nindex - critical, elevated or not in high demand - and which of the five\r\nindicators behind it were signalling. `previous` is the year before,\r\nre-assessed on the same method, so the two can be compared.\r\n\r\nShow `uncertainty`, `imputation` and `capping` where present: they are\r\nthe publisher's own caveats on this occupation.",
        "operationId": "GetOccupationDemand",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/demand": {
      "get": {
        "tags": [
          "Demand"
        ],
        "summary": "List occupations by demand level.",
        "description": "Every assessed occupation at the given level in the latest year, highest\r\ndemand index first. Without `level`, the occupations in critical and\r\nelevated demand.",
        "operationId": "ListOccupationsInDemand",
        "parameters": [
          {
            "name": "level",
            "in": "query",
            "description": "critical, elevated or not_in_high_demand.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/visas": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get sponsored work visas for an occupation.",
        "description": "How many people were granted visas to come to the UK to work in the\r\noccupation, from the Home Office's quarterly immigration statistics:\r\nevery quarter since Q4 2024, and the latest four quarters broken down by\r\nvisa route, nationality and the sponsor's industry, with the occupation's\r\nrank among all occupations.\r\n\r\nA measure of how far employers recruit from abroad for the occupation,\r\nnot of how many vacancies it has.",
        "operationId": "GetOccupationVisas",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VisaResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/visas": {
      "get": {
        "tags": [
          "Visas"
        ],
        "summary": "List occupations by sponsored work visas granted.",
        "description": "Every occupation granted at least one sponsored work visa in the latest\r\nfour quarters, most first.",
        "operationId": "ListOccupationsByVisas",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "How many to return, most first. Default 50, at most 412.",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VisaListResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/job-adverts": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get new online job adverts for an occupation.",
        "description": "How many new job adverts appeared online for the occupation each month\r\nsince January 2017, from ONS's labour demand volumes, with the latest\r\ntwelve months totalled, compared with the twelve before, and ranked\r\nagainst every other occupation.\r\n\r\nONS has suppressed some recent months after source problems; those are\r\nnull and left out of totals, and `monthsSuppressed` says how many. Show\r\n`notices` alongside any recent figures.",
        "operationId": "GetOccupationJobAdverts",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "area",
            "in": "query",
            "description": "uk (default), a nation, or an English region.",
            "schema": {
              "enum": [
                "uk",
                "wales",
                "scotland",
                "north-east",
                "north-west",
                "yorkshire-and-the-humber",
                "east-midlands",
                "west-midlands",
                "east-of-england",
                "london",
                "south-east",
                "south-west"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobAdvertResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/job-adverts": {
      "get": {
        "tags": [
          "Job adverts"
        ],
        "summary": "List occupations by new online job adverts.",
        "description": "Occupations ranked by new online job adverts over the latest twelve\r\nmonths in the area, most first, with the change on the year before.",
        "operationId": "ListOccupationsByJobAdverts",
        "parameters": [
          {
            "name": "area",
            "in": "query",
            "description": "uk (default), a nation, or an English region.",
            "schema": {
              "enum": [
                "uk",
                "wales",
                "scotland",
                "north-east",
                "north-west",
                "yorkshire-and-the-humber",
                "east-midlands",
                "west-midlands",
                "east-of-england",
                "london",
                "south-east",
                "south-west"
              ],
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "How many to return. Default 50, at most 412.",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobAdvertListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/local-areas": {
      "get": {
        "tags": [
          "Local areas"
        ],
        "summary": "List local areas.",
        "description": "The local authorities job adverts are published for, with the slug to\r\npass as `{area}`. London is one area: ONS does not split it by borough.",
        "operationId": "ListLocalAreas",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LocalArea"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/local-areas/{area}/job-adverts": {
      "get": {
        "tags": [
          "Local areas"
        ],
        "summary": "Get the occupations with most job adverts in a local area.",
        "description": "Occupations ranked by new online job adverts in the area over the latest\r\nfour quarters, with the change on the four before.",
        "operationId": "GetLocalAreaJobAdverts",
        "parameters": [
          {
            "name": "area",
            "in": "path",
            "description": "A local authority's GSS code or slug, e.g. \"leeds\". See /v1/local-areas.",
            "required": true,
            "schema": {
              "enum": [
                "uk",
                "wales",
                "scotland",
                "north-east",
                "north-west",
                "yorkshire-and-the-humber",
                "east-midlands",
                "west-midlands",
                "east-of-england",
                "london",
                "south-east",
                "south-west"
              ],
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "How many occupations to return. Default 50, at most 412.",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AreaAdvertsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/job-adverts/local": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get where an occupation's jobs are advertised.",
        "description": "Every local area with new online job adverts for the occupation over the\r\nlatest four quarters, most first. `perThousand` is the occupation's share\r\nof all adverts in the area, and `concentration` compares it with the\r\nUK: above 1 means the occupation is more in evidence there than nationally.",
        "operationId": "GetOccupationJobAdvertsByArea",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocalAdvertAreasResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/job-adverts/local/{area}": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get an occupation's job adverts in a local area.",
        "description": "New online job adverts for the occupation in the area each quarter for\r\nthe last three years, the latest four quarters totalled and compared\r\nwith the four before, and the occupation's rank among all occupations\r\nadvertised there.",
        "operationId": "GetOccupationJobAdvertsInArea",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "area",
            "in": "path",
            "description": "A local authority's GSS code or slug, e.g. \"leeds\". See /v1/local-areas.",
            "required": true,
            "schema": {
              "enum": [
                "uk",
                "wales",
                "scotland",
                "north-east",
                "north-west",
                "yorkshire-and-the-humber",
                "east-midlands",
                "west-midlands",
                "east-of-england",
                "london",
                "south-east",
                "south-west"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocalAdvertResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/apprenticeships": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get apprenticeships and technical qualifications into an occupation.",
        "description": "The occupations on Skills England's occupational maps that sit behind\r\nthe SOC unit group, each with its apprenticeship standards, T Levels and\r\nother technical qualifications. A unit group usually has several:\r\nplumbers (5315) cover gas engineering operatives, heating engineers,\r\nplumbing and domestic heating technicians and more.\r\n\r\n`match` says whether Skills England codes the occupation to this unit\r\ngroup (`primary`) or mainly to another, partly to this one (`partial`).\r\nRetired and withdrawn apprenticeships are left out unless\r\n`includeInactive=true`.\r\n\r\nSkills England's terms require its logo and the `attribution` statement\r\nwherever this data is shown.",
        "operationId": "GetOccupationApprenticeships",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeInactive",
            "in": "query",
            "description": "Include retired and withdrawn apprenticeships. Default false.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApprenticeshipsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/how-to-become": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get how to become one.",
        "description": "The routes into the occupation as the National Careers Service describes\r\nthem: university, college, apprenticeship, working your way up,\r\nvolunteering, applying directly - each with its entry requirements -\r\nand what you will need, such as background checks or a licence.\r\n\r\nThe careers service writes profiles per job, not per SOC unit group, so\r\nan occupation can have several (plumbers: plumber, heating engineer and\r\nothers) or none. Each is matched to a unit group through the ONS coding\r\nindex by its title or an alternative title; `match` says which.\r\n\r\nShow `attribution` wherever this text is used.",
        "operationId": "GetOccupationHowToBecome",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HowToBecomeResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/workforce": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get who works in an occupation.",
        "description": "The occupation's workforce by age band, by highest qualification and by\r\nindustry, from the Annual Population Survey, with headline shares: aged\r\nunder 25, aged 55 and over, and holding a degree.\r\n\r\nEach figure carries a quality band. Show `acceptable` figures with a\r\ncaution and never show `unreliable` ones, which ONS withheld.",
        "operationId": "GetOccupationWorkforce",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkforceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/work-profile": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get the interests and abilities an occupation suits.",
        "description": "The career interest profile (Holland's six RIASEC types) and the abilities\r\nthe work calls on, for matching people to occupations. No UK source\r\npublishes these, so they come from the US O*NET database.\r\n\r\nO*NET describes American occupations. They are reached through ISCO-08\r\nand the official ESCO to O*NET crosswalk, which usually links a UK\r\noccupation to several US ones; the profile is their weighted average.\r\n`basedOn` lists them - show it, so users can judge the match - and\r\n`derivation` explains it. Wherever the profile is shown, O*NET's licence\r\nrequires the `attribution` text.",
        "operationId": "GetOccupationWorkProfile",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkProfileResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/meta/sources": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "List data sources.",
        "description": "Every upstream dataset this service draws on, its publisher and licence,\r\nand the release currently served. No API key needed.",
        "operationId": "ListSources",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SourceResponse"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/v1/meta/editions": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "List releases.",
        "description": "The history of every release ingested, newest first, including any held\r\nback by validation (quarantined) and any that published with a known\r\nissue (see `checks`). Pass a release's `id` as `?edition=` to the pay\r\nendpoint to pin figures to it. No API key needed.",
        "operationId": "ListEditions",
        "parameters": [
          {
            "name": "source",
            "in": "query",
            "description": "Limit to one source key, e.g. ashe_t14.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EditionResponse"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/v1/meta/ingest": {
      "get": {
        "tags": [
          "Metadata"
        ],
        "summary": "Check data freshness.",
        "description": "When each source was last checked for new releases, and any release\r\ncurrently held back because it failed validation - in which case the\r\nprevious release is still being served. Never cached. No API key needed.",
        "operationId": "IngestStatus",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IngestStatusResponse"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/v1/occupations": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "List occupations.",
        "description": "All 412 SOC 2020 unit groups with their place in the hierarchy and how\r\nmany job titles the ONS coding index classifies to each.",
        "operationId": "ListOccupations",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OccupationSummary"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/search": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Find occupations matching a job title.",
        "description": "Resolves free text - \"plumber\", \"plumbers mate\", even a misspelling - to\r\nSOC 2020 unit groups, using the 32,000 job titles in the ONS coding index.\r\nResults are ranked occupations, not ranked synonyms: each unit group\r\nappears once, with the job title that matched it best. An exact match\r\nalways ranks first. The index already separates similar-sounding jobs\r\nthat are classified differently, such as a plumber (5315, a skilled\r\ntrade) and a plumber's mate (9129, an elementary occupation).",
        "operationId": "SearchOccupations",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "The job title to look up.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Maximum results, 1-50. Default 10.",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OccupationMatch"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/titles": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get every job title classified to an occupation.",
        "description": "The ONS coding index's job titles for the unit group, in natural word\r\norder, with the qualifier that some carry - \"Engineer\" in one industry\r\ncodes differently from \"Engineer\" in another. For building search over\r\njob titles; `/search` does the matching for you.",
        "operationId": "GetOccupationTitles",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OccupationTitle"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get an occupation.",
        "description": "The unit group's title, its place in the SOC 2020 hierarchy, its ISCO-08\r\nmapping, a sample of the job titles classified to it, and in `about` the\r\nONS description of the work and its typical tasks.",
        "operationId": "GetOccupation",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code, e.g. 5315.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OccupationProfile"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/pay": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get pay for an occupation.",
        "description": "The full pay distribution - median, mean and percentiles - for one\r\noccupation, area, year and breakdown, from the ONS Annual Survey of Hours\r\nand Earnings. Defaults to gross annual pay for all employees in the UK in\r\nthe latest year.\r\n\r\nCheck `presentable` before showing a figure, and pass on `coverage`:\r\nASHE counts employee jobs only, so it says nothing about self-employed\r\npeople in the occupation. Figures are `provisional` until ONS revises\r\nthem the following spring. Any figure ONS withholds is null, never zero.",
        "operationId": "GetOccupationPay",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "measure",
            "in": "query",
            "description": "Pay measure. Default annual_pay_gross.",
            "schema": {
              "enum": [
                "weekly_pay_gross",
                "weekly_pay_excl_overtime",
                "basic_pay_incl_other",
                "overtime_pay",
                "hourly_pay_gross",
                "hourly_pay_excl_overtime",
                "annual_pay_gross",
                "annual_pay_incentive",
                "hours_paid_total",
                "hours_paid_basic",
                "hours_paid_overtime"
              ],
              "type": "string"
            }
          },
          {
            "name": "sex",
            "in": "query",
            "description": "all, male or female. Default all.",
            "schema": {
              "enum": [
                "all",
                "male",
                "female"
              ],
              "type": "string"
            }
          },
          {
            "name": "pattern",
            "in": "query",
            "description": "all, fulltime or parttime. Default all.",
            "schema": {
              "enum": [
                "all",
                "fulltime",
                "parttime"
              ],
              "type": "string"
            }
          },
          {
            "name": "year",
            "in": "query",
            "description": "Reference year. Default the latest published.",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          },
          {
            "name": "edition",
            "in": "query",
            "description": "Pin an exact release by its id from /v1/meta/editions, e.g. to keep figures stable through an academic year. Overrides year.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "area",
            "in": "query",
            "description": "uk (default), an English region, wales or scotland.",
            "schema": {
              "enum": [
                "uk",
                "wales",
                "scotland",
                "north-east",
                "north-west",
                "yorkshire-and-the-humber",
                "east-midlands",
                "west-midlands",
                "east-of-england",
                "london",
                "south-east",
                "south-west"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/pay/regions": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Compare pay for an occupation across regions.",
        "description": "Median pay in each English region, Wales and Scotland, with the UK\r\nfigure for the same year and each region's difference from it. Regions\r\nare by workplace - where the job is, not where the employee lives.\r\nRegions ONS withholds are still listed, with a null median, so a map can\r\nshow \"not published\" rather than leave a hole. Northern Ireland is not\r\npublished at this level. Regional pay covers annual, weekly and hourly\r\ngross pay.",
        "operationId": "GetOccupationPayByRegion",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "measure",
            "in": "query",
            "description": "annual_pay_gross (default), weekly_pay_gross or hourly_pay_gross.",
            "schema": {
              "enum": [
                "annual_pay_gross",
                "weekly_pay_gross",
                "hourly_pay_gross"
              ],
              "type": "string"
            }
          },
          {
            "name": "sex",
            "in": "query",
            "description": "all, male or female. Default all.",
            "schema": {
              "enum": [
                "all",
                "male",
                "female"
              ],
              "type": "string"
            }
          },
          {
            "name": "pattern",
            "in": "query",
            "description": "all, fulltime or parttime. Default all.",
            "schema": {
              "enum": [
                "all",
                "fulltime",
                "parttime"
              ],
              "type": "string"
            }
          },
          {
            "name": "year",
            "in": "query",
            "description": "Reference year. Default the latest published.",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegionalPayResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/pay/series": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get pay for an occupation over time.",
        "description": "Median and mean pay for every published year, oldest first. Each point\r\nsays whether it is provisional - mark those on a chart, because ONS will\r\nstill revise them. Withheld years are included with null values, so a\r\ngap in a chart can be shown as a gap.",
        "operationId": "GetOccupationPaySeries",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "measure",
            "in": "query",
            "description": "Pay measure. Default annual_pay_gross.",
            "schema": {
              "enum": [
                "weekly_pay_gross",
                "weekly_pay_excl_overtime",
                "basic_pay_incl_other",
                "overtime_pay",
                "hourly_pay_gross",
                "hourly_pay_excl_overtime",
                "annual_pay_gross",
                "annual_pay_incentive",
                "hours_paid_total",
                "hours_paid_basic",
                "hours_paid_overtime"
              ],
              "type": "string"
            }
          },
          {
            "name": "sex",
            "in": "query",
            "description": "all, male or female. Default all.",
            "schema": {
              "enum": [
                "all",
                "male",
                "female"
              ],
              "type": "string"
            }
          },
          {
            "name": "pattern",
            "in": "query",
            "description": "all, fulltime or parttime. Default all.",
            "schema": {
              "enum": [
                "all",
                "fulltime",
                "parttime"
              ],
              "type": "string"
            }
          },
          {
            "name": "area",
            "in": "query",
            "description": "uk (default), an English region, wales or scotland.",
            "schema": {
              "enum": [
                "uk",
                "wales",
                "scotland",
                "north-east",
                "north-west",
                "yorkshire-and-the-humber",
                "east-midlands",
                "west-midlands",
                "east-of-england",
                "london",
                "south-east",
                "south-west"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaySeriesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/occupations/{soc}/skills": {
      "get": {
        "tags": [
          "Occupations"
        ],
        "summary": "Get the skills an occupation involves.",
        "description": "Skills and knowledge from ESCO, the European Commission's classification,\r\njoined to the SOC unit group through its ISCO-08 code. Skills are pooled\r\nacross every related ESCO occupation and ranked by how many of them list\r\neach one, so the top of the list is what the work broadly involves.\r\n\r\nThese are related occupations rather than exact equivalents - several UK\r\nunit groups can share one ISCO-08 group. The `derivation` field says how\r\nthe match was made; pass that on when presenting the results.",
        "operationId": "GetOccupationSkills",
        "parameters": [
          {
            "name": "soc",
            "in": "path",
            "description": "Four-digit SOC 2020 unit group code.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "relation",
            "in": "query",
            "description": "essential or optional to filter; omit for both.",
            "schema": {
              "enum": [
                "essential",
                "optional"
              ],
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Maximum skills, 1-200. Default 40.",
            "schema": {
              "pattern": "^-?(?:0|[1-9]\\d*)$",
              "type": [
                "integer",
                "string"
              ],
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkillsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/keys/requests": {
      "post": {
        "tags": [
          "Keys"
        ],
        "summary": "Ask for a free API key.",
        "description": "Emails a confirmation link to the address. Opening the link and\r\nconfirming issues the key. The response is the same whether or not the\r\naddress already has a key, and the link replaces any earlier key, which\r\nis also how to recover a lost one. No key is needed to call this.",
        "operationId": "RequestKey",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeyRequestBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KeyRequestAccepted"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    },
    "/v1/keys/confirm": {
      "post": {
        "tags": [
          "Keys"
        ],
        "summary": "Confirm an email address and receive the key.",
        "description": "Each link works once. The key is in this response only.",
        "operationId": "ConfirmKey",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KeyConfirmBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IssuedKey"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": []
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "AbilityScore": {
        "required": [
          "ability",
          "importance"
        ],
        "type": "object",
        "properties": {
          "ability": {
            "type": "string",
            "description": "O*NET ability name, e.g. \"Manual Dexterity\"."
          },
          "importance": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "description": "How important it is to the work, 1 (not important) to 5 (extremely). A weighted average.",
            "format": "double"
          }
        },
        "description": "An ability the work calls on."
      },
      "AdvertQuarter": {
        "required": [
          "quarter",
          "adverts"
        ],
        "type": "object",
        "properties": {
          "quarter": {
            "type": "string",
            "description": "\"2026 Q2\"."
          },
          "adverts": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "New adverts. Null where ONS suppressed the quarter.",
            "format": "int32"
          }
        },
        "description": "New adverts in one quarter."
      },
      "ApprenticeshipsResponse": {
        "required": [
          "soc2020",
          "title",
          "apprenticeshipsAvailable",
          "lowestApprenticeshipLevel",
          "tLevels",
          "occupations",
          "attribution",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The SOC unit group."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "apprenticeshipsAvailable": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Apprenticeships approved for delivery across the primary-match occupations.",
            "format": "int32"
          },
          "lowestApprenticeshipLevel": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "The lowest level of those, i.e. the earliest entry point. Null if none.",
            "format": "int32"
          },
          "tLevels": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "T Levels across the primary-match occupations.",
            "format": "int32"
          },
          "occupations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SkillsEnglandOccupationItem"
            },
            "description": "Skills England occupations behind the unit group: primary matches first, then partial."
          },
          "attribution": {
            "type": "string",
            "description": "The attribution statement Skills England requires wherever this is shown, alongside its logo."
          },
          "provenance": {
            "description": "Where it came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "The routes into an occupation through apprenticeships and technical education."
      },
      "AreaAdvertOccupation": {
        "required": [
          "rank",
          "soc2020",
          "title",
          "latestYear",
          "changePercent"
        ],
        "type": "object",
        "properties": {
          "rank": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "1 for the highest average adverts per published quarter.",
            "format": "int32"
          },
          "soc2020": {
            "type": "string",
            "description": "The occupation."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "latestYear": {
            "description": "Its adverts in the area over the latest four quarters.",
            "$ref": "#/components/schemas/LocalAdvertYear"
          },
          "changePercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Change on the four quarters before, over quarters published in both.",
            "format": "double"
          }
        },
        "description": "An occupation in an area's job adverts listing."
      },
      "AreaAdvertsResponse": {
        "required": [
          "area",
          "allOccupations",
          "occupations",
          "notices",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "area": {
            "description": "The area.",
            "$ref": "#/components/schemas/LocalArea"
          },
          "allOccupations": {
            "description": "All new adverts in the area over the latest four quarters, including those ONS could not code to an occupation.",
            "$ref": "#/components/schemas/LocalAdvertYear"
          },
          "occupations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AreaAdvertOccupation"
            },
            "description": "Occupations, most adverts first."
          },
          "notices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JobAdvertNoticeItem"
            },
            "description": "ONS's data quality notices for this release."
          },
          "coverage": {
            "description": "What the figures count.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where they came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "The occupations with most job adverts in an area."
      },
      "AreaSummary": {
        "required": [
          "code",
          "slug",
          "name"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "GSS code, e.g. \"E12000007\"."
          },
          "slug": {
            "type": "string",
            "description": "The name to pass as `?area=`, e.g. \"london\"."
          },
          "name": {
            "type": "string",
            "description": "Display name, e.g. \"London\"."
          }
        },
        "description": "A UK area."
      },
      "Coverage": {
        "required": [
          "population",
          "includesSelfEmployed",
          "referencePeriod",
          "note"
        ],
        "type": "object",
        "properties": {
          "population": {
            "type": "string",
            "description": "What is counted: \"employee jobs\" or \"people in employment\"."
          },
          "includesSelfEmployed": {
            "type": "boolean",
            "description": "Whether self-employed people are included."
          },
          "referencePeriod": {
            "type": "string",
            "description": "The period the figure describes, e.g. \"tax year ending 5 April 2025\"."
          },
          "note": {
            "type": "string",
            "description": "Caveats a consumer should be aware of when presenting the figure."
          }
        },
        "description": "What a figure counts and the period it refers to."
      },
      "DemandIndicator": {
        "required": [
          "indicator",
          "signal",
          "measures"
        ],
        "type": "object",
        "properties": {
          "indicator": {
            "type": "string",
            "description": "visa_grants, online_job_adverts, wage_growth, wage_premium or hours_worked."
          },
          "signal": {
            "type": "string",
            "description": "\"critical\", \"elevated\" or \"none\"."
          },
          "measures": {
            "type": "string",
            "description": "What the indicator measures."
          }
        },
        "description": "What one of the five indicators said."
      },
      "DemandListItem": {
        "required": [
          "soc2020",
          "title",
          "level",
          "demandIndex",
          "indicatorsInDemand",
          "workers"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The occupation."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "level": {
            "type": "string",
            "description": "\"critical\", \"elevated\" or \"not_in_high_demand\"."
          },
          "demandIndex": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "The composite score; the list is ordered by it, highest first.",
            "format": "double"
          },
          "indicatorsInDemand": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "How many of the five indicators were elevated or critical.",
            "format": "int32"
          },
          "workers": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "People employed in the occupation, as used by the publisher.",
            "format": "int32"
          }
        },
        "description": "An occupation in a demand listing."
      },
      "DemandListResponse": {
        "required": [
          "year",
          "occupations",
          "definitions",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "year": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "The assessment year.",
            "format": "int32"
          },
          "occupations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DemandListItem"
            },
            "description": "The occupations, highest demand index first."
          },
          "definitions": {
            "type": "string",
            "description": "What the levels mean."
          },
          "provenance": {
            "description": "Where it came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Occupations by demand level."
      },
      "DemandResponse": {
        "required": [
          "soc2020",
          "title",
          "latest",
          "previous",
          "definitions",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The occupation."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "latest": {
            "description": "The latest assessment.",
            "$ref": "#/components/schemas/DemandYear"
          },
          "previous": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "The year before, re-assessed by the publisher on the same method, for comparison. Null if there is none.",
                "$ref": "#/components/schemas/DemandYear"
              }
            ]
          },
          "definitions": {
            "type": "string",
            "description": "What the levels mean and how they are decided."
          },
          "coverage": {
            "description": "What the assessment covers.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where it came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Whether an occupation is in demand."
      },
      "DemandYear": {
        "required": [
          "year",
          "level",
          "demandIndex",
          "indicators",
          "uncertainty",
          "imputation",
          "capping",
          "onImmigrationSalaryList"
        ],
        "type": "object",
        "properties": {
          "year": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "The assessment year.",
            "format": "int32"
          },
          "level": {
            "type": "string",
            "description": "\"critical\", \"elevated\" or \"not_in_high_demand\"."
          },
          "demandIndex": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "The average of the five indicators; higher is more demand. It ranks occupations but does not decide the level. Compare occupations within a year, not across years.",
            "format": "double"
          },
          "indicators": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DemandIndicator"
            },
            "description": "Each indicator's signal."
          },
          "uncertainty": {
            "type": [
              "null",
              "string"
            ],
            "description": "The publisher's note on indicators whose data is uncertain, or null if none."
          },
          "imputation": {
            "type": [
              "null",
              "string"
            ],
            "description": "The publisher's note on indicators filled in from the occupation's three-digit group for lack of data, or null if none."
          },
          "capping": {
            "type": [
              "null",
              "string"
            ],
            "description": "The publisher's note on indicators held at elevated because they were imputed, or null if none."
          },
          "onImmigrationSalaryList": {
            "type": [
              "null",
              "boolean"
            ],
            "description": "Whether the occupation was on the Immigration Salary List when assessed."
          }
        },
        "description": "One year's demand assessment."
      },
      "EditionCheck": {
        "required": [
          "rule",
          "status",
          "observed"
        ],
        "type": "object",
        "properties": {
          "rule": {
            "type": "string",
            "description": "Name of the check."
          },
          "status": {
            "type": "string",
            "description": "\"warn\" (published with a known issue) or \"fail\" (held back)."
          },
          "observed": {
            "type": [
              "null",
              "string"
            ],
            "description": "What the check found."
          }
        },
        "description": "A validation check an edition did not pass cleanly."
      },
      "EditionResponse": {
        "required": [
          "id",
          "sourceKey",
          "label",
          "seriesKey",
          "status",
          "detectedAt",
          "publishedAt",
          "sourceUri",
          "checks"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Pass as `?edition=` on the pay endpoint to pin figures to this release.",
            "format": "uuid"
          },
          "sourceKey": {
            "type": "string",
            "description": "Which source."
          },
          "label": {
            "type": "string",
            "description": "The publisher's name for the release."
          },
          "seriesKey": {
            "type": [
              "null",
              "string"
            ],
            "description": "For pay, the reference year. Releases only replace others in the same series."
          },
          "status": {
            "type": "string",
            "description": "published, superseded, quarantined, or an in-progress state."
          },
          "detectedAt": {
            "type": "string",
            "description": "When the release was first seen.",
            "format": "date-time"
          },
          "publishedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When it began being served.",
            "format": "date-time"
          },
          "sourceUri": {
            "type": "string",
            "description": "Where it was retrieved from."
          },
          "checks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EditionCheck"
            },
            "description": "Checks that warned or failed. Empty for a clean release."
          }
        },
        "description": "One release of one source."
      },
      "EmploymentBreakdown": {
        "required": [
          "female",
          "partTime",
          "selfEmployed"
        ],
        "type": "object",
        "properties": {
          "female": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "Women in the occupation.",
                "$ref": "#/components/schemas/EmploymentShare"
              }
            ]
          },
          "partTime": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "People working part-time.",
                "$ref": "#/components/schemas/EmploymentShare"
              }
            ]
          },
          "selfEmployed": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "Self-employed people. Pay figures do not cover this group.",
                "$ref": "#/components/schemas/EmploymentShare"
              }
            ]
          }
        },
        "description": "Who works in the occupation. Published for the UK only; every field is null\r\nfor a nation."
      },
      "EmploymentFigure": {
        "required": [
          "count",
          "confidenceInterval",
          "quality",
          "presentable",
          "shareOfAllEmploymentPercent"
        ],
        "type": "object",
        "properties": {
          "count": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "People in employment. Null where withheld.",
            "format": "int32"
          },
          "confidenceInterval": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Half-width of the 95% confidence interval: the true figure is likely within this many people either side.",
            "format": "int32"
          },
          "quality": {
            "type": "string",
            "description": "Reliability band: precise, reasonable, acceptable or unreliable."
          },
          "presentable": {
            "type": "boolean",
            "description": "False when the figure should not be shown as a number."
          },
          "shareOfAllEmploymentPercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "The occupation's share of everyone in employment in the area.",
            "format": "double"
          }
        },
        "description": "How many people work in the occupation."
      },
      "EmploymentResponse": {
        "required": [
          "soc2020",
          "title",
          "area",
          "period",
          "employment",
          "breakdown",
          "series",
          "notes",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "Four-digit SOC 2020 unit group code."
          },
          "title": {
            "type": "string",
            "description": "Unit group title."
          },
          "area": {
            "description": "The area.",
            "$ref": "#/components/schemas/AreaSummary"
          },
          "period": {
            "type": [
              "null",
              "string"
            ],
            "description": "The most recent survey period, e.g. \"Apr 2025-Mar 2026\"."
          },
          "employment": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "The headline figure for that period.",
                "$ref": "#/components/schemas/EmploymentFigure"
              }
            ]
          },
          "breakdown": {
            "description": "Shares by sex, working pattern and self-employment (UK only).",
            "$ref": "#/components/schemas/EmploymentBreakdown"
          },
          "series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmploymentSeriesPoint"
            },
            "description": "Calendar-year figures, oldest first."
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Caveats to pass on, e.g. when pay figures describe only part of the occupation."
          },
          "coverage": {
            "description": "What the figures count and when.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where the figures came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Employment in one occupation and area."
      },
      "EmploymentSeriesPoint": {
        "required": [
          "year",
          "period",
          "count",
          "confidenceInterval",
          "quality"
        ],
        "type": "object",
        "properties": {
          "year": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Calendar year.",
            "format": "int32"
          },
          "period": {
            "type": "string",
            "description": "The survey period, e.g. \"Jan 2024-Dec 2024\"."
          },
          "count": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "People in employment. Null where withheld.",
            "format": "int32"
          },
          "confidenceInterval": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Half-width of the 95% confidence interval.",
            "format": "int32"
          },
          "quality": {
            "type": "string",
            "description": "Reliability band."
          }
        },
        "description": "One calendar year of employment."
      },
      "EmploymentShare": {
        "required": [
          "count",
          "percent",
          "quality",
          "presentable"
        ],
        "type": "object",
        "properties": {
          "count": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "People in the group.",
            "format": "int32"
          },
          "percent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "description": "The group as a percentage of everyone in the occupation.",
            "format": "double"
          },
          "quality": {
            "type": "string",
            "description": "Reliability band. Shares often rest on small samples; check before showing."
          },
          "presentable": {
            "type": "boolean",
            "description": "False when the figure should not be shown as a number."
          }
        },
        "description": "A group within the occupation, as a share of it."
      },
      "EntryRoute": {
        "required": [
          "kind",
          "heading",
          "blocks"
        ],
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "\"university\", \"college\", \"apprenticeship\", \"work\", \"volunteering\", \"direct_application\", \"other_routes\" or \"more_information\"."
          },
          "heading": {
            "type": "string",
            "description": "The profile's own heading for it."
          },
          "blocks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RouteBlock"
            },
            "description": "Its content."
          }
        },
        "description": "One way into a job."
      },
      "HowToBecomeResponse": {
        "required": [
          "soc2020",
          "title",
          "profiles",
          "attribution",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The unit group."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "profiles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JobProfileRoutes"
            },
            "description": "The job profiles matched to it, those matched by their own title first."
          },
          "attribution": {
            "type": "string",
            "description": "The attribution to show wherever this text is used."
          },
          "provenance": {
            "description": "Where it came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "How to get into an occupation, from the National Careers Service."
      },
      "IngestStatusResponse": {
        "required": [
          "sources",
          "quarantined"
        ],
        "type": "object",
        "properties": {
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SourceFreshness"
            },
            "description": "Last check per source."
          },
          "quarantined": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QuarantinedEdition"
            },
            "description": "Releases currently held back."
          }
        },
        "description": "How current each source is, and anything held back."
      },
      "InterestScore": {
        "required": [
          "type",
          "letter",
          "score",
          "meaning"
        ],
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Realistic, Investigative, Artistic, Social, Enterprising or Conventional."
          },
          "letter": {
            "type": "string",
            "description": "The type's initial, as used in Holland codes."
          },
          "score": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "description": "How strongly the work suits this interest, 1 (not at all) to 7 (extremely). A weighted average across the matched US occupations.",
            "format": "double"
          },
          "meaning": {
            "type": "string",
            "description": "What the interest type means, in plain words."
          }
        },
        "description": "One of the six career interest types (Holland's RIASEC)."
      },
      "IssuedKey": {
        "required": [
          "key",
          "prefix",
          "tier",
          "requestsPerMinute",
          "replacedKeys"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "Send it in the `X-API-Key` header."
          },
          "prefix": {
            "type": "string",
            "description": "The key's first characters, which identify it without revealing it."
          },
          "tier": {
            "type": "string",
            "description": "The access tier."
          },
          "requestsPerMinute": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "The tier's rate limit.",
            "format": "int32"
          },
          "replacedKeys": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Earlier keys for this address, now revoked.",
            "format": "int32"
          }
        },
        "description": "A new key. It is shown this once and cannot be retrieved later."
      },
      "JobAdvertListItem": {
        "required": [
          "rank",
          "soc2020",
          "title",
          "adverts",
          "averagePerMonth",
          "changePercent"
        ],
        "type": "object",
        "properties": {
          "rank": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "1 for the highest average adverts per published month.",
            "format": "int32"
          },
          "soc2020": {
            "type": "string",
            "description": "The occupation."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "adverts": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "New adverts over the latest twelve months, leaving out suppressed months.",
            "format": "int32"
          },
          "averagePerMonth": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Average new adverts per published month; the list is ordered by it.",
            "format": "double"
          },
          "changePercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Change on the twelve months before, over months published in both.",
            "format": "double"
          }
        },
        "description": "An occupation in the job adverts listing."
      },
      "JobAdvertListResponse": {
        "required": [
          "area",
          "from",
          "to",
          "occupations",
          "notices",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "area": {
            "description": "The area.",
            "$ref": "#/components/schemas/AreaSummary"
          },
          "from": {
            "type": "string",
            "description": "First month of the period."
          },
          "to": {
            "type": "string",
            "description": "Last month of the period."
          },
          "occupations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JobAdvertListItem"
            },
            "description": "Occupations, most adverts first."
          },
          "notices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JobAdvertNoticeItem"
            },
            "description": "ONS's data quality notices for this release."
          },
          "coverage": {
            "description": "What the figures count.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where they came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Occupations by new online job adverts."
      },
      "JobAdvertMonth": {
        "required": [
          "month",
          "adverts"
        ],
        "type": "object",
        "properties": {
          "month": {
            "type": "string",
            "description": "\"2026-08\"."
          },
          "adverts": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Adverts that first appeared online in the month. Null where ONS suppressed the month for quality.",
            "format": "int32"
          }
        },
        "description": "New online job adverts in one month."
      },
      "JobAdvertNoticeItem": {
        "required": [
          "heading",
          "text"
        ],
        "type": "object",
        "properties": {
          "heading": {
            "type": "string",
            "description": "e.g. \"Data issue - March 2026\"."
          },
          "text": {
            "type": "string",
            "description": "What ONS said."
          }
        },
        "description": "A data quality notice from ONS about the release."
      },
      "JobAdvertResponse": {
        "required": [
          "soc2020",
          "title",
          "area",
          "latestYear",
          "months",
          "notices",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The occupation."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "area": {
            "description": "The area.",
            "$ref": "#/components/schemas/AreaSummary"
          },
          "latestYear": {
            "description": "The latest twelve months, with change and rank.",
            "$ref": "#/components/schemas/JobAdvertYear"
          },
          "months": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JobAdvertMonth"
            },
            "description": "Every month since January 2017, oldest first."
          },
          "notices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JobAdvertNoticeItem"
            },
            "description": "ONS's data quality notices for this release. Show them alongside recent months."
          },
          "coverage": {
            "description": "What the figures count.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where they came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "New online job adverts for an occupation."
      },
      "JobAdvertYear": {
        "required": [
          "from",
          "to",
          "adverts",
          "monthsSuppressed",
          "averagePerMonth",
          "changePercent",
          "rank",
          "occupationsRanked"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "First month, \"2025-09\"."
          },
          "to": {
            "type": "string",
            "description": "Last month, \"2026-08\"."
          },
          "adverts": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "New adverts over the months ONS published. Lower than the true total when any month is suppressed.",
            "format": "int32"
          },
          "monthsSuppressed": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Months in the period ONS suppressed, which `adverts` leaves out.",
            "format": "int32"
          },
          "averagePerMonth": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Average new adverts per published month. Compare occupations on this rather than `adverts`, since ONS suppresses different months for different occupations.",
            "format": "double"
          },
          "changePercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Change on the twelve months before, comparing only months published in both periods. Null if there are none.",
            "format": "double"
          },
          "rank": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "The occupation's rank by `averagePerMonth` among all occupations in the area, 1 being the most.",
            "format": "int32"
          },
          "occupationsRanked": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Occupations ranked.",
            "format": "int32"
          }
        },
        "description": "An occupation's job adverts over the latest twelve months."
      },
      "JobProfileRoutes": {
        "required": [
          "slug",
          "title",
          "alternativeTitles",
          "summary",
          "match",
          "routesIntro",
          "routesListed",
          "routes",
          "requirements",
          "requirementNotes",
          "url"
        ],
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "The profile's address, \"plumber\"."
          },
          "title": {
            "type": "string",
            "description": "The job, e.g. \"Plumber\"."
          },
          "alternativeTitles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Other names for it."
          },
          "summary": {
            "type": [
              "null",
              "string"
            ],
            "description": "One-line description."
          },
          "match": {
            "type": "string",
            "description": "How the profile was matched to this unit group: \"title\" or \"alternative title\"."
          },
          "routesIntro": {
            "type": [
              "null",
              "string"
            ],
            "description": "The profile's opening line on routes in."
          },
          "routesListed": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The ways in it lists, e.g. \"an apprenticeship\"."
          },
          "routes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EntryRoute"
            },
            "description": "Each way in, in the profile's order."
          },
          "requirements": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "What you will need, e.g. \"pass enhanced background checks\"."
          },
          "requirementNotes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Further notes on requirements."
          },
          "url": {
            "type": "string",
            "description": "The profile on the National Careers Service."
          }
        },
        "description": "A National Careers Service job profile's account of how to get in."
      },
      "KeyConfirmBody": {
        "required": [
          "token"
        ],
        "type": "object",
        "properties": {
          "token": {
            "type": [
              "null",
              "string"
            ],
            "description": "The `token` value from the emailed link."
          }
        },
        "description": "A confirmation link's token."
      },
      "KeyRequestAccepted": {
        "required": [
          "message"
        ],
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "description": "For the person signing up."
          }
        },
        "description": "What happens next."
      },
      "KeyRequestBody": {
        "required": [
          "email",
          "projectName",
          "acceptTerms",
          "turnstileToken"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": [
              "null",
              "string"
            ],
            "description": "Where to send the confirmation link."
          },
          "projectName": {
            "type": [
              "null",
              "string"
            ],
            "description": "What the key is for. Optional; helps if we ever need to get in touch about it."
          },
          "acceptTerms": {
            "type": "boolean",
            "description": "Must be true: the API terms, including the attribution the data's licences require."
          },
          "turnstileToken": {
            "type": [
              "null",
              "string"
            ],
            "description": "From the sign-up form's bot check."
          }
        },
        "description": "Ask for a key by email."
      },
      "LocalAdvertArea": {
        "required": [
          "rank",
          "area",
          "latestYear"
        ],
        "type": "object",
        "properties": {
          "rank": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "1 for the highest average adverts per published quarter.",
            "format": "int32"
          },
          "area": {
            "description": "The area.",
            "$ref": "#/components/schemas/LocalArea"
          },
          "latestYear": {
            "description": "Its adverts over the latest four quarters.",
            "$ref": "#/components/schemas/LocalAdvertYear"
          }
        },
        "description": "An area in the listing of where an occupation's jobs are advertised."
      },
      "LocalAdvertAreasResponse": {
        "required": [
          "soc2020",
          "title",
          "areas",
          "notices",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The occupation."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "areas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LocalAdvertArea"
            },
            "description": "Every area with adverts for it, most first."
          },
          "notices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JobAdvertNoticeItem"
            },
            "description": "ONS's data quality notices for this release."
          },
          "coverage": {
            "description": "What the figures count.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where they came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Where an occupation's jobs are advertised."
      },
      "LocalAdvertResponse": {
        "required": [
          "soc2020",
          "title",
          "area",
          "latestYear",
          "changePercent",
          "rank",
          "occupationsRanked",
          "quarters",
          "notices",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The occupation."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "area": {
            "description": "The area.",
            "$ref": "#/components/schemas/LocalArea"
          },
          "latestYear": {
            "description": "The latest four quarters.",
            "$ref": "#/components/schemas/LocalAdvertYear"
          },
          "changePercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Change on the four quarters before, over quarters published in both. Null if there are none.",
            "format": "double"
          },
          "rank": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "The occupation's rank by average adverts per published quarter among all occupations in the area, 1 being the most.",
            "format": "int32"
          },
          "occupationsRanked": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Occupations with adverts in the area.",
            "format": "int32"
          },
          "quarters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AdvertQuarter"
            },
            "description": "The last twelve quarters, oldest first."
          },
          "notices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JobAdvertNoticeItem"
            },
            "description": "ONS's data quality notices for this release."
          },
          "coverage": {
            "description": "What the figures count.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where they came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "An occupation's job adverts in one area."
      },
      "LocalAdvertYear": {
        "required": [
          "from",
          "to",
          "adverts",
          "quartersSuppressed",
          "averagePerQuarter",
          "perThousand",
          "concentration"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "First quarter, \"2025 Q3\"."
          },
          "to": {
            "type": "string",
            "description": "Last quarter, \"2026 Q2\"."
          },
          "adverts": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "New adverts over the quarters ONS published. Lower than the true total when any quarter is suppressed.",
            "format": "int32"
          },
          "quartersSuppressed": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Quarters ONS suppressed, which `adverts` leaves out.",
            "format": "int32"
          },
          "averagePerQuarter": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Average new adverts per published quarter. Rankings use this, since ONS suppresses different quarters for different occupations and areas.",
            "format": "double"
          },
          "perThousand": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "The occupation's adverts per 1,000 of all adverts in the area, over quarters published for both. Null if there are none.",
            "format": "double"
          },
          "concentration": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "How much more common the occupation's adverts are here than across the UK: 2 means twice the national share. Null if it cannot be compared.",
            "format": "double"
          }
        },
        "description": "An occupation's job adverts in one area over the latest four quarters."
      },
      "LocalArea": {
        "required": [
          "code",
          "slug",
          "name",
          "region"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "GSS code, April 2023 boundaries; London has the region's code."
          },
          "slug": {
            "type": "string",
            "description": "The name to pass as `{area}`, e.g. \"leeds\"."
          },
          "name": {
            "type": "string",
            "description": "Display name."
          },
          "region": {
            "type": "string",
            "description": "The English region or nation it is in."
          }
        },
        "description": "A local authority (or London, which ONS publishes only as a whole)."
      },
      "OccupationAbout": {
        "required": [
          "description",
          "tasks",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "description": "What people in the occupation do."
          },
          "tasks": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Typical tasks. Each continues \"Job holders in this occupation...\" so starts in lower case, e.g. \"examines drawings and specifications to determine layout of system\"."
          },
          "provenance": {
            "description": "Where the description came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "The ONS description of an occupation, from SOC 2020 Volume 1."
      },
      "OccupationMatch": {
        "required": [
          "soc2020",
          "title",
          "matchedTitle",
          "qualifier",
          "confidence",
          "matchType"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "Four-digit SOC 2020 unit group code. Use it with every other endpoint."
          },
          "title": {
            "type": "string",
            "description": "The unit group's official title."
          },
          "matchedTitle": {
            "type": "string",
            "description": "The job title from the ONS coding index that matched the query."
          },
          "qualifier": {
            "type": [
              "null",
              "string"
            ],
            "description": "Context that distinguishes this title from an identical one classified elsewhere, e.g. \"coal mine: below ground\". Null when none."
          },
          "confidence": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "description": "1.0 for an exact match; otherwise a similarity score between 0 and 1.",
            "format": "double"
          },
          "matchType": {
            "type": "string",
            "description": "\"exact\" or \"fuzzy\"."
          }
        },
        "description": "An occupation matched to a free-text job title."
      },
      "OccupationProfile": {
        "required": [
          "soc2020",
          "title",
          "minorGroup",
          "minorTitle",
          "subMajorGroup",
          "subMajorTitle",
          "majorGroup",
          "majorTitle",
          "isco08",
          "titleCount",
          "examples",
          "about"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "Four-digit unit group code, e.g. \"5315\"."
          },
          "title": {
            "type": "string",
            "description": "Official unit group title."
          },
          "minorGroup": {
            "type": [
              "null",
              "string"
            ],
            "description": "Three-digit minor group code."
          },
          "minorTitle": {
            "type": [
              "null",
              "string"
            ],
            "description": "Minor group title."
          },
          "subMajorGroup": {
            "type": [
              "null",
              "string"
            ],
            "description": "Two-digit sub-major group code."
          },
          "subMajorTitle": {
            "type": [
              "null",
              "string"
            ],
            "description": "Sub-major group title."
          },
          "majorGroup": {
            "type": [
              "null",
              "string"
            ],
            "description": "One-digit major group code."
          },
          "majorTitle": {
            "type": [
              "null",
              "string"
            ],
            "description": "Major group title."
          },
          "isco08": {
            "type": [
              "null",
              "string"
            ],
            "description": "The international ISCO-08 group this maps to, used to join skills data."
          },
          "titleCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "How many job titles in the ONS coding index map to this unit group.",
            "format": "int32"
          },
          "examples": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "A sample of those job titles, default titles first."
          },
          "about": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "What the job involves, in ONS's words. Null until SOC 2020 Volume 1 has been ingested.",
                "$ref": "#/components/schemas/OccupationAbout"
              }
            ]
          }
        },
        "description": "One SOC 2020 unit group and where it sits in the classification."
      },
      "OccupationSummary": {
        "required": [
          "soc2020",
          "title",
          "majorGroup",
          "majorTitle",
          "subMajorGroup",
          "subMajorTitle",
          "titleCount"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "Four-digit SOC 2020 unit group code."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "majorGroup": {
            "type": [
              "null",
              "string"
            ],
            "description": "One-digit major group."
          },
          "majorTitle": {
            "type": [
              "null",
              "string"
            ],
            "description": "Major group title."
          },
          "subMajorGroup": {
            "type": [
              "null",
              "string"
            ],
            "description": "Two-digit sub-major group."
          },
          "subMajorTitle": {
            "type": [
              "null",
              "string"
            ],
            "description": "Sub-major group title."
          },
          "titleCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Job titles the ONS coding index classifies to it.",
            "format": "int32"
          }
        },
        "description": "An occupation in the full list."
      },
      "OccupationTitle": {
        "required": [
          "title",
          "qualifier"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "The title in natural word order, e.g. \"Plumber's mate\"."
          },
          "qualifier": {
            "type": [
              "null",
              "string"
            ],
            "description": "Industry or context that decides the code for an otherwise ambiguous title, if any."
          }
        },
        "description": "A job title from the ONS coding index."
      },
      "PayDistribution": {
        "required": [
          "p10",
          "p20",
          "p25",
          "p30",
          "p40",
          "median",
          "p60",
          "p70",
          "p75",
          "p80",
          "p90"
        ],
        "type": "object",
        "properties": {
          "p10": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "10th percentile: 10% of jobs pay less than this.",
            "format": "double"
          },
          "p20": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "20th percentile.",
            "format": "double"
          },
          "p25": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "25th percentile (lower quartile).",
            "format": "double"
          },
          "p30": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "30th percentile.",
            "format": "double"
          },
          "p40": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "40th percentile.",
            "format": "double"
          },
          "median": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Median - the typical figure, and ONS's preferred average.",
            "format": "double"
          },
          "p60": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "60th percentile.",
            "format": "double"
          },
          "p70": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "70th percentile.",
            "format": "double"
          },
          "p75": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "75th percentile (upper quartile).",
            "format": "double"
          },
          "p80": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "80th percentile.",
            "format": "double"
          },
          "p90": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "90th percentile. Often withheld for high-paying occupations.",
            "format": "double"
          }
        },
        "description": "The spread of pay within an occupation. Any value can be null where ONS\r\nwithholds it; a null is never a zero."
      },
      "PayResponse": {
        "required": [
          "soc2020",
          "title",
          "area",
          "year",
          "referencePeriod",
          "provisional",
          "measure",
          "unit",
          "sex",
          "workPattern",
          "mean",
          "distribution",
          "employeeJobsThousands",
          "percentChange",
          "quality",
          "presentable",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "Four-digit SOC 2020 unit group code."
          },
          "title": {
            "type": "string",
            "description": "Unit group title."
          },
          "area": {
            "description": "The area the figure covers.",
            "$ref": "#/components/schemas/AreaSummary"
          },
          "year": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Reference year.",
            "format": "int32"
          },
          "referencePeriod": {
            "type": "string",
            "description": "Exactly what period the figure describes, which depends on the measure."
          },
          "provisional": {
            "type": "boolean",
            "description": "True until ONS publishes its revised figures the following spring."
          },
          "measure": {
            "type": "string",
            "description": "Which pay measure, e.g. \"annual_pay_gross\"."
          },
          "unit": {
            "type": "string",
            "description": "Unit of every figure in the response, e.g. \"gbp_per_year\"."
          },
          "sex": {
            "type": "string",
            "description": "\"all\", \"male\" or \"female\"."
          },
          "workPattern": {
            "type": "string",
            "description": "\"all\", \"fulltime\" or \"parttime\"."
          },
          "mean": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Mean pay. Pulled upwards by a small number of high earners; prefer the median.",
            "format": "double"
          },
          "distribution": {
            "description": "Median and percentiles.",
            "$ref": "#/components/schemas/PayDistribution"
          },
          "employeeJobsThousands": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Indicative number of employee jobs, in thousands. ONS warns these are not accurate estimates.",
            "format": "double"
          },
          "percentChange": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Change in the median on the previous year, in percent.",
            "format": "double"
          },
          "quality": {
            "type": "string",
            "description": "Reliability band of the median: precise, reasonable, acceptable or unreliable."
          },
          "presentable": {
            "type": "boolean",
            "description": "False when the figure should not be shown to users as a number."
          },
          "coverage": {
            "description": "What the figure counts and when.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where the figure came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Pay for one occupation, area, year and breakdown."
      },
      "PaySeriesPoint": {
        "required": [
          "year",
          "referencePeriod",
          "provisional",
          "median",
          "mean",
          "employeeJobsThousands",
          "quality"
        ],
        "type": "object",
        "properties": {
          "year": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Reference year.",
            "format": "int32"
          },
          "referencePeriod": {
            "type": "string",
            "description": "Exactly what period this point describes."
          },
          "provisional": {
            "type": "boolean",
            "description": "True when ONS will still revise this year. Mark it as such on a chart."
          },
          "median": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Median pay. Null where withheld.",
            "format": "double"
          },
          "mean": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Mean pay. Null where withheld.",
            "format": "double"
          },
          "employeeJobsThousands": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Indicative employee jobs, in thousands.",
            "format": "double"
          },
          "quality": {
            "type": "string",
            "description": "Reliability band of the median."
          }
        },
        "description": "One year of a pay series."
      },
      "PaySeriesResponse": {
        "required": [
          "soc2020",
          "title",
          "area",
          "measure",
          "unit",
          "sex",
          "workPattern",
          "coverage",
          "points"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "Four-digit SOC 2020 unit group code."
          },
          "title": {
            "type": "string",
            "description": "Unit group title."
          },
          "area": {
            "description": "The area the series covers.",
            "$ref": "#/components/schemas/AreaSummary"
          },
          "measure": {
            "type": "string",
            "description": "Which pay measure."
          },
          "unit": {
            "type": "string",
            "description": "Unit of every figure."
          },
          "sex": {
            "type": "string",
            "description": "\"all\", \"male\" or \"female\"."
          },
          "workPattern": {
            "type": "string",
            "description": "\"all\", \"fulltime\" or \"parttime\"."
          },
          "coverage": {
            "description": "What the figures count. Each point carries its own reference period.",
            "$ref": "#/components/schemas/Coverage"
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaySeriesPoint"
            },
            "description": "One point per published year, oldest first."
          }
        },
        "description": "Pay for one occupation across every published year."
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": [
              "null",
              "string"
            ]
          },
          "title": {
            "type": [
              "null",
              "string"
            ]
          },
          "status": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "detail": {
            "type": [
              "null",
              "string"
            ]
          },
          "instance": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "ProjectionGroup": {
        "required": [
          "code",
          "title",
          "unitGroups"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "Two-digit SOC 2020 sub-major group code, e.g. \"53\"."
          },
          "title": {
            "type": "string",
            "description": "Sub-major group title."
          },
          "unitGroups": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "How many four-digit occupations the group contains. The projection covers them all together.",
            "format": "int32"
          }
        },
        "description": "The broader occupation group projections are published for."
      },
      "ProjectionOutlook": {
        "required": [
          "baseYear",
          "targetYear",
          "employmentBase",
          "employmentTarget",
          "netChange",
          "netChangePercent",
          "direction",
          "replacementDemand",
          "totalRequirement",
          "presentable"
        ],
        "type": "object",
        "properties": {
          "baseYear": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Start of the period (2020).",
            "format": "int32"
          },
          "targetYear": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "End of the period (2035).",
            "format": "int32"
          },
          "employmentBase": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Jobs at the start, nearest 1,000.",
            "format": "int32"
          },
          "employmentTarget": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Jobs at the end, nearest 1,000.",
            "format": "int32"
          },
          "netChange": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Target minus base, nearest 1,000. Negative for a shrinking group.",
            "format": "int32"
          },
          "netChangePercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Net change as a percentage of the base.",
            "format": "double"
          },
          "direction": {
            "type": "string",
            "description": "\"growing\", \"declining\", or \"little change\" where the net change is under 1,000."
          },
          "replacementDemand": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Openings from people leaving the workforce - retirement, family, mortality - over the period, nearest 1,000.",
            "format": "int32"
          },
          "totalRequirement": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Net change plus replacement demand: all the new workers needed over the period. Usually positive even for a shrinking group.",
            "format": "int32"
          },
          "presentable": {
            "type": "boolean",
            "description": "False when the group is below 10,000 jobs in this area. The figures are then null: the publisher asks users not to publish them."
          }
        },
        "description": "What the group is projected to need between the base and target years."
      },
      "ProjectionPoint": {
        "required": [
          "year",
          "employment",
          "projected",
          "presentable"
        ],
        "type": "object",
        "properties": {
          "year": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Year.",
            "format": "int32"
          },
          "employment": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Jobs in the group, rounded to the nearest 1,000 as the publisher advises. Null below 10,000, which the publisher asks users not to publish.",
            "format": "int32"
          },
          "projected": {
            "type": "boolean",
            "description": "False up to 2020 (the modellers' historical estimates); true from 2021, including years that have since passed."
          },
          "presentable": {
            "type": "boolean",
            "description": "False below 10,000, the publisher's minimum for publishing a figure."
          }
        },
        "description": "Projected employment in one year."
      },
      "ProjectionResponse": {
        "required": [
          "soc2020",
          "title",
          "group",
          "area",
          "outlook",
          "series",
          "byQualification",
          "derivation",
          "accuracy",
          "coverage",
          "citation",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The four-digit occupation asked about."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "group": {
            "description": "The sub-major group the figures are actually for.",
            "$ref": "#/components/schemas/ProjectionGroup"
          },
          "area": {
            "description": "The area.",
            "$ref": "#/components/schemas/AreaSummary"
          },
          "outlook": {
            "description": "Change and job openings over the projection period.",
            "$ref": "#/components/schemas/ProjectionOutlook"
          },
          "series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProjectionPoint"
            },
            "description": "Employment year by year, 2010-2035."
          },
          "byQualification": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QualificationOutlook"
            },
            "description": "The outlook split by the highest qualification workers hold, highest level first. Shows which qualifications the openings are for."
          },
          "derivation": {
            "type": "string",
            "description": "How the figures relate to the occupation asked about. Pass this on."
          },
          "accuracy": {
            "type": "string",
            "description": "How accurate projections like these have proved, from the publisher's own assessment."
          },
          "coverage": {
            "description": "What the figures count and when.",
            "$ref": "#/components/schemas/Coverage"
          },
          "citation": {
            "type": "string",
            "description": "The citation the publisher requires wherever these figures are shown."
          },
          "provenance": {
            "description": "Where the figures came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "The employment outlook for an occupation's group."
      },
      "Provenance": {
        "required": [
          "source",
          "publisher",
          "licence",
          "edition",
          "published",
          "url"
        ],
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "description": "Name of the upstream dataset."
          },
          "publisher": {
            "type": "string",
            "description": "Organisation that publishes it."
          },
          "licence": {
            "type": "string",
            "description": "Licence the data is reused under. Most require attribution; see the attribution guide."
          },
          "edition": {
            "type": "string",
            "description": "The release the figure was taken from, as the publisher labels it, e.g. \"2025 provisional\"."
          },
          "published": {
            "type": [
              "null",
              "string"
            ],
            "description": "When this service began serving that release.",
            "format": "date-time"
          },
          "url": {
            "type": "string",
            "description": "The publisher's page for the dataset."
          }
        },
        "description": "Where a figure came from. Attached to every data response so that anything\r\nshown to a user can be attributed and traced to the exact release it came from."
      },
      "QualificationOutlook": {
        "required": [
          "qualification",
          "rqf",
          "label",
          "employmentBase",
          "employmentTarget",
          "netChange",
          "replacementDemand",
          "totalRequirement",
          "sharePercent",
          "presentable"
        ],
        "type": "object",
        "properties": {
          "qualification": {
            "type": "string",
            "description": "Key: rqf8 down to rqf1, or none."
          },
          "rqf": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Level on the Regulated Qualifications Framework; null for no qualification.",
            "format": "int32"
          },
          "label": {
            "type": "string",
            "description": "What the level means, e.g. \"First degree\"."
          },
          "employmentBase": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Jobs held by people at this level at the start, nearest 1,000.",
            "format": "int32"
          },
          "employmentTarget": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "At the end, nearest 1,000.",
            "format": "int32"
          },
          "netChange": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Target minus base, nearest 1,000. Often negative for lower levels as qualification levels rise across the workforce.",
            "format": "int32"
          },
          "replacementDemand": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Openings from people at this level leaving, nearest 1,000.",
            "format": "int32"
          },
          "totalRequirement": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "New workers needed at this level, nearest 1,000. Can be negative where a level is being displaced faster than people leave.",
            "format": "int32"
          },
          "sharePercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "This level's share of the group's total requirement. Null when the total is not positive.",
            "format": "double"
          },
          "presentable": {
            "type": "boolean",
            "description": "False when employment at this level is under 10,000 in this area. The figures are then null: the publisher asks users not to publish them."
          }
        },
        "description": "The outlook for workers holding one level of qualification."
      },
      "QuarantinedEdition": {
        "required": [
          "id",
          "sourceKey",
          "label",
          "detectedAt"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Edition id.",
            "format": "uuid"
          },
          "sourceKey": {
            "type": "string",
            "description": "Which source."
          },
          "label": {
            "type": "string",
            "description": "The publisher's name for the release."
          },
          "detectedAt": {
            "type": "string",
            "description": "When it was seen.",
            "format": "date-time"
          }
        },
        "description": "A release held back because it failed validation. The previous release is still served."
      },
      "RegionalPayFigure": {
        "required": [
          "area",
          "median",
          "mean",
          "quality",
          "presentable",
          "relativeToUkPercent"
        ],
        "type": "object",
        "properties": {
          "area": {
            "description": "The region.",
            "$ref": "#/components/schemas/AreaSummary"
          },
          "median": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Median pay. Null where ONS withholds it; the region is still listed.",
            "format": "double"
          },
          "mean": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Mean pay. Null where withheld.",
            "format": "double"
          },
          "quality": {
            "type": "string",
            "description": "Reliability band of the median."
          },
          "presentable": {
            "type": "boolean",
            "description": "False when the figure should not be shown as a number."
          },
          "relativeToUkPercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "How far the median sits above (+) or below (-) the UK median. Null unless both figures can be shown.",
            "format": "double"
          }
        },
        "description": "Pay in one region."
      },
      "RegionalPayResponse": {
        "required": [
          "soc2020",
          "title",
          "year",
          "referencePeriod",
          "provisional",
          "measure",
          "unit",
          "sex",
          "workPattern",
          "uk",
          "regions",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "Four-digit SOC 2020 unit group code."
          },
          "title": {
            "type": "string",
            "description": "Unit group title."
          },
          "year": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Reference year.",
            "format": "int32"
          },
          "referencePeriod": {
            "type": "string",
            "description": "Exactly what period the figures describe."
          },
          "provisional": {
            "type": "boolean",
            "description": "True until ONS publishes revised figures."
          },
          "measure": {
            "type": "string",
            "description": "Which pay measure."
          },
          "unit": {
            "type": "string",
            "description": "Unit of every figure."
          },
          "sex": {
            "type": "string",
            "description": "\"all\", \"male\" or \"female\"."
          },
          "workPattern": {
            "type": "string",
            "description": "\"all\", \"fulltime\" or \"parttime\"."
          },
          "uk": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "The UK figure for comparison. Null if unavailable.",
                "$ref": "#/components/schemas/UkPayFigure"
              }
            ]
          },
          "regions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RegionalPayFigure"
            },
            "description": "Every region, highest median first; withheld regions last."
          },
          "coverage": {
            "description": "What the figures count and when.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where the figures came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Pay for one occupation in every region, against the UK figure."
      },
      "RelatedOccupation": {
        "required": [
          "title",
          "description",
          "uri"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "ESCO occupation title."
          },
          "description": {
            "type": [
              "null",
              "string"
            ],
            "description": "ESCO's description of the role."
          },
          "uri": {
            "type": "string",
            "description": "Stable ESCO identifier."
          }
        },
        "description": "An ESCO occupation related to the SOC unit group."
      },
      "RouteBlock": {
        "required": [
          "heading",
          "parts"
        ],
        "type": "object",
        "properties": {
          "heading": {
            "type": [
              "null",
              "string"
            ],
            "description": "e.g. \"Entry requirements\"; null for the text before any subheading."
          },
          "parts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RoutePart"
            },
            "description": "Paragraphs and lists in page order."
          }
        },
        "description": "Text under one subheading of a route."
      },
      "RoutePart": {
        "required": [
          "text",
          "items"
        ],
        "type": "object",
        "properties": {
          "text": {
            "type": [
              "null",
              "string"
            ],
            "description": "A paragraph."
          },
          "items": {
            "type": [
              "null",
              "array"
            ],
            "items": {
              "type": "string"
            },
            "description": "A list's items."
          }
        },
        "description": "A paragraph (`text`) or a bulleted list (`items`); exactly one is set."
      },
      "SkillsEnglandOccupationItem": {
        "required": [
          "code",
          "name",
          "match",
          "level",
          "status",
          "overview",
          "route",
          "pathway",
          "technicalLevel",
          "typicalJobTitles",
          "products",
          "url"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "Skills England's code, \"OCC0155\"."
          },
          "name": {
            "type": "string",
            "description": "Its name, e.g. \"Gas engineering operative\"."
          },
          "match": {
            "type": "string",
            "description": "\"primary\" when Skills England codes it to this SOC unit group; \"partial\" when it is coded elsewhere but partly to this one."
          },
          "level": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "The occupation's level, 2 to 7.",
            "format": "int32"
          },
          "status": {
            "type": "string",
            "description": "e.g. \"Approved occupation\", \"Occupational standard in development\"."
          },
          "overview": {
            "type": [
              "null",
              "string"
            ],
            "description": "One-sentence description."
          },
          "route": {
            "type": "string",
            "description": "The occupational route, e.g. \"Construction and the built environment\"."
          },
          "pathway": {
            "type": [
              "null",
              "string"
            ],
            "description": "The pathway within the route."
          },
          "technicalLevel": {
            "type": [
              "null",
              "string"
            ],
            "description": "\"Technical\", \"Higher technical\" or \"Professional\"."
          },
          "typicalJobTitles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Job titles Skills England lists for it."
          },
          "products": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TechnicalProduct"
            },
            "description": "Its apprenticeships and qualifications, lowest level first."
          },
          "url": {
            "type": "string",
            "description": "The occupation's page on the occupational maps."
          }
        },
        "description": "An occupation on Skills England's occupational maps."
      },
      "SkillsResponse": {
        "required": [
          "soc2020",
          "title",
          "isco08",
          "relatedOccupationCount",
          "relatedOccupations",
          "skills",
          "derivation",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "Four-digit SOC 2020 unit group code."
          },
          "title": {
            "type": "string",
            "description": "Unit group title."
          },
          "isco08": {
            "type": "string",
            "description": "The ISCO-08 group used to join ESCO."
          },
          "relatedOccupationCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "How many ESCO occupations sit under that group.",
            "format": "int32"
          },
          "relatedOccupations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RelatedOccupation"
            },
            "description": "Up to 25 of them."
          },
          "skills": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SkillSummary"
            },
            "description": "Skills and knowledge, most widely shared first."
          },
          "derivation": {
            "type": "string",
            "description": "How the match was made. These are related occupations, not exact equivalents; say so when presenting them."
          },
          "provenance": {
            "description": "Where the data came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "What the occupation involves, from ESCO."
      },
      "SkillSummary": {
        "required": [
          "skillTitle",
          "type",
          "sharedBy",
          "essential"
        ],
        "type": "object",
        "properties": {
          "skillTitle": {
            "type": "string",
            "description": "ESCO's name for it."
          },
          "type": {
            "type": "string",
            "description": "\"skill\" (something done) or \"knowledge\" (something understood)."
          },
          "sharedBy": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "How many of the related ESCO occupations list it. Higher means more central to the work.",
            "format": "int32"
          },
          "essential": {
            "type": "boolean",
            "description": "True if at least one related occupation marks it essential rather than optional."
          }
        },
        "description": "A skill or body of knowledge associated with the occupation."
      },
      "SourceFreshness": {
        "required": [
          "sourceKey",
          "lastRun",
          "lastSuccess"
        ],
        "type": "object",
        "properties": {
          "sourceKey": {
            "type": "string",
            "description": "Which source."
          },
          "lastRun": {
            "type": "string",
            "description": "Most recent check.",
            "format": "date-time"
          },
          "lastSuccess": {
            "type": [
              "null",
              "string"
            ],
            "description": "Most recent check that did not fail.",
            "format": "date-time"
          }
        },
        "description": "When a source was last checked for new releases."
      },
      "SourceResponse": {
        "required": [
          "key",
          "name",
          "publisher",
          "licence",
          "url",
          "cadence",
          "tier",
          "currentEdition",
          "currentEditionPublished"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "Identifier used by `/v1/meta/editions?source=`."
          },
          "name": {
            "type": "string",
            "description": "Dataset name."
          },
          "publisher": {
            "type": "string",
            "description": "Publishing organisation."
          },
          "licence": {
            "type": "string",
            "description": "Licence the data is reused under."
          },
          "url": {
            "type": "string",
            "description": "Publisher's page for the dataset."
          },
          "cadence": {
            "type": [
              "null",
              "string"
            ],
            "description": "How often the publisher releases it."
          },
          "tier": {
            "type": "string",
            "description": "How the service tracks it: \"api\", \"scrapeanddiff\" or \"detectonly\"."
          },
          "currentEdition": {
            "type": [
              "null",
              "string"
            ],
            "description": "The release currently served. Null if none yet."
          },
          "currentEditionPublished": {
            "type": [
              "null",
              "string"
            ],
            "description": "When that release began being served.",
            "format": "date-time"
          }
        },
        "description": "An upstream dataset this service draws on."
      },
      "StandardDetail": {
        "required": [
          "durationMonths",
          "entryRequirements",
          "regulatedBy",
          "professionalRecognition",
          "degree",
          "qualificationsGained",
          "version"
        ],
        "type": "object",
        "properties": {
          "durationMonths": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Typical time to complete, in months.",
            "format": "int32"
          },
          "entryRequirements": {
            "type": [
              "null",
              "string"
            ],
            "description": "What employers typically ask for, in Skills England's words. Usually null: most leave it to the employer."
          },
          "regulatedBy": {
            "type": [
              "null",
              "string"
            ],
            "description": "The statutory regulator you must register with to practise, e.g. \"Nursing and Midwifery Council (NMC)\". Null if the occupation is not regulated."
          },
          "professionalRecognition": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Professional bodies whose registration or membership completing it can lead to."
          },
          "degree": {
            "type": [
              "null",
              "string"
            ],
            "description": "\"integrated\" when the apprenticeship includes a degree assessed together with it, \"separate\" when it includes a degree assessed apart, null otherwise."
          },
          "qualificationsGained": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Qualifications gained along the way."
          },
          "version": {
            "type": "string",
            "description": "The standard's version."
          }
        },
        "description": "What an apprenticeship standard involves, from Skills England."
      },
      "TechnicalProduct": {
        "required": [
          "code",
          "name",
          "type",
          "level",
          "status",
          "careerStarter",
          "detail"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "Skills England's product code: \"ST0155\" for an apprenticeship standard, \"TL0002e\" for a T Level."
          },
          "name": {
            "type": "string",
            "description": "Its name."
          },
          "type": {
            "type": "string",
            "description": "\"apprenticeship\", \"foundation_apprenticeship\", \"apprenticeship_unit\", \"t_level\", \"higher_technical_qualification\" or \"technical_qualification\"."
          },
          "level": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Qualification level, 2 to 7.",
            "format": "int32"
          },
          "status": {
            "type": [
              "null",
              "string"
            ],
            "description": "e.g. \"Approved for delivery\", \"Retired\". Null where Skills England gives none, as for T Levels."
          },
          "careerStarter": {
            "type": "boolean",
            "description": "Whether it is marked as a career starter apprenticeship for young people."
          },
          "detail": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "For an apprenticeship standard, how long it takes and what it leads to. Null for other products.",
                "$ref": "#/components/schemas/StandardDetail"
              }
            ]
          }
        },
        "description": "An apprenticeship, T Level or other technical qualification."
      },
      "UkPayFigure": {
        "required": [
          "median",
          "quality"
        ],
        "type": "object",
        "properties": {
          "median": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "UK median for the same occupation, year and breakdown.",
            "format": "double"
          },
          "quality": {
            "type": "string",
            "description": "Its reliability band."
          }
        },
        "description": "The UK-wide figure regional pay is compared against."
      },
      "VacancyGroup": {
        "required": [
          "code",
          "title",
          "level"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "SOC 2020 code at that level."
          },
          "title": {
            "type": "string",
            "description": "Group title."
          },
          "level": {
            "type": "string",
            "description": "\"unit group\", \"minor group\", \"sub-major group\" or \"major group\"."
          }
        },
        "description": "The occupation group the vacancy figures are for."
      },
      "VacancyResponse": {
        "required": [
          "soc2020",
          "title",
          "group",
          "area",
          "latest",
          "previous",
          "allOccupations",
          "derivation",
          "definitions",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The four-digit occupation asked about."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "group": {
            "description": "The group the figures are actually for: the finest level the survey published for this area.",
            "$ref": "#/components/schemas/VacancyGroup"
          },
          "area": {
            "description": "The area.",
            "$ref": "#/components/schemas/AreaSummary"
          },
          "latest": {
            "description": "The latest survey year.",
            "$ref": "#/components/schemas/VacancyYear"
          },
          "previous": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "The survey before, at the same level, for comparison. Null if there is none.",
                "$ref": "#/components/schemas/VacancyYear"
              }
            ]
          },
          "allOccupations": {
            "description": "The same measures across all occupations in the area and year, for context.",
            "$ref": "#/components/schemas/VacancyYear"
          },
          "derivation": {
            "type": "string",
            "description": "Why the figures are at this level. Pass this on when it is not the unit group."
          },
          "definitions": {
            "type": "string",
            "description": "What hard-to-fill and skill-shortage vacancies mean."
          },
          "coverage": {
            "description": "What the figures count and when.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where the figures came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Skill-shortage measures for an occupation."
      },
      "VacancyYear": {
        "required": [
          "year",
          "vacancies",
          "hardToFill",
          "skillShortage",
          "hardToFillPercent",
          "skillShortagePercent",
          "employersReporting",
          "presentable"
        ],
        "type": "object",
        "properties": {
          "year": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Survey year.",
            "format": "int32"
          },
          "vacancies": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Vacancies at the time of the survey, nearest 100. Null when withheld.",
            "format": "int32"
          },
          "hardToFill": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Vacancies employers described as hard to fill, nearest 100.",
            "format": "int32"
          },
          "skillShortage": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Hard-to-fill vacancies where the reason was applicants lacking skills, qualifications or experience, nearest 100.",
            "format": "int32"
          },
          "hardToFillPercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Hard-to-fill vacancies as a percentage of all vacancies in the group.",
            "format": "double"
          },
          "skillShortagePercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Skill-shortage vacancies as a percentage of all vacancies in the group. The usual headline measure of a shortage.",
            "format": "double"
          },
          "employersReporting": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "Employers in the survey with a vacancy in the group, the base for the figures. Null when confidential.",
            "format": "int32"
          },
          "presentable": {
            "type": "boolean",
            "description": "False when the survey withheld the figures for too small a sample."
          }
        },
        "description": "Vacancies employers reported in one survey year."
      },
      "VisaListItem": {
        "required": [
          "rank",
          "soc2020",
          "title",
          "grants",
          "applications"
        ],
        "type": "object",
        "properties": {
          "rank": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "1 for the most grants.",
            "format": "int32"
          },
          "soc2020": {
            "type": "string",
            "description": "The occupation."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "grants": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Grants over the latest four quarters.",
            "format": "int32"
          },
          "applications": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Applications over the latest four quarters.",
            "format": "int32"
          }
        },
        "description": "An occupation in the sponsored visas listing."
      },
      "VisaListResponse": {
        "required": [
          "from",
          "to",
          "occupations",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "First quarter of the period."
          },
          "to": {
            "type": "string",
            "description": "Last quarter of the period."
          },
          "occupations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VisaListItem"
            },
            "description": "Occupations with at least one grant, most first."
          },
          "coverage": {
            "description": "What the figures count.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where they came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Occupations by sponsored visas granted."
      },
      "VisaQuarter": {
        "required": [
          "period",
          "year",
          "quarter",
          "applications",
          "grants",
          "provisional"
        ],
        "type": "object",
        "properties": {
          "period": {
            "type": "string",
            "description": "\"2026 Q2\"."
          },
          "year": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Calendar year.",
            "format": "int32"
          },
          "quarter": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Calendar quarter, 1 to 4.",
            "format": "int32"
          },
          "applications": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Applications made in the quarter.",
            "format": "int32"
          },
          "grants": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Visas granted in the quarter, possibly for applications made earlier.",
            "format": "int32"
          },
          "provisional": {
            "type": "boolean",
            "description": "True when the Home Office has said it will revise the quarter."
          }
        },
        "description": "Sponsored work visas for an occupation in one quarter."
      },
      "VisaResponse": {
        "required": [
          "soc2020",
          "title",
          "latestYear",
          "quarters",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The occupation."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "latestYear": {
            "description": "The latest four quarters, with breakdowns.",
            "$ref": "#/components/schemas/VisaYear"
          },
          "quarters": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VisaQuarter"
            },
            "description": "Every quarter since Q4 2024, the first coded to four-digit occupations, oldest first. Quarters with no visas are zero."
          },
          "coverage": {
            "description": "What the figures count.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where they came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Sponsored work visas for an occupation."
      },
      "VisaShare": {
        "required": [
          "name",
          "grants",
          "percent"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The route, nationality or industry."
          },
          "grants": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Grants in the period.",
            "format": "int32"
          },
          "percent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "description": "Share of the occupation's grants in the period.",
            "format": "double"
          }
        },
        "description": "A share of an occupation's visa grants."
      },
      "VisaYear": {
        "required": [
          "from",
          "to",
          "applications",
          "grants",
          "rank",
          "occupationsRanked",
          "routes",
          "nationalities",
          "industries"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "First quarter, e.g. \"2025 Q3\"."
          },
          "to": {
            "type": "string",
            "description": "Last quarter, e.g. \"2026 Q2\"."
          },
          "applications": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Applications in the period.",
            "format": "int32"
          },
          "grants": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Grants in the period.",
            "format": "int32"
          },
          "rank": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "The occupation's rank by grants among all occupations in the period, 1 being the most. Null when it had none.",
            "format": "int32"
          },
          "occupationsRanked": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "How many occupations had at least one grant in the period.",
            "format": "int32"
          },
          "routes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VisaShare"
            },
            "description": "Grants by visa route, largest first."
          },
          "nationalities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VisaShare"
            },
            "description": "The ten nationalities granted most, largest first."
          },
          "industries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VisaShare"
            },
            "description": "The five industries sponsors gave most, largest first. Self-assigned by sponsors."
          }
        },
        "description": "An occupation's sponsored visas over the latest four quarters."
      },
      "WorkforceResponse": {
        "required": [
          "soc2020",
          "title",
          "people",
          "agedUnder25Percent",
          "aged55AndOverPercent",
          "degreePercent",
          "ageBands",
          "qualifications",
          "industries",
          "coverage",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The occupation."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "people": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "People in employment in the occupation, summed over age bands.",
            "format": "int32"
          },
          "agedUnder25Percent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Share aged 16 to 24. Null if any band in it is withheld.",
            "format": "double"
          },
          "aged55AndOverPercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Share aged 55 and over, who will retire over the coming decade or so. Null if any band in it is withheld.",
            "format": "double"
          },
          "degreePercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Share whose highest qualification is a degree or equivalent. Null if withheld.",
            "format": "double"
          },
          "ageBands": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkforceShare"
            },
            "description": "People by age band, youngest first."
          },
          "qualifications": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkforceShare"
            },
            "description": "People by highest qualification held, in the release's order (highest first)."
          },
          "industries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkforceShare"
            },
            "description": "The ten industries employing most of the occupation, largest first; withheld industries are left out."
          },
          "coverage": {
            "description": "What the figures count and when.",
            "$ref": "#/components/schemas/Coverage"
          },
          "provenance": {
            "description": "Where they came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Who works in an occupation."
      },
      "WorkforceShare": {
        "required": [
          "code",
          "name",
          "people",
          "percent",
          "quality",
          "presentable"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "The category's code: an age band number, a qualification number, or a SIC 2007 class like \"43.22\"."
          },
          "name": {
            "type": "string",
            "description": "What the category is."
          },
          "people": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "description": "People in employment in the occupation and category. Null when withheld for too small a sample.",
            "format": "int32"
          },
          "percent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "description": "Share of the occupation's workforce. Null when withheld.",
            "format": "double"
          },
          "quality": {
            "type": "string",
            "description": "\"reasonable\" (larger sample), \"acceptable\" (small sample: use with caution) or \"unreliable\" (withheld)."
          },
          "presentable": {
            "type": "boolean",
            "description": "False when withheld."
          }
        },
        "description": "One category of a workforce breakdown."
      },
      "WorkProfileResponse": {
        "required": [
          "soc2020",
          "title",
          "hollandCode",
          "interests",
          "abilities",
          "basedOn",
          "derivation",
          "attribution",
          "provenance"
        ],
        "type": "object",
        "properties": {
          "soc2020": {
            "type": "string",
            "description": "The four-digit occupation asked about."
          },
          "title": {
            "type": "string",
            "description": "Its title."
          },
          "hollandCode": {
            "type": "string",
            "description": "The three highest interest types' letters, highest first, e.g. \"RCI\"."
          },
          "interests": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InterestScore"
            },
            "description": "All six interest types, highest first."
          },
          "abilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AbilityScore"
            },
            "description": "Abilities by importance, most important first."
          },
          "basedOn": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkProfileSource"
            },
            "description": "The US occupations averaged, largest weight first. Show these if you show the profile, so users can judge the match."
          },
          "derivation": {
            "type": "string",
            "description": "How the US data reaches a UK occupation. Pass this on."
          },
          "attribution": {
            "type": "string",
            "description": "The credit O*NET's licence requires wherever this information is shown."
          },
          "provenance": {
            "description": "Where the data came from.",
            "$ref": "#/components/schemas/Provenance"
          }
        },
        "description": "Interests and abilities associated with an occupation, from O*NET."
      },
      "WorkProfileSource": {
        "required": [
          "code",
          "title",
          "weightPercent"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "O*NET-SOC code."
          },
          "title": {
            "type": "string",
            "description": "US occupation title."
          },
          "weightPercent": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "description": "Its share of the average.",
            "format": "double"
          }
        },
        "description": "A US occupation the profile is averaged from."
      }
    },
    "securitySchemes": {
      "ApiKey": {
        "type": "apiKey",
        "description": "Your API key. Required on every endpoint except /v1/meta.",
        "name": "X-API-Key",
        "in": "header"
      }
    }
  },
  "tags": [
    {
      "name": "Occupations"
    },
    {
      "name": "Demand"
    },
    {
      "name": "Visas"
    },
    {
      "name": "Job adverts"
    },
    {
      "name": "Local areas"
    },
    {
      "name": "Metadata"
    },
    {
      "name": "Keys"
    }
  ],
  "servers": [
    {
      "url": "https://api.jobfacts.uk"
    }
  ]
}