# Reed Jobs Scraper — UK Jobs, Salary, Company & Description (`haketa/reed-scraper`) Actor

Scrape Reed.co.uk UK job listings: title, company, location, salary range (min/max & period), job type, employment type, posted date, application deadline & full job description. Search by keyword & location, or paste job URLs. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/haketa/reed-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.75 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Jobs Scraper — UK Jobs, Salary, Company & Description

Collect **Reed.co.uk** job listings as clean, structured data. Search by keyword and location, or paste job URLs — every matching job comes back with a full record: title, company, location, **salary range (min/max and period)**, job type, employment type, posted date, **application deadline** and the **complete job description**.

Built for **recruiters, staffing agencies, job‑market analysts, job seekers and data teams** who need Reed job data in JSON, CSV or Excel instead of paging through search results by hand.

***

### ✨ Why use this scraper

- **Full job records, not just titles** — each job includes company, location, salary, job type, posted date, deadline and the complete description.
- **Structured salary** — minimum, maximum, currency and **period** (per year, per day, per hour). Essential for the UK market, where contract roles are quoted as day rates and permanent roles as annual salaries.
- **Application deadline** — the closing date for each role, so you know how long it stays live.
- **Deep pagination** — collect hundreds of jobs per keyword, not just the first page.
- **Easy‑apply flag** — see which roles accept a one‑click Reed application.
- **Direct job lookups** — already have a list of Reed job URLs or IDs? Paste them in and get full records back.
- **Clean, typed output** — numbers as numbers, booleans as booleans — ready for spreadsheets, databases and BI tools.
- **Export anywhere** — JSON, CSV, Excel, HTML or via the Apify API and integrations.

***

### 🚀 Quick start

1. Enter one or more **search keywords** (for example `Python Developer`, `Project Manager`, `Nurse`).
2. *(Optional)* Set a **location** (`London`, `Manchester`, `Birmingham`).
3. Set **Maximum jobs** and click **Start**.

The scraper paginates the search, collects every matching job, and (by default) enriches each one with its full description, structured salary and deadline.

***

### 📥 Input

| Field | Type | Description |
|---|---|---|
| **Search keywords** (`searchQueries`) | array | Job keywords — role, skill or company. Each keyword is searched and paginated. |
| **Location** (`location`) | string | Optional location applied to every keyword — a UK town, city or county. |
| **Job URLs** (`jobUrls`) | array | Reed job URLs or job IDs to scrape directly. |
| **Enrich with full job details** (`includeJobDetails`) | boolean | Add full description, structured salary, employment type, posted date and deadline. On by default. |
| **Maximum jobs** (`maxItems`) | integer | Maximum number of job records to save. Default `100`. |
| **Concurrent detail requests** (`maxConcurrency`) | integer | How many detail pages to fetch in parallel. Recommended 6–10. |
| **Proxy configuration** (`proxyConfiguration`) | object | Apify Proxy is recommended for reliable access. |

#### Example 1 — role in a city

```json
{
  "searchQueries": ["Python Developer"],
  "location": "London",
  "maxItems": 200
}
```

#### Example 2 — several roles across the UK

```json
{
  "searchQueries": ["Project Manager", "Business Analyst", "Scrum Master"],
  "maxItems": 500
}
```

#### Example 3 — fast listing pull (no detail enrichment)

```json
{
  "searchQueries": ["Warehouse Operative"],
  "location": "Manchester",
  "includeJobDetails": false,
  "maxItems": 300
}
```

#### Example 4 — specific jobs

```json
{
  "jobUrls": [
    "https://www.reed.co.uk/jobs/python-developer/57258187"
  ]
}
```

***

### 📤 Output

Each job is one dataset item. Example:

```json
{
  "jobId": "57258187",
  "title": "Python Developer",
  "company": "Tenth Revolution Group",
  "companyProfileUrl": "https://www.reed.co.uk/company-profile/Tenth-Revolution-Group",
  "location": "London",
  "city": "London",
  "region": "South East England",
  "country": "GB",
  "postcode": "",
  "salary": "£35,000 - £45,000 per annum",
  "salaryMin": 35000,
  "salaryMax": 45000,
  "salaryCurrency": "GBP",
  "salaryPeriod": "YEAR",
  "jobType": "Permanent, full-time",
  "employmentType": "FULL_TIME",
  "easyApply": true,
  "postedRelative": "4 days ago",
  "datePosted": "2026-08-20T09:24:11.997Z",
  "applicationDeadline": "2026-10-01T23:55:00.000Z",
  "description": "Python Developer - London (Hybrid) - Up to £45,000. We're partnering with a growing technology-led business...",
  "url": "https://www.reed.co.uk/jobs/python-developer/57258187",
  "sourceMode": "search",
  "detailEnriched": true,
  "scrapedAt": "2026-08-24T12:05:00.000Z"
}
```

#### Field reference

**Job**

| Field | Description |
|---|---|
| `jobId` | Reed job identifier. |
| `title` | Job title. |
| `description` | Full job description (from the detail page, cleaned to plain text). Requires detail enrichment. |
| `url` | Canonical job URL. |
| `easyApply` | Whether the job accepts a one‑click Reed application. |

**Company**

| Field | Description |
|---|---|
| `company` | Hiring company or recruiter. |
| `companyProfileUrl` | Link to the company profile on Reed, when available. |

**Location**

| Field | Description |
|---|---|
| `location` | Display location from the listing. |
| `city`, `region`, `country`, `postcode` | Structured location from detail enrichment. |

**Compensation & terms**

| Field | Description |
|---|---|
| `salary` | Raw salary text as shown on Reed. |
| `salaryMin`, `salaryMax` | Structured salary range when published. |
| `salaryCurrency` | Currency (usually GBP). |
| `salaryPeriod` | `YEAR`, `DAY` or `HOUR` — how the salary is quoted. |
| `jobType` | Listing type, e.g. "Permanent, full-time" or "Contract, full-time". |
| `employmentType` | Schema type, e.g. `FULL_TIME`, `PART_TIME`, `CONTRACTOR`. |

**Dates & meta**

| Field | Description |
|---|---|
| `postedRelative` | Relative posting time from the listing, e.g. "4 days ago". |
| `datePosted` | Exact posting timestamp. |
| `applicationDeadline` | Closing date for applications. |
| `detailEnriched` | Whether full detail was fetched for this record. |
| `sourceMode` | How the job was found (`search`, `direct`). |
| `scrapedAt` | ISO timestamp of the scrape. |

***

### 💡 Use cases

- **Recruiters & staffing agencies** — monitor demand for roles and skills, benchmark competitors' postings, and build sourcing lists by company and location.
- **Job‑market analysts** — aggregate `salaryMin`/`salaryMax` by role, location and period to build up‑to‑date UK pay benchmarks, including day rates for contract roles.
- **Job seekers** — track new postings for your role and area the moment they appear, with salary and deadline in one place.
- **Talent intelligence** — measure hiring trends, permanent‑vs‑contract mix, and which skills and locations are heating up.
- **Competitive intelligence** — see who is hiring, for what, and where — a live signal of a company's growth.
- **ATS / CRM feeds** — pipe structured jobs into applicant‑tracking systems, dashboards and lead tools.
- **Researchers & data teams** — build clean datasets of the UK labour market for analysis and modelling.

***

### 🔍 Popular searches to try

Use these as starting points in **Search keywords**, and set a **Location** to focus on a city or region.

**Technology**

- `Software Engineer`, `Python Developer`, `Java Developer`, `Data Analyst`, `Data Scientist`
- `DevOps Engineer`, `Cloud Engineer`, `Cyber Security`, `IT Support`, `QA Tester`

**Business & office**

- `Project Manager`, `Business Analyst`, `Account Manager`, `Administrator`, `Customer Service`
- `Finance Manager`, `Accountant`, `HR Advisor`, `Marketing Manager`, `Sales Executive`

**Healthcare & care**

- `Nurse`, `Care Assistant`, `Support Worker`, `Healthcare Assistant`, `Pharmacist`

**Trades, logistics & industrial**

- `Warehouse Operative`, `HGV Driver`, `Electrician`, `Plumber`, `Production Operative`

**Education & public sector**

- `Teaching Assistant`, `Teacher`, `Lecturer`, `Social Worker`

> Tip: combine a role and a location (`Data Analyst` + `Leeds`) for tightly targeted results, and turn off enrichment for a fast listing‑only pull.

***

### 🧩 What you can build with the data

- **A UK salary benchmark** — aggregate `salaryMin`/`salaryMax` by role, region and `salaryPeriod`, refreshed on a schedule.
- **A day‑rate tracker** — filter `salaryPeriod = DAY` to monitor contract rates for a role over time.
- **A recruiting pipeline** — feed new postings by company and location straight into your CRM or ATS.
- **A job‑alert product** — run keyword+location searches on a schedule and notify users the moment a matching role appears.
- **A hiring dashboard** — track which companies are posting, for what roles, and where across the UK.
- **A permanent‑vs‑contract index** — measure the split of `jobType` across a market or region.

***

### 📊 Reading the salary data

- **Mind the period.** `salaryMin`/`salaryMax` are only comparable within the same `salaryPeriod`. A "£1,000 – £1,100" role at `DAY` is a contract day rate, not an annual salary — group by period before you average.
- **Rough annualisation.** For a quick comparison, a day rate can be approximated as `rate × ~220` working days, and an hourly rate as `rate × ~1,800` hours — adjust for your assumptions.
- **Use the midpoint.** `(salaryMin + salaryMax) / 2` gives a single comparable figure per role for charts and benchmarks.
- **Keep the raw text.** `salary` preserves exactly what Reed showed (including "Competitive" or "Negotiable"), which the structured fields can't always capture.

#### Field types at a glance

| Field | Type | Notes |
|---|---|---|
| `salaryMin`, `salaryMax` | number | Numeric bounds when published. |
| `salaryPeriod` | string | `YEAR`, `DAY` or `HOUR`. |
| `easyApply` | boolean | One‑click apply available. |
| `datePosted`, `applicationDeadline` | string | ISO 8601 timestamps. |
| `salary`, `jobType`, `company`, `location` | string | Text as shown on Reed. |

***

### 🎯 Tips for best results

- **Be specific.** `Senior Python Developer` returns more relevant results than `Developer`. Combine role + seniority for tight targeting.
- **Use several keywords.** Each keyword is paginated independently, so a handful of related terms covers a market quickly.
- **Scope by location.** Set a UK town, city or county, or leave it blank to search nationwide.
- **Turn off enrichment for speed.** If you only need titles, companies, salaries and locations, set `includeJobDetails` to `false` for a faster, lighter run.
- **Filter after export.** Pull a wide net, then filter on `salaryMin`, `salaryPeriod`, `jobType`, `easyApply` or `location` in your spreadsheet or database.

***

### 📈 Getting more results

- Each keyword is **paginated deeply**, so a single keyword can return hundreds of jobs. Raise **Maximum jobs** to collect more.
- Add **more keywords** to widen coverage — by role, by skill, or by company name.
- Combine **location** to slice the market precisely.

***

### 🔌 Run it your way

- **Apify Console** — fill in the form and click Start.
- **API** — start runs and pull the dataset programmatically.
- **Scheduler** — run hourly or daily to keep a fresh jobs feed.
- **Integrations** — push results to Google Sheets, Zapier, Make, webhooks, Slack, S3 and more.

***

### ❓ FAQ

**How many jobs can I collect?**
As many as you need. Each keyword is paginated, so you can pull hundreds of jobs across several keywords in one run.

**Do I get the full job description?**
Yes, when **Enrich with full job details** is on (the default). Each job's page is opened to add the full description, structured salary, employment type and deadline. Turn it off for a faster, listing‑only run.

**Are salaries always included?**
Only when the employer publishes them. Many roles show a range, some show "Competitive" or "Negotiable", and some show none — the scraper returns whatever is available in `salary`, `salaryMin` and `salaryMax`.

**How do contract day rates appear?**
As `salaryMin`/`salaryMax` with `salaryPeriod = DAY`. Always group by `salaryPeriod` before comparing or averaging.

**Which region does Reed cover?**
Reed focuses on the United Kingdom job market. UK proxies give the most complete results.

**Can I re‑scrape specific jobs?**
Yes. Save the `url` or `jobId` of jobs you follow and pass them back in **Job URLs** to refresh their status and deadline.

**In what format is the data?**
Structured JSON by default, exportable to CSV, Excel, HTML and more.

**Can I run it on a schedule?**
Yes — use the Apify Scheduler for recurring runs, or start runs through the Apify API and its integrations.

***

### ⚖️ Legal & responsible use

This tool collects **publicly available** job‑posting information for legitimate business use such as recruitment, market research and salary analysis. You are responsible for how you use the data and for complying with all applicable laws and regulations, the website's terms, and data‑protection rules (including UK GDPR where relevant). Do not use the output to infringe intellectual‑property rights or for any unlawful purpose. This scraper is not affiliated with, endorsed by, or connected to Reed; all trademarks belong to their respective owners.

***

#### Tags

`reed` · `reed scraper` · `reed.co.uk` · `uk jobs` · `job scraper` · `job listings` · `job postings` · `uk recruitment` · `salary data` · `day rate` · `contract jobs` · `staffing` · `talent intelligence` · `labour market data` · `vacancies`

# Actor input Schema

## `searchQueries` (type: `array`):

Job keywords to search — role, skill or company. Each keyword is searched and paginated. Example: Python Developer, Project Manager, Nurse.

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

Optional location applied to every keyword — a UK town, city or county (for example London, Manchester, Birmingham). Leave empty to search all of the UK.

## `jobUrls` (type: `array`):

Reed job URLs (or job IDs) to scrape directly. Example: https://www.reed.co.uk/jobs/python-developer/57258187

## `includeJobDetails` (type: `boolean`):

Open each job to add the full description, structured salary (min/max & period), employment type, posted date and application deadline. Turn off for a faster, lighter run.

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

Maximum number of job records to save across all keywords.

## `maxConcurrency` (type: `integer`):

How many job-detail pages to fetch in parallel. Recommended 6–10.

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

UK residential proxies are recommended for reliable access to Reed.

## Actor input object example

```json
{
  "searchQueries": [
    "Python Developer",
    "Project Manager"
  ],
  "location": "London",
  "jobUrls": [
    "https://www.reed.co.uk/jobs/python-developer/57258187"
  ],
  "includeJobDetails": true,
  "maxItems": 15,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "searchQueries": [
        "python developer"
    ],
    "jobUrls": [],
    "includeJobDetails": true,
    "maxItems": 15,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GB"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/reed-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 = {
    "searchQueries": ["python developer"],
    "jobUrls": [],
    "includeJobDetails": True,
    "maxItems": 15,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GB",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/reed-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 '{
  "searchQueries": [
    "python developer"
  ],
  "jobUrls": [],
  "includeJobDetails": true,
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}' |
apify call haketa/reed-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/reed-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/nLfckFu8kgulGxuNc/builds/1CbY0E8mArJv5nhke/openapi.json
