# TargetJobs UK Scraper: Graduate Jobs & Interns (`santamaria-automations/targetjobs-uk-scraper`) Actor

Extract UK graduate jobs, internships, spring weeks, and placement year listings from targetjobs.co.uk. Returns title, employer, sector, salary range, closing date, degree requirements, application URL, and diversity scheme flag. Filter by sector and opportunity type. Pay-per-result.

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

## Pricing

Pay per event

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## TargetJobs UK Scraper

Extract UK graduate jobs, internships, spring weeks, and placement year listings from [targetjobs.co.uk](https://targetjobs.co.uk), one of the country's oldest and most sector-organized graduate recruitment boards.

### What it does

Pulls live graduate opportunities off targetjobs.co.uk. Every run rebuilds its target list from the site's own sitemap (about 6,600 live listings on any given day), applies your filters, and fetches the full listing data for each match.

Filter by:

- **Sector**: accounting, consulting, law, engineering, banking, technology, and 20+ more.
- **Opportunity type**: graduate scheme, graduate job, internship, summer internship, placement year, spring week, insight day.
- **Location**: London, Manchester, Edinburgh, or any city or region.
- **Free-text keywords**: matched against the listing slug.

No login required. No captcha. HTTP-only, no browser under the hood.

### Sample output

```json
{
  "_type": "job",
  "id": "214186",
  "title": "Finance Graduate Scheme",
  "employer_name": "Equans Uk & Ireland",
  "sector": ["Accounting & finance"],
  "location": "Carlisle",
  "cities": ["Carlisle"],
  "salary_range": {
    "min": 30000, "max": 35000, "currency": "GBP", "period": "year",
    "text": "GBP 30,000 - 35,000 per year"
  },
  "employment_type": "graduate-scheme",
  "application_deadline": "2026-03-24",
  "closing_date": "2026-09-24",
  "start_date_type": "september-intake",
  "application_url": "https://www.equans.co.uk/jobs/81691-finance-graduate-scheme",
  "targetjobs_verified_employer": false,
  "diversity_scheme_flag": false,
  "company_about": "Equans is a global leader in energy and services...",
  "company_phone": null,
  "company_email": null,
  "company_website": "https://targetjobs.co.uk/companies/equans-uk-ireland",
  "company_address_street": null,
  "company_address_city": null,
  "company_address_postcode": null,
  "company_address_country": "United Kingdom",
  "company_active_jobs_count": null,
  "company_active_jobs": []
}
```

### Pricing

| Event | Price |
|-------|-------|
| Actor start | $0.001 |
| SERP result (fast mode, `includeJobDetails=false`) | $0.003 per job |
| Detail result (default mode with PDP) | $0.005 per job |
| Company profile (unique employer, `includeCompanyDetails=true`) | $0.005 per employer |

Typical cost: **$5 per 1,000 jobs** in default detail mode. SERP-only mode is $3 per 1,000 jobs (no descriptions, no employer profiles).

You only pay for rows that successfully return data. Failed fetches are not charged.

**New to Apify?** Every account gets a $5 free monthly platform credit, enough for around 1,000 detail-mode results on this actor before you commit to paying anything. Test extensively first.

### Input

| Field | Type | Description |
|---|---|---|
| `searchQueries` | array of strings | Free-text keywords matched against the listing slug. Example: `"spring week banking"`. Leave empty for all. |
| `sectors` | array of strings | Sector labels from targetjobs. Case-insensitive substring match. |
| `opportunityTypes` | array of strings | One or more of `graduate-scheme`, `graduate-job`, `internship`, `summer-internship`, `placement-year`, `spring-week`, `insight-day`. |
| `location` | string | City or region substring, matched against location + cities. |
| `searchUrls` | array of strings | (Advanced) Bypass discovery and scrape only specific `/jobs/{slug}-{id}` URLs. |
| `includeJobDetails` | boolean | Every row already includes PDP fields since TargetJobs is Gatsby SSR. Kept for interface parity. |
| `includeCompanyDetails` | boolean | Surface `company_about`, `company_website`, and other `company_*` fields from the PDP JSON organisation node. Deduplicated per employer. |
| `maxResults` | integer | Total cap on rows returned. Default 20. |
| `maxConcurrency` | integer | Concurrent listing fetches. Default 5. |

### Output fields

**Identity and role**

- `id` : targetjobs numeric node id
- `title` : job title
- `employer_name` : hiring employer
- `employer_logo_url` : logo image URL
- `sector` : list of sector labels
- `employment_type` : canonical bucket
- `workplace_type` : `onsite`, `hybrid`, `remote`

**Employer profile (populated when `includeCompanyDetails=true`)**

- `company_about`: About-us text from the TargetJobs organisation profile (embedded in PDP JSON)
- `company_website`: TargetJobs org profile URL (Gatsby `/companies/{slug}` path)
- `company_address_country`: Always "United Kingdom"
- `company_phone`, `company_email`, `company_address_street`, `company_address_city`, `company_address_postcode`: Usually null (TargetJobs does not publish postal address or contact details on the organisation node)
- `company_active_jobs_count`, `company_active_jobs`: Usually null since TargetJobs does not embed a per-employer job list in the PDP payload

**Location**

- `location` : free-text location string
- `cities` : structured list of city labels
- `country` : always `GB`

**Compensation**

- `salary_range.min`, `salary_range.max`, `salary_range.currency`, `salary_range.period`, `salary_range.text`

**Timing**

- `closing_date` : listing removal date (ISO)
- `application_deadline` : employer-set deadline (often earlier)
- `start_date_type` : `september-intake`, `summer-intake`, `rolling`, etc.
- `duration_weeks` : for internships and placements
- `posted_at` : listing creation date

**Requirements and flags**

- `degree_required` : degree class or text
- `target_universities` : degree subjects the scheme targets
- `targetjobs_verified_employer` : true when a live targetjobs employer profile is linked
- `diversity_scheme_flag` : true when title or body mentions a diversity or social-mobility programme

**Links and metadata**

- `job_url` : public targetjobs URL
- `application_url` : external apply URL (or targetjobs URL fallback)
- `description` : plain-text listing body
- `search_query`, `source_platform`, `scraped_at`

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

**Apify MCP server URL:**

`https://mcp.apify.com?tools=santamaria-automations/targetjobs-uk-scraper`

**Example prompt once connected:**

> "Use `targetjobs-uk-scraper` to get all consulting spring weeks with a February 2026 or earlier deadline. Return results as a table with employer, deadline, and application URL."

Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically.

### Why this scraper

- **Graduate-specific fields.** Most job scrapers give you title, company, salary. This one adds `employment_type` (spring week vs. summer internship vs. placement year), `start_date_type`, `duration_weeks`, `application_deadline` (often distinct from listing removal date), `degree_required`, and a `diversity_scheme_flag`.
- **Full-board discovery.** Starts from targetjobs' own sitemap, so you get everything live on the day of the run, not a cached snapshot.
- **Sector as a first-class filter.** Targetjobs organizes its board by sector; the scraper preserves that structure so you can pull "all consulting graduate schemes with an autumn 2027 intake" in one call.
- **HTTP-only.** No headless browser, no captcha subscription, no residential proxy required.

### Common use cases

- **University careers services** monitoring open spring weeks and internship deadlines per sector.
- **Graduate recruiters** benchmarking their scheme visibility against direct competitors on the same board.
- **Job aggregators** ingesting a UK-graduate-only feed to complement mainstream Reed and Indeed data.
- **Recruitment research** measuring diversity programme prevalence per sector across the graduate market.

### Notes and limits

- When `includeCompanyDetails=true`, employer data is aggregated from the PDP JSON payload (no additional HTTP requests). Each unique employer is billed once per run.

- `duration_weeks` is parsed from the listing title and body; not every internship listing states its length explicitly.

- `degree_required` is only populated when the employer set the field on targetjobs; many listings leave it blank.

- `target_universities` uses the site's `field_degree_subjects` (open-to-any-university schemes filter by subject, not by institution).

- `targetjobs_verified_employer=true` means the listing links to a live employer profile page. `false` typically means the row came in via a scraped feed and the employer hasn't paid for a profile.

- The scraper deduplicates automatically on the numeric listing id.

### Related Actors

- [Job Feed](https://apify.com/santamaria-automations/job-feed): one normalized, deduplicated job feed across 50+ international job boards. Orchestrates the NanoScrape fleet.
- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper): scrape jobs directly from company career pages (Greenhouse, Lever, Workday, etc.).
- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): extract job listings from any website via HTML pattern detection.
- [Reed.co.uk Scraper](https://apify.com/santamaria-automations/reed-uk-scraper) : mainstream UK jobs board, 200,000+ live vacancies.
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper) : worldwide job listings with detail-page enrichment.
- [Website Email Scraper](https://apify.com/santamaria-automations/website-email-scraper) : pair with any of the above to pull hiring-team contact emails from employer domains.

### Support

Bug or missing field? Open an issue in the actor's [Issues tab](https://apify.com/santamaria-automations/targetjobs-uk-scraper/issues). We usually reply within six hours. Fallback: contact@nanoscrape.com.

# Actor input Schema

## `searchQueries` (type: `array`):

Free-text terms to filter job titles/slugs. Example: 'graduate scheme', 'spring week banking', 'summer internship'. Leave empty to scrape the full board.

## `location` (type: `string`):

Location substring to match against the job's location or cities. Example: 'London', 'Manchester', 'Edinburgh'. Case-insensitive.

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

Skip discovery and scrape only the /jobs/{slug}-{id} URLs you paste here. Overrides all filters. Mutually exclusive with searchQueries.

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

Alias of searchUrls — direct job URLs to crawl instead of building from keywords. Mutually exclusive with searchQueries.

## `includeJobDetails` (type: `boolean`):

Fetch each job's detail page for the full description, structured salary, employment type, closing date, and any additional PDP-only fields. Otherwise only SERP-visible fields are returned.

## `includeCompanyDetails` (type: `boolean`):

Also fetch each unique employer's company profile page for the About-us text, phone, address, website, and a list of the employer's other currently-open roles. Deduplicated per employer within a run. Adds one HTTP hop per unique employer.

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

Filter by sector as labelled on targetjobs. Example: 'Accounting', 'Consulting', 'Law', 'Engineering', 'Investment banking'. Case-insensitive substring match. Leave empty for all sectors.

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

Filter by role type. Options: 'graduate-scheme', 'graduate-job', 'internship', 'summer-internship', 'placement-year', 'spring-week', 'insight-day'. Leave empty for all.

## `maxResults` (type: `integer`):

Total cap on job listings returned. Small numbers keep runs cheap and fast during testing.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per individual search query or start URL. Total run is capped by maxResults.

## `maxConcurrency` (type: `integer`):

Concurrent PDP fetches. 5 is safe. Raise for large runs.

## Actor input object example

```json
{
  "searchQueries": [
    "graduate scheme"
  ],
  "location": "London",
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset of scraped UK graduate opportunities.

# 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 = {
    "searchQueries": [
        "graduate scheme"
    ],
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/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 = {
    "searchQueries": ["graduate scheme"],
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/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 '{
  "searchQueries": [
    "graduate scheme"
  ],
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 5
}' |
apify call santamaria-automations/targetjobs-uk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/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/BJDE02NakKMF6beDg/builds/hGSVw8KuUwxQqYkIy/openapi.json
