# Reed UK Jobs Scraper (`straightforward_hydra/reed-jobs-scraper`) Actor

Scrape UK job adverts from Reed.co.uk: title, recruiter, location, contract type and real salary figures, annualised so hourly, daily and yearly pay compare directly. Optional full descriptions. No API key.

- **URL**: https://apify.com/straightforward\_hydra/reed-jobs-scraper.md
- **Developed by:** [Dev D](https://apify.com/straightforward_hydra) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 jobs

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?

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 UK Jobs Scraper

Scrape UK job adverts from [Reed.co.uk](https://www.reed.co.uk) — title,
recruiter, location, contract type, remote option, dates and, above all, the
**salary numbers**.

Paste the URL from your address bar, or just type a job title. No API key,
no login, no browser.

### Input

| Field | Meaning |
| --- | --- |
| `startUrls` | Reed search URLs, e.g. `https://www.reed.co.uk/jobs/nurse-jobs-in-manchester` |
| `searchKeywords` | Job titles to search instead of pasting URLs |
| `searchLocation` | Town/city/postcode applied to those keywords |
| `maxJobsPerSearch` | Adverts per search (default 100) |
| `scrapeDescriptions` | Also open each advert for its full text (default off) |
| `proxyConfiguration` | Optional |

Any filter already in the URL keeps working — `salaryFrom=`, `proximity=`,
`perm=`, `contract=`, `partTime=`, `dateCreatedOffSet=`, `remoteWorkingOption=`
and the rest are passed straight through.

### Output

One row per advert:

```json
{
  "job_id": 57205630,
  "title": "Software Engineer",
  "url": "https://www.reed.co.uk/jobs/software-engineer/57205630",
  "recruiter": "Vermillion Analytics",
  "location": "London",
  "county": "London",
  "contract_type": "Permanent",
  "is_full_time": true,
  "remote_option": "Hybrid",
  "posted_at": "2026-08-06T12:54:07",
  "expires_at": "2026-09-17T23:59:59",
  "category": "Engineer",
  "sub_category": "Software Engineer",
  "salary_from": 35000,
  "salary_to": 45000,
  "salary_period": "per annum",
  "salary_currency": "GBP",
  "salary_display": "£35,000 - £45,000 per annum",
  "salary_is_advertised": true,
  "salary_from_per_year": 35000,
  "salary_to_per_year": 45000,
  "is_easy_apply": true
}
```

With `scrapeDescriptions` on, each row also gets `description`,
`description_html`, `sector`, `parent_sector`, `region`, `town`, `postcode`,
`recruiter_type` (agency or direct employer), `job_age_days` and
`breadcrumbs`.

### About the salary fields — please read

Reed publishes pay in three periods: **per hour**, **per day** and
**per annum**. `salary_from_per_year` / `salary_to_per_year` annualise all
three onto one scale so a £13/hour warehouse role and a £45,000 engineering
role sort in the same column. The multipliers are Reed's own — **1,950 hours**
(37.5 h/week x 52) and **260 days** (5 days/week x 52) — the same ones its
detail pages use.

`salary_is_advertised` is the field to watch. Some advertisers publish
"Competitive salary" or "Salary negotiable" instead of a figure, and for those
Reed still carries an internal band that the public listing never shows. Those
rows come back with `salary_is_advertised: false` and a `salary_display` of
"Competitive salary" — the numbers are real, but nobody reading the advert saw
them. Filter on that flag before quoting a market rate.

### Paging

Reed serves 25 adverts per page and pages to the very end — a 5,896-result
search really does return all 236 pages. Set `maxJobsPerSearch` to whatever you
need; the only limit is your run timeout, and the Actor stops cleanly and keeps
everything it has if it gets close to one.

### Pay per event

| Event | When |
| --- | --- |
| `job` | One advert from the search results |
| `job-with-description` | One advert whose own page was also opened, adding the full description and sector detail. Charged instead of `job`, never on top |

Adverts Reed repeats across pages or searches are de-duplicated by `job_id` and
charged once.

# Actor input Schema

## `startUrls` (type: `array`):

Any Reed job-search URL. Search on reed.co.uk and copy the address, e.g. https://www.reed.co.uk/jobs/nurse-jobs-in-manchester. Filters already in the URL (salary, distance, contract type, date posted) are all kept.

## `searchKeywords` (type: `array`):

Job titles or keywords to search instead of pasting URLs, e.g. "data analyst". Combined with the location below.

## `searchLocation` (type: `string`):

Town, city or postcode applied to every keyword above, e.g. Leeds. Leave empty to search the whole UK.

## `maxJobsPerSearch` (type: `integer`):

How many adverts to collect per search. Reed serves 25 per page and pages all the way to the end of the result set, so large numbers work.

## `scrapeDescriptions` (type: `boolean`):

Fetch every advert's own page to add the full description text, sector, region, postcode and whether the recruiter is an agency. One extra request per job, so runs take longer and are charged as job-with-description.

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

Optional. Reed is readable without a proxy, but a proxy helps on long runs or from busy networks.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.reed.co.uk/jobs/software-developer-jobs-in-london",
    "https://www.reed.co.uk/jobs/nurse-jobs-in-manchester"
  ],
  "searchKeywords": [
    "project manager"
  ],
  "searchLocation": "",
  "maxJobsPerSearch": 100,
  "scrapeDescriptions": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `jobs` (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 = {
    "startUrls": [
        "https://www.reed.co.uk/jobs/software-developer-jobs-in-london",
        "https://www.reed.co.uk/jobs/nurse-jobs-in-manchester"
    ],
    "searchKeywords": [
        "project manager"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("straightforward_hydra/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 = {
    "startUrls": [
        "https://www.reed.co.uk/jobs/software-developer-jobs-in-london",
        "https://www.reed.co.uk/jobs/nurse-jobs-in-manchester",
    ],
    "searchKeywords": ["project manager"],
}

# Run the Actor and wait for it to finish
run = client.actor("straightforward_hydra/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 '{
  "startUrls": [
    "https://www.reed.co.uk/jobs/software-developer-jobs-in-london",
    "https://www.reed.co.uk/jobs/nurse-jobs-in-manchester"
  ],
  "searchKeywords": [
    "project manager"
  ]
}' |
apify call straightforward_hydra/reed-jobs-scraper --silent --output-dataset

```

## MCP server setup

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