Reed.co.uk Scraper - Jobs, Companies, Courses & Reviews avatar

Reed.co.uk Scraper - Jobs, Companies, Courses & Reviews

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Reed.co.uk Scraper - Jobs, Companies, Courses & Reviews

Reed.co.uk Scraper - Jobs, Companies, Courses & Reviews

Scrape Reed.co.uk jobs, companies, courses and reviews by keyword, location, filters or URL. Extract 80+ fields including salary, company, GPS, sector, contract type, skills, descriptions, postcodes, company profiles, courses and reviews.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

Reed.co.uk Scraper: Job Listings, Company Profiles & Training Courses

Reed.co.uk Scraper turns Reed.co.uk, a major UK job board, into a clean, structured data feed. Search jobs by keyword, location, salary, distance, job type and more, or paste any Reed search or job URL directly. Every job comes back as one flat record with the same 96 fields: title, company, salary range, GPS coordinates resolved from the job location, job type, badges and posting dates. Full job details (on by default) also fill in the complete description, region/postcode, full salary breakdown, sector, contract type, skills, company profile and screening questions. The same actor scrapes Reed company profiles and Reed Courses with their reviews, and exports to JSON, CSV or Excel, or straight into your app through the API.

Why This Scraper?

  • 96 fields on every job record. Every record has the same fixed set of fields; full job details fill in roughly 45 of them (description, location breakdown, sector, contract type, skills, company profile, screening questions) that otherwise stay empty.
  • GPS coordinates on every job, resolved from the job's location text against a built-in UK gazetteer, since Reed itself does not publish coordinates.
  • Three things to scrape: job listings (by filters or pasted URLs), company profiles, and training courses with their reviews.
  • Full filter grammar: keyword, location, distance, salary range, posted-within window, sort order, job type (permanent, temporary, contract, full-time, part-time), posted-by (agency or employer), plus graduate, easy-apply, visa-sponsorship and early-bird flags.
  • Walks the whole catalogue by default. Max pages defaults to unlimited: the run walks every result page per search or URL, stopping on its own once Reed's reported page count is reached or a page comes back with nothing new. Max results is the sole cap on volume.
  • Resumable runs. Point a new run at a previous run or dataset ID to collect only the jobs it doesn't already have. The run also checkpoints its own progress, so an Apify platform migration or a Resurrect of an interrupted run can continue instead of starting over (see the known limitations below for what a mid-run restart does not preserve).
  • Optional export to your apps via MCP connectors (Notion, Linear, Airtable, Apify).

Use Cases

  • Recruitment and staffing agencies: track competitor job ads, salary bands and hiring volume by sector or region.
  • Job board and aggregator operators: mirror Reed listings into your own search index, complete with GPS coordinates for map-based search.
  • Market and salary researchers: build salary distributions and posting-volume trends across UK regions, sectors and job types.
  • Sales and lead-generation teams: use company profiles (open jobs, employee-count range, sector, website) to find growing companies as outbound leads.
  • Training and upskilling platforms: track Reed Courses pricing, ratings and reviews across providers.

Data You Get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
jobId00000001
title"Data Engineer"
url"https://www.reed.co.uk/jobs/data-engineer/00000001"
companyName"Sample Company"
logoImage"https://resources.reed.co.uk/profileimages/logos/Logo_0000.png"
location"London"
latitude / longitude51.5074 / -0.1278
displaySalary"£45,000 - £55,000 per annum"
salaryFrom / salaryTo45000 / 55000
salaryType5
remoteWorkingOption"On-Site"
postedOn / expiryOn"2026-01-01T00:00:00.000Z" / "2026-02-01T00:00:00.000Z"
statuses["Featured", "Easy Apply"]
contractType"Permanent" (when full details are on)
sectorName / parentSectorName"Other IT & Telecoms" / "IT & Telecoms" (when full details are on)
region / county / postCode"South East England" / "London" / "EC1A" (when full details are on)
description"Full job description text appears here when full job details are on."
skills["Python", "SQL"] (when full details are on)
companyProfileId0000 (when full details are on)
detailFetchedtrue

Company records (recordType: "company") carry the sector, employee-count range, website, benefits, articles, external links, total open jobs and a list of recent jobs (each with salary and GPS). Course records (recordType: "course") carry the title, provider, price, rating, study method and format; when reviews are enabled each review is returned as its own record (recordType: "review") with overall and per-category ratings, text, reviewer and any provider response.

How to Use

  1. Pick a mode: Jobs (default), Companies, or Courses + reviews.
  2. For Jobs, either paste Job URLs or leave them empty and set keywords, locations and filters. Keep Fetch full job details on (the default) for the complete description and company profile, or switch it off for list-page fields only.
  3. Set Max results to control run size and cost (and, optionally, Max pages as a safety limit), then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Jobs by keyword search with filters:

{
"mode": "jobs",
"keywords": "software developer",
"locations": ["manchester"],
"salaryFrom": 50000,
"proximity": 20,
"postedDate": "last7days",
"sortBy": "date",
"permanent": true,
"fetchDetails": true,
"maxListings": 100
}

Jobs by pasting URLs (filters are ignored when Job URLs are set):

{
"mode": "jobs",
"urls": [
"https://www.reed.co.uk/jobs/accountant-jobs-in-bristol",
"https://www.reed.co.uk/jobs/marketing-jobs-in-london?sortby=displayDate"
],
"maxListings": 200
}

Company profiles by URL or slug:

{
"mode": "company",
"companies": [
"https://www.reed.co.uk/company-profile/Sample-Company-00000",
"Sample-Company-00000"
],
"maxListings": 50
}

Training courses and their reviews:

{
"mode": "course",
"courseQueries": ["python", "project management"],
"fetchReviews": true,
"reviewsSort": "MostRecent",
"maxListings": 50
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/reed-co-uk-scraper").call(run_input={
"mode": "jobs",
"keywords": "data engineer",
"locations": ["london"],
"maxListings": 50,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], job["companyName"], job["displaySalary"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/reed-co-uk-scraper').call({
mode: 'jobs',
keywords: 'data engineer',
locations: ['london'],
maxListings: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

How Max results and Max pages interact

Max results is the single cap that applies in every mode: jobs, companies and courses (course reviews are additional and not counted against it). In Jobs mode with several locations or pasted URLs, the cap is split evenly: each search may contribute at most Max results divided by the number of searches, rounded up. maxListings: 100 with two locations returns up to 50 per location, and a location with fewer matches does not pass its unused share to the other. Max pages is only an optional safety limit; left at 0 (the default) a search walks every result page until it reaches its share of Max results, Reed's own reported last page, or a page that contributes no job the run hasn't already collected.

Known limitation: overlapping searches in one run can stop a later search early

Duplicate protection is run-wide, not per search. Once a job has been returned by one search, every later search in the same run treats it as already collected. If a results page of a later search (after its first page) consists entirely of such jobs, the actor reads that as the end of that search's new results and stops it, even when Reed reports more pages.

Example: locations: ["london", "manchester"], where Reed reports 4 pages for each. London walks all 4 pages. Manchester's page 1 has new jobs, but its page 2 happens to hold only remote or nationally advertised roles London already returned. Manchester stops after page 2, and the jobs unique to Manchester on its pages 3 and 4 are never collected. A page with even one new job does not trigger this, and a later search whose very first page is all duplicates keeps walking.

Workaround: when you need complete coverage of each location, keyword or URL, run each one in its own run instead of combining overlapping ones. Unrelated, non-overlapping searches in one run are not affected.

Known limitation: a migration or Resurrect in the middle of a run

The actor saves a checkpoint after every page, so an Apify platform migration or the Resurrect button continues the same run instead of starting over. Three things are not carried across that restart correctly:

  • The Max results counter restarts at 0. The resumed process counts only its own rows, so the run as a whole can return the rows collected before the restart plus up to Max results again, and each row is billed. Example: maxListings: 5, 3 jobs collected on page 1, a migration, and the resumed process then collects 5 more: 8 rows in total.
  • Jobs the cap left out are remembered as collected. When a page has more new jobs than the budget left, the jobs the cap leaves out are still recorded as collected. Example: maxListings: 2, page 1 has 5 new jobs J1 to J5. J1 and J2 are returned; if the run restarts right after that page, the resumed process skips J3, J4 and J5 for good and returns J6 and J7 from page 2, so you get 4 rows and J3 to J5 are never returned. Even without a restart, later searches in the same run also skip those left-out jobs, so a multi-location run can end below Max results while matching jobs remain.
  • The page in progress can be lost. Jobs on the page being processed at the moment of the migration (with Fetch full job details on, while their detail pages are being fetched) are recorded as collected before they are saved, so the resumed process skips them. This happens with or without a cap.

Workaround: if the run log contains a "Checkpoint: resuming run" line, the run was restarted. When an exact count or complete coverage matters, start a follow-up run with resumeFromRunId set to that run. It reads what was actually saved to the dataset, so jobs skipped by the restart are collected then. Prefer a generous Max results (or 0) plus a follow-up resume over relying on a tight cap across a restart.

Resuming a run

Set resumeFromRunId to a previous run ID or dataset ID (from this account) to collect only the jobs that run doesn't already have. This reads the actual dataset of that previous run, so jobs a restarted run skipped (see above) are collected by the follow-up run. Jobs mode only.

Send results into your apps (MCP connectors)

Optionally pipe each job into the apps you already use, with no change to the dataset output:

  1. Authorize a connector under Apify, Settings, API & Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the mcpConnectors input. For Notion, also set notionParentPageUrl.
  3. Run the actor. Each job is written as a condensed, human-readable summary (title plus key fields); the complete record always stays in the Apify dataset.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave mcpConnectors empty to skip this entirely.

Input Parameters

ParameterTypeDefaultDescription
modestringjobsjobs = job listings (filters or pasted URLs); company = company profiles; course = courses + reviews.
urlsarray(empty)Reed job-search or job URLs (jobs mode). If set, these are scraped directly and the filters below are ignored.
keywordsstring(empty)Job search terms, e.g. "data engineer" (jobs mode, when no Job URLs are pasted).
locationsarray(empty)UK cities or regions; one search per location (jobs mode). Empty searches UK-wide.
proximityinteger10Search radius in miles. Allowed: 0, 1, 3, 5, 10, 15, 20, 30, 50.
salaryFrominteger(none)Minimum salary per annum.
salaryTointeger(none)Maximum salary per annum.
postedDatestringanytimeanytime, today, last3days, last7days, or last14days.
sortBystringrelevancerelevance (Reed's default) or date (newest first).
fullTimebooleanfalseRestrict to full-time roles.
partTimebooleanfalseRestrict to part-time roles.
permanentbooleanfalseRestrict to permanent roles.
temporarybooleanfalseRestrict to temporary roles.
contractbooleanfalseRestrict to contract roles.
agencybooleanfalseOnly jobs posted by recruitment agencies.
directbooleanfalseOnly jobs posted directly by the employer.
graduatebooleanfalseOnly graduate-level roles.
easyApplybooleanfalseOnly jobs that support one-click apply.
visaSponsorshipbooleanfalseOnly jobs offering visa sponsorship.
earlyBirdbooleanfalseOnly newly posted "early bird" jobs.
fetchDetailsbooleantrueJobs mode only. Enrich each job from its detail page: full description, region/county/postcode, full salary breakdown, sector, company profile, contract type, breadcrumbs and screening questions.
companiesarray(empty, prefilled with an example)Reed company-profile URLs or bare slugs (company mode). Slugs are case-sensitive.
courseQueriesarray(empty, prefilled with an example)Keywords to search Reed Courses (course mode). One search per keyword.
courseUrlsarray(empty)Reed course URLs or bare course IDs (course mode).
fetchReviewsbooleantrueCourse mode only. Return each course's reviews as separate records.
maxReviewsPerCourseinteger0Cap on reviews fetched per course; 0 = all.
reviewsSortstringMostRecentReview order: MostRecent, RatingDesc, or RatingAsc.
maxListingsinteger20The single result cap in every mode. The run stops once this many are collected. 0 = unlimited.
maxPagesinteger0Optional safety limit on result pages walked per search (Jobs and Courses). 0 (default) walks the whole catalogue.
resumeFromRunIdstring(empty)Jobs mode only. A previous run ID or dataset ID from this account. Jobs already there are skipped, so this run returns only new jobs.
maxResidentialRequestsinteger0Optional cap on how many stronger-tier connections the run may use (cost control). 0 = unlimited.
proxyobjectApify datacenterConnection settings.
mcpConnectorsarray(none)Optional: send a condensed summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"id": 1,
"jobId": 1,
"url": "https://www.reed.co.uk/jobs/data-engineer/1",
"title": "Data Engineer",
"companyName": "Sample Company",
"logoImage": "https://resources.reed.co.uk/profileimages/logos/Logo_0000.png",
"description": "Full job description text appears here when full job details are on.",
"skills": ["Python", "SQL"],
"statuses": ["Featured", "Easy Apply"],
"location": "London",
"latitude": 51.5074,
"longitude": -0.1278,
"remoteWorkingOption": "On-Site",
"displaySalary": "£45,000 - £55,000 per annum",
"salaryFrom": 45000,
"salaryTo": 55000,
"salaryCurrencyId": 1,
"salaryType": 5,
"salaryTypeName": "per annum",
"jobType": 1,
"isFullTime": true,
"isPartTime": false,
"postedOn": "2026-01-01T00:00:00.000Z",
"expiryOn": "2026-02-01T00:00:00.000Z",
"contractType": "Permanent",
"sectorName": "Other IT & Telecoms",
"parentSectorName": "IT & Telecoms",
"region": "South East England",
"county": "London",
"country": "United Kingdom",
"countryCode": "GB",
"postCode": "EC1A",
"companyProfileId": 0,
"companyProfileUrl": "Sample-Company-00000",
"isEasyApply": true,
"isExternal": false,
"detailFetched": true
}

Plan Requirement

The default connection setting works out of the box for Reed. For very large or frequent runs, or under heavy load, a stronger Apify Residential proxy (Starter plan or higher) is more reliable; the actor escalates to it automatically when needed. Set proxy.apifyProxyGroups: ["RESIDENTIAL"] with apifyProxyCountry: "GB" to force it.

FAQ

How much does it cost?

You pay per record returned, plus a separate detail charge for each job detail page actually fetched when Fetch full job details is on, and for each course review returned in Courses mode. The Pricing tab shows the current rates for both. Use Max results to cap the cost of any run, or turn Fetch full job details off to collect only the list-page fields.

This actor collects only publicly available job, company and course listing data. You are responsible for how you use it: follow Reed's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Job postings are generally facts, but logos, photos and some description text may be subject to third-party rights.

Can I schedule this to collect only new jobs?

Yes. Schedule the actor from the Schedules tab and pass the previous run's ID as resumeFromRunId on each new run; only jobs not already in that run's dataset come back. This actor has no built-in incremental mode that classifies jobs as new, updated or expired across runs; a delta is produced only through resumeFromRunId.

Why did I get fewer jobs than I expected across multiple locations?

Two reasons. First, Max results is split evenly across locations, so each location returns at most its share. Second, when locations share jobs (remote or nationally advertised roles), a later location's search stops early if one of its pages after the first holds only jobs an earlier location already returned, so its remaining pages are never read. See "Known limitation: overlapping searches in one run" above for an example. For complete coverage, run one location per run.

Why did my run fail instead of returning an empty dataset?

If Reed refuses every request in a run, the run stops with a clear message so "no jobs match this search" is never confused with "nothing could be read." Run it again in a few minutes, or switch to a stronger Apify Residential GB proxy under Connection.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

🔗 Want more jobs data?

Pair this actor with these related scrapers from the same team:

💼 Jobsite UK
From $1/1K. Collect UK job listings from Jobsite.co.uk at scale. Search by keyword...
🏨 Caterer.com Scraper
Scrape UK hospitality jobs from Caterer.com, including chef, hotel, restaurant, bar, and...
💼 NHS UK
From $0.8/1k. Scrape nhs.uk Jobs listings into a flat dataset. Extract 50+ fields...
💼 s1jobs Scraper
Scrape jobs from s1jobs.com across Scotland and the UK. Search by keyword, location, or...
💼 JobTeaser Scraper
Scrape early-career jobs and internships from JobTeaser across Europe. Search with 15...
💼 Nofluffjobs
From $1/1K. Extract IT jobs from NoFluffJobs.com across Poland, Czechia, Slovakia...

👉 Browse all abotapi scrapers

💬 Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.