# Reed Jobs Scraper (UK Jobs, Salaries, Locations) (`webdatatools/reed-jobs-scraper`) Actor

Scrape Reed.co.uk UK job listings by keyword, city and radius: job title, employer, location, salary range, working pattern, posting date, snippet and optional full description.

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

## Pricing

from $0.24 / 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.
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?

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 Jobs, Salaries, Locations)

### What is Reed Jobs Scraper?

Reed Jobs Scraper collects UK job listings from [Reed.co.uk](https://www.reed.co.uk) by keyword, city and radius. Each job becomes one row with the title, employer, location, salary range, working pattern (remote, hybrid or on site), posting date, a short snippet and the Reed job link. An optional switch adds the full job description. No login is needed: the actor reads the public search pages.

### What data does Reed Jobs Scraper extract?

| Field | Type | Meaning |
|---|---|---|
| `jobId`, `url` | string | Reed job id and job page link |
| `title` | string | Job title |
| `company`, `companyUrl` | string | Employer name and Reed employer page (anonymous listings show "Anonymous") |
| `location`, `county` | string | Town and county as Reed lists them |
| `workingOption` | string | `remote`, `hybrid` or `onsite` when Reed states it |
| `isFullTime`, `isPartTime` | boolean | Contract pattern flags |
| `isEasyApply`, `isPromoted`, `isFeatured` | boolean | Listing flags |
| `taxonomy` | string | Reed's main job category, e.g. `Developer`, `Analyst` |
| `salaryFrom`, `salaryTo`, `currency` | number / string | Annual or other pay band as listed; `currency` is GBP whenever a salary is present |
| `datePosted`, `dateCreated`, `expiryDate` | string | Reed dates (local UK time, no timezone suffix) |
| `snippet` | string | Short description from the search results |
| `description` | string | Full description as plain text (only with "Include full description") |
| `searchKeyword`, `searchLocation`, `searchUrl` | string | The search that found the row |
| `scrapedAt` | ISO string | When the row was collected |

### How to use Reed Jobs Scraper

1. Open the actor in Apify and go to the Input tab.
2. Enter one or more keywords separated by `;`, for example `data analyst; python developer`.
3. Optionally add a UK city and a radius in miles, for example `London` and `10`.
4. Optionally set filters: working pattern, full time only, minimum salary, posted within days.
5. Set the maximum jobs per search and click Start. Download the dataset as JSON, CSV or Excel.

### Example input

```json
{
    "keywords": "data analyst",
    "location": "London",
    "distance": 10,
    "fullTimeOnly": true,
    "maxJobs": 40,
    "fetchDescriptions": true
}
```

### Example output

Real row from a run on 2026-10-23 (input above; trimmed for length):

```json
{
    "position": 1,
    "jobId": "57459297",
    "title": "Data Analyst",
    "url": "https://www.reed.co.uk/jobs/data-analyst/57459297",
    "company": "Harnham - Data & Analytics Recruitment",
    "location": "London",
    "county": "London",
    "workingOption": "hybrid",
    "isFullTime": true,
    "isEasyApply": true,
    "taxonomy": "Analyst",
    "salaryFrom": 40000,
    "salaryTo": 60000,
    "currency": "GBP",
    "datePosted": "2026-10-14T16:09:33.597",
    "expiryDate": "2026-11-25T23:55:00",
    "searchKeyword": "data analyst",
    "searchLocation": "London"
}
```

The run returned 40 rows from 50 scanned (Reed reported 1,091 matches for the search) in about 47 seconds (run `2ZroJK8a27JMDkh1L`). Platform usage: USD 0.00156.

### Input parameters

- **Keywords**: one or more searches separated by `;`.
- **Location**: a UK place name. Empty = all of the UK.
- **Distance (miles)**: radius around the location, used only with a location.
- **Working pattern**: any, remote, hybrid or onsite; applied after the fetch.
- **Full-time only**: keeps jobs marked full time.
- **Minimum salary (GBP)**: keeps jobs whose top salary is at least this value; rows without salary are dropped when set.
- **Posted within days**: keeps jobs posted in the last N days.
- **Max jobs per search**: up to 2,000 per keyword.
- **Include full description**: opens each job page (one extra request per row) and adds the description text.
- **Proxy mode**: direct first; residential UK proxy only after blocks.

### Pricing

Pay per result: **USD 0.0004 per job** at the base tier, with volume tiers that go lower on higher Apify plans. The actor start is billed as well (USD 0.00005).

Measured platform usage: a 100-job default run cost USD 0.00119 (about USD 0.012 per 1,000 jobs). A 40-job run with full descriptions cost USD 0.00156, because every row needs a second request. The top competing UK Reed actor on the Store is priced at USD 0.0005 per lot scraped, so this price sits below it.

### Reed Jobs Scraper vs. alternatives

- **Search pages**: Reed shows 25 jobs per page. A query returns up to the number of matches Reed reports; the actor stops at the end of results or at your limit.
- **Filters**: working pattern, full-time, salary and date are applied after each page, so a filtered run saves fewer rows than it scans.
- **Descriptions**: the search pages carry a short snippet only; the full text comes from the job page and costs an extra request per row.

### Using Reed Jobs Scraper with AI agents

Reed Jobs Scraper has a schema with a description for every input, pay-per-result pricing and a maximum-jobs bound. An agent can pass keywords and a city, read the rows and stop at the limit.

### FAQ

**Does it need a login?** No. It reads the public search and job pages.

**Why is the salary empty for some jobs?** Reed shows pay only when the employer enters it. In the 40-job test, 39 of 40 rows had a salary band; in the 100-job default run, 99 of 100 did.

**Are the dates in UK time?** Reed sends local dates without a timezone suffix; the actor keeps them as sent.

**Can I search the whole UK?** Yes, leave the location empty. Radius is then ignored.

**What if Reed blocks the run?** The actor retries and switches to the residential proxy after the first blocks. If results still cannot be read, it stops that search and writes an ERRORS record.

**Does it cover Ireland or other countries?** No. Reed's UK site only.

### Support

Use the Issues tab on the actor page. Reed is a third-party site; this actor is not affiliated with Reed.

# Actor input Schema

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

Job title, skill or company, e.g. `developer` or `data analyst`. Several separated by `;` run one after another.

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

Optional UK place, e.g. `London`, `Manchester`, `Leeds`. Leave empty for all of the UK.

## `distance` (type: `integer`):

Radius around the location in miles, e.g. `10`. Only used with a location.

## `workingOption` (type: `string`):

Keep only remote, hybrid or onsite jobs. Applied after the fetch.

## `fullTimeOnly` (type: `boolean`):

Keep only jobs marked full time.

## `minSalary` (type: `integer`):

Keeps jobs whose top salary is at least this number. Jobs without salary data are dropped when this is set.

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

Keep only jobs posted in the last N days, e.g. `7`.

## `maxJobs` (type: `integer`):

For each keyword (25 jobs per page; Reed pages are read until this limit or the end of the results).

## `fetchDescriptions` (type: `boolean`):

Opens each job page and adds the full description as plain text. Slower: one extra request per job.

## `proxyMode` (type: `string`):

auto: direct first, Apify Residential proxy (UK) only after blocks. never: direct only. always: Residential from the start.

## Actor input object example

```json
{
  "keywords": "developer",
  "workingOption": "any",
  "fullTimeOnly": false,
  "maxJobs": 100,
  "fetchDescriptions": false,
  "proxyMode": "auto"
}
```

# Actor output Schema

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

All reed jobs from this run.

# 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"
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdatatools/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" }

# Run the Actor and wait for it to finish
run = client.actor("webdatatools/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 '{
  "keywords": "developer"
}' |
apify call webdatatools/reed-jobs-scraper --silent --output-dataset

```

## MCP server setup

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