# Reed Jobs Scraper: UK Job Listings from Reed.co.uk (`pulsedata/reed-jobs-scraper`) Actor

Scrape UK jobs from Reed.co.uk by keyword, location, job type, salary and date posted, or from any Reed search URL. Returns salary range, full description, skills, contract type, sector, postcode and recruiter. $2.00 per 1,000 jobs.

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

## Pricing

$2.00 / 1,000 job scrapeds

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

## Reed Jobs Scraper: UK Job Listings from Reed.co.uk

This actor scrapes job listings from [Reed.co.uk](https://www.reed.co.uk), one of the largest job boards in the UK. You search by keyword and location, or paste any Reed search URL, and get one row per job with the title, employer or agency, location down to the postcode district, salary range and period, contract type, working arrangement, sector, skills, posting and expiry dates and the full job description. It costs $2.00 per 1,000 jobs, with no start fee.

It reads the public job pages the same way a visitor does. It does not need a Reed account, an API key or a login, and it does not apply to jobs.

### Features

- **Scrape Reed jobs by keyword**, for example `data analyst`, `nurse` or `HGV driver`, across the whole UK.
- **Search UK jobs by location and radius**: a town, county or postcode and a distance of up to 50 miles.
- **Filter Reed jobs by job type**: permanent, temporary, contract, full-time or part-time.
- **Find remote and hybrid jobs in the UK** with the working arrangement filter (on-site, hybrid, remote).
- **Get jobs posted today, in the last 3 days, last week or last 2 weeks.**
- **Filter UK jobs by salary** with a minimum and maximum in GBP per year.
- **Scrape a Reed search URL** you set up in the browser. Its filters are used as they are.
- **Export the full job description, skills and sector** for each job, or switch details off for a faster run.
- **Download Reed jobs as CSV, Excel or JSON** through the Apify dataset or API.

### Use cases

- **Recruitment agencies and sourcers**: a daily list of new jobs in a sector and region, with the advertiser and whether it was posted by an agency or the employer directly. Direct employer ads are often the ones worth a business development call.
- **Salary benchmarking**: collect salary ranges for one role across UK regions. With full details on, `salaryFromPerYear` and `salaryToPerYear` carry the annual figure Reed works out for the ad, where Reed provides one, so hourly and annual ads can be compared.
- **Labour market research**: count openings by sector, region, contract type or working arrangement over time with a scheduled run.
- **Job search tools and alerts**: feed new Reed listings into your own job board, Slack channel or email digest.
- **Skills analysis**: the `skills` list Reed attaches to each ad shows which tools and qualifications employers ask for in a role.
- **Lead generation**: find companies that are hiring for a specific role in a specific town.

### Input

| Field | What it does |
|---|---|
| `searchQueries` (required) | One search per line. A keyword such as `data analyst`, or a Reed search URL such as `https://www.reed.co.uk/jobs/nurse-jobs-in-manchester?perm=true`. |
| `location` | Town, county or postcode, for example `London`, `Manchester` or `M1`. Empty searches the whole UK. |
| `distanceMiles` | Radius around the location: 0, 1, 3, 5, 10, 15, 20, 30 or 50. Other numbers round up to the next of these. Default 10. |
| `jobTypes` | Any of `permanent`, `temporary`, `contract`, `full-time`, `part-time`. Empty means all. |
| `workingOptions` | Any of `on-site`, `hybrid`, `remote`. Empty means all. |
| `postedWithin` | `anytime` (default), `today`, `lastthreedays`, `lastweek` or `lasttwoweeks`. |
| `salaryFrom`, `salaryTo` | Reed's salary filter in GBP per year. 0 means no limit. Reed matches on the advertised range, so a £60,000 to £80,000 ad counts for a £70,000 minimum, and some ads with an unstated salary are included. Filter on `salaryFromPerYear` afterwards for a strict cut-off. |
| `includeDetails` | Default `true`. Adds the description, skills, contract type, sector, region, postcode and recruiter type. |
| `maxResults` | Stop each search after this many jobs. 0 returns every match. |
| `proxyConfiguration` | UK residential Apify Proxy by default. Leave it as is; Reed blocks datacenter IPs after a few pages. |

Example input:

```json
{
  "searchQueries": ["nurse"],
  "location": "Manchester",
  "distanceMiles": 10,
  "jobTypes": ["permanent", "full-time"],
  "workingOptions": ["hybrid", "on-site"],
  "postedWithin": "lastweek",
  "salaryFrom": 30000,
  "includeDetails": true,
  "maxResults": 100
}
```

Location, distance and the filters apply to keyword searches. A pasted Reed URL keeps its own filters and ignores these fields. Input is read tolerantly: `Full time`, `fulltime` and `full-time` all work, salaries can be written as `30k` or `£30,000`, and `7 days` maps to the last week. Unknown values are skipped with a warning in the log. With more than one working arrangement the actor runs one search per arrangement and removes duplicate jobs. A job found by two searches in the same run is returned once.

### Output

One item per job. With full details on:

```json
{
  "id": 57359488,
  "url": "https://www.reed.co.uk/jobs/data-analyst/57359488",
  "title": "Data analyst",
  "company": "Kingdom People",
  "companyUrl": "https://www.reed.co.uk/jobs/mlw-recruit-ltd/p39981",
  "location": "Newton-le-Willows",
  "county": "Merseyside",
  "town": "Newton-le-Willows",
  "region": "North West England",
  "postcode": "WA12",
  "salary": "£35,000 - £40,000 per annum",
  "salaryFrom": 35000,
  "salaryTo": 40000,
  "salaryPeriod": "per annum",
  "salaryFromPerYear": 35000,
  "salaryToPerYear": 40000,
  "contractType": "Permanent",
  "isFullTime": true,
  "isPartTime": false,
  "workingOption": "On-site",
  "isRemote": false,
  "sector": "IT & Telecoms",
  "subSector": "Business Analyst",
  "skills": ["Power BI", "SQL Databases", "Microsoft Excel", "Stakeholder Management"],
  "postedBy": "Agency",
  "postedAt": "2026-09-17T15:32:59.737",
  "expiresAt": "2026-10-29T23:55:00",
  "isEasyApply": false,
  "isGraduate": false,
  "description": "Job Title: Data & BI Analyst ...",
  "descriptionHtml": "Job Title: Data & BI Analyst<br><br> ...",
  "searchQuery": "data analyst"
}
```

Items also carry `companyId`, `category`, `subCategory`, `updatedAt`, `snippet`, `externalApplyUrl`, `isPromoted`, `isTrainingJob`, `logoUrl`, `companyProfileName`, `country` and `isLive`. With `includeDetails` set to `false` you get the fields from the search results only: title, company, location, county, salary, dates, working arrangement, the category and a short snippet. If one job page cannot be read after retries, the row is still returned from the search results with a `detailError` field.

### Pricing

| Event | Price |
|---|---|
| `job-scraped`, per job returned | $0.002 |

That is $2.00 per 1,000 jobs. There is no start fee, and full details cost the same as search results only. Proxy traffic is included. Worked example: 100 data analyst jobs with full details cost $0.20. A search that finds nothing costs nothing.

If you set a maximum cost per run in the run options, the actor stops cleanly at that amount and keeps everything it collected.

### FAQ

**Do I need a Reed account or an API key?**
No. The actor reads the public search and job pages. It never logs in.

**How do I get every job for a search, not only the first 50?**
Set `maxResults` to `0`. The actor walks all result pages, 25 jobs per page, and fetches several pages in parallel.

**How fast is it?**
In our test runs 100 jobs with full details took about 45 seconds. Without details about 280 jobs took 16 seconds, because each job then needs no extra request.

**Can I sort the results by date?**
No. Reed's robots.txt disallows the sort parameter, so results come in Reed's default order. Use `postedWithin` to limit the run to recent jobs and sort the dataset afterwards by `postedAt`.

**Can I scrape a single job URL?**
Not on its own. A URL of one job (`/jobs/<title>/<id>`) is skipped with a warning. Use a search URL or a keyword.

**Does it work for jobs outside the UK?**
The actor searches reed.co.uk, which is a UK job board. For Australia and New Zealand use the SEEK Jobs Scraper linked below.

**Why a UK residential proxy?**
In our tests Reed answered datacenter IPs with 403 errors after a few pages. Blocked or dropped requests are retried on a new IP, and the log reports how many were retried.

**Can I schedule it?**
Yes. Save a task with your searches and `postedWithin` set to `today`, add an Apify schedule, and send the dataset to Google Sheets, Make, Zapier, n8n or your own API endpoint.

**What can it not do?**
It does not apply to jobs, read applicant numbers, log in to Reed, or return contact details that are not in the public ad.

### Example pages

Each of these opens a ready-made run with a real input:

- [Scrape data analyst jobs in the UK from Reed](https://apify.com/pulsedata/reed-jobs-scraper/examples/reed-data-analyst-jobs-uk)
- [Get nurse jobs in Manchester from Reed](https://apify.com/pulsedata/reed-jobs-scraper/examples/reed-nurse-jobs-manchester)
- [Find remote software developer jobs in the UK on Reed](https://apify.com/pulsedata/reed-jobs-scraper/examples/reed-remote-developer-jobs-uk)
- [Get new jobs in London posted on Reed this week](https://apify.com/pulsedata/reed-jobs-scraper/examples/reed-new-jobs-london-this-week)
- [Scrape accountant jobs in Leeds from Reed](https://apify.com/pulsedata/reed-jobs-scraper/examples/reed-accountant-jobs-leeds)
- [Export warehouse contract jobs in Birmingham from a Reed URL](https://apify.com/pulsedata/reed-jobs-scraper/examples/reed-warehouse-contract-jobs-birmingham)
- [Find graduate jobs in the UK on Reed](https://apify.com/pulsedata/reed-jobs-scraper/examples/reed-graduate-jobs-uk)
- [Software engineer jobs in London with a £70,000 salary filter](https://apify.com/pulsedata/reed-jobs-scraper/examples/reed-software-engineer-jobs-london-70k)
- [Get part-time jobs in Bristol from Reed](https://apify.com/pulsedata/reed-jobs-scraper/examples/reed-part-time-jobs-bristol)
- [Scrape teaching assistant jobs in the UK from Reed](https://apify.com/pulsedata/reed-jobs-scraper/examples/reed-teaching-assistant-jobs-uk)

### Related actors

- [SEEK Jobs Scraper](https://apify.com/pulsedata/seek-jobs-scraper): job listings from SEEK in Australia and New Zealand.
- [Career Page Jobs Scraper](https://apify.com/pulsedata/career-page-jobs-scraper): open roles straight from company career pages on Greenhouse, Lever, Ashby, Workday and other systems.
- [Greenhouse Jobs Scraper](https://apify.com/pulsedata/greenhouse-jobs-scraper): every job on a company's Greenhouse board.
- [Workday Jobs Scraper](https://apify.com/pulsedata/workday-jobs-scraper): jobs from large employers' Workday career sites.

# Actor input Schema

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

One search per line. Use job keywords like `data analyst` or `nurse`, or paste a Reed search URL such as `https://www.reed.co.uk/jobs/nurse-jobs-in-manchester?perm=true` (its filters are used as they are).

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

Town, county or postcode as you would type it on Reed, for example `London`, `Manchester` or `M1`. Empty searches the whole UK.

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

Radius around the location: 0, 1, 3, 5, 10, 15, 20, 30 or 50 miles. Other numbers round up to the next of these. Only used with a location.

## `jobTypes` (type: `array`):

Only these job types: `permanent`, `temporary`, `contract`, `full-time`, `part-time`. Empty means all.

## `workingOptions` (type: `array`):

Only these arrangements: `on-site`, `hybrid`, `remote`. Empty means all. With more than one value the actor runs one search per value and removes duplicates.

## `postedWithin` (type: `string`):

Only jobs posted in this period.

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

Passed to Reed's minimum salary filter, GBP per year. Reed matches on the advertised range, so a £60,000 to £80,000 ad counts for a £70,000 minimum, and it also returns some ads with no stated salary. Filter on salaryFromPerYear afterwards for a strict cut-off. 0 means no minimum.

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

Passed to Reed's maximum salary filter, GBP per year. Reed matches on the advertised range and may return ads with no stated salary. Filter on salaryToPerYear afterwards for a strict cut-off. 0 means no maximum.

## `includeDetails` (type: `boolean`):

Add the full description, skills, contract type, sector, region, postcode and recruiter details. One extra request per job, same price.

## `maxResults` (type: `integer`):

Stop each search after this many jobs. 0 means all.

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

UK residential proxy is the default. Reed blocks datacenter IPs after a few pages.

## Actor input object example

```json
{
  "searchQueries": [
    "data analyst",
    "nurse"
  ],
  "location": "",
  "distanceMiles": 10,
  "jobTypes": [],
  "workingOptions": [],
  "postedWithin": "anytime",
  "salaryFrom": 0,
  "salaryTo": 0,
  "includeDetails": true,
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Jobs stored in the default dataset (JSON/CSV/Excel via the dataset API).

# 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": [
        "data analyst",
        "nurse"
    ],
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GB"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("pulsedata/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 = {
    "searchQueries": [
        "data analyst",
        "nurse",
    ],
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GB",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("pulsedata/reed-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 '{
  "searchQueries": [
    "data analyst",
    "nurse"
  ],
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}' |
apify call pulsedata/reed-jobs-scraper --silent --output-dataset

```

## MCP server setup

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