# TargetJobs UK scraper: graduate jobs, schemes, and internships (`getascraper/targetjobs-uk-scraper`) Actor

Scrape public TargetJobs UK graduate jobs, schemes, internships, and entry-level roles by keyword, location, sector, opportunity type, or employer. Export salaries, deadlines, descriptions, education fields, and application links through Apify datasets, API, CSV, or JSON. From $2.50 per 1,000 jobs.

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

## Pricing

from $1.88 / 1,000 job postings

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

## 🎓 TargetJobs UK scraper: graduate jobs, schemes, and internships

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#EEF2FF;border:1px solid #C7D2FE;border-top:4px solid #312E81;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1E1B4B;line-height:1.3">Build a graduate-job dataset without opening TargetJobs by hand</span><br>
<span style="font-size:15px;color:#3F3D6B;line-height:1.6">Search public TargetJobs UK graduate jobs, schemes, and internships by keyword, location, sector, or employer, then export salaries, deadlines, and application links to a spreadsheet, API, or workflow.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td width="25%" style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D2FE;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#312E81">🔍 Targeted search</span><br>
<span style="font-size:12px;color:#3F3D6B">Keyword, location, sector, opportunity type, and employer filters in one run.</span>
</td>
<td width="25%" style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D2FE;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#312E81">🧾 Full job context</span><br>
<span style="font-size:12px;color:#3F3D6B">Salaries, deadlines, descriptions, and degree requirements when published.</span>
</td>
<td width="25%" style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D2FE;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#312E81">🔗 Direct URLs</span><br>
<span style="font-size:12px;color:#3F3D6B">Start from a specific job link instead of a search.</span>
</td>
<td width="25%" style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D2FE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#312E81">📤 Clean exports</span><br>
<span style="font-size:12px;color:#3F3D6B">Three dataset views for listings, enriched details, and sources.</span>
</td>
</tr>
</table>

Search public **TargetJobs UK** graduate jobs, schemes, and internships, then export source-backed titles, employers, locations, salaries, deadlines, descriptions, education fields, and application links. It uses direct public requests and runs without a browser.

### 🔍 What does this Actor do?

Give it a keyword, a location, or a public TargetJobs URL and it returns every matching graduate opportunity as one clean dataset row. Titles, employers, sectors, opportunity types, and application links come from the public search response.

Turn on `scrapeDetails` and it opens each selected public job page for fuller descriptions, structured deadlines, degree requirements, and application data.

Everything stays within TargetJobs' public search and job pages. Login, account, and internal routes are never requested, and a missing field is left out rather than guessed.

### 💡 Who is this for?

- **I am a graduate-recruitment researcher.** I need a current list of graduate schemes in a sector so that I can benchmark what competitors are offering this cycle.
- **I am a careers-service advisor.** I need to pull opportunities matching my students' subjects and locations so that I can share a relevant shortlist every week.
- **I am building a job board or aggregator.** I need salaries, deadlines, and application links in flat fields so that I can drop them straight into my own listings.
- **I am a data analyst tracking the graduate market.** I need comparable fields across employers and sectors so that I can spot hiring trends without reading each posting by hand.

### 🚀 How to use it

<table width="100%">
<tr>
<td width="33%" style="padding:16px 14px;width:33%;background:#EEF2FF;border:1px solid #C7D2FE;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#312E81;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1E1B4B">Choose your search</span><br>
<span style="font-size:12px;color:#3F3D6B">Enter keywords and filters, or paste public TargetJobs URLs.</span>
</td>
<td width="33%" style="padding:16px 14px;width:33%;background:#EEF2FF;border:1px solid #C7D2FE;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#312E81;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1E1B4B">Set your limits</span><br>
<span style="font-size:12px;color:#3F3D6B">Bound the run with a result cap, page cap, and request delay.</span>
</td>
<td width="33%" style="padding:16px 14px;width:33%;background:#EEF2FF;border:1px solid #C7D2FE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#312E81;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1E1B4B">Export your jobs</span><br>
<span style="font-size:12px;color:#3F3D6B">Download listings, enriched details, or the sources view.</span>
</td>
</tr>
</table>

Leave `startUrls` empty to use the default software search, or add public TargetJobs URLs when you already know the pages you want. If `startUrls` is not empty, those URLs take precedence over keyword and filter fields.

#### Default input

```json
{
    "startUrls": [],
    "searchTerms": ["software"],
    "locations": [],
    "opportunityTypes": [],
    "sectors": [],
    "employers": [],
    "scrapeDetails": false,
    "maxItems": 25,
    "maxPages": 3,
    "requestDelayMs": 500
}
```

#### Search with filters

```json
{
    "startUrls": [],
    "searchTerms": ["data analyst", "business analyst"],
    "locations": ["London", "Cambridge"],
    "opportunityTypes": ["Graduate job", "Graduate scheme"],
    "sectors": ["Data", "Technology"],
    "employers": [],
    "scrapeDetails": true,
    "maxItems": 50,
    "maxPages": 3,
    "requestDelayMs": 750
}
```

#### Start from public URLs

```json
{
    "startUrls": [
        { "url": "https://targetjobs.co.uk/search/jobs?search=actuarial" },
        { "url": "https://targetjobs.co.uk/jobs/graduate-software-engineer-robot-software-216322" }
    ],
    "scrapeDetails": true,
    "maxItems": 25,
    "maxPages": 2,
    "requestDelayMs": 500
}
```

### 🧾 Input

| Field | Type | Required | Description |
| --- | --- | :---: | --- |
| `startUrls` | array of URLs | No | Public TargetJobs search, category, browse, or job URLs. These override the other targeting fields. |
| `searchTerms` | array of strings | No | Keywords or role names matched by TargetJobs. |
| `locations` | array of strings | No | TargetJobs city filters such as London, Cambridge, or Manchester. |
| `opportunityTypes` | array of strings | No | Public opportunity types such as Graduate job, Graduate scheme, or Internship. |
| `sectors` | array of strings | No | Public TargetJobs sectors such as Technology, Data, or Finance. |
| `employers` | array of strings | No | Public employer names available in the TargetJobs index. |
| `scrapeDetails` | boolean | No | Opens each selected public job page and its public page data for fuller fields. |
| `maxItems` | integer | No | Maximum number of unique jobs returned, from 1 to 500. |
| `maxPages` | integer | No | Maximum search pages per keyword or start URL, from 1 to 25. |
| `requestDelayMs` | integer | No | Delay between requests, from 250 to 5,000 milliseconds. |

### 📊 Data table

Every dataset item represents one unique public TargetJobs opportunity. Missing source values are omitted rather than replaced with placeholders.

| Field | Type | Description |
| --- | --- | --- |
| `jobId` | string | TargetJobs UUID or numeric opportunity ID. |
| `title` | string | Public job title. |
| `company` | string | Public employer name. |
| `location`, `locations` | string | Primary location and normalized city list. |
| `sectors` | string | Comma-separated public sector labels. |
| `opportunityTypes` | string | Comma-separated opportunity type labels. |
| `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency` | string/number | Source salary text and normalized bounds when available. |
| `employmentType`, `workplaceType` | string | Public employment or location-type labels when available. |
| `degreeRequirements`, `degreeSubjects` | string | Public education or qualification text when available. |
| `description` | string | Public job description with HTML removed. |
| `applicationUrl`, `applicationEmail` | string | Public application destination or email when published. |
| `jobUrl`, `sourceUrl` | string | Public job page and discovery source URLs. |
| `postedAt`, `updatedAt`, `startDate`, `applicationDeadline` | string | Source-backed dates in ISO or source date format. |
| `applicationOpen`, `registerInterestOnly`, `freeJob`, `scrapedJob` | boolean | Public source flags when available. |
| `sourcePlatform`, `searchTerm`, `searchLocation`, `scrapedAt` | string | Provenance and run metadata. |

#### Dataset views

The dataset contains exactly three views:

1. **🔍 Job listings**: titles, employers, locations, filters, salaries, deadlines, and job links for discovery.
2. **🧾 Enriched details**: descriptions, education, employment, workplace, salary bounds, and application fields.
3. **🔗 Sources**: IDs, source URLs, application URLs, search provenance, and freshness timestamps.

### 💰 Pricing

This Actor uses pay-per-event pricing: you pay per job posting returned. Enabling `scrapeDetails` adds a small per-job enrichment event for the extra public page read. Empty runs do not charge result events, and there is no subscription requirement.

### ⭐ Enjoying TargetJobs UK scraper?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#EEF2FF;border:1px solid #C7D2FE;border-left:5px solid #312E81;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1E1B4B">One run just saved you a morning of manual graduate-job searching.</span><br>
<span style="font-size:14px;color:#3F3D6B">A 5-star rating takes 10 seconds and helps other recruiters and researchers find this Actor. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#312E81;border:1px solid #C7D2FE;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/targetjobs-uk-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### 🔧 Tips

- Start with the default search and `maxItems` at 25 to check the fields before scaling up.
- Turn on `scrapeDetails` only when you need descriptions, deadlines, or education fields; it adds one request per job.
- Add direct `/jobs/...` URLs to `startUrls` when you already know the opportunities you want.
- Combine `sectors` and `opportunityTypes` to narrow a broad keyword like "analyst" to graduate schemes only.
- Raise `requestDelayMs` on larger runs to keep pagination steady.

### ❓ FAQ

#### Does this Actor scrape every TargetJobs job?

No. It returns the jobs matched by your search terms, filters, or start URLs, within `maxItems` and `maxPages`.

#### Should I enable `scrapeDetails`?

Enable it when you need full descriptions, public application URLs, structured deadlines, or education fields. Leave it off for a faster discovery export.

#### Can I use direct job URLs?

Yes. Add public `/jobs/...` URLs to `startUrls`. Direct URLs are fetched as individual public opportunities and take precedence over search inputs.

#### Does this Actor monitor changes?

No. This is a one-shot scraper. Use Apify Schedules if you want to run the same bounded search repeatedly and compare the resulting datasets.

### 🛡️ Limits and data boundaries

This Actor reads public TargetJobs search responses, public job pages, and public page data on `targetjobs.co.uk` or `www.targetjobs.co.uk`. It does not log in, access private candidate data, request employer websites, solve CAPTCHAs, bypass access controls, or use browser automation. Application URLs are returned as values but are not opened.

TargetJobs occasionally changes public page fields. If a field is not present in the source response, the Actor leaves it out. A challenge page or unexpected source response is reported in the run summary and does not become a fabricated dataset item.

### 🔗 Other actors

- [Goodmoves Jobs Scraper: Charity Sector Jobs](https://apify.com/getascraper/goodmoves-jobs-scraper) ↗ - Collect charity-sector job listings across the UK.
- [Freshersworld Jobs Scraper: Filtered Fresher Jobs](https://apify.com/getascraper/freshersworld-jobs-scraper) ↗ - Find entry-level and fresher jobs by filter.
- [Job Bank Canada Scraper & LMIA Job Monitor](https://apify.com/getascraper/jobbank-scraper) ↗ - Monitor Canadian government job postings and LMIA listings.
- [Teaching Vacancies UK Scraper: DfE School Jobs and Change Feed](https://apify.com/getascraper/teaching-vacancies-uk-scraper) ↗ - Track England school vacancies with a new and changed feed.
- [NHS Jobs Scraper: UK Trust Vacancy Alerts](https://apify.com/getascraper/nhs-trust-vacancy-monitor) ↗ - Monitor another UK public-sector vacancy source.

# Changelog

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

# Actor input Schema

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

Public TargetJobs search, category, sector, browse, or job URLs. When provided, these URLs take precedence over keyword and filter inputs.

## `searchTerms` (type: `array`):

Keywords matched by the public TargetJobs search service. Use graduate job terms, skills, roles, or employers.

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

Public TargetJobs city filters, such as London, Cambridge, or Manchester.

## `opportunityTypes` (type: `array`):

Keep public TargetJobs opportunity types, such as Graduate job, Graduate scheme, or Internship.

## `sectors` (type: `array`):

Keep public TargetJobs sectors, such as Software engineering, Finance, or Consulting.

## `employers` (type: `array`):

Keep public TargetJobs employer names when they are available in the search index.

## `scrapeDetails` (type: `boolean`):

Open each selected public job page to add JSON-LD details such as the full description, salary fallback, application link, employment type, and education requirements.

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

Hard cap on unique jobs returned across the entire run.

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

Maximum number of public search pages requested per keyword or start URL.

## `requestDelayMs` (type: `integer`):

Delay between direct HTTP requests. Increase this if the source responds slowly or begins returning rate-limit responses.

## Actor input object example

```json
{
  "startUrls": [],
  "searchTerms": [
    "software"
  ],
  "locations": [],
  "opportunityTypes": [],
  "sectors": [],
  "employers": [],
  "scrapeDetails": false,
  "maxItems": 25,
  "maxPages": 3,
  "requestDelayMs": 500
}
```

# Actor output Schema

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

No description

## `csv` (type: `string`):

No description

## `json` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# 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 = {
    "startUrls": [],
    "searchTerms": [
        "software"
    ],
    "locations": [],
    "opportunityTypes": [],
    "sectors": [],
    "employers": [],
    "scrapeDetails": false,
    "maxItems": 25,
    "maxPages": 3,
    "requestDelayMs": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/targetjobs-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 = {
    "startUrls": [],
    "searchTerms": ["software"],
    "locations": [],
    "opportunityTypes": [],
    "sectors": [],
    "employers": [],
    "scrapeDetails": False,
    "maxItems": 25,
    "maxPages": 3,
    "requestDelayMs": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/targetjobs-uk-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 '{
  "startUrls": [],
  "searchTerms": [
    "software"
  ],
  "locations": [],
  "opportunityTypes": [],
  "sectors": [],
  "employers": [],
  "scrapeDetails": false,
  "maxItems": 25,
  "maxPages": 3,
  "requestDelayMs": 500
}' |
apify call getascraper/targetjobs-uk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/targetjobs-uk-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/6M4tbRaVCm3j2YLcp/builds/2l5vQXiGhaByMq49R/openapi.json
