Vexaloom Labs

Use Reed.co.uk UK Job Listings & Pay Extractor with Python

Search live Reed.co.uk vacancies by keyword and location and get structured job records with parsed pay ranges, job type, remote status and job descriptions.

1. Choose the data you need

Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.

2. Prepare a source-based input

This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.

{
  "contract": false,
  "easyApplyOnly": false,
  "fetchDetails": true,
  "fullTime": false,
  "graduateOnly": false,
  "hideNoSalary": false,
  "hideSurveyJobs": false,
  "hideTrainingJobs": false,
  "keywords": "software engineer",
  "maxItems": 3,
  "mode": "search",
  "partTime": false,
  "permanent": false,
  "postedBy": "any",
  "postedWithin": "anytime",
  "proximity": "10",
  "remoteOption": "any",
  "sector": "any",
  "temporary": false,
  "visaSponsorship": false
}

Download input.example.json and save your reviewed copy as input.json.

FieldTypeRequiredDescription
modestringoptionalSearch Reed's job listings, or scrape specific Reed search/job URLs.
keywordsstringoptionalJob title, skill or phrase to search for (mode=search).
searchQueriesarrayoptionalRun several keyword searches in one run (mode=search). When set, this replaces Keywords.
locationstringoptionalUK town, city, region or postcode (mode=search). Leave blank for UK-wide.
sectorstringoptionalLimit results to one of Reed's parent sectors (mode=search).
proximitystringoptionalRadius around the location (mode=search).
salaryFromintegeroptionalAnnual salary floor in pounds (mode=search). Reed matches jobs whose salary range overlaps this floor.
salaryTointegeroptionalAnnual salary ceiling in pounds (mode=search). Reed matches jobs whose salary range overlaps this ceiling.
postedWithinstringoptionalOnly return jobs posted in this window (mode=search).
postedBystringoptionalFilter by who advertised the job (mode=search).
remoteOptionstringoptionalFilter by remote, hybrid or on-site work (mode=search).
permanentbooleanoptionalOnly permanent contracts (mode=search).
contractbooleanoptionalOnly contract roles (mode=search).
temporarybooleanoptionalOnly temporary roles (mode=search).
fullTimebooleanoptionalOnly full-time roles (mode=search).
partTimebooleanoptionalOnly part-time roles (mode=search).
graduateOnlybooleanoptionalOnly graduate roles (mode=search).
easyApplyOnlybooleanoptionalOnly jobs with Reed Easy Apply (mode=search).
visaSponsorshipbooleanoptionalOnly jobs Reed marks as offering visa sponsorship (mode=search).
hideNoSalarybooleanoptionalExclude listings where no salary is displayed (mode=search).
hideTrainingJobsbooleanoptionalExclude training-course adverts (mode=search).
hideSurveyJobsbooleanoptionalExclude survey-job adverts (mode=search).
searchUrlsarrayoptionalOne or more Reed search URLs (mode=byUrl). Their filters are preserved; other filters here are added when absent.
jobUrlsarrayoptionalOne or more Reed job URLs or numeric job IDs (mode=byUrl).
fetchDetailsbooleanoptionalOpen each job page for the full description, display salary, per-annum pay and location details. Turn off for a faster listing-only run.
maxItemsintegeroptionalMaximum number of job records to return (1-10,000). Reed exposes at most 10,000 results per search.

3. Start an Actor run

Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.

Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.

import json
import os
import urllib.request

# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
    actor_input = json.load(stream)

token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
    "https://api.apify.com/v2/acts/oH5FuQqgUuRsixihL/runs?timeout=120&maxTotalChargeUsd=0.50",
    data=json.dumps(actor_input).encode("utf-8"),
    headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
    method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
    run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.

4. Inspect the actual results

Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.

Reed.co.uk job listings with full descriptions, parsed pay ranges, employer and location metadata, sector, skills and direct job URLs.

Questions before you run

Which inputs are required?

No top-level fields are marked required in the published schema. Conditional requirements can still apply; check the README.

What does this guide verify?

The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.

What if the run request times out?

Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.

Generated from source build PXJc0ImTfiwpuWFBr and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.