# TargetJobs Graduate Jobs Scraper (`steadyscrape/targetjobs-graduate-jobs-scraper`) Actor

Scrape TargetJobs UK graduate jobs, schemes, internships and placements by keyword, role type, city, sector and employer: salary, application deadline, start date, apply link and full description. gradireland too. Only-new mode. Export to JSON, CSV or Excel, or via API.

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

## Pricing

from $1.50 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Graduate Jobs Scraper

Scrape **graduate jobs, graduate schemes, internships, placements, insight programmes and vacation schemes** from
**[TargetJobs](https://targetjobs.co.uk)**, the UK graduate job board, by **keyword**, **role type**, **city**, **sector** and
**employer**. This TargetJobs scraper gives every open opportunity with its **employer**, **role type**, **cities**,
**sectors**, **salary as numbers**, **application deadline**, **start date**, **application link** and the **full job
description** — and, from each job's own page, the **graduate scheme / job distinction**, **work arrangement** (in person,
hybrid, remote), **degree requirements**, **benefits**, **every start date**, **the day applications open**, **office
addresses** and the **employer's size and type**.

Also reads **[gradireland](https://gradireland.com)**, the Irish graduate board on the same platform, at the same price.

No start fee, no login. Pay only for the jobs you get; searches that find nothing cost nothing.

> This Actor is unofficial and is not affiliated with, endorsed by or connected to TargetJobs, gradireland or Group GTI.

### What you can do with this TargetJobs graduate jobs scraper

- **Graduate job feeds and alerts**: schedule it daily with **Posted within** and **Only new jobs** to receive just the
  graduate jobs and internships published since the last run — into a spreadsheet, Slack, email or a careers site through
  Apify's integrations.
- **Deadline tracking for students and careers services**: every open scheme **sorted by application deadline**, with the
  day applications open and the start dates, so nothing closes unnoticed.
- **Graduate salary benchmarking**: published graduate salaries as numbers, by sector, role type and city.
- **Employer and market research**: which employers are hiring graduates, interns and placement students, in which
  sectors and cities, and how many schemes each runs.
- **Lead generation for graduate recruitment, campus marketing and training providers**: who is recruiting early-career
  talent right now, with links to the employer profiles.
- **Ireland too**: the same searches on gradireland (Dublin, Cork, Galway…).

### Input

Search with keywords and filters, or paste lists copied from either site.

| Field | What it does |
|---|---|
| **Job board** | TargetJobs (UK) or gradireland (Ireland). |
| **Keywords** | Job titles, skills or employers (`software engineer`, `data analyst`, `audit`). Each keyword is one search. Leave empty to list everything the filters match. |
| **Keyword matching** | **Exact phrase** (default: `software engineer` finds 290 open opportunities) or **any word**, as the site's own search box (1,924: everything with "software" or "engineer", most relevant first). |
| **Role types** | Graduate job, internship, placement, insight programme, vacation scheme, work experience, training (degree apprenticeships), law training contract, law pupillage, postgraduate study, casual work, and graduate scheme on gradireland. |
| **Cities**, **Sectors**, **Employers** | As the sites list them (`London`, `Manchester`; `Accounting & finance`, `Technology`, `Software engineering`; `Deloitte`, `EY`). Case and accents do not matter. A name the site does not list gives a free row naming close ones. |
| **List links** | A list page such as `https://targetjobs.co.uk/graduate-jobs/london` or `https://targetjobs.co.uk/internships`, or the search page with its filters, read with the site's own filters. |
| **Posted within** | Last 24 hours, 3, 7, 14 or 30 days. |
| **Minimum salary**, **Only with salary** | Keep jobs whose published salary figure reaches an amount, or that publish one at all. |
| **Sort by** | Newest first, closing soonest (deadline), or most relevant. |
| **Include job details** | Read each job's own page (charged as `job-with-details`). On by default. |
| **Max jobs per search** | 0 for every job the search lists. |
| **Only new jobs** | Deliver and charge only jobs an earlier run with the same input did not deliver. |

Example: graduate jobs and placements in London and Manchester in technology, newest first:

```json
{
    "roleTypes": ["graduate-job", "placement"],
    "locations": ["London", "Manchester"],
    "sectors": ["Technology"],
    "maxJobsPerSearch": 200
}
```

### Output

One row per job. Example (trimmed):

```json
{
    "site": "targetjobs",
    "jobId": "255939",
    "url": "https://targetjobs.co.uk/jobs/private-capital-audit-graduate-programme-autumn-2027-255939",
    "title": "Private Capital Audit Graduate Programme (Autumn 2027)",
    "employerName": "Grant Thornton UK",
    "employerUrl": "https://targetjobs.co.uk/organisations/grant-thornton-uk",
    "roleTypes": ["Graduate job"],
    "location": "London, Cardiff, Milton Keynes, Cambridge",
    "cities": ["Cambridge", "Cardiff", "London", "Milton Keynes"],
    "sectors": ["Accounting", "Accounting & finance"],
    "salaryMin": 34250,
    "salaryMax": 34250,
    "salaryCurrency": "GBP",
    "applicationDeadline": "2026-11-30",
    "applicationOpen": true,
    "applicationUrl": "https://www.grantthornton.co.uk/careers/early-careers-job-search/...",
    "startDate": "2027-09-01",
    "postedAt": "2026-10-30T13:51:48.000Z",
    "isImportedListing": false,
    "description": "Go one better than Four. The industry is set to change...",
    "search": "accountant",
    "position": 1,
    "details": {
        "detailedRoleTypes": ["Graduate scheme"],
        "workArrangement": "In Person",
        "degreeRequirements": [],
        "startDates": ["2027-09-01"],
        "applicationOpensOn": "2026-10-30",
        "listedUntil": "2027-05-30",
        "addresses": [{ "street": null, "city": "London", "postcode": null, "country": "United Kingdom" }],
        "employerType": "Employer",
        "employerSize": "10000+",
        "employerSectors": ["Accounting & finance"]
    }
}
```

A search, link or filter value that finds nothing gives a free row with `rowType: "status"`, a `status` (`no_results`,
`not_found`, `invalid`, `blocked`) and the `reason`. The run's `SUMMARY` record lists each search with its count on the
site, the filters as the site spells them and the jobs left out by your salary filters.

#### Fields

| Field | Meaning |
|---|---|
| `rowType`, `status` | `job` and `ok` for a job; `status` rows explain a search that gave none. |
| `site`, `jobId`, `uuid`, `url` | The board, the job's id and its page. |
| `title`, `employerName`, `employerUrl` | The job, the employer, and its profile on the site (imported listings have no profile). |
| `roleTypes`, `location`, `cities`, `regions`, `sectors` | Role type, the location as written, and the site's cities, regions and sectors. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryBands` | The published salary figures and currency, or the bands named instead ("£25,000 to £30,000"). |
| `applicationDeadline`, `applicationOpen`, `registerInterestOnly`, `applicationUrl` | Deadline (YYYY-MM-DD, `null` for rolling), whether applications are open or only registrations of interest, and where to apply. |
| `startDate`, `postedAt`, `updatedAt` | Start date, and when the job was posted and last changed. |
| `isPromoted`, `isFeatured`, `isFreeListing`, `isImportedListing`, `externalId` | Paid placement flags, whether the site imported the listing from another source, and the source's own id. |
| `description`, `descriptionHtml` | The full job description as text and as HTML. |
| `search`, `searchUrl`, `position`, `scrapedAt` | Which search found the job, that search on the site, its place in the search, and when. |
| `details.detailedRoleTypes`, `details.workArrangement` | The job page's own role type ("Graduate scheme") and "In Person", "Hybrid" or "Remote". |
| `details.degreeRequirements`, `details.degreeSubjects`, `details.benefits` | As the employer lists them. |
| `details.startDates`, `details.applicationOpensOn`, `details.listedUntil` | Every intake's start date, the day applications open, and the day the site takes the listing down. |
| `details.addresses`, `details.employerType`, `details.employerSize`, `details.employerSectors` | Office addresses, and the employer's type, size and sectors. |

### Pricing

Pay per event, no start fee:

| Event | Price |
|---|---|
| `job` — a job as the search lists it, full description included | US$0.0015 |
| `job-with-details` — a job with its own page read | US$0.0025 |

Rows with a reason and jobs already delivered earlier in the run are free. A job whose page cannot be read is delivered as
listed, at the `job` price. Set a maximum cost per run in Apify and the Actor stops at it.

### Limits

- Only **open** opportunities are listed, as on the sites themselves; closed ones are not available.
- Many listings (about four in five of the newest on TargetJobs) are **imported** by the site from employers' own career
  pages: they carry the employer's name, description and application link, but rarely a salary, a deadline or job page
  details. `isImportedListing` marks them.
- TargetJobs publishes salary **figures without a period**: graduate jobs give yearly pay, some vacation schemes and
  placements weekly pay (550, 750). A yearly **Minimum salary** leaves those out.
- TargetJobs files graduate schemes as **Graduate job** in its search; the job page's own role type (`detailedRoleTypes`)
  says "Graduate scheme". gradireland lists schemes apart.
- A job the site published in the last hours may have **no job page yet**: it is delivered as listed.
- Recruiters' names, emails and phone numbers are not collected as fields; descriptions are delivered as the site serves them.

### Is it legal to scrape TargetJobs?

This Actor reads public job listings that anyone can see without an account, through the same search the site's own pages
use, follows robots.txt (which allows everything), and asks for one page a second. It collects no personal data as fields.
Check that your use of the data complies with the sites' terms and with the UK GDPR and other laws that apply to you. This
Actor is unofficial and not affiliated with TargetJobs, gradireland or Group GTI.

# Actor input Schema

## `site` (type: `string`):

TargetJobs (targetjobs.co.uk, UK graduate jobs) or gradireland (gradireland.com, the Irish board on the same platform). Pasted links are read on the board they belong to.

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

Job titles, skills or employers, e.g. <code>software engineer</code>, <code>data analyst</code>, <code>audit</code>, <code>law</code>. Each keyword is one search, with every filter below. Leave empty to list all open opportunities that match the filters.

## `keywordMatch` (type: `string`):

Exact phrase (<code>software engineer</code>: 290 open opportunities) or any of its words, as the site's own search box matches (1,924: everything with "software" or "engineer", most relevant first).

## `roleTypes` (type: `array`):

Leave empty for every type. TargetJobs files graduate schemes as Graduate job; gradireland lists them apart.

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

Leave empty for every place. Cities as the site lists them: <code>London</code>, <code>Manchester</code>, <code>Bristol</code>, <code>Edinburgh</code>, <code>Belfast</code>; <code>Dublin</code>, <code>Cork</code> on gradireland. Case and accents do not matter. A city the site does not list gives a free row with close names.

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

Leave empty for every sector. As the site names them: <code>Accounting & finance</code>, <code>Technology</code>, <code>Engineering</code>, <code>Law</code>, <code>Consulting</code>, or a narrower one such as <code>Software engineering</code>, <code>Tax</code>, <code>Actuarial</code>.

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

Only these employers' opportunities, as the site names them: <code>Deloitte</code>, <code>EY</code>, <code>Lloyds Banking Group</code>, <code>BAE Systems</code>.

## `searchUrls` (type: `array`):

Lists copied from either site, read with their own filters: a list page such as <code>https://targetjobs.co.uk/graduate-jobs/london</code> or <code>https://targetjobs.co.uk/internships</code>, or the search page with its filters, such as <code>https://targetjobs.co.uk/search/jobs?search=data%20analyst\&opportunity_type=Internship</code>. One job's page is not taken.

## `postedWithin` (type: `string`):

Only opportunities the site published in the last days. Combine with a schedule and Only new jobs for a daily feed.

## `minSalary` (type: `integer`):

Only jobs whose published salary figure reaches this amount (in the job's currency). The site publishes figures without a period: graduate jobs give yearly pay, but some vacation schemes and placements give weekly pay (550, 750), which a yearly minimum leaves out. Jobs without figures are left out when this is set.

## `onlyWithSalary` (type: `boolean`):

Leave out jobs that publish no salary figure.

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

Newest first, closing soonest first (jobs with a rolling deadline last), or most relevant to the keyword first.

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

Open each job's page for the finer role type (graduate scheme), work arrangement (in person, hybrid, remote), degree requirements and subjects, benefits, every start date, the day applications open, the day the listing ends, office addresses, and the employer's type, size and sectors. Charged as job-with-details instead of job.

## `maxJobsPerSearch` (type: `integer`):

Stop each search (each keyword, and each link) after this many jobs. 0 means every job it lists.

## `onlyNewJobs` (type: `boolean`):

Deliver, and charge, only jobs that an earlier run with the same searches and filters has not delivered. Made for scheduled runs.

## Actor input object example

```json
{
  "site": "targetjobs",
  "keywords": [
    "software engineer"
  ],
  "keywordMatch": "phrase",
  "roleTypes": [],
  "locations": [
    "London"
  ],
  "sectors": [],
  "employers": [],
  "searchUrls": [],
  "postedWithin": "any",
  "onlyWithSalary": false,
  "sortBy": "newest",
  "includeDetails": true,
  "maxJobsPerSearch": 2,
  "onlyNewJobs": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "keywords": [
        "software engineer"
    ],
    "locations": [
        "London"
    ],
    "maxJobsPerSearch": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/targetjobs-graduate-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": ["software engineer"],
    "locations": ["London"],
    "maxJobsPerSearch": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/targetjobs-graduate-jobs-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keywords": [
    "software engineer"
  ],
  "locations": [
    "London"
  ],
  "maxJobsPerSearch": 2
}' |
apify call steadyscrape/targetjobs-graduate-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape/targetjobs-graduate-jobs-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/vudIX92aMDk9yiqVg/builds/ELY1XwjUeRXxXaJ9a/openapi.json
