# UK Public Sector Jobs Scraper: NHS Jobs & Teaching Vacancies (`signalscouter/uk-public-sector-jobs-scraper`) Actor

Scrape UK public-sector vacancies from NHS Jobs and Teaching Vacancies (official OGL APIs), plus optional DWP Find a Job. One schema with annual GBP salary, NHS Agenda for Change bands, teacher pay scales, region, closing-soon filter, new-job monitoring and employer hiring summaries.

- **URL**: https://apify.com/signalscouter/uk-public-sector-jobs-scraper.md
- **Developed by:** [Signal Scout](https://apify.com/signalscouter) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## UK Public Sector Jobs Scraper: NHS Jobs & Teaching Vacancies

**Get UK public-sector vacancies from NHS Jobs and Teaching Vacancies (DfE) in one clean dataset, with UK pay normalised.** Every salary is turned into an annual GBP figure. NHS jobs are tagged with their exact Agenda for Change band and teaching jobs with their pay scale (MPS, UPS, leadership). Each job also gets its region and local authority. You can filter for jobs closing in the next few days, and run it on a schedule to get only new jobs.

✅ NHS Jobs + Teaching Vacancies in one schema · ✅ annual GBP salary min/max · ✅ exact NHS AfC band (2–9, 8a–8d) · ✅ teacher pay scales (MPS / UPS / leadership / unqualified) · ✅ region + local authority from postcode · ✅ "closing soon" filter · ✅ "new jobs only" monitoring · ✅ hiring summary per trust or school · ✅ official open-licence APIs, no proxies, no browser

*By **signalscouter**: reliable, low-cost data scrapers for hiring and market signals.*

***

### What does UK Public Sector Jobs Scraper do?

It reads the **official public APIs** behind two of the UK's biggest public-sector job boards:

| Source | What it covers | Access | Licence |
|---|---|---|---|
| **NHS Jobs** (NHS Business Services Authority) | ~12,000 live NHS vacancies in England & Wales: trusts, GP practices, ICBs, hospices | Official public XML search API | Open Government Licence v3.0 |
| **Teaching Vacancies** (Department for Education) | ~5,000 live school jobs in England: teachers, leaders, teaching assistants, support staff | Official public JSON API (schema.org JobPosting) | Open Government Licence v3.0 |

It then **normalises both into one schema** and adds the things UK recruiters actually filter on:

- **Pay:** "£28,392 to £31,157 a year", "£13.45 per hour" and "G6 SCP 20-24 £28,153-£31,015 FTE" all become `salaryAnnualMin` / `salaryAnnualMax` in GBP. Pro-rata and FTE adverts are flagged.
- **NHS Agenda for Change band:** taken from NHS Jobs' own pay-band filter, so it's exact. When an advert gives no figures (e.g. "Negotiable"), the band's 2026/27 pay range is used and flagged.
- **Teacher pay scales:** MPS / M1–M6, UPS / U1–U3, leadership (L-points), unqualified and lead practitioner, read from the advert text or matched against national pay ranges.
- **Location:** postcode → **region** and **local authority** (postcodes.io, ONS open data).
- **Contract and hours:** permanent / fixed-term / bank / locum / apprenticeship / training…, full-time / part-time, and hours per week where stated.
- **Dates:** posted date, closing date and `daysUntilClosing`.

### What data do you get?

**Per job (`recordType: "job"`):**

- `source`, `jobId`, stable `uid`, `reference`, `title`, `jobRole` (Teaching Vacancies)
- `employer`, `employerType` (nhs_trust, gp_practice, nhs_icb, school, academy_trust, local_authority…), `employerId` (school URN), `employerWebsite`
- `location`, `postcode`, `region`, `localAuthority`, `country`
- `salaryText`, `salaryMin`, `salaryMax`, `salaryInterval`, `salaryAnnualMin`, `salaryAnnualMax`, `salaryIsProRata`, `salarySource`
- `nhsBand`, `nhsBandSource`, `payScheme`, `teacherPayScales`, `teacherPayPoints`
- `contractType`, `workingPattern`, `hoursPerWeek`, `isRemote`
- `postedAt`, `closingDate`, `daysUntilClosing`
- `url`, `applyUrl`, `description` (+ `descriptionHtml` optional), `isNew` (monitoring mode), `attribution`, `scrapedAt`

**Per employer (`recordType: "employerSummary"`, optional):**

- Open roles; roles posted in the last 7 and 30 days; roles closing within 7 days
- NHS band mix, teacher pay-scale mix, contract-type mix
- Median annual salary, top titles, regions, local authorities
- `newSinceLastRun` in monitoring mode

### Use cases

- 🏥 **Healthcare recruitment and staffing agencies:** get every new Band 5–7 nursing role in your region each morning, grouped by trust.
- 🍎 **Education recruitment agencies:** track new teaching and TA roles by local authority, and see which schools are hiring repeatedly.
- 🧑‍💻 **Niche job boards:** power a nurse, teacher or public-sector board with clean, attributed, openly licensed data.
- 📈 **Sales to the NHS and schools:** a trust posting 30 roles this month, or a school replacing its business manager, is a buying signal. Feed the employer summaries into your CRM.
- 📊 **Labour-market research and journalism:** count vacancies by band, region, trust or local authority over time.
- ⏰ **"Closing soon" alerts:** catch roles before the deadline. Public-sector adverts have hard closing dates.

### How to use it

1. Click **Try for free**. Choose your sources (NHS Jobs, Teaching Vacancies or both) and, optionally, add **Keywords** and **Locations**.
2. Add filters: region, minimum annual salary, NHS bands, teacher pay scales, job roles, contract type, working pattern, posted within N days, or closing within N days.
3. Click **Start**. Download the results as JSON, CSV or Excel, or read them through the API.

#### Input example: Band 5–6 nursing jobs in Yorkshire closing within 7 days

```json
{
  "sources": ["nhs"],
  "keywords": ["nurse"],
  "nhsBands": ["5", "6"],
  "regions": ["Yorkshire and The Humber"],
  "closingWithinDays": 7,
  "includeEmployerSummary": true
}
```

#### Input example: daily feed of new MPS/UPS teaching jobs in London (monitoring mode)

```json
{
  "sources": ["teaching"],
  "teachingJobRoles": ["teacher"],
  "teacherPayScales": ["MPS", "UPS"],
  "regions": ["London"],
  "onlyNewJobs": true
}
```

**Schedule** the Actor (for example, daily at 07:00) with **Only new jobs since last run** on. Each run then outputs only jobs that weren't there last time. The "seen jobs" memory is kept in a named key-value store (`uk-public-sector-jobs-state`) in your account, keyed on your filters so different saved tasks don't interfere.

### Output sample

| source | title | employer | region | salaryAnnualMin | salaryAnnualMax | nhsBand | teacherPayScales | closingDate |
|---|---|---|---|---|---|---|---|---|
| nhs | Registered Nurse | The Mid Yorkshire Teaching NHS Trust | Yorkshire and The Humber | 32073 | 39043 | 5 | — | 2026-10-25 |
| nhs | PGDip Student Midwife | Lewisham and Greenwich NHS Trust | London | 32073 | 39043 | 5 | — | 2026-10-20 |
| teaching | Teacher with Head of Learning Responsibility | St Edward's Church of England Academy | London | 39195 | 58119 | — | MPS, UPS | 2026-10-23 |
| teaching | Teaching Assistant Level 2 | Garforth Academy | Yorkshire and The Humber | 26847 | 27709 | — | — | 2026-10-31 |

```json
{
  "recordType": "job",
  "source": "nhs",
  "sourceName": "NHS Jobs",
  "jobId": "5669750",
  "title": "PGDip Student Midwife",
  "employer": "Lewisham and Greenwich NHS Trust",
  "employerType": "nhs_trust",
  "location": "Woolwich, SE18 4QH",
  "postcode": "SE18 4QH",
  "region": "London",
  "localAuthority": "Greenwich",
  "salaryText": "£32,073 to £39,043 a year per annum plus HCAS",
  "salaryAnnualMin": 32073,
  "salaryAnnualMax": 39043,
  "salaryInterval": "year",
  "nhsBand": "5",
  "nhsBandSource": "nhsJobsAdvert",
  "payScheme": "Agenda for change",
  "contractType": "training",
  "workingPattern": "full_time",
  "postedAt": "2026-10-16T15:16:42.657996+00:00",
  "closingDate": "2026-10-20T00:00:00+00:00",
  "daysUntilClosing": 0,
  "url": "https://www.jobs.nhs.uk/candidate/jobadvert/C9197-26-0938",
  "attribution": "Contains public sector information licensed under the Open Government Licence v3.0. Source: NHS Jobs (NHS Business Services Authority)."
}
```

Employer summary example:

```json
{
  "recordType": "employerSummary",
  "source": "nhs",
  "employer": "Leeds Teaching Hospitals",
  "employerType": "nhs_trust",
  "openJobs": 23,
  "postedLast7Days": 13,
  "closingWithin7Days": 12,
  "medianAnnualSalary": 35558,
  "bandMix": [{"name": "Band 3", "count": 5}, {"name": "Band 6", "count": 7}, {"name": "Band 8a", "count": 1}],
  "localAuthorities": [{"name": "Leeds", "count": 23}]
}
```

*(Figures from test runs in October 2026; live numbers change daily.)*

The Console has three ready-made views: **Jobs**, **Employer hiring summaries** and **Errors**.

### How much does it cost?

The Actor uses **pay-per-event** pricing. Current prices are always on the **Pricing** tab. You pay for:

- each **job** returned (`job-result` event)
- each **employer summary**, only if you turn summaries on (`employer-summary` event)

Error records are **never charged**. In monitoring mode you pay only for **new** jobs. Use **Max jobs per source**, **Max total jobs** and the filters to cap the cost of a run.

The Actor also respects your run's **maximum cost** setting. When it is reached, it stops delivering jobs, and `RUN_SUMMARY.droppedAtChargeLimit` shows how many matching jobs and summaries were left out. In monitoring mode those jobs are **not** marked as seen, so the next run delivers them. Apify's free monthly credits are enough to try it.

### FAQ

**Is this legal? Can I reuse the data commercially?**
Both sources publish their job data under the **Open Government Licence v3.0**. The OGL lets you copy, publish and adapt the data, including commercially, **as long as you attribute it**. Every record carries an `attribution` field with the required statement. Keep it, or show "Contains public sector information licensed under the Open Government Licence v3.0" with the source name wherever you republish the data. The Teaching Vacancies API terms also say you must not charge candidates or schools a fee for a hire made through a listing you republished. Check that rule if you run an agency. The Actor reads only public job adverts, never logs in, collects no candidate data, respects robots.txt and waits between requests.

**How accurate are the NHS bands and teacher pay scales?**

- **NHS bands** (`nhsBandSource: "nhsJobs"`) come from NHS Jobs' own pay-band filter, so they're exact.
- **`nhsJobsAdvert`** means the band was read from the advert page. **`text`** means "Band N" appeared in the title or salary. **`salary`** means the salary matched a 2025/26 or 2026/27 Agenda for Change pay point.
- **Teacher pay scales** come from the advert's own wording (MPS, M1–M6, UPS, L8–L10…) or from figures that match the 2026/27 or 2025/26 national ranges.
- When an advert names a scale but gives no figures, the national (rest-of-England) range is used and `salarySource` says so.

**How is the annual salary calculated?**

- Hourly pay × 1,950 (37.5 hours × 52 weeks), daily × 260, weekly × 52, monthly × 12.
- Pro-rata and FTE adverts keep the full-time-equivalent figures and set `salaryIsProRata: true`.
- "Up to £X" gives only a maximum, and "From £X" only a minimum.

**Why is the NHS description short?**
NHS Jobs' feed includes only the first ~150 characters. Turn on **NHS: fetch full advert** to get the full summary, main duties and responsibilities, plus pay scheme, working pattern and reference. It costs one extra request per output job, so use it with filters or caps.

**What about Civil Service Jobs, DWP Find a Job, Reed or Indeed?**

- **Civil Service Jobs** runs an anti-bot check, so it isn't included.
- **DWP Find a Job** returned errors to every automated request in our October 2026 tests, so it isn't included either.
- **Commercial boards** (Reed, Totaljobs, Indeed, Adzuna) forbid commercial reuse in their terms.

We only ship sources we can use reliably and legitimately. Open an issue if there's an official feed you'd like added.

**How do keywords work?**

- By default, a keyword must appear in the **job title** (or the Teaching Vacancies job role), which gives precise results.
- Set **Keyword match** to *Anywhere* to use NHS Jobs' own full-text search and match Teaching Vacancies descriptions too. This is much broader: "nurse" matches about 40% of all NHS adverts.

**How fast is it? Is the data complete?**

- **A full run of both boards** (~17,000 jobs) takes about 3–5 minutes on the platform at the default 512 MB memory (peak use is about 225 MB, so more memory doesn't help).
- **NHS Jobs** is read in newest-first order, the only ordering NHS Jobs pages through without dropping jobs. Exact band tagging makes a second pass per band.
- **Teaching Vacancies:** the API has no server-side filters, so each run reads all ~60 pages (about 1 minute). Some jobs appear on more than one page, and the Actor removes the duplicates. On 20 Oct 2026, the API's reported 5,794 count came to 5,050 unique jobs.
- **Posted within N days** stops early on both sources, so daily monitoring runs take about 10 seconds.

**How do I integrate it?**
Use the **Apify API** or the official JavaScript and Python clients. You can also connect it with **Make, Zapier, n8n, Google Sheets, Slack, webhooks**, or the **Apify MCP server** for AI agents. Results export to JSON, CSV, Excel, XML or RSS.

### Attribution

- Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).
- **NHS Jobs** data © NHS Business Services Authority.
- **Teaching Vacancies** data © Department for Education.
- Postcode lookups use [postcodes.io](https://postcodes.io), which serves Office for National Statistics data (OGL).

signalscouter isn't affiliated with, or endorsed by, the NHS, NHSBSA or DfE.

### More signalscouter Actors

| Actor | What it gives you |
|---|---|
| [Career Site Jobs Scraper](https://apify.com/signalscouter/career-site-jobs-scraper) | Jobs from 12 ATSes (Greenhouse, Lever, Ashby, Workday, Workable and more) in one schema, from company domains |
| [Workday Jobs Scraper](https://apify.com/signalscouter/workday-jobs-scraper) | Jobs from any `myworkdayjobs.com` career site, including sites with more than 2,000 jobs |
| [Company Tech Stack & Domain Signals](https://apify.com/signalscouter/company-tech-stack-signals) | What a company's website runs on, plus DNS, email security and domain age |
| [SEC Form D Funding Signals](https://apify.com/signalscouter/sec-form-d-funding-signals) | Newly funded US companies from SEC Form D filings |

### Support and feedback

Built and maintained by **signalscouter** ([apify.com/signalscouter](https://apify.com/signalscouter), <signalscouter.data@gmail.com>). Found a bug, or want a field or source added? Open a ticket on the **Issues** tab. We read every issue and aim to reply quickly. If the Actor saves you time, a review on the Store helps others find it.

# Actor input Schema

## `sources` (type: `array`):

Which official job sources to search. Both use free, official, openly licensed (OGL v3.0) APIs: no proxies, no browser.

## `keywords` (type: `array`):

Keep jobs matching any keyword (case-insensitive). See 'Keyword match' for where keywords are looked for. Leave empty for all jobs.

## `keywordScope` (type: `string`):

Title: the keyword must appear in the job title (or Teaching Vacancies job role). Anywhere: NHS Jobs' own full-text search plus title/employer/description matching for Teaching Vacancies; much broader (e.g. 'nurse' matches ~40% of NHS adverts).

## `excludeKeywords` (type: `array`):

Drop jobs whose title contains any of these, e.g. bank, locum, apprentice.

## `locations` (type: `array`):

For NHS Jobs this is NHS Jobs' own location search with the radius below. For Teaching Vacancies it keeps jobs whose address, postcode, local authority, region or school name contains the text.

## `distanceMiles` (type: `integer`):

Search radius used with Locations for NHS Jobs.

## `regions` (type: `array`):

Keep jobs in these UK regions. Region comes from the job's postcode (postcodes.io, ONS data) or the source's own region field.

## `salaryMin` (type: `integer`):

Keep jobs whose normalised annual salary (top of the range) is at least this. Hourly/daily pay is annualised (37.5 h × 52 weeks; 260 days). Jobs with no salary information are dropped when this is set.

## `nhsBands` (type: `array`):

Applies to NHS Jobs only (other sources are not affected). Uses NHS Jobs' own pay-band filter, so it is exact.

## `teacherPayScales` (type: `array`):

Applies to Teaching Vacancies only (other sources are not affected). Keeps jobs that mention these pay ranges (MPS/M1-M6, UPS/U1-U3, Leadership/L-points, unqualified, lead practitioner) or whose salary matches a national range.

## `teachingJobRoles` (type: `array`):

Teaching Vacancies only: keep these job roles.

## `contractTypes` (type: `array`):

Keep jobs with these normalised contract types.

## `workingPatterns` (type: `array`):

Keep full-time and/or part-time jobs. Jobs offered as either count for both.

## `postedWithinDays` (type: `integer`):

0 = no filter. Speeds up runs a lot (sources are read newest-first and paging stops early).

## `closingWithinDays` (type: `integer`):

Keep only jobs whose closing date is today or within the next N days (e.g. 3). Empty or 0 = no filter. Jobs without a closing date are dropped when set.

## `onlyNewJobs` (type: `boolean`):

Remembers job IDs in a named key-value store and outputs only jobs not seen in previous runs with the same filters. Ideal for scheduled daily runs and alerts.

## `monitoringStateKey` (type: `string`):

By default the 'seen jobs' memory is keyed on your filters, so different saved tasks don't interfere. Set a name to share or reset the memory explicitly.

## `includeEmployerSummary` (type: `boolean`):

One extra record per trust, school or employer among the matched jobs: open roles, posted in last 7/30 days, closing within 7 days, NHS band mix, teacher pay scale mix, median salary, regions and new since last run. In monitoring mode only employers with new jobs get a summary. Charged per summary.

## `summaryMinJobs` (type: `integer`):

Skip small employers to keep summary count (and cost) down.

## `includeDescription` (type: `boolean`):

Teaching Vacancies gives full descriptions. NHS Jobs' feed gives a short summary; turn on 'NHS: fetch full advert' for the full text.

## `includeHtml` (type: `boolean`):

Adds descriptionHtml where the source provides it.

## `maxJobsPerSource` (type: `integer`):

0 = unlimited. Newest jobs are kept first.

## `maxTotalJobs` (type: `integer`):

Stop pushing job results after this many. 0 = unlimited.

## `nhsFetchDetails` (type: `boolean`):

One extra request per output NHS job: full description, pay scheme, exact band from the advert, working pattern and reference. Slower; use with filters or caps.

## `nhsExactBands` (type: `boolean`):

Runs NHS Jobs' own pay-band filter for each band so every Agenda for Change job gets its exact band (about twice the API requests). Off = band detected from the title or salary.

## `lookupPostcodes` (type: `boolean`):

Uses the free postcodes.io API (ONS open data) in batches of 100. Off = approximate region from the postcode area.

## `requestDelaySecs` (type: `number`):

Politeness delay per host.

## Actor input object example

```json
{
  "sources": [
    "nhs",
    "teaching"
  ],
  "keywords": [
    "nurse",
    "maths teacher"
  ],
  "keywordScope": "title",
  "distanceMiles": 10,
  "postedWithinDays": 0,
  "onlyNewJobs": false,
  "includeEmployerSummary": false,
  "summaryMinJobs": 1,
  "includeDescription": true,
  "includeHtml": false,
  "maxJobsPerSource": 0,
  "maxTotalJobs": 200,
  "nhsFetchDetails": false,
  "nhsExactBands": true,
  "lookupPostcodes": true,
  "requestDelaySecs": 0.5
}
```

# Actor output Schema

## `jobs` (type: `string`):

Dataset opened on the Jobs view; rows with recordType=job are vacancies from NHS Jobs and Teaching Vacancies.

## `employerSummaries` (type: `string`):

Dataset opened on the Employer hiring summaries view; rows with recordType=employerSummary carry per-trust/school hiring signals (open roles, posted last 7/30 days, closing within 7 days, band and pay-scale mix).

## `errors` (type: `string`):

Dataset opened on the Errors view; rows with recordType=error are sources that failed in this run, never charged.

## `runSummary` (type: `string`):

RUN_SUMMARY record: per-source fetched/matched/pushed/new counts, HTTP requests, bytes per host.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sources": [
        "nhs",
        "teaching"
    ],
    "keywords": [
        "nurse",
        "maths teacher"
    ],
    "maxTotalJobs": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalscouter/uk-public-sector-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sources": [
        "nhs",
        "teaching",
    ],
    "keywords": [
        "nurse",
        "maths teacher",
    ],
    "maxTotalJobs": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("signalscouter/uk-public-sector-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "nhs",
    "teaching"
  ],
  "keywords": [
    "nurse",
    "maths teacher"
  ],
  "maxTotalJobs": 200
}' |
apify call signalscouter/uk-public-sector-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,signalscouter/uk-public-sector-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Uuf7UhxseyJoK41z5/builds/xFhYcJp1NcdvU0t1G/openapi.json
