# Reed.co.uk Scraper | Jobs, Companies, Courses & Reviews (`abotapi/reed-co-uk-scraper`) Actor

Scrape Reed.co.uk jobs, companies, courses, and reviews. Search by keyword, location, filters, or URLs. Extract 80+ job fields including salary, company, GPS location, sector, contract type, skills, full description, postcode, company profile, course details, and review data.

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

## Pricing

from $1.50 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Reed.co.uk Jobs Scraper

Extract structured job data from Reed.co.uk, the UK's largest job board, at scale. Search by keyword, location, salary, distance, job type and more, or paste any Reed search or job URL. Every job comes back as a flat record with 80+ fields: salary breakdown, company, location with GPS coordinates, sector, contract type, skills, and posting dates. Turn on full details to also pull the complete job description, region/county/postcode, company profile, and screening questions.

### Why this scraper

- **80+ fields per job**, rising to 125+ when full details are enabled, far more than typical Reed scrapers return.
- **GPS coordinates on every job** resolved from the job location, so you can map and geo-filter results out of the box.
- **Runs on datacenter connections by default**, the cheapest tier, so a 1,000-job run costs a fraction of residential-only scrapers. Residential is used automatically as a fallback only when needed.
- **Three things to scrape**: jobs (by filters or pasted URLs), company profiles, and training courses with reviews.
- **Full filter grammar**: keyword, location, distance, salary range, posted-within, sort, job type (permanent/temporary/contract/full-time/part-time), posted-by (agency/employer), graduate, easy-apply, visa-sponsorship, early-bird.
- **Fast and lightweight**: no browser, low memory, concurrent detail enrichment.
- **Optional export to your apps** via MCP connectors (Notion, Linear, Airtable, Apify).

### Data you get

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

| Field | Example |
| --- | --- |
| `jobId` | `00000001` |
| `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` | `51.5074` |
| `longitude` | `-0.1278` |
| `displaySalary` | `£45,000 - £55,000 per annum` |
| `salaryFrom` | `45000` |
| `salaryTo` | `55000` |
| `salaryCurrencyId` | `1` |
| `salaryType` | `5` |
| `remoteWorkingOption` | `On-Site` |
| `jobType` | `1` |
| `isFullTime` | `true` |
| `isPartTime` | `false` |
| `postedOn` | `2026-01-01T00:00:00.000Z` |
| `expiryOn` | `2026-01-01T00:00:00.000Z` |
| `statuses` | `["Featured", "Easy Apply"]` |
| `contractType` | `Permanent` |
| `sectorName` | `IT & Telecoms` |
| `region` | `South East England` |
| `county` | `London` |
| `postCode` | `EC1A` |
| `description` | `Full job description text appears here when fetchDetails is on.` |
| `companyProfileId` | `0000` |

Plus salary-per-annum breakdown, parent sector, taxonomy, breadcrumbs, job-owner profile (id, url, logo, banner), screening questions, and the raw source objects (`rawListData`, `rawDetailData`).

### How to use

There are three things to scrape, chosen with `mode`: `jobs`, `company`, or `course`.

Jobs by keyword search in one city (leave Job URLs empty to search by filters):

```json
{
  "mode": "jobs",
  "keywords": "data engineer",
  "locations": ["london"],
  "maxListings": 20
}
````

Jobs with filters (salary, distance, recent, newest first):

```json
{
  "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 (when Job URLs are set, the filters are ignored):

```json
{
  "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"
  ],
  "maxPages": 3,
  "maxListings": 200
}
```

In Jobs mode you choose URLs vs search automatically: paste Job URLs to scrape them directly, or leave Job URLs empty and the actor builds the search from your keyword, location, and filters.

Company mode (scrape company profiles by URL or slug):

```json
{
  "mode": "company",
  "companies": [
    "https://www.reed.co.uk/company-profile/Marshall-Wolfe-63256",
    "Marshall-Wolfe-63256"
  ],
  "maxListings": 50
}
```

In company mode each entry returns one record with the company sector, employee-count range, website, benefits, articles, external links, total open jobs, and a list of recent jobs (each with salary and GPS). Company slugs are case-sensitive.

Course mode (scrape training courses and their reviews):

```json
{
  "mode": "course",
  "courseQueries": ["python", "project management"],
  "courseUrls": ["https://www.reed.co.uk/courses/c/271655"],
  "fetchReviews": true,
  "maxReviewsPerCourse": 0,
  "reviewsSort": "MostRecent",
  "maxListings": 50
}
```

In course mode each course is returned as one record (title, provider, price, rating, study method, qualification, format, description). When `fetchReviews` is on, every review is returned as its own record (overall and per-category ratings, text, reviewer, date, and any provider response). `courseQueries` searches Reed Courses by keyword; `courseUrls` accepts course URLs or bare course IDs.

### 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.

Leave `mcpConnectors` empty to skip this entirely.

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `jobs` | `jobs` = job listings (filters or pasted URLs); `company` = company profiles; `course` = courses + reviews. |
| `keywords` | string | (empty) | Job search terms (jobs mode, when no Job URLs are pasted). |
| `locations` | array | (empty) | UK cities or regions; one search per location (jobs mode). |
| `proximity` | integer | `10` | Search radius in miles (0, 1, 3, 5, 10, 15, 20, 30, 50). |
| `salaryFrom` | integer | (none) | Minimum salary per annum. |
| `salaryTo` | integer | (none) | Maximum salary per annum. |
| `postedDate` | string | `anytime` | `anytime`, `today`, `last3days`, `last7days`, `last14days`. |
| `sortBy` | string | `relevance` | `relevance` or `date` (newest first). |
| `fullTime`, `partTime`, `permanent`, `temporary`, `contract` | boolean | `false` | Job-type filters. |
| `agency`, `direct` | boolean | `false` | Posted by agency / employer. |
| `graduate`, `easyApply`, `visaSponsorship`, `earlyBird` | boolean | `false` | Extra filters. |
| `urls` | array | (empty) | Reed job-search or job URLs (jobs mode; if set, filters are ignored). |
| `companies` | array | (empty) | Reed company-profile URLs or slugs (company mode). |
| `courseQueries` | array | (empty) | Course search keywords (course mode). |
| `courseUrls` | array | (empty) | Course URLs or IDs (course mode). |
| `fetchReviews` | boolean | `true` | Return course reviews as separate records (course mode). |
| `maxReviewsPerCourse` | integer | `0` | Cap reviews per course; 0 = all (course mode). |
| `reviewsSort` | string | `MostRecent` | Review order: `MostRecent`, `RatingDesc`, `RatingAsc`. |
| `fetchDetails` | boolean | `true` | Enrich each job from its detail page. |
| `maxListings` | integer | `20` | The result cap. The run stops at this many unique jobs. Set 0 for unlimited. |
| `maxPages` | integer | `200` | Safety bound on result pages per search; the run stops at Max jobs first. |
| `maxResidentialRequests` | integer | `0` | Optional residential exit budget (cost control); 0 = unlimited. |
| `proxy` | object | Apify datacenter | Proxy configuration. |

`maxListings` is the single cap. `maxPages` is only a safety bound and does not limit below `maxListings`.

### Output example

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

```json
{
  "id": 1,
  "jobId": 1,
  "url": "https://www.reed.co.uk/jobs/data-engineer/00000001",
  "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 fetchDetails is on.",
  "skills": [],
  "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-01-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-0000",
  "isEasyApply": true,
  "isExternal": false,
  "detailFetched": true
}
```

### Plan requirement

This actor runs on Apify datacenter connections by default, which works for Reed and is available on the free plan. For very large runs or under heavy load, an Apify Residential proxy (Starter plan or higher) is more reliable; the actor escalates to it automatically when datacenter results thin out. Set `proxy.apifyProxyGroups: ["RESIDENTIAL"]` with `apifyProxyCountry: "GB"` to force residential.

# Actor input Schema

## `mode` (type: `string`):

Jobs = job listings (by filters or pasted URLs). Companies = company profiles. Courses = training courses and their reviews.

## `urls` (type: `array`):

Reed job-search URLs (e.g. https://www.reed.co.uk/jobs/data-engineer-jobs-in-london) or direct job URLs. If set, these are scraped directly and the filters below are ignored. Leave empty to search by the filters below.

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

Job search terms, e.g. 'data engineer'. Used only when no Job URLs are pasted. Leave empty to browse all jobs in the location.

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

UK cities or regions, e.g. \['london', 'manchester']. One search per location. Leave empty for a UK-wide search.

## `proximity` (type: `integer`):

Search radius around the location, in miles. Allowed: 0, 1, 3, 5, 10, 15, 20, 30, 50 (other values are ignored). Default 10.

## `salaryFrom` (type: `integer`):

Only jobs with a salary at or above this amount (per annum).

## `salaryTo` (type: `integer`):

Only jobs with a salary at or below this amount (per annum).

## `postedDate` (type: `string`):

Only jobs posted within this window.

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

Result ordering. 'relevance' is Reed's default; 'date' shows newest first.

## `fullTime` (type: `boolean`):

Restrict to full-time roles.

## `partTime` (type: `boolean`):

Restrict to part-time roles.

## `permanent` (type: `boolean`):

Restrict to permanent roles.

## `temporary` (type: `boolean`):

Restrict to temporary roles.

## `contract` (type: `boolean`):

Restrict to contract roles.

## `agency` (type: `boolean`):

Only jobs posted by recruitment agencies.

## `direct` (type: `boolean`):

Only jobs posted directly by the employer.

## `graduate` (type: `boolean`):

Only graduate-level roles.

## `easyApply` (type: `boolean`):

Only jobs that support one-click apply.

## `visaSponsorship` (type: `boolean`):

Only jobs offering visa sponsorship.

## `earlyBird` (type: `boolean`):

Only newly posted 'early bird' jobs.

## `fetchDetails` (type: `boolean`):

Jobs mode only. When enabled, each job is enriched from its detail page: full HTML description, region/county/postcode, full salary breakdown, sector + parent sector, company profile, contract type, breadcrumbs, and screening questions. Adds one fetch per job.

## `companies` (type: `array`):

Reed company-profile URLs (e.g. https://www.reed.co.uk/company-profile/Marshall-Wolfe-63256) or bare slugs (e.g. Marshall-Wolfe-63256). Slugs are case-sensitive.

## `courseQueries` (type: `array`):

Keywords to search Reed Courses, e.g. \['python', 'project management']. One search per keyword; Max results caps the number of courses.

## `courseUrls` (type: `array`):

Reed course URLs (e.g. https://www.reed.co.uk/courses/python-course/271655) or bare course IDs (e.g. 271655). Combined with any search keywords above.

## `fetchReviews` (type: `boolean`):

Courses mode only. When enabled, each course's reviews are returned as separate review records (rating breakdown, text, reviewer, provider response).

## `maxReviewsPerCourse` (type: `integer`):

Cap on reviews fetched per course. 0 = all reviews.

## `reviewsSort` (type: `string`):

Order in which course reviews are fetched.

## `maxListings` (type: `integer`):

The single result cap, applied in every mode: max jobs, companies, or courses (course reviews are additional and not counted here). The run stops once this many are collected. Set 0 for unlimited (then it stops at Max pages).

## `maxPages` (type: `integer`):

Safety bound on result pages walked per search (Jobs and Courses). Leave at the default for no practical limit; the run stops at Max results first.

## `maxResidentialRequests` (type: `integer`):

Optional cap on how many residential proxy exits the run may use (cost control). 0 = unlimited. Datacenter is used first regardless.

## `proxy` (type: `object`):

Proxy servers used by the scraper. Default is Apify datacenter (free-tier friendly).

## `mcpConnectors` (type: `array`):

Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "jobs",
  "urls": [],
  "keywords": "data engineer",
  "locations": [
    "london"
  ],
  "proximity": 10,
  "postedDate": "anytime",
  "sortBy": "relevance",
  "fullTime": false,
  "partTime": false,
  "permanent": false,
  "temporary": false,
  "contract": false,
  "agency": false,
  "direct": false,
  "graduate": false,
  "easyApply": false,
  "visaSponsorship": false,
  "earlyBird": false,
  "fetchDetails": true,
  "companies": [
    "https://www.reed.co.uk/company-profile/Marshall-Wolfe-63256"
  ],
  "courseQueries": [
    "python"
  ],
  "courseUrls": [],
  "fetchReviews": true,
  "maxReviewsPerCourse": 0,
  "reviewsSort": "MostRecent",
  "maxListings": 20,
  "maxPages": 200,
  "maxResidentialRequests": 0,
  "proxy": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `jobs` (type: `string`):

Individual job records with 80+ fields, plus ~45 detail fields when fetchDetails is enabled.

## `output` (type: `string`):

Run summary: total jobs, detail pages fetched, pages walked, duration.

# 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 = {
    "urls": [],
    "keywords": "data engineer",
    "locations": [
        "london"
    ],
    "companies": [
        "https://www.reed.co.uk/company-profile/Marshall-Wolfe-63256"
    ],
    "courseQueries": [
        "python"
    ],
    "courseUrls": [],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/reed-co-uk-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 = {
    "urls": [],
    "keywords": "data engineer",
    "locations": ["london"],
    "companies": ["https://www.reed.co.uk/company-profile/Marshall-Wolfe-63256"],
    "courseQueries": ["python"],
    "courseUrls": [],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/reed-co-uk-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [],
  "keywords": "data engineer",
  "locations": [
    "london"
  ],
  "companies": [
    "https://www.reed.co.uk/company-profile/Marshall-Wolfe-63256"
  ],
  "courseQueries": [
    "python"
  ],
  "courseUrls": [],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/reed-co-uk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=abotapi/reed-co-uk-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Reed.co.uk Scraper | Jobs, Companies, Courses & Reviews",
        "description": "Scrape Reed.co.uk jobs, companies, courses, and reviews. Search by keyword, location, filters, or URLs. Extract 80+ job fields including salary, company, GPS location, sector, contract type, skills, full description, postcode, company profile, course details, and review data.",
        "version": "1.0",
        "x-build-id": "pTXw5a8Nk09eVgABd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/abotapi~reed-co-uk-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-abotapi-reed-co-uk-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/abotapi~reed-co-uk-scraper/runs": {
            "post": {
                "operationId": "runs-sync-abotapi-reed-co-uk-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/abotapi~reed-co-uk-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-abotapi-reed-co-uk-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "What to scrape",
                        "enum": [
                            "jobs",
                            "company",
                            "course"
                        ],
                        "type": "string",
                        "description": "Jobs = job listings (by filters or pasted URLs). Companies = company profiles. Courses = training courses and their reviews.",
                        "default": "jobs"
                    },
                    "urls": {
                        "title": "Job URLs (optional)",
                        "type": "array",
                        "description": "Reed job-search URLs (e.g. https://www.reed.co.uk/jobs/data-engineer-jobs-in-london) or direct job URLs. If set, these are scraped directly and the filters below are ignored. Leave empty to search by the filters below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "string",
                        "description": "Job search terms, e.g. 'data engineer'. Used only when no Job URLs are pasted. Leave empty to browse all jobs in the location."
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "UK cities or regions, e.g. ['london', 'manchester']. One search per location. Leave empty for a UK-wide search.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "proximity": {
                        "title": "Distance (miles)",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Search radius around the location, in miles. Allowed: 0, 1, 3, 5, 10, 15, 20, 30, 50 (other values are ignored). Default 10.",
                        "default": 10
                    },
                    "salaryFrom": {
                        "title": "Minimum salary (£)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only jobs with a salary at or above this amount (per annum)."
                    },
                    "salaryTo": {
                        "title": "Maximum salary (£)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only jobs with a salary at or below this amount (per annum)."
                    },
                    "postedDate": {
                        "title": "Posted within",
                        "enum": [
                            "anytime",
                            "today",
                            "last3days",
                            "last7days",
                            "last14days"
                        ],
                        "type": "string",
                        "description": "Only jobs posted within this window.",
                        "default": "anytime"
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "relevance",
                            "date"
                        ],
                        "type": "string",
                        "description": "Result ordering. 'relevance' is Reed's default; 'date' shows newest first.",
                        "default": "relevance"
                    },
                    "fullTime": {
                        "title": "Full-time only",
                        "type": "boolean",
                        "description": "Restrict to full-time roles.",
                        "default": false
                    },
                    "partTime": {
                        "title": "Part-time only",
                        "type": "boolean",
                        "description": "Restrict to part-time roles.",
                        "default": false
                    },
                    "permanent": {
                        "title": "Permanent only",
                        "type": "boolean",
                        "description": "Restrict to permanent roles.",
                        "default": false
                    },
                    "temporary": {
                        "title": "Temporary only",
                        "type": "boolean",
                        "description": "Restrict to temporary roles.",
                        "default": false
                    },
                    "contract": {
                        "title": "Contract only",
                        "type": "boolean",
                        "description": "Restrict to contract roles.",
                        "default": false
                    },
                    "agency": {
                        "title": "Posted by agency",
                        "type": "boolean",
                        "description": "Only jobs posted by recruitment agencies.",
                        "default": false
                    },
                    "direct": {
                        "title": "Posted by employer",
                        "type": "boolean",
                        "description": "Only jobs posted directly by the employer.",
                        "default": false
                    },
                    "graduate": {
                        "title": "Graduate roles",
                        "type": "boolean",
                        "description": "Only graduate-level roles.",
                        "default": false
                    },
                    "easyApply": {
                        "title": "Easy apply",
                        "type": "boolean",
                        "description": "Only jobs that support one-click apply.",
                        "default": false
                    },
                    "visaSponsorship": {
                        "title": "Visa sponsorship",
                        "type": "boolean",
                        "description": "Only jobs offering visa sponsorship.",
                        "default": false
                    },
                    "earlyBird": {
                        "title": "Early bird",
                        "type": "boolean",
                        "description": "Only newly posted 'early bird' jobs.",
                        "default": false
                    },
                    "fetchDetails": {
                        "title": "Fetch full job details",
                        "type": "boolean",
                        "description": "Jobs mode only. When enabled, each job is enriched from its detail page: full HTML description, region/county/postcode, full salary breakdown, sector + parent sector, company profile, contract type, breadcrumbs, and screening questions. Adds one fetch per job.",
                        "default": true
                    },
                    "companies": {
                        "title": "Companies",
                        "type": "array",
                        "description": "Reed company-profile URLs (e.g. https://www.reed.co.uk/company-profile/Marshall-Wolfe-63256) or bare slugs (e.g. Marshall-Wolfe-63256). Slugs are case-sensitive.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "courseQueries": {
                        "title": "Course search keywords",
                        "type": "array",
                        "description": "Keywords to search Reed Courses, e.g. ['python', 'project management']. One search per keyword; Max results caps the number of courses.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "courseUrls": {
                        "title": "Course URLs or IDs",
                        "type": "array",
                        "description": "Reed course URLs (e.g. https://www.reed.co.uk/courses/python-course/271655) or bare course IDs (e.g. 271655). Combined with any search keywords above.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "fetchReviews": {
                        "title": "Fetch course reviews",
                        "type": "boolean",
                        "description": "Courses mode only. When enabled, each course's reviews are returned as separate review records (rating breakdown, text, reviewer, provider response).",
                        "default": true
                    },
                    "maxReviewsPerCourse": {
                        "title": "Max reviews per course",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap on reviews fetched per course. 0 = all reviews.",
                        "default": 0
                    },
                    "reviewsSort": {
                        "title": "Reviews sort order",
                        "enum": [
                            "MostRecent",
                            "RatingDesc",
                            "RatingAsc"
                        ],
                        "type": "string",
                        "description": "Order in which course reviews are fetched.",
                        "default": "MostRecent"
                    },
                    "maxListings": {
                        "title": "Max results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "The single result cap, applied in every mode: max jobs, companies, or courses (course reviews are additional and not counted here). The run stops once this many are collected. Set 0 for unlimited (then it stops at Max pages).",
                        "default": 20
                    },
                    "maxPages": {
                        "title": "Max pages per search",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Safety bound on result pages walked per search (Jobs and Courses). Leave at the default for no practical limit; the run stops at Max results first.",
                        "default": 200
                    },
                    "maxResidentialRequests": {
                        "title": "Residential request budget",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional cap on how many residential proxy exits the run may use (cost control). 0 = unlimited. Datacenter is used first regardless.",
                        "default": 0
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy servers used by the scraper. Default is Apify datacenter (free-tier friendly).",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "mcpConnectors": {
                        "title": "Pipe results into your apps (optional)",
                        "type": "array",
                        "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
                    },
                    "notionParentPageUrl": {
                        "title": "Notion parent page (Notion connector only)",
                        "type": "string",
                        "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
                    },
                    "maxNotifyListings": {
                        "title": "Max items to export per connector",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on items written to each connector per run. Does not affect the dataset.",
                        "default": 50
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
