# Reed.co.uk Jobs Scraper — UK Salaries & Details (`scrapersdelight/reed-jobs-scraper`) Actor

From $0.50 per 1,000 jobs — full details included, one flat per-job price. Scrape Reed.co.uk UK jobs by keyword, location, salary band, contract type & date posted: parsed salary, recruiter, full description, remote flag. Saved-search monitor with Slack/email/webhook alerts. No login or API key.

- **URL**: https://apify.com/scrapersdelight/reed-jobs-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Jobs, Automation, 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## 💼 Reed.co.uk Jobs Scraper — UK Job Listings with Parsed Salaries, Full Details & a Saved-Search Monitor

**Scrape Reed.co.uk — the UK's biggest job board (100,000+ live jobs) — by keyword, location, salary band, contract type, and date posted. Every job comes back with a parsed salary (min/max/currency/period + per-annum normalization), full description, recruiter/advertiser info, remote/hybrid flag, sector taxonomy, and posting + expiry dates. One flat per-job price — full details included, no two-tier upsell.**

### Why this one?

| | **This actor** | Typical Reed scraper |
|---|---|---|
| **Price per 1,000 jobs — with full details** | **$0.50** | $8.00 |
| **Price per 1,000 jobs — listing only** | $0.50 (details always included) | $3.00 |
| Parsed salary (min/max/period) + **per-annum normalization** | ✅ | ❌ (raw text) |
| Full job description | ✅ plaintext **and** HTML, in the base price | paid "details" tier |
| Remote / hybrid / on-site flag | ✅ both the SERP label and the site's inferred type | ❌ |
| Recruiter type (agency / employer) + job reference | ✅ | ❌ |
| Sector taxonomy + breadcrumbs | ✅ | ❌ |
| Server-side filters (salary band, date posted, job type, posted-by, visa sponsorship…) | ✅ 15+ | keyword + location |
| Saved-search **monitor mode** with Slack / email / webhook alerts | ✅ | ❌ |
| Raw source data kept on every record | ✅ `raw` sub-object | ❌ |
| Failure handling | per-request retries with fresh proxy sessions; one bad page never kills a run | — |

No login, no API key, no browser automation — the actor reads the structured data Reed's own pages are rendered from, so it's fast (25 jobs per request) and stable.

---

### What does Reed.co.uk Jobs Scraper do?

It extracts **UK job postings** from [reed.co.uk](https://www.reed.co.uk) and returns clean, structured rows you can export to **JSON, CSV, Excel, or pull via API**:

- 🔎 **Search the way the site does** — keywords, town/city/postcode + radius, salary band (£/year), date posted, permanent/contract/temp/full-time/part-time, agency vs direct employer, graduate, Easy Apply, visa sponsorship. All server-side.
- 💷 **Salaries, actually parsed** — `salary_min`, `salary_max`, currency, period (per annum / per day / per hour), the site's own **per-annum normalization** for day/hour rates, the display string, and negotiable/OTE/pro-rata flags.
- 📝 **Full descriptions included** — complete plaintext from the listing plus the formatted HTML from the detail page. In the base price.
- 🏢 **Recruiter / advertiser intel** — name, agency vs direct employer vs Reed, the recruiter's own job reference, profile URL, logo.
- 🌍 **Location, fully resolved** — town, county, region, country, postcode (when published) + the **remote / hybrid / on-site** flag.
- 🗂️ **Sector taxonomy** — Reed's sector + parent sector and category breadcrumbs.
- 📅 **Time-aware** — posted, created, updated, and **expiry** dates on every job.
- 🔔 **Saved-search monitor** — schedule it and get **Slack / email / webhook alerts** for newly posted jobs matching your query.
- 🔑 **Optional BYOK extra** — the live **applications count** exists only in Reed's official API; paste your own free key (reed.co.uk/developers) and every record gets it.

---

### What data does it extract?

Every job is one dataset row:

- 🆔 `job_id`, 🔗 `job_url`, 🏷️ `title`
- 📝 `description_text` (full plaintext) + `description_html`*
- 💷 `salary_min`, `salary_max`, `salary_currency`, `salary_period`, `salary_min_per_annum`, `salary_max_per_annum`, `salary_display`*, `salary_negotiable`*, `salary_ote`*, `salary_pro_rata`*
- 📍 `location`, `town`*, `county`, `region`*, `country`*, `country_code`*, `postcode`*, `remote_working`, `location_type`*, `is_remote`
- 📃 `contract_type`* (Permanent / Contract / Temporary), `is_permanent`*, `is_contract`*, `is_temp`*, `is_full_time`, `is_part_time`
- 🏢 `recruiter_name`, `recruiter_type`* (agency / employer / reed), `recruiter_reference`*, `recruiter_profile_url`, `recruiter_logo`, `recruiter_tier`*
- 📅 `posted_date`, `created_date`, `updated_date`, `expiry_date`
- 🖱️ `applications` (with your own free Reed API key), `is_easy_apply`, `external_url`, `is_external_redirect`*
- 🗂️ `sector`*, `sector_parent`*, `taxonomy_l1`, `taxonomy_l2`, `breadcrumbs`*, `skills`*
- 🚩 `is_graduate`*, `is_promoted`, `is_featured`, `is_early_bird`, `eligible_uk_only`, `is_training_job`, `is_survey_job`
- 🧾 `raw` — the untrimmed source objects (listing + detail), so nothing the site returns is lost
- ✨ `is_new` (monitor mode), 🕒 `scraped_at`

*\* = filled by the detail-page fetch (`fetchDetails`, ON by default — included in the price).*

---

### Who is it for?

- 📊 **Salary & labour-market analysts** — Reed states real salary numbers on most postings (rare among job boards), parsed here into clean min/max/period columns.
- 🤝 **Recruiters & staffing agencies** — track competitor postings, day rates, and which agencies own which clients.
- 🛠️ **Job-board and aggregator builders** — a clean UK feed with descriptions, taxonomy, and expiry dates.
- 🎯 **GTM / lead-gen teams** — hiring is a buying signal; filter by sector, region, and date posted.
- 👩‍💻 **Job seekers & career coaches** — monitor a saved search and get pinged the moment a matching role drops.

---

### Two ways to use it

1. **Bulk scrape** — pull every job for a keyword/location/salary band into one dataset (`maxItems: 0` sweeps the whole result set, up to 10k/run).
2. **Saved-search monitor** *(the recurring play)* — set `monitorMode: true`, attach an **Apify Schedule** (e.g. hourly), and the actor emits/alerts **only jobs new since the last run**. Pair with `datePosted: "lastthreedays"` to keep runs small and fast.

#### Quick start

```json
{ "keywords": "developer", "maxItems": 50 }
````

#### Salary-banded contract search

```json
{
  "keywords": "python developer",
  "location": "London",
  "proximity": 20,
  "salaryFrom": 60000,
  "contract": true,
  "datePosted": "lastweek",
  "maxItems": 200
}
```

#### Saved-search monitor

```json
{
  "keywords": "data engineer",
  "location": "Manchester",
  "datePosted": "lastthreedays",
  "monitorMode": true,
  "alertOnNewJob": true,
  "slackWebhookUrl": "https://hooks.slack.com/services/…"
}
```

***

### Input

| Field | What it does |
|-------|--------------|
| `keywords` | search keywords (empty = ALL live UK jobs; cap with `maxItems`) |
| `location` + `proximity` | UK town/city/postcode + radius in miles (0–50) |
| `salaryFrom` / `salaryTo` | annual GBP salary band |
| `datePosted` | `anytime` · `today` · `lastthreedays` · `lastweek` · `lasttwoweeks` |
| `permanent` / `contract` / `temp` / `fullTime` / `partTime` | job-type switches (combine freely) |
| `postedBy` | `any` · `agency` · `direct` (direct employers only) |
| `graduateOnly`, `easyApplyOnly`, `visaSponsorship` | extra server-side filters |
| `hideTrainingJobs`, `hideSurveyJobs`, `hideNoSalaryJobs` | drop course ads, survey ads, and hidden-salary postings |
| `fetchDetails` | detail-page enrichment (ON by default, included in the price) |
| `maxItems` | hard cap per run (0 = unlimited, ≤10k/run) |
| `reedApiKey` | optional — your own free Reed API key adds the live `applications` count |
| `monitorMode`, `alertOnNewJob` | recurring watcher: output/alert only new jobs |
| `webhookUrl`, `slackWebhookUrl`, `emailRecipients` | alert channels |
| `proxyConfiguration`, `requestConcurrency` | proxy + parallelism (datacenter is enough) |

***

### Output

Example record (truncated):

```json
{
  "job_id": "56972754",
  "job_url": "https://www.reed.co.uk/jobs/developer/56972754",
  "title": "Developer",
  "description_text": "An exciting opportunity has arisen for a Developer…",
  "salary_min": 45000,
  "salary_max": 45000,
  "salary_currency": "GBP",
  "salary_period": "per annum",
  "salary_min_per_annum": 45000,
  "salary_display": "£ 45,000 per annum",
  "location": "Exeter",
  "town": "Exeter",
  "county": "Devon",
  "region": "South West England",
  "country_code": "GB",
  "remote_working": "Remote",
  "location_type": "remote",
  "contract_type": "Permanent",
  "is_full_time": true,
  "recruiter_name": "MEARS GROUP PLC",
  "recruiter_type": "employer",
  "recruiter_reference": "REQ0037668",
  "posted_date": "2026-06-10T23:25:05",
  "expiry_date": "2026-07-22T00:00:00",
  "sector": "Software Developer",
  "sector_parent": "IT & Telecoms",
  "is_easy_apply": false
}
```

Day-rate and hourly jobs keep their native numbers (`salary_min: 350, salary_period: "per day"`) **and** get the site's own annualized figures (`salary_min_per_annum: 91000`).

***

### How much does it cost?

Pay-per-event — one flat per-job price, **details included**. No "shallow vs deep" tiers, no subscription.

| Event | What it covers | Price |
|-------|----------------|-------|
| `lot-scraped` | each job returned — **full details included** | **$0.0005 / job** |
| `monitor-run-completed` | each scheduled watch run | $0.01 / run |
| `new-lot-detected` | each newly posted job a monitor finds | $0.002 / job |
| `alert-delivered` | each Slack/email/webhook push | $0.002 / alert |

*(Final per-event prices are set on the actor's pricing page.)*

That's **$0.50 per 1,000 jobs with full descriptions** — the cheapest way to get structured Reed data, 6–16× below the incumbent's $3–$8 per 1,000.

***

### Is it legal to scrape Reed.co.uk?

The actor reads **publicly available job postings** — no login, no paywall, no personal data of job seekers. Recruiter/advertiser names and references are business contact data the postings publish deliberately. That said, scraping may conflict with reed.co.uk's Terms of Service, and **you are responsible for how you use the data** — review Reed's current ToS before commercial use, and consider Reed's own free official API (reed.co.uk/developers) where its terms and quotas fit your use case.

***

### FAQ

**What is Reed.co.uk?**
Reed is the UK's longest-running and one of its largest job boards — 100,000+ live vacancies across every sector, posted by agencies and direct employers.

**Do I need an account, login, or API key?**
No. The actor reads the public pages directly. The only optional key is your own free Reed developer key, which adds the live applications count.

**Are full job descriptions really included in the base price?**
Yes — both the complete plaintext and the formatted HTML. There is no separate "details" tier: one event, one price.

**How are salaries returned?**
Parsed: `salary_min` / `salary_max` numbers, the currency, and the period (per annum / per day / per hour). Day and hour rates also get the site's own per-annum normalization, so you can compare a £450/day contract against a £85k permanent role in one column.

**Can I filter to jobs with a real stated salary?**
Yes — `hideNoSalaryJobs: true` drops "competitive"/"negotiable" postings server-side.

**Can I monitor a saved search and get alerts?**
Yes. Turn on `monitorMode`, attach an Apify **Schedule**, and add a Slack/webhook/email channel. Each run emits and alerts **only jobs new since the last run** for that exact search scope (state survives across runs).

**Can I get the number of applicants?**
The live applications count is not in Reed's public pages — it exists only in Reed's official API. Paste your own free key (60 seconds at reed.co.uk/developers) into `reedApiKey` and every record gets `applications`.

**How fresh is the data?**
You scrape live SERPs, so it's as fresh as the site. Use `datePosted: "today"` or `"lastthreedays"` for new-postings-only runs.

**Can I scrape ALL UK jobs?**
Yes — leave `keywords` empty and set `maxItems: 0` to sweep the whole board (capped at 10,000 jobs per run for safety; slice by sector keywords or region for full coverage).

**How fast is it?**
25 jobs per request, sub-second responses. 1,000 jobs with full details typically takes a few minutes at the default concurrency.

**Does it handle remote/hybrid jobs?**
Yes — every job has the site's `remote_working` label (On-Site / Remote / Hybrid) plus the detail page's inferred `location_type`.

**What about training-course and survey ads?**
Reed mixes them into results; flip `hideTrainingJobs` / `hideSurveyJobs` to drop them (filtered server-side and double-checked client-side).

**How do I export the data?**
JSON, CSV, Excel, HTML, or RSS from the Dataset tab, or via the Apify API.

**Can I integrate with Make, Zapier, n8n, or my backend?**
Yes — use the webhook/Slack channels for alerts, or the Apify API to pipe the dataset anywhere.

***

### You might also like

- 💼 Other job-board scrapers (Indeed, LinkedIn Jobs, Totaljobs, CV-Library)
- 📈 Hiring-signal and ATS job-posting monitors for GTM teams
- 🇬🇧 UK data scrapers (Companies House, property portals)

***

### Feedback

Found a missing field or want a new filter? Open an issue on the actor — fast fixes and feature requests welcome.

# Actor input Schema

## `keywords` (type: `string`):

Job-title / skill keywords, exactly as you'd type them into reed.co.uk (e.g. 'python developer', 'registered nurse'). Leave empty to sweep ALL live UK jobs (100k+ — combine with filters and a maxItems cap).

## `location` (type: `string`):

UK town/city/postcode (e.g. 'London', 'Manchester', 'SW1A'). Leave empty for nationwide.

## `proximity` (type: `integer`):

Radius around the location, in miles. Site-supported values: 0, 1, 3, 5, 10, 15, 20, 30, 50 (other values are rounded down to the nearest supported one in code). Ignored when no location is set.

## `salaryFrom` (type: `integer`):

Only jobs paying at/above this annual GBP salary. Leave empty for no floor.

## `salaryTo` (type: `integer`):

Only jobs paying at/below this annual GBP salary. Leave empty for no cap.

## `datePosted` (type: `string`):

Only jobs posted within this window (server-side filter — ideal for monitors and fresh-leads runs).

## `permanent` (type: `boolean`):

Only permanent roles. Combine the five job-type switches freely; all off = any type.

## `contract` (type: `boolean`):

Only contract roles.

## `temp` (type: `boolean`):

Only temporary roles.

## `fullTime` (type: `boolean`):

Only full-time roles.

## `partTime` (type: `boolean`):

Only part-time roles.

## `postedBy` (type: `string`):

Restrict to jobs posted by recruitment agencies or directly by employers.

## `graduateOnly` (type: `boolean`):

Only graduate-suitable roles.

## `easyApplyOnly` (type: `boolean`):

Only jobs with Reed's one-click Easy Apply.

## `visaSponsorship` (type: `boolean`):

Only jobs flagged as offering visa sponsorship.

## `hideTrainingJobs` (type: `boolean`):

Drop 'training job' ads (courses dressed as jobs) — filtered server-side AND client-side.

## `hideSurveyJobs` (type: `boolean`):

Drop paid-survey ads — filtered server-side AND client-side.

## `hideNoSalaryJobs` (type: `boolean`):

Drop postings whose salary is hidden ('competitive', 'negotiable') — keeps only rows with real salary numbers.

## `fetchDetails` (type: `boolean`):

Fetch each job's detail page: HTML description, normalized per-annum salary, recruiter reference & type, sector taxonomy, town/county/region/postcode, inferred remote/hybrid/onsite type. INCLUDED in the per-job price — turning it off just makes runs faster (the full plaintext description is on the listing either way).

## `maxItems` (type: `integer`):

Hard cap on jobs scraped this run (cost/safety guard). Defaults to 50 for a fast first run — set 0 for an unlimited sweep of the whole result set (capped at 10,000/run).

## `reedApiKey` (type: `string`):

The live 'applications' count is NOT in the public pages — only Reed's official API returns it. Paste your own free key (60 seconds at reed.co.uk/developers) and every record gets an 'applications' number. Leave empty to skip.

## `monitorMode` (type: `boolean`):

Recurring watcher: diff against the prior run's seen jobs (per search scope) and output/alert ONLY newly posted jobs. Pair with an Apify Schedule and 'Date posted' = Last 3 days.

## `alertOnNewJob` (type: `boolean`):

In monitor mode, deliver an alert for each newly posted job via the channels below.

## `webhookUrl` (type: `string`):

POST endpoint for new-job alert payloads (Make / Zapier / n8n / custom). One JSON body per alert.

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL for formatted new-job cards.

## `emailRecipients` (type: `array`):

Email addresses for the new-job digest (sent via apify/send-mail).

## `proxyConfiguration` (type: `object`):

Proxy settings. Datacenter rotation is enough for this site (server-rendered pages, no anti-bot).

## `requestConcurrency` (type: `integer`):

Max parallel requests for detail-page fetches. Keep modest to respect the site.

## `diagnose` (type: `boolean`):

Dev only. Dumps the raw SERP + detail HTML to the key-value store (DEBUG\_SERP\_HTML / DEBUG\_DETAIL\_HTML) and logs the parsed first row + pagination check, then exits. Leave off for normal runs.

## Actor input object example

```json
{
  "keywords": "developer",
  "proximity": 10,
  "datePosted": "anytime",
  "permanent": false,
  "contract": false,
  "temp": false,
  "fullTime": false,
  "partTime": false,
  "postedBy": "any",
  "graduateOnly": false,
  "easyApplyOnly": false,
  "visaSponsorship": false,
  "hideTrainingJobs": false,
  "hideSurveyJobs": false,
  "hideNoSalaryJobs": false,
  "fetchDetails": true,
  "maxItems": 50,
  "monitorMode": false,
  "alertOnNewJob": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "requestConcurrency": 6,
  "diagnose": false
}
```

# Actor output Schema

## `items` (type: `string`):

The dataset of scraped Reed.co.uk jobs (one job per row).

# 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 = {
    "keywords": "developer",
    "fetchDetails": true,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/reed-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 = {
    "keywords": "developer",
    "fetchDetails": True,
    "maxItems": 50,
}

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

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

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

```

## CLI example

```bash
echo '{
  "keywords": "developer",
  "fetchDetails": true,
  "maxItems": 50
}' |
apify call scrapersdelight/reed-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapersdelight/reed-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Reed.co.uk Jobs Scraper — UK Salaries & Details",
        "description": "From $0.50 per 1,000 jobs — full details included, one flat per-job price. Scrape Reed.co.uk UK jobs by keyword, location, salary band, contract type & date posted: parsed salary, recruiter, full description, remote flag. Saved-search monitor with Slack/email/webhook alerts. No login or API key.",
        "version": "0.1",
        "x-build-id": "8vW8KbbK4OElvddzH"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapersdelight~reed-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapersdelight-reed-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapersdelight~reed-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapersdelight-reed-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapersdelight~reed-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapersdelight-reed-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "keywords": {
                        "title": "Keywords",
                        "type": "string",
                        "description": "Job-title / skill keywords, exactly as you'd type them into reed.co.uk (e.g. 'python developer', 'registered nurse'). Leave empty to sweep ALL live UK jobs (100k+ — combine with filters and a maxItems cap)."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "UK town/city/postcode (e.g. 'London', 'Manchester', 'SW1A'). Leave empty for nationwide."
                    },
                    "proximity": {
                        "title": "Search radius (miles)",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Radius around the location, in miles. Site-supported values: 0, 1, 3, 5, 10, 15, 20, 30, 50 (other values are rounded down to the nearest supported one in code). Ignored when no location is set.",
                        "default": 10
                    },
                    "salaryFrom": {
                        "title": "Min salary (£/year)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only jobs paying at/above this annual GBP salary. Leave empty for no floor."
                    },
                    "salaryTo": {
                        "title": "Max salary (£/year)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only jobs paying at/below this annual GBP salary. Leave empty for no cap."
                    },
                    "datePosted": {
                        "title": "Date posted",
                        "enum": [
                            "anytime",
                            "today",
                            "lastthreedays",
                            "lastweek",
                            "lasttwoweeks"
                        ],
                        "type": "string",
                        "description": "Only jobs posted within this window (server-side filter — ideal for monitors and fresh-leads runs).",
                        "default": "anytime"
                    },
                    "permanent": {
                        "title": "Permanent",
                        "type": "boolean",
                        "description": "Only permanent roles. Combine the five job-type switches freely; all off = any type.",
                        "default": false
                    },
                    "contract": {
                        "title": "Contract",
                        "type": "boolean",
                        "description": "Only contract roles.",
                        "default": false
                    },
                    "temp": {
                        "title": "Temporary",
                        "type": "boolean",
                        "description": "Only temporary roles.",
                        "default": false
                    },
                    "fullTime": {
                        "title": "Full-time",
                        "type": "boolean",
                        "description": "Only full-time roles.",
                        "default": false
                    },
                    "partTime": {
                        "title": "Part-time",
                        "type": "boolean",
                        "description": "Only part-time roles.",
                        "default": false
                    },
                    "postedBy": {
                        "title": "Posted by",
                        "enum": [
                            "any",
                            "agency",
                            "direct"
                        ],
                        "type": "string",
                        "description": "Restrict to jobs posted by recruitment agencies or directly by employers.",
                        "default": "any"
                    },
                    "graduateOnly": {
                        "title": "Graduate jobs only",
                        "type": "boolean",
                        "description": "Only graduate-suitable roles.",
                        "default": false
                    },
                    "easyApplyOnly": {
                        "title": "Easy Apply only",
                        "type": "boolean",
                        "description": "Only jobs with Reed's one-click Easy Apply.",
                        "default": false
                    },
                    "visaSponsorship": {
                        "title": "Visa sponsorship",
                        "type": "boolean",
                        "description": "Only jobs flagged as offering visa sponsorship.",
                        "default": false
                    },
                    "hideTrainingJobs": {
                        "title": "Hide training-course ads",
                        "type": "boolean",
                        "description": "Drop 'training job' ads (courses dressed as jobs) — filtered server-side AND client-side.",
                        "default": false
                    },
                    "hideSurveyJobs": {
                        "title": "Hide survey ads",
                        "type": "boolean",
                        "description": "Drop paid-survey ads — filtered server-side AND client-side.",
                        "default": false
                    },
                    "hideNoSalaryJobs": {
                        "title": "Hide jobs without a stated salary",
                        "type": "boolean",
                        "description": "Drop postings whose salary is hidden ('competitive', 'negotiable') — keeps only rows with real salary numbers.",
                        "default": false
                    },
                    "fetchDetails": {
                        "title": "Fetch full job details",
                        "type": "boolean",
                        "description": "Fetch each job's detail page: HTML description, normalized per-annum salary, recruiter reference & type, sector taxonomy, town/county/region/postcode, inferred remote/hybrid/onsite type. INCLUDED in the per-job price — turning it off just makes runs faster (the full plaintext description is on the listing either way).",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max jobs per run",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard cap on jobs scraped this run (cost/safety guard). Defaults to 50 for a fast first run — set 0 for an unlimited sweep of the whole result set (capped at 10,000/run).",
                        "default": 50
                    },
                    "reedApiKey": {
                        "title": "Reed API key (optional — live applications count)",
                        "type": "string",
                        "description": "The live 'applications' count is NOT in the public pages — only Reed's official API returns it. Paste your own free key (60 seconds at reed.co.uk/developers) and every record gets an 'applications' number. Leave empty to skip."
                    },
                    "monitorMode": {
                        "title": "Monitor mode (saved-search watcher)",
                        "type": "boolean",
                        "description": "Recurring watcher: diff against the prior run's seen jobs (per search scope) and output/alert ONLY newly posted jobs. Pair with an Apify Schedule and 'Date posted' = Last 3 days.",
                        "default": false
                    },
                    "alertOnNewJob": {
                        "title": "Alert on new jobs",
                        "type": "boolean",
                        "description": "In monitor mode, deliver an alert for each newly posted job via the channels below.",
                        "default": true
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "POST endpoint for new-job alert payloads (Make / Zapier / n8n / custom). One JSON body per alert."
                    },
                    "slackWebhookUrl": {
                        "title": "Slack webhook URL",
                        "type": "string",
                        "description": "Slack incoming-webhook URL for formatted new-job cards."
                    },
                    "emailRecipients": {
                        "title": "Email recipients",
                        "type": "array",
                        "description": "Email addresses for the new-job digest (sent via apify/send-mail).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Proxy settings. Datacenter rotation is enough for this site (server-rendered pages, no anti-bot).",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "requestConcurrency": {
                        "title": "Request concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Max parallel requests for detail-page fetches. Keep modest to respect the site.",
                        "default": 6
                    },
                    "diagnose": {
                        "title": "Diagnostic mode (dev)",
                        "type": "boolean",
                        "description": "Dev only. Dumps the raw SERP + detail HTML to the key-value store (DEBUG_SERP_HTML / DEBUG_DETAIL_HTML) and logs the parsed first row + pagination check, then exits. Leave off for normal runs.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
