# Reed Scraper — UK Jobs, Salaries & Recruiters (`logiover/reed-scraper`) Actor

Reed.co.uk jobs scraper: export UK job ads with salary as shown plus numbers, full description, location and county, posted and expiry dates, contract type, remote or hybrid, agency or employer and skills. Search by keyword, location and Reed's filters, paste URLs or export every job. No login.

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

## Pricing

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

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 Scraper

**Export UK job vacancies from Reed.co.uk — salary exactly as Reed shows it plus the numbers, full description, town, county, region and postcode, posted and expiry dates, contract type, full- or part-time, remote or hybrid, the advertiser (agency or employer) and skills — as clean JSON, CSV or Excel, without a login.**

> Independent tool. Not affiliated with, endorsed by, or sponsored by Reed.co.uk, Reed Specialist Recruitment or the REED group. "Reed" and "reed.co.uk" are trademarks of their owner and are used here only to describe the website this Actor reads.

**Reed Scraper** is a Reed.co.uk jobs scraper for the UK's best-known job board. It turns any Reed search — keywords or job titles, a town, county or postcode, Reed's own filters, a pasted Reed URL, a recruiter's or employer's job list, or the whole site — into structured UK jobs data: job title, **salary as displayed** ("£45,000 - £50,000 per annum", "Competitive salary", "£25 - £30 per hour") together with salary from / to as numbers, currency, period and the yearly equivalent, contract type (permanent, temporary, contract), full-time / part-time, remote / hybrid / on-site, location with county, region, country and postcode district, posted, updated and expiry dates in UTC, the advertiser (recruitment agency, direct employer or charity, with profile, logo, company page and the agency's own job reference), Reed's specialism and sub-specialism, skills, screening questions, Easy Apply, cover-letter rule, UK right-to-work and visa-sponsorship flags and the **complete job description**. Use it to **scrape Reed.co.uk** by keyword and location, as a **Reed API alternative** (Reed's own developer API needs a registered key, returns at most 100 jobs per call and leaves most of these fields out), or to **export Reed jobs to CSV, Excel or JSON** for your ATS, CRM, BI tool or data warehouse. No Reed account, no API key, no cookies, no browser.

Recruitment agencies, in-house recruiters, staffing firms, HR and compensation analysts, job aggregators and labour-market researchers use it for **UK salary data and salary benchmarking**, lead lists of employers that are hiring, competitor monitoring of other agencies' adverts, daily feeds of new vacancies and UK labour-market statistics by county, region and specialism. Typical searches it answers: *Reed jobs export*, *Reed.co.uk job listings to Excel*, *UK job vacancies dataset*, *Reed job scraper for London*, *all Reed jobs in Manchester*, *contract IT jobs UK day rates*, *teaching assistant vacancies by county*, *jobs offering visa sponsorship UK*, *recruitment agency job adverts* and *Reed salary data*. Reed lists about **99,500 live jobs**; the Actor reads all of them in about **72 seconds** (search data) and adds every job's own record at about **30 jobs per second**. All numbers on this page were measured on **2026-10-20**; run results and speeds come from runs on the Apify platform.

***

### Table of contents

- [At a glance](#at-a-glance)
- [What you get](#what-you-get)
- [Who uses it — 15 workflows](#who-uses-it--15-workflows)
- [Cookbook — 17 ready-to-run inputs](#cookbook--17-ready-to-run-inputs)
- [Tutorial: your first run in the Apify Console](#tutorial-your-first-run-in-the-apify-console)
- [Tutorial: run it from the API](#tutorial-run-it-from-the-api)
- [Input reference](#input-reference)
- [Output data dictionary](#output-data-dictionary)
- [Real output sample](#real-output-sample)
- [Scale and speed (measured)](#scale-and-speed-measured)
- [What you pay](#what-you-pay)
- [Integrations](#integrations)
- [Performance tips](#performance-tips)
- [Troubleshooting: every status message explained](#troubleshooting-every-status-message-explained)
- [Honest limits](#honest-limits)
- [How it compares](#how-it-compares)
- [FAQ](#faq)
- [Glossary](#glossary)
- [Is it legal to scrape Reed.co.uk?](#is-it-legal-to-scrape-reedcouk)
- [Changelog](#changelog)
- [Support](#support)

***

### At a glance

| | |
|---|---|
| **Site** | reed.co.uk — UK job board (plus some overseas jobs) |
| **Jobs available** | 99,567 live jobs on 2026-10-20 (London alone: 23,210) |
| **Search by** | keywords / job titles × towns, counties or postcodes (with Reed's distance), pasted Reed URLs (search pages, recruiter pages, job pages), recruiter or employer names / profile numbers, or the whole of Reed |
| **Filters** | job type (permanent / temporary / contract), full- / part-time, remote / hybrid / on-site, salary range, date posted, posted by (agency / employer / Reed), 37 specialisms, graduate, Easy Apply, visa sponsorship, early bird, hide training courses, hide jobs without salary, distance 0–50 miles |
| **Per job** | 67 columns: listing, salary (as shown + numbers + yearly + notes), contract and hours, remote / hybrid, town / county / region / country / postcode, four dates, advertiser (type, category, profile, logo, company page, job reference), specialism, occupation, skills, screening questions, application rules, flags, full description |
| **Depth** | Every job of any search — Reed serves only 10,000 results per search, so bigger searches are split along Reed's own filters (the whole site: 153 parts, 0 duplicates) |
| **Speed** | 50 jobs with full details in 4 s · 1,000 jobs with full details in 37 s · all 99,567 jobs (search data) in 72 s |
| **Output** | JSON, CSV, Excel, XML, HTML; API, webhooks, Make, Zapier, n8n, Sheets, MCP |
| **Login / cookies / proxy** | None needed (a capped UK residential fallback is built in) |
| **Price** | $1.20 → $0.80 per 1,000 jobs by Apify plan, all included |

***

### What you get

Every row is one Reed job advert, 67 columns in a fixed order. Values Reed does not publish are `null` (or an empty list) — never an empty string or an invented 0. Real examples from 2026-10-20:

- **The job** — `id` (57475083), `url`, `title` ("Mortgage Administrator"), `jobType` ("Permanent", "Temporary", "Contract"), `hours` with `fullTime` / `partTime`, `workingOption` ("On-site", "Hybrid", "Remote").
- **Pay** — `salary` **exactly as Reed shows it** ("£28,000 - £45,000 per annum, OTE", "£12.71 per hour", "Competitive salary", "Training Course"; same rules as Reed's pages, checked on 2,078 of 2,078 job cards), `salaryFrom` / `salaryTo` as numbers, `salaryCurrency`, `salaryPeriod` ("year", "day", "hour" …), Reed's yearly equivalent `salaryYearlyFrom` / `salaryYearlyTo`, and the notes `salaryNegotiable`, `salaryOte`, `salaryIncludesBenefits`, `salaryProRata`, `salaryCommissionOnly`. `salaryShown` is `false` where Reed shows a phrase instead of the numbers — Reed's page data (and its structured data) still carries the advertiser's range for most of these jobs, and it is kept.
- **Where** — `location` ("Chapeltown"), `county` ("South Yorkshire"), `region` ("Yorkshire and Humberside"), `country` ("United Kingdom", "Ireland" …), `postcode` district ("S35") and `locationText`, the line exactly as Reed prints it ("Dublin, Ireland, County Dublin").
- **When** — `datePosted` (as Reed shows it; refreshed adverts move up), `dateCreated`, `dateUpdated`, `expiryDate`. Reed stores UK local time without an offset; every date is converted to **UTC ISO 8601** (BST and GMT handled).
- **The advertiser** — `advertiserName` (as printed after "by"), `advertiserProfileName` (Reed profile / brand), `advertiserType` ("Agency" / "Employer"), `advertiserCategory` ("Recruitment consultancy", "Direct employer", "Charity/not for profit"), `postedByReed`, `advertiserId`, `advertiserProfileId`, `advertiserJobsUrl` (all their jobs on Reed), `advertiserLogoUrl`, `companyProfileUrl` and `advertiserReference` — the agency's own job reference ("IR36986O3a").
- **Category** — `specialism` ("Financial Services") and `subSpecialism` ("Mortgage Administrator") with Reed's ids, `occupation` / `occupationDetail` ("Administrator" / "Mortgage Administrator"), `knowledgeDomain` ("Administration").
- **Applying** — `easyApply`, `externalApplication` (continues on the advertiser's site), `coverLetter` ("None", "Optional", "Mandatory"), `screeningQuestions` ("Do you have a minimum 12 months independent mortgage administration experience?"), `ukRightToWorkRequired`, `visaSponsorship`.
- **The advert text** — `description` (complete, plain text with paragraphs and bullets), optional `descriptionHtml`, Reed's teaser `descriptionSnippet`, and `skills` ("CeMAP", "Mortgage Advice").
- **Flags and bookkeeping** — `graduate`, `earlyBird`, `trainingCourse`, `promoted`, `featured`, `detailsScraped`, `searchKeyword`, `searchLocation`, `scrapedAt`.

***

### Who uses it — 15 workflows

#### 1. Recruitment agencies — business development

Filter `postedBy: ["employer"]` for a specialism and region, export weekly, and you have a list of companies that are recruiting **without** an agency: employer name, Reed profile, company page and the roles they struggle to fill. Sort by `advertiserName` to see who posts the most.

#### 2. Recruitment agencies — competitor monitoring

Put competitor agencies into `recruiters` ("Hays", "CMD Recruitment" or their Reed page) and track what they post, where, at what salary and with which `advertiserReference` — week by week, from a schedule.

#### 3. In-house recruiters and talent acquisition

Benchmark your adverts against the market: what other employers in your town pay for the same title (`salaryFrom` / `salaryTo` / `salaryPeriod`), which skills they list, whether they offer hybrid working and how many ask screening questions.

#### 4. Temporary and contract staffing

Search `jobTypes: ["temporary"]` or `["contract"]` per county and read day rates (`salaryPeriod: "day"`) and hourly rates (`"hour"`) as numbers — 12,919 day-rate and 19,106 hourly-rate jobs were live on Reed on 2026-10-20.

#### 5. Compensation and reward analysts

Export a whole specialism and compute pay bands by sub-specialism, county and contract type. `salaryYearlyFrom` / `salaryYearlyTo` put hourly, daily and annual pay on one scale; `salaryShown` tells you which ranges Reed displays and which sit behind "Competitive salary".

#### 6. Job aggregators and niche job boards

Load all of Reed (≈99,500 jobs) or a niche (for example *Education* or *Social Care*) every day with full descriptions; `id` is stable for de-duplication and `expiryDate` tells you when to drop a job.

#### 7. Labour-market researchers, economists, journalists and public bodies

Count vacancies by `specialism`, `county`, `region`, `jobType` and `workingOption`, follow remote and hybrid shares over time, or measure how many adverts hide their salary — with a dated, reproducible dataset.

#### 8. Local economic development and councils

Every job within 10 or 20 miles of a town (`locations` + `distanceMiles`) gives a local vacancy picture for skills plans and inward-investment pitches.

#### 9. HR-tech, payroll, benefits and training sellers

Employers with many open roles are warm leads. Group by `advertiserName`, keep `advertiserType: "Employer"`, and use `companyProfileUrl` and `advertiserJobsUrl` for research before outreach.

#### 10. Career coaches, outplacement and job clubs

Run your clients' target titles and towns each morning (`datePosted: "today"`) and send them a filtered list.

#### 11. Universities and careers services

`graduateJobsOnly: true` plus the specialisms your students study gives a graduate-jobs feed for a careers portal or newsletter.

#### 12. Immigration advisers and international recruiters

`visaSponsorshipOnly: true` returns the adverts whose advertiser offers sponsorship; `ukRightToWorkRequired` marks the ones that do not accept applicants without UK right to work (62.6 % of all jobs on 2026-10-20).

#### 13. Training providers

`skills`, `screeningQuestions` and descriptions show demand for qualifications such as CeMAP, CSCS or SIA; `trainingCourse` separates course adverts from vacancies.

#### 14. Remote-work job boards

`workingOption: "remote"` (4,799 jobs on 2026-10-20) or `"hybrid"` (19,475) with full descriptions, ready for your own board.

#### 15. AI, RAG and LLM pipelines

Clean plain-text descriptions, skills and screening questions are ideal for embeddings, CV-to-job matching, salary prediction and summarisation. Call the Actor from an AI agent through the Apify MCP server.

***

### Cookbook — 17 ready-to-run inputs

#### 1. Keyword + town (the default example)

```json
{
  "keywords": ["software engineer"],
  "locations": ["London"],
  "maxItems": 100
}
```

#### 2. Several job titles × several towns

```json
{
  "keywords": ["accountant", "payroll administrator"],
  "locations": ["Manchester", "Leeds", "Birmingham"],
  "maxItems": 3000
}
```

Each search gets a fair share of `maxItems`; jobs found twice are saved once.

#### 3. Every job in a city, with full details

```json
{
  "locations": ["London"],
  "maxItems": 0
}
```

London had 23,210 jobs on 2026-10-20 — read completely in 786 s with job details. Reed serves 10,000 per search, so the Actor splits London along Reed's filters by itself.

#### 4. Every job on Reed (fastest bulk export)

```json
{
  "maxItems": 0,
  "includeDetails": false
}
```

All 99,567 jobs in 72 s (2026-10-20). Leave out `includeDetails: false` for full descriptions and the rest of the job record (≈55 minutes at the default pace — raise the run timeout to 2 hours).

#### 5. Remote jobs only

```json
{
  "keywords": ["data analyst"],
  "workingOption": "remote",
  "maxItems": 500
}
```

#### 6. Contract IT roles posted in the last three days

```json
{
  "specialisms": ["IT & Telecoms"],
  "jobTypes": ["contract"],
  "datePosted": "lastthreedays",
  "maxItems": 0
}
```

#### 7. Daily monitoring of new jobs

```json
{
  "keywords": ["teaching assistant"],
  "locations": ["Kent"],
  "datePosted": "today",
  "sortBy": "newest",
  "maxItems": 0
}
```

Schedule it every morning and connect Google Sheets, Slack or a webhook.

#### 8. One recruiter's or employer's jobs by name

```json
{
  "recruiters": ["Hays"],
  "maxItems": 0
}
```

"Hays" was resolved to *Hays Specialist Recruitment Limited* (profile p36210, 2,962 jobs) in our test. A Reed recruiter page (`https://www.reed.co.uk/jobs/cmd-recruitment/p12120`) or a profile number (`p12120`) works too.

#### 9. A recruiter's jobs in certain towns

```json
{
  "recruiters": ["Hays"],
  "locations": ["Bristol"],
  "maxItems": 0
}
```

With recruiters given, keywords and locations narrow that recruiter's jobs (95 Hays jobs in Bristol in our test).

#### 10. Direct employers only — lead list for agencies

```json
{
  "specialisms": ["Engineering", "Manufacturing"],
  "postedBy": ["employer"],
  "locations": ["West Midlands"],
  "distanceMiles": "20",
  "maxItems": 0
}
```

#### 11. Graduate jobs for a careers portal

```json
{
  "graduateJobsOnly": true,
  "specialisms": ["Accountancy", "Financial Services", "IT & Telecoms"],
  "maxItems": 2000
}
```

#### 12. Jobs that offer visa sponsorship

```json
{
  "visaSponsorshipOnly": true,
  "maxItems": 0
}
```

Few advertisers tick this box (24 jobs on Reed when we counted on 2026-10-20) — check `visaSponsorship` and the description as well.

#### 13. Part-time jobs near a postcode

```json
{
  "locations": ["SW1A"],
  "distanceMiles": "5",
  "hours": "part",
  "maxItems": 500
}
```

#### 14. Well-paid finance jobs, salary shown

```json
{
  "specialisms": ["Financial Services", "Banking"],
  "salaryMin": 60000,
  "hideJobsWithoutSalary": true,
  "hideTrainingCourses": true,
  "maxItems": 1000
}
```

#### 15. A Reed search URL with any filters

```json
{
  "startUrls": [
    { "url": "https://www.reed.co.uk/jobs/nurse-jobs-in-leeds?perm=true&salaryFrom=30000" }
  ],
  "maxItems": 0
}
```

The Actor asks Reed's own page how it reads the URL, so every filter you set on the website is kept (37 jobs in our test).

#### 16. Specific job adverts

```json
{
  "startUrls": [
    { "url": "https://www.reed.co.uk/jobs/software-developer/57412315" },
    { "url": "https://www.reed.co.uk/jobs/mortgage-administrator/57475083" }
  ]
}
```

Expired adverts are reported in the log ("… no longer on Reed") instead of failing the run.

#### 17. Search data only, for the biggest exports

```json
{
  "keywords": ["manager"],
  "maxItems": 0,
  "includeDetails": false
}
```

Reed listed about 30,400 "manager" jobs on 2026-10-20; search data comes in up to 1,000 jobs per call. Paste the interesting job URLs into `startUrls` afterwards for full details.

***

### Tutorial: your first run in the Apify Console

1. Open the Actor and click **Try for free**. The form is pre-filled with "software engineer" in "London" and 50 results.
2. Change **Keywords or job titles** and **Locations** — or leave both empty for every job on Reed — and pick Reed filters if you like.
3. Set **Max results** (0 = everything that matches) and keep **Include full job details** on unless you need the fastest bulk export.
4. Click **Start**. The status line counts saved jobs, search calls and job details while it runs; rows appear in the **Output** tab within seconds.
5. When the run says *Succeeded*, open **Output** and click **Export** → CSV, Excel, JSON, XML or HTML. Views **Overview**, **Salary**, **Advertiser** and **Job facts** show the most useful columns first.
6. Open **Storage → Key-value store → SUMMARY** for the run report: how many jobs Reed listed per search, how many were read (`coveragePercent`), how the search was split and how many requests were made.

***

### Tutorial: run it from the API

#### 1. Get your token

Apify Console → **Settings → API & Integrations** → copy your personal API token.

#### 2. Run and get the data in one call (small runs)

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~reed-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN&format=json" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["nurse"],"locations":["Leeds"],"maxItems":200}'
```

#### 3. Start a run and fetch the data later (big runs)

```bash
## start
curl -X POST "https://api.apify.com/v2/acts/logiover~reed-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" -d '{"locations":["Manchester"],"maxItems":0}'
## poll: GET https://api.apify.com/v2/actor-runs/RUN_ID?token=YOUR_TOKEN   (status SUCCEEDED)
## data: GET https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN
```

#### 4. Node.js (apify-client)

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('logiover/reed-scraper').call({
    keywords: ['quantity surveyor'],
    locations: ['Bristol', 'Cardiff'],
    jobTypes: ['permanent'],
    maxItems: 1000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0].title, items[0].salary);
```

#### 5. Python (apify-client)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("logiover/reed-scraper").call(run_input={
    "keywords": ["HGV driver"],
    "locations": ["Birmingham"],
    "distanceMiles": "20",
    "maxItems": 500,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["salary"], job["advertiserName"], job["url"])
```

#### 6. Read the run summary

`GET https://api.apify.com/v2/key-value-stores/STORE_ID/records/SUMMARY` returns `outcome`, `rowsSaved`, per-search `jobsOnReed` / `jobsSeen` / `coveragePercent` / `parts`, `searchPagesRead`, `jobDetailsRead`, `firstRowAfterSecs`, request statistics and — when a budget stopped the run — `stoppedBy: "MAX_COST"`.

***

### Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `keywords` | array of strings | `[]` (prefill "software engineer") | Job titles or keywords; each is one Reed search. Empty with empty `locations` = all of Reed. |
| `locations` | array of strings | `[]` (prefill "London") | Towns, counties or postcodes ("Manchester", "Kent", "SW1A"); every keyword × every location. |
| `distanceMiles` | string | `"10"` | Reed's radius: `"0"`, `"1"`, `"3"`, `"5"`, `"10"`, `"15"`, `"20"`, `"30"`, `"50"`. |
| `jobTypes` | array | `[]` | `"permanent"`, `"temporary"`, `"contract"` (any of them). |
| `hours` | string | `"any"` | `"full"` or `"part"`. |
| `workingOption` | string | `"any"` | `"onSite"`, `"hybrid"` or `"remote"`. |
| `salaryMin` | integer | `0` | Reed's "Salary from", pounds per year. |
| `salaryMax` | integer | `0` | Reed's "Salary to", pounds per year. |
| `datePosted` | string | `"anytime"` | `"today"`, `"lastthreedays"`, `"lastweek"`, `"lasttwoweeks"`. |
| `postedBy` | array | `[]` | `"agency"`, `"employer"`, `"reed"`. |
| `specialisms` | array | `[]` | Any of Reed's 37 specialisms by name ("IT & Telecoms", "Social Care", "Education" …). |
| `graduateJobsOnly` | boolean | `false` | Reed's Graduate filter. |
| `easyApplyOnly` | boolean | `false` | Only Easy Apply jobs. |
| `visaSponsorshipOnly` | boolean | `false` | Only jobs offering visa sponsorship. |
| `earlyBirdOnly` | boolean | `false` | Reed's Early bird filter. |
| `hideTrainingCourses` | boolean | `false` | Leave out training-course adverts. |
| `hideJobsWithoutSalary` | boolean | `false` | Leave out "Competitive salary", "Salary negotiable" and "Commission only" adverts. |
| `startUrls` | array of `{ "url": … }` | `[]` | Reed search pages, recruiter pages (`/jobs/<name>/p<number>`), job pages or job numbers. |
| `recruiters` | array of strings | `[]` | Names, Reed recruiter URLs or profile numbers; keywords, locations and filters narrow their jobs. |
| `maxItems` | integer | `1000` (prefill 50) | Unique jobs to save across all searches; `0` = no limit. |
| `includeDetails` | boolean | `true` | Read each job's own record (description, region, postcode, skills, questions …). |
| `sortBy` | string | `"relevance"` | `"relevance"` = Reed's order for keyword searches (first 1,000 per search), `"newest"` = newest first. |
| `includeDescriptionHtml` | boolean | `false` | Adds `descriptionHtml`. |
| `maxRequestsPerSecond` | integer | `30` | Upper pace limit (1–60); the Actor slows down on refusals by itself. |
| `proxyConfiguration` | object | `{ "useApifyProxy": false }` | Optional fallback, used only while Reed refuses the direct connection. |

***

### Output data dictionary

Fill rates are measured on two platform runs of 2026-10-20: **all 99,567 jobs on Reed (search data)** and **every job in London with job details (23,213 jobs)**. "true" gives the share of jobs where a flag is true. "—" = the column needs job details.

| Column | Type | Meaning | Fill | Example |
|---|---|---|---|---|
| `id` | number | Reed's job number — stable, use it to de-duplicate. | A 100 % | `57475083` |
| `url` | string (URL) | The job page on reed.co.uk. | A 100 % | `"https://www.reed.co.uk/jobs/mortgage-admin…"` |
| `title` | string | Job title as advertised. | A 100 % | `"Mortgage Administrator"` |
| `salary` | string | Salary line exactly as Reed shows it (numbers, period and notes, or a phrase such as "Competitive salary" / "Training Course"). | A 100 % | `"£28,000 - £45,000 per annum, OTE"` |
| `salaryFrom` | number | Lower end of the salary in `salaryCurrency` per `salaryPeriod`. | A 97.9 % | `28000` |
| `salaryTo` | number | Upper end of the salary (equal to `salaryFrom` for a single figure). | A 97.9 % | `45000` |
| `salaryCurrency` | string | ISO currency code ("GBP", "EUR", "USD" …). | A 97.9 % | `"GBP"` |
| `salaryPeriod` | string | "year", "month", "week", "day" or "hour". | A 97.9 % | `"year"` |
| `salaryShown` | boolean | `true` when Reed displays the numbers; `false` for "Competitive salary", "Salary negotiable", "Commission only", "Training Course" or no salary. | A 100 % · true 79.2 % | `true` |
| `salaryYearlyFrom` | number | Reed's yearly equivalent of `salaryFrom` (hourly and daily rates converted by Reed). | L 98.2 % | `28000` |
| `salaryYearlyTo` | number | Reed's yearly equivalent of `salaryTo`. | L 98.2 % | `45000` |
| `salaryNegotiable` | boolean | Reed note "negotiable" / "Salary negotiable". | A 100 % · true 8 % | `false` |
| `salaryOte` | boolean | On-target earnings (pay includes commission or bonus). | A 100 % · true 1.7 % | `true` |
| `salaryIncludesBenefits` | boolean | Reed note "inc benefits". | A 100 % · true 6.6 % | `false` |
| `salaryProRata` | boolean | Reed note "pro-rata". | A 100 % · true 0.5 % | `false` |
| `salaryCommissionOnly` | boolean | Reed note "Commission only". | A 100 % · true 0.2 % | `false` |
| `jobType` | string | "Permanent", "Temporary" or "Contract". | A 100 % | `"Permanent"` |
| `hours` | string | "Full-time", "Part-time" or "Full-time or part-time". | A 100 % | `"Full-time"` |
| `fullTime` | boolean | Full-time hours offered. | A 100 % · true 95.2 % | `true` |
| `partTime` | boolean | Part-time hours offered. | A 100 % · true 12 % | `false` |
| `workingOption` | string | "On-site", "Hybrid" or "Remote" — Reed's classification used by its filter. | A 98.8 % | `"Hybrid"` |
| `location` | string | Town or area as the job page shows it. | A 100 % | `"London"` |
| `county` | string | County ("West Yorkshire", "London", "County Down"). | A 98.6 % | `"London"` |
| `region` | string | Region ("South East England", "Yorkshire and Humberside", "Leinster"). | L 99 % | `"South East England"` |
| `country` | string | Country ("United Kingdom", "Ireland", "USA" …). | L 100 % | `"United Kingdom"` |
| `postcode` | string | Postcode district Reed holds for the job ("EC2A", "S35"). | L 38.8 % | `"EC2A"` |
| `locationText` | string | Location line exactly as Reed prints it. | A 100 % | `"London"` |
| `datePosted` | string (ISO 8601, UTC) | Date Reed shows as posted (moves up when the advert is refreshed). | A 100 % | `"2026-10-20T07:21:01.887Z"` |
| `dateCreated` | string (ISO 8601, UTC) | When the advert was first created. | A 100 % | `"2026-10-20T07:21:01.890Z"` |
| `dateUpdated` | string (ISO 8601, UTC) | Last update of the advert. | A 100 % | `"2026-10-20T07:21:01.890Z"` |
| `expiryDate` | string (ISO 8601, UTC) | When the advert closes. | A 100 % | `"2026-12-01T23:59:59.000Z"` |
| `advertiserName` | string | Advertiser as printed after "by" on Reed. | A 100 % | `"Pure Resourcing Limited"` |
| `advertiserProfileName` | string | The advertiser's Reed profile (brand) name. | A 94.6 % | `"Pure Resourcing Limited"` |
| `advertiserType` | string | "Agency" or "Employer" — Reed's *Posted by* filter (charities count as employers). | A 100 %¹ | `"Agency"` |
| `advertiserCategory` | string | "Recruitment consultancy", "Direct employer" or "Charity/not for profit". | A 100 %¹ | `"Recruitment consultancy"` |
| `postedByReed` | boolean | Posted by Reed itself. | L 100 % · true 0.2 % | `false` |
| `advertiserId` | number | Reed's id of the advertising organisation. | A 100 % | `56313` |
| `advertiserProfileId` | number | Reed's profile number (the `p…` in recruiter URLs). | A 94.6 % | `4059` |
| `advertiserJobsUrl` | string (URL) | All of this advertiser's jobs on Reed. | A 100 % | `"https://www.reed.co.uk/jobs/pure-resourcin…"` |
| `advertiserLogoUrl` | string (URL) | The advertiser's logo on Reed. | A 94.6 % | `"https://resources.reed.co.uk/profileimages…"` |
| `companyProfileUrl` | string (URL) | The advertiser's company page on Reed. | L 56.7 % | `"https://www.reed.co.uk/company-profile/Pur…"` |
| `advertiserReference` | string | The agency's or employer's own job reference. | L 78.3 % | `"IR36986O3a"` |
| `specialism` | string | Reed's specialism (one of 37). | A 93.6 % | `"Financial Services"` |
| `specialismId` | number | Reed's specialism id (e.g. 52 = IT & Telecoms). | A 93.6 % | `117` |
| `subSpecialism` | string | Finer category inside the specialism. | L 100 % | `"Mortgage Administrator"` |
| `subSpecialismId` | number | Reed's sub-specialism id. | L 100 % | `1832` |
| `occupation` | string | Reed's occupation (taxonomy level 1). | A 97 % | `"Administrator"` |
| `occupationDetail` | string | Reed's occupation (taxonomy level 2). | A 76.8 % | `"Mortgage Administrator"` |
| `knowledgeDomain` | string | Reed's broad domain (taxonomy root). | L 100 % | `"Administration"` |
| `easyApply` | boolean | One-click application with a Reed profile. | A 100 % · true 64.1 % | `false` |
| `externalApplication` | boolean | The application continues on the advertiser's own website. | L 100 % · true 17.1 % | `false` |
| `coverLetter` | string | "None", "Optional" or "Mandatory". | A 100 % | `"None"` |
| `screeningQuestions` | array of strings | Questions in Reed's application form for this job. | L 20.2 % | `["Do you have a minimum 12 months independe…"` |
| `skills` | array of strings | Skills Reed lists on the job page. | L 39 % | `["Mortgage Administration", "Mortgage Admin…"` |
| `ukRightToWorkRequired` | boolean | Applicants must already have the right to work in the UK. | A 100 % · true 62.6 % | `true` |
| `visaSponsorship` | boolean | The advertiser offers visa sponsorship. | L 100 % · true <0.1 % | `true` |
| `graduate` | boolean | Graduate job. | L 100 % · true 7.3 % | `true` |
| `earlyBird` | boolean | Reed "Early bird" badge. | A 100 % · true 11.7 % | `true` |
| `trainingCourse` | boolean | Advert for a paid training course ("Training Course" instead of a salary). | A 100 % · true 3.5 % | `true` |
| `promoted` | boolean | Promoted (paid) placement. | A 100 % · true 13 % | `true` |
| `featured` | boolean | Featured advert. | A 100 % · true 44.5 % | `true` |
| `description` | string | Complete advert text, plain text with paragraphs and bullets. | L 100 % | `"Mortgage Administrator  Location: City of …"` |
| `descriptionHtml` | string | Original advert HTML (only with `includeDescriptionHtml`). | optional | `"<p><strong>Mortgage Administrator</strong></p>…"` |
| `descriptionSnippet` | string | Reed's short teaser from the search results. | A 100 % | `"Optometrist Location: White City Position:…"` |
| `detailsScraped` | boolean | Whether the job's own record was read. | L 100 % | `true` |
| `searchKeyword` | string | Keyword of the search that found the job (empty for URL / recruiter / whole-site runs). | when searched | `"nurse"` |
| `searchLocation` | string | Location of the search that found the job. | when searched | `"Leeds"` |
| `scrapedAt` | string (ISO 8601, UTC) | When the run started. | A 100 % | `"2026-10-20T11:33:43.672Z"` |

**A** = all 99,567 jobs on Reed, search data only (run of 2026-10-20). **L** = every job in London with job details, 23,213 jobs (run of 2026-10-20). Columns marked L need job details (`includeDetails`, on by default); without details they are `null`. In search-data-only runs `specialism` is filled where the search was split or filtered by specialism (93.6 % of the whole site).

¹ `advertiserCategory` was added after the measurement runs. It comes from the same Reed field as `advertiserType` (99.9 % in the whole-site run); the other 87 jobs were charities, which both columns now label (all 87 checked one by one on 2026-10-20).

***

### Real output sample

One complete row from a platform run on 2026-10-20 (run `JMCM99VR2TImZ5dEB`, nothing edited or masked):

```json
{
  "id": 57475083,
  "url": "https://www.reed.co.uk/jobs/mortgage-administrator/57475083",
  "title": "Mortgage Administrator",
  "salary": "£28,000 - £45,000 per annum, OTE",
  "salaryFrom": 28000,
  "salaryTo": 45000,
  "salaryCurrency": "GBP",
  "salaryPeriod": "year",
  "salaryShown": true,
  "salaryYearlyFrom": 28000,
  "salaryYearlyTo": 45000,
  "salaryNegotiable": false,
  "salaryOte": true,
  "salaryIncludesBenefits": false,
  "salaryProRata": false,
  "salaryCommissionOnly": false,
  "jobType": "Permanent",
  "hours": "Full-time",
  "fullTime": true,
  "partTime": false,
  "workingOption": "Hybrid",
  "location": "London",
  "county": "London",
  "region": "South East England",
  "country": "United Kingdom",
  "postcode": "EC2A",
  "locationText": "London",
  "datePosted": "2026-10-20T07:21:01.887Z",
  "dateCreated": "2026-10-20T07:21:01.890Z",
  "dateUpdated": "2026-10-20T07:21:01.890Z",
  "expiryDate": "2026-12-01T23:59:59.000Z",
  "advertiserName": "Pure Resourcing Limited",
  "advertiserProfileName": "Pure Resourcing Limited",
  "advertiserType": "Agency",
  "advertiserCategory": "Recruitment consultancy",
  "postedByReed": false,
  "advertiserId": 56313,
  "advertiserProfileId": 4059,
  "advertiserJobsUrl": "https://www.reed.co.uk/jobs/pure-resourcing-limited/p4059",
  "advertiserLogoUrl": "https://resources.reed.co.uk/profileimages/logos/thumbs/Logo_4059.png",
  "companyProfileUrl": "https://www.reed.co.uk/company-profile/Pure-Resourcing-Limited-60304",
  "advertiserReference": "IR36986O3a",
  "specialism": "Financial Services",
  "specialismId": 117,
  "subSpecialism": "Mortgage Administrator",
  "subSpecialismId": 1832,
  "occupation": "Administrator",
  "occupationDetail": "Mortgage Administrator",
  "knowledgeDomain": "Administration",
  "easyApply": false,
  "externalApplication": false,
  "coverLetter": "None",
  "screeningQuestions": [
    "Do you have a minimum 12 months independent mortgage administration experience?"
  ],
  "skills": [
    "Mortgage Administration",
    "Mortgage Administrator"
  ],
  "ukRightToWorkRequired": true,
  "visaSponsorship": false,
  "graduate": false,
  "earlyBird": false,
  "trainingCourse": false,
  "promoted": false,
  "featured": false,
  "description": "Mortgage Administrator\n\nLocation: City of London - Hybrid, 3 days per week office based\n\nSalary: Up to £35k Basic + Excellent Bonus Potential + Benefits\n\nA fantastic opportunity is available for an experienced Mortgage Administrator to join our client, a leading financial services brokerage based in London. This is a social, busy and fast paced environment offering a great career path and professional development.\n\nYou will be responsible for supporting a team of Mortgage Brokers, administering mortgage administration through to completion, liaising with clients, solicitors, lenders etc.\n\nApplicants will need to be highly professional, being comfortable dealing with a wide range of clientele, including High Net Worth and UHNW individuals.\n\nResponsibilities:\n\n• Administering mortgage applications through to completion.\n• Regular liaison with lenders to obtain updates on applicant status and proactively progress mortgage applications through to offer.\n\nSkills & Experience Required:\n\n• A minimum of 18 months mortgage administration experience.\n• Experience of managing mortgage applications from offer through to completion\n• Ability to resolve problems quickly & efficiently.\n• Outstanding communication skills at all levels, both written and oral.\n• Demonstrate a confident telephone manner & excellent customer service.\n• A team player with ability to use own initiative.",
  "descriptionSnippet": null,
  "detailsScraped": true,
  "searchKeyword": null,
  "searchLocation": null,
  "scrapedAt": "2026-10-20T11:33:43.672Z"
}
```

The same run in a spreadsheet (five rows, a few columns):

| title | salary | locationText | jobType | advertiserName | advertiserType | datePosted |
|---|---|---|---|---|---|---|
| Mortgage Administrator | £28,000 - £45,000 per annum, OTE | London | Permanent | Pure Resourcing Limited | Agency | 2026-10-20T07:21:01.887Z |
| Workforce Planning Partner | £35,072 - £36,918 per annum | Devon | Permanent | WEA | Employer | 2026-10-20T09:40:05.390Z |
| Registered Nurse | £39,520 - £43,680 per annum | Huddersfield, West Yorkshire | Permanent | Integrated Health Care Management | Agency | 2026-10-02T10:33:15.447Z |
| Regional Clinical Lead (Registered Nurse) | £45,000 per annum | Leeds, West Yorkshire | Permanent | Helping Hands | Employer | 2026-10-13T08:54:05.233Z |
| Immunisation Nurse | £25 - £30 per hour | Huddersfield, West Yorkshire | Temporary | Greys Specialist Recruitment | Agency | 2026-10-16T08:18:37.000Z |

CSV and Excel exports keep the column order of the [data dictionary](#output-data-dictionary); arrays (`skills`, `screeningQuestions`) become numbered columns (`skills/0`, `skills/1` …).

***

### Scale and speed (measured)

All runs on the Apify platform, default memory (1 GB), 2026-10-20.

| Run | Result | Time |
|---|---|---|
| Prefill / first run (50 jobs, "software engineer" in London, full details) | 50 jobs, first row after 1.1 s | **4.0 s** |
| 1,000 jobs, default settings ("manager", full details) | 1,000 jobs, 1,001 answers from Reed, 0 refused | **37.4 s** |
| 3,000 newest jobs in the UK, full details | 3,000 jobs, 0 duplicates | 105.9 s |
| 5,000 newest jobs in the UK, full details | 5,000 jobs, 5,010 answers, 0 refused | 172 s |
| Every job in London, full details (`maxItems: 0`, 25 requests per second) | **23,213 unique jobs, 0 duplicates**, 41 parts, 1 advert expired during the run | 786 s |
| **Every job on Reed, search data only** (`maxItems: 0`, `includeDetails: false`) | **99,567 unique jobs, 0 duplicates**, 217 Reed calls, 153 parts, 234 MB memory | **71.8 s** |
| Pace test: 2,000 job details at up to 50 requests per second | 2,008 answers OK, 0 refused | 59.8 s |
| Simulated hold (direct connection refused), 50 jobs | 50 jobs through UK residential IPs | 22.4 s |

#### How big searches are read completely

- **Reed serves only the first 10,000 results of a search.** Measured: with 1,000 jobs per call, page 11 returns page 10 again, page 50 and page 99 too — a fake pagination that silently repeats the last window. Searches below 10,000 end with "page not found" after their last page.
- **Splitting along Reed's own filters.** Reed reports how many jobs each filter value holds with every answer. A search above 10,000 is split first by job type (permanent / temporary / contract), then by *posted by* (agency / employer), then by specialism — three exact partitions of Reed's listings — and, only if a part is still too big, by remote / hybrid, hours and county. Every job of every part is read and de-duplicated by its Reed id. All of Reed needed 153 parts on 2026-10-20, London 41.
- **Stable order.** Reed's relevance order shifts between pages (145 of 10,000 "manager" jobs repeated across ten pages while others were skipped); the newest-first order does not (0 repeats). The Actor therefore uses relevance only for a single call of up to 1,000 jobs and reads everything bigger newest first. Parts that end below 99.5 % of their size are read once more (completion pass).
- **Counts move.** New jobs arrive every minute, so a long run can save a few more jobs than Reed listed when it started (London: 23,213 saved, 23,210 listed at the start).
- **Search data vs. job details.** One search call returns up to 1,000 jobs; each job's own record is one more call (about 30 jobs per second at the default pace).

***

### What you pay

**A fixed price per job in the dataset — compute, connection, search calls and job-detail calls are included.** No monthly rental and no charge for duplicates or for jobs your filters excluded.

| Apify plan | Price per 1,000 jobs | 1,000 jobs | 10,000 jobs | 100,000 jobs |
|---|---|---|---|---|
| Free | $1.20 | $1.20 | $12.00 | $120.00 |
| Bronze | $1.07 | $1.07 | $10.67 | $106.67 |
| Silver | $0.93 | $0.93 | $9.33 | $93.33 |
| Gold, Platinum, Diamond | $0.80 | $0.80 | $8.00 | $80.00 |

The price is the same with or without job details. Every job on Reed (≈99,600 on 2026-10-20) costs about $120 on the Free plan and about $80 on Gold.

#### Maximum cost per run

Apify stops every pay-per-result run at its **Maximum cost per run** (you set it in the run options; the platform also applies a default). The Actor reads that limit when it starts, collects only what it covers, stops cleanly and says so: *"Saved 46 jobs — this run's maximum cost ($0.05) covers 46 results at the current price. Raise "Maximum cost per run" to get more."* (real message of a test run on 2026-10-20 — 46 jobs saved, 46 charged; the number depends on your plan's price). The run ends as **Succeeded**, the SUMMARY says `stoppedBy: "MAX_COST"`, and you pay only for the jobs in the dataset. For a whole-site export raise the limit accordingly.

***

### Integrations

#### API, apify-client and webhooks

See [Tutorial: run it from the API](#tutorial-run-it-from-the-api). Add a webhook (Actor → Integrations → Webhooks) on **Run succeeded** to POST the dataset id to your endpoint or queue — the cleanest way to load new jobs into a CRM or ATS.

#### Make (Integromat)

Apify app: "Run an Actor" with `logiover/reed-scraper` and your JSON input, then "Get Dataset Items" into Sheets, Slack, e-mail or a CRM.

#### Zapier

Trigger "Finished Actor Run" (or action "Run Actor") in the Apify Zapier app, then "Find Dataset Items" to send every new job to a sheet, a channel or a CRM record.

#### n8n

The Apify node runs the Actor and returns the items for any following node (Postgres, HTTP Request, OpenAI …).

#### Google Sheets and Airtable

Use the Apify Google Sheets integration to append every scheduled run to a sheet; for Airtable use Make, Zapier or n8n, or import the CSV — `id` is a good primary field.

#### Scheduling

Actor → **Schedules**: run daily with `datePosted: "today"` (or weekly with `"lastweek"`) and `sortBy: "newest"` to collect only new jobs. Keep a dataset per run or merge into one table by `id`.

#### Data warehouses (BigQuery, Snowflake, Postgres, S3)

Fetch `GET /v2/datasets/{id}/items?format=json` (or `csv`, `xlsx`, `xml`) from your ETL tool, or let a webhook trigger the load. Dates are ISO 8601 in UTC, numbers are numbers, booleans are booleans.

#### MCP and AI agents

The Actor works with the Apify MCP server, so Claude, ChatGPT or your own agent can call it as a tool — "find hybrid data-engineering jobs in Manchester posted this week paying over £60k" — and receive structured rows.

***

### Performance tips

- **Search data first, details for a shortlist.** For tens of thousands of jobs run with `includeDetails: false` (up to 1,000 jobs per call), filter in your spreadsheet, then paste the interesting job URLs into `startUrls` for full details.
- **Use Reed's filters instead of post-filtering** — `jobTypes`, `workingOption`, `salaryMin`, `datePosted`, `postedBy` and `specialisms` shrink the search before anything is downloaded.
- **Whole-site exports with details** take about 55 minutes at the default pace: raise the run timeout (Run options → Timeout) to 2 hours, or `maxRequestsPerSecond` to 50 (measured clean on 2026-10-20).
- **Daily monitoring:** `datePosted: "today"` with `sortBy: "newest"` reads only the newest jobs.
- **Many towns or titles:** list them in one run — each search gets a fair share of `maxItems`, and jobs found by several searches are saved once.
- **Leave the proxy empty.** The direct connection is the fastest route; datacenter proxies are refused by Reed about half of the time (measured), and residential IPs are used automatically if Reed ever holds the connection.

***

### Troubleshooting: every status message explained

| Status / outcome | What it means | What to do |
|---|---|---|
| `Saved N jobs (max results reached) in X s.` | You got what you asked for. | Raise `maxItems` for more. |
| `Saved N jobs (every matching job read; Reed listed M when the run started) in X s.` | Every job was read. N can differ slightly from M: duplicates across searches are kept once, and Reed's counts move. `coveragePercent` per search is in the SUMMARY. | — |
| `… · K without details (Reed did not answer)` | K jobs kept their search data, but their own record could not be read after retries (`detailsScraped: false`). | Paste those job URLs into `startUrls` later. |
| `… · K search page(s) could not be read` (outcome PARTIAL) | Rows were saved, but some search calls failed after all retries. | Re-run later; the SUMMARY shows which search was affected. |
| `Saved N jobs — this run's maximum cost ($X) covers N results …` | The run reached your **Maximum cost per run** (outcome COMPLETED, `stoppedBy: MAX_COST`). | Raise the limit in the run options. |
| `Saved 0 jobs — this run's maximum cost … does not cover a single result.` | The limit is below the price of one job. | Raise the limit. |
| `Reed has no jobs for … If "X" is spelled differently on Reed …` (EMPTY_RESULT) | Reed answered, but the place is unknown to Reed or has no jobs. | Try a town, county or postcode Reed knows (or a bigger `distanceMiles`). |
| `No jobs matched on Reed — the search ran fine but returned 0 results …` (EMPTY_RESULT) | The keywords and filters exclude everything. | Use broader keywords or fewer filters. |
| Log: `N of M job URL(s) are no longer on Reed (expired or removed).` | Those adverts have ended. | — |
| Log: `"X": no exact name match on Reed; using the closest advertiser "Y".` | A recruiter name was matched to the closest Reed advertiser. | Check the name, or paste the recruiter's Reed page instead. |
| Log: `No recruiter or employer called "X" found …` | No advertiser of that name appears among the jobs that mention it. | Paste the recruiter's Reed page (`/jobs/<name>/p<number>`). |
| Log: `Completion pass for N part(s) …` | Jobs expired while a part was read and the order moved by a few places; the part is read once more. | Nothing — it is automatic and only adds missing jobs. |
| Log: `Reed refused the direct connection for …; switching to the residential rescue route.` | Reed is holding the platform's shared address; up to 150 requests go through UK residential IPs so the run keeps going. | Nothing for small runs. For long runs set `proxyConfiguration` to Apify RESIDENTIAL (United Kingdom). |
| Log: `Reed is refusing this connection — pausing 20 s …` (later: `… works again …; switching back to it.`) | The direct connection pauses (20–120 s) instead of hammering, and is used again once the hold ends; `pausesForRefusals` counts the pauses. | Wait, or re-run later. |
| Log: `The residential rescue route reached its cap (150 requests) …` | The free fallback is used up for this run; the direct connection continues with pauses. | Set Apify RESIDENTIAL in `proxyConfiguration`. |
| Log: `Read the search from the URL itself (Reed's page did not answer): …` | A pasted URL was interpreted by the Actor's own URL reader. | Check the SUMMARY `criteria` of that search. |
| Log: `Unknown specialism "X" — ignored.` | The specialism name is not one of Reed's 37. | Pick it from the list in the input form. |
| Run **failed**: `No jobs collected: no page could be fetched (…)` (BLOCKED / FETCH_FAILED) | Reed refused every request — an empty result is never reported as success in this case. | Re-run later, or set `proxyConfiguration` to Apify RESIDENTIAL. |
| Run **failed**: `No jobs collected and N page(s) could not be read, so an empty result cannot be confirmed.` | Some calls failed and nothing was saved. | Re-run later. |
| Run **failed**: `None of the start URLs or recruiters is usable …` (BAD_INPUT) | The pasted URLs are not Reed search, recruiter or job pages. | Paste URLs from reed.co.uk/jobs. |

***

### Honest limits

- **10,000 results per Reed search** — solved by splitting, and the whole site splits cleanly (job type × posted by × specialism). A part that still exceeded 10,000 after every filter would be read to 10,000 and the rest reported as `beyondReedWindow` in the SUMMARY; this did not happen on 2026-10-20.
- **Remote / hybrid is Reed's classification.** 98.8 % of all jobs carry one; brand-new adverts often have none for the first hours (58.5 % of the 3,000 newest jobs).
- **Postcode districts only, and not always** — about 39 % of jobs ("EC2A", "S35"); nationwide and remote jobs have none.
- **Skills (39 %) and screening questions (20 %)** exist only where the advertiser entered them (London, with details).
- **No recruiter e-mail addresses.** Reed removes e-mail addresses from advert text (0 of 23,213 London descriptions contained one; advertisers write "name (DOT) surname @ …" instead), and phone numbers are rare. Use `advertiserJobsUrl` and `companyProfileUrl` to research advertisers.
- **Hidden salaries.** About 16 % of adverts show "Competitive salary", "Salary negotiable" or "Commission only" (with training courses and jobs without any salary, 20.8 % have `salaryShown: false`). Most still carry the advertiser's range in Reed's page data, which is exported; 2.1 % of all jobs have no salary numbers at all.
- **Training courses** — 3.5 % of Reed's listings are adverts for paid courses ("Training Course" instead of a salary). They are flagged in `trainingCourse` and can be excluded with `hideTrainingCourses`.
- **Row order** follows the arrival of job records, not strictly Reed's order; sort by `datePosted` if it matters.
- **Pace.** Job details are one call per job: about 30 jobs per second at the default pace, so a whole-site export with details takes about 55 minutes.
- **Temporary holds.** If one network address sends Reed a lot of traffic, Reed may refuse it for a while. We saw no refusal in about 37,000 requests on 2026-10-20 (up to 50 per second), but the Actor is built for it: 150 requests through UK residential IPs, pauses on the direct connection, and rows without details keep their search data.
- **Counts move.** Reed adds and removes adverts all day, so totals differ slightly between runs and between Reed's headline number and your dataset.
- **Overseas jobs.** Reed also lists some jobs in Ireland, the USA, Australia and elsewhere; `country` and `salaryCurrency` tell them apart.

***

### How it compares

| | This Actor | Reed's developer API | Copying from reed.co.uk by hand | Reed job alerts |
|---|---|---|---|---|
| Account / key needed | No | Registered API key | No | Reed account |
| Jobs per request | Up to 1,000 per search call; whole site in one run | Up to 100 per call | One page at a time | E-mails |
| Salary as shown + numbers + yearly + notes | Yes | Numbers, yearly, type; hidden salaries left out | Manual | No |
| Remote / hybrid, county, region, postcode | Yes | No | Manual | No |
| Specialism, skills, screening questions | Yes | No | Manual | No |
| Agency vs employer, profile, reference | Yes | Employer name and id | Manual | No |
| Whole-site export beyond 10,000 per search | Yes (automatic splitting) | Paging by hand | No | No |
| Export CSV / Excel / JSON, webhooks, schedules | Yes | Build it yourself | No | E-mail only |

***

### FAQ

#### What is Reed Scraper?

An Apify Actor that exports job adverts from reed.co.uk — title, salary, location, dates, contract type, remote/hybrid, advertiser, specialism, skills and the full description — as JSON, CSV or Excel, for any search, recruiter, town or the whole site.

#### Is there an official Reed API for job data?

Reed's developer API needs a registered key, returns at most 100 jobs per call with fewer fields, and hides salaries hidden on the website. This Actor needs no key and returns the full public job record — a Reed API alternative.

#### How do I scrape Reed jobs to Excel or CSV?

Run your search, open the Output tab and click **Export → Excel** (or CSV); via the API add `format=xlsx` or `format=csv`.

#### Do I need proxies to scrape Reed.co.uk?

No. The Actor uses a direct connection; only while Reed holds it are up to 150 requests per run sent through UK residential IPs (included in the price).

#### How many jobs can I scrape from Reed?

All of them: 99,567 live jobs on 2026-10-20. Reed serves only 10,000 per search, so the Actor splits big searches along Reed's own filters and reads every part.

#### How fast is it?

50 jobs with full details in 4 seconds, 1,000 in 37 seconds, all 99,567 jobs (search data) in 72 seconds — see [Scale and speed](#scale-and-speed-measured).

#### How much does it cost to scrape Reed?

$0.80–$1.20 per 1,000 jobs depending on your Apify plan, everything included — e.g. 10,000 jobs cost $8–$12.

#### Does it get salaries from Reed?

Yes: `salary` exactly as Reed shows it, plus `salaryFrom`, `salaryTo`, `salaryCurrency`, `salaryPeriod`, the yearly equivalent and Reed's notes (OTE, benefits, pro-rata, negotiable, commission only). 97.9 % of all jobs carry salary numbers (2026-10-20).

#### What does "Competitive salary" mean in the data?

Reed shows that phrase instead of the numbers. `salaryShown` is then `false`; if Reed's page data holds the advertiser's range it is still in `salaryFrom` / `salaryTo`.

#### Can I get day rates and hourly rates?

Yes — `salaryPeriod` is "day" or "hour" for those jobs and `salaryYearlyFrom` / `salaryYearlyTo` give Reed's yearly equivalent. 12,919 day-rate and 19,106 hourly jobs were live on 2026-10-20.

#### Can I scrape only remote or hybrid jobs from Reed?

Yes: `"workingOption": "remote"` or `"hybrid"`.

#### Can I filter by salary?

Yes: `salaryMin` and `salaryMax` use Reed's salary range filter (pounds per year). Every row also has the numbers for your own filters.

#### Can I get every job in one town or county?

Yes — put it into `locations`, choose `distanceMiles`, and set `maxItems` to `0`. London had 23,210 jobs on 2026-10-20.

#### Can I export every job on Reed.co.uk?

Yes: leave keywords and locations empty and set `maxItems: 0`. Raise your Maximum cost per run to cover ~100,000 results.

#### How do I get all jobs from one recruitment agency or employer?

Put its name ("Hays"), its Reed page (`https://www.reed.co.uk/jobs/<name>/p<number>`) or profile number into `recruiters`.

#### Can I paste a Reed search URL with my filters?

Yes. Any reed.co.uk/jobs search URL works — keywords, location, distance, salary, job type, specialism, date and the other filters you clicked on the website are kept.

#### Can I scrape single Reed job adverts?

Yes — paste job URLs or bare job numbers into `startUrls`.

#### Do I need a Reed account, login, cookies or an API key?

No. Everything is public.

#### Does it tell me if a job is from an agency or a direct employer?

Yes: `advertiserType` ("Agency" / "Employer"), `advertiserCategory` ("Recruitment consultancy", "Direct employer", "Charity/not for profit") and `postedByReed`. On 2026-10-20, 76.9 % of Reed's jobs came from agencies.

#### Does it include the recruiter's e-mail or phone number?

No — Reed removes e-mail addresses from adverts. You get the advertiser's name, Reed profile, company page and job reference.

#### Which jobs offer visa sponsorship?

Use `visaSponsorshipOnly: true` (24 jobs on 2026-10-20) and check `visaSponsorship`; `ukRightToWorkRequired` marks adverts that require existing UK right to work.

#### Are the dates in UK time?

Reed stores UK local time; the Actor converts every date to UTC ISO 8601, so 10:46 BST becomes `09:46:18Z`.

#### Why did I get fewer (or more) jobs than Reed's headline number?

Jobs found by two of your searches are saved once, and Reed's count changes while the run reads. The SUMMARY shows Reed's count and `coveragePercent` per search.

#### How do I monitor new Reed jobs every day?

Schedule a run with `"datePosted": "today"` and `"sortBy": "newest"`, then connect a webhook, Google Sheets or Slack.

#### Are duplicates removed?

Yes. Every job is de-duplicated by its Reed id within a run — across searches, parts and pages. The whole-site run on 2026-10-20 had 0 duplicates in 99,567 rows.

#### Does it work for jobs outside England?

Yes — Scotland, Wales and Northern Ireland are included, and Reed's overseas jobs come with their `country`.

#### What are "Training Course" adverts?

Paid courses advertised among jobs (for example trainee programmes). They show "Training Course" instead of a salary; exclude them with `hideTrainingCourses: true`.

#### What happens if Reed blocks or changes something?

The Actor slows down, switches to a capped residential route, retries, and — if nothing works — fails with the reason. It never reports an empty dataset as a successful search.

#### Can I use the data with AI or an LLM?

Yes — through the API, webhooks or the Apify MCP server; plain-text descriptions and skills suit embeddings and matching.

#### Can I scrape other UK job boards with it?

No — this Actor reads reed.co.uk only.

#### I need a field or filter that is missing. Can you add it?

Yes — open an issue on the Actor's Issues tab and describe what you need.

***

### Glossary

| Term | Meaning |
|---|---|
| **Specialism / sub-specialism** | Reed's 37 job categories and the finer category inside them. |
| **Occupation / knowledge domain** | Reed's occupation taxonomy and its broad domain. |
| **Posted by: agency / employer / Reed** | Whether a recruitment agency, the employer itself or Reed posted the job (`advertiserType`, `postedByReed`). |
| **Easy Apply** | One-click application with a Reed profile (`easyApply`). |
| **Early bird** | Reed's badge for jobs with few applications so far (`earlyBird`). |
| **Promoted / Featured** | Paid advert placements on Reed (`promoted`, `featured`). |
| **OTE** | On-target earnings — pay including commission or bonus (`salaryOte`). |
| **Pro-rata** | Full-time pay, paid in proportion to the hours worked. |
| **Competitive salary / Salary negotiable** | Phrases Reed shows instead of the numbers (`salaryShown: false`). |
| **Training Course** | An advert for a paid course rather than a job (`trainingCourse`). |
| **Right to work in the UK** | Legal permission to work in the UK (`ukRightToWorkRequired`). |
| **Visa sponsorship** | The employer can sponsor a work visa (`visaSponsorship`). |
| **Postcode district** | The outward part of a UK postcode ("EC2A") (`postcode`). |
| **Part (of a search)** | A slice of a big search within Reed's 10,000-result limit. |
| **Maximum cost per run** | The spending limit Apify applies to a pay-per-result run. |

***

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

This Actor reads only publicly available job adverts — the same information any visitor sees on reed.co.uk without logging in — and collects business information that advertisers publish to be seen. It does not log in, does not bypass access controls, and does not collect data about job seekers. Some adverts name a contact person; if you store or process such personal data, the UK GDPR and the Data Protection Act 2018 apply to you: have a lawful basis and a legitimate purpose, keep only what you need, and delete it when it is no longer needed. Respect the advertisers' copyright in their advert texts when you republish them. You are responsible for using the data in line with Reed's terms, applicable law and your own policies; if in doubt, ask a lawyer.

**Legal and trademark disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Reed.co.uk, Reed Specialist Recruitment Ltd or the REED group of companies. All trademarks are the property of their respective owners.

***

### Changelog

- **1.0 (2026-10-20)** — First release: every job on reed.co.uk; keyword × location searches with Reed's filters (job type, hours, remote/hybrid, salary range, date posted, posted by, 37 specialisms, graduate, Easy Apply, visa sponsorship, early bird, hide training courses, hide jobs without salary, distance); pasted search, recruiter and job URLs; recruiters by name, profile number or URL; whole-site export by splitting along Reed's own filters (10,000-result limit per search); salary exactly as Reed shows it plus numbers, yearly equivalent and notes; UK local times converted to UTC; job records with full description, region, country, postcode, specialism, skills, screening questions, cover-letter rule, advertiser reference and company page; direct connection with a capped UK residential rescue route; pay-per-result budget handled cleanly.

***

### Support

Questions, a bug, or a field you need? Open an issue on the **Issues** tab — we reply **within 24 hours**. If a run did something unexpected, include the run link so we can look at its log and SUMMARY.

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/reed-scraper/changelog.md

# Actor input Schema

## `keywords` (type: `array`):

Job titles, skills or keywords, e.g. "software engineer", "nurse", "HGV driver", "teaching assistant", "accountant". Each keyword is one Reed search (combined with every location below). Leave keywords and locations empty to export every job on Reed (about 99,000).

## `locations` (type: `array`):

UK towns, cities, counties or postcodes as Reed knows them, e.g. "London", "Manchester", "Kent", "West Yorkshire", "Bristol", "SW1A", "M1". Empty = the whole UK.

## `distanceMiles` (type: `string`):

Reed's radius around each location (Reed's default is 10 miles). Ignored without a location.

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

Any of these contract types (empty = all).

## `hours` (type: `string`):

Only full-time or only part-time jobs.

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

Reed's working-location filter.

## `salaryMin` (type: `integer`):

Reed's "Salary range — From" filter in pounds per year (Reed's steps: 10,000, 12,000 … 50,000, 55,000 … 100,000). 0 = any.

## `salaryMax` (type: `integer`):

Reed's "Salary range — To" filter in pounds per year. 0 = any.

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

Only jobs posted (or refreshed) within this period — Reed's own filter.

## `postedBy` (type: `array`):

Recruitment agencies, direct employers and/or Reed itself (empty = all).

## `specialisms` (type: `array`):

Any of Reed's 37 specialisms (empty = all).

## `graduateJobsOnly` (type: `boolean`):

Reed's "Graduate" experience filter.

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

Only jobs you can apply to on Reed in one click with a Reed profile.

## `visaSponsorshipOnly` (type: `boolean`):

Only jobs whose advertiser offers visa sponsorship (Reed's filter; few jobs).

## `earlyBirdOnly` (type: `boolean`):

Reed's "Early bird" filter.

## `hideTrainingCourses` (type: `boolean`):

Leave out training-course adverts (they show "Training Course" instead of a salary — about 3.5 % of Reed's listings).

## `hideJobsWithoutSalary` (type: `boolean`):

Reed's "Jobs without salary displayed" filter: leaves out "Competitive salary", "Salary negotiable" and "Commission only" adverts.

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

Optional. Paste Reed search pages with any filters (https://www.reed.co.uk/jobs/nurse-jobs-in-leeds?…), recruiter or employer job pages (https://www.reed.co.uk/jobs/<name>/p12345) or single job pages (https://www.reed.co.uk/jobs/<title>/57412315). If you give only URLs, only the URLs are scraped.

## `recruiters` (type: `array`):

Optional. Every job of these advertisers: a Reed recruiter page URL, a profile number (p12120) or a name as it appears on Reed ("Hays", "Reed Education", "NHS Professionals"). Names are looked up among Reed's jobs; the filters above still apply.

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

Stop after this many unique jobs across all searches. 0 = no limit (every matching job — all of Reed is about 99,000).

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

Reads each job's own record: full description, region, country, postcode, specialism and sub-specialism, skills, screening questions, cover-letter rule, advertiser reference and company profile, visa sponsorship, graduate flag and the yearly salary equivalent. Off = search data only (fastest bulk export).

## `sortBy` (type: `string`):

Relevance = Reed's own order for keyword searches (used for the first 1,000 results of each search; Reed's relevance order shifts between pages, so bigger reads continue newest-first so that no job is skipped). Newest = newest first everywhere.

## `includeDescriptionHtml` (type: `boolean`):

Also keep the job description with its original HTML formatting (descriptionHtml). Off keeps rows small.

## `maxRequestsPerSecond` (type: `integer`):

Upper limit for the request pace (searches and job details together). The scraper slows down by itself when Reed refuses requests and speeds up again afterwards. Measured on 2026-10-20: 2,000 job details at up to 50 per second without a single refusal. Default 30.

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

Optional. The scraper reads Reed over a direct connection (no proxy cost). If Reed puts that connection on hold, up to 150 requests automatically go through UK residential IPs so small runs still finish. For long runs through a hold, set Apify RESIDENTIAL (United Kingdom) here — Reed refuses Apify datacenter IPs about half of the time (measured).

## Actor input object example

```json
{
  "keywords": [
    "software engineer"
  ],
  "locations": [
    "London"
  ],
  "distanceMiles": "10",
  "jobTypes": [],
  "hours": "any",
  "workingOption": "any",
  "salaryMin": 0,
  "salaryMax": 0,
  "datePosted": "anytime",
  "postedBy": [],
  "specialisms": [],
  "graduateJobsOnly": false,
  "easyApplyOnly": false,
  "visaSponsorshipOnly": false,
  "earlyBirdOnly": false,
  "hideTrainingCourses": false,
  "hideJobsWithoutSalary": false,
  "startUrls": [],
  "recruiters": [],
  "maxItems": 50,
  "includeDetails": true,
  "sortBy": "relevance",
  "includeDescriptionHtml": false,
  "maxRequestsPerSecond": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All jobs collected in 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": [
        "software engineer"
    ],
    "locations": [
        "London"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/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 = {
    "keywords": ["software engineer"],
    "locations": ["London"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/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 '{
  "keywords": [
    "software engineer"
  ],
  "locations": [
    "London"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call logiover/reed-scraper --silent --output-dataset

```

## MCP server setup

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