# Totaljobs Scraper (UK Jobs, Salaries, Locations) (`webdatatools/totaljobs-scraper`) Actor

Scrape Totaljobs UK job listings by keyword and location: job title, employer, location, salary text, work type, posting date, snippet and link.

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

## Pricing

from $0.96 / 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.
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

## Totaljobs Scraper (UK Jobs, Salaries, Locations)

### What is Totaljobs Scraper?

Totaljobs Scraper collects UK job listings from [Totaljobs](https://www.totaljobs.com) by keyword and location. Each job becomes one row with the title, employer, location, salary text, how long ago it was posted, a description snippet and the Totaljobs job link. Totaljobs blocks datacenter IPs, so the actor reads its results pages through Apify's residential proxy (UK). No login is used.

### What data does Totaljobs Scraper extract?

| Field | Type | Meaning |
|---|---|---|
| `jobId`, `url` | string | Totaljobs job id and job page link |
| `title` | string | Job title |
| `company` | string | Employer name as shown on the results card |
| `location` | string | Town and county as shown on the card |
| `salaryText` | string | Pay as written on the card, e.g. `Competitive`, `£55000 - £62000 per annum`; null when absent |
| `postedAgo` | string | Relative posting age as Totaljobs shows it, e.g. `2 days ago` (not a date) |
| `snippet` | string | Opening sentences of the advert, up to 500 characters |
| `totalMatches` | number | Total matches Totaljobs reports for the search (for example 101,532 for `developer`) |
| `searchKeyword`, `searchLocation` | string | The search that found the row |
| `scrapedAt` | ISO string | When the row was collected |

### How to use Totaljobs Scraper

1. Open the actor in Apify and go to the Input tab.
2. Enter one or more keywords separated by `;`, for example `developer; data analyst`.
3. Optionally enter a UK place, for example `London`.
4. Set the maximum jobs per search and click Start.
5. Download the dataset as JSON, CSV or Excel.

### Example input

```json
{
    "keywords": "developer",
    "maxJobs": 40
}
```

### Example output

Real row from a run on 2026-10-23 (input above; trimmed for length):

```json
{
    "position": 1,
    "jobId": "108144203",
    "title": "Developer",
    "url": "https://www.totaljobs.com/job/developer/computershare-investor-services-plc-job108144203",
    "company": "Computershare Investor Services Plc",
    "location": "Bristol, Avon",
    "salaryText": "Competitive",
    "postedAgo": "1 week ago",
    "snippet": "Computershare is a global financial services and technology company. They're looking for a developer to design, build and deploy software solutions across their application portfolio. ...",
    "searchKeyword": "developer",
    "totalMatches": 101532
}
```

The run returned 40 rows from 50 scanned cards in about 8 seconds (run `NDdWRUmdXO31KCApf`). Platform usage, including the residential proxy traffic: USD 0.00368.

### Input parameters

- **Keywords**: one or more searches separated by `;`.
- **Location**: a UK place name. Empty = all of the UK.
- **Max jobs per search**: up to 1,000 per keyword.
- **Save debug page** (maintainers only): stores the first results page HTML and stops.

### Pricing

Pay per result: **USD 0.0012 per job** at the base tier. Volume tiers step down to USD 0.00096 per job on the highest plans, which is the lowest price used for the margin check below. The actor start is billed as well (USD 0.00005).

Measured platform usage: USD 0.00368 for 40 rows, about USD 0.00009 per row, almost all of it residential proxy traffic. At the base tier that leaves roughly 72% margin after Apify's 20% share; at the lowest tier roughly 70%. The leading competing Totaljobs actor on the Store lists USD 0.00139 per result.

### Totaljobs Scraper vs. alternatives

- **Proxy**: a residential UK proxy is required. Direct requests from Apify's datacenter IPs were refused (HTTP 403) in our tests.
- **Coverage**: the search results only. The card gives the snippet, not the full advert; full text needs a request per job page, which this version does not make.
- **Pay**: most cards show no pay or a generic word such as `Competitive`; salary min and max are not parsed.

### Using Totaljobs Scraper with AI agents

The actor has pay-per-result pricing, a bounded maximum per search and a schema with a description for every input. An agent can pass keywords and a place and read the rows.

### FAQ

**Why does it cost more than the other job actors?** Every page goes through a residential proxy. The cost is measured and included in the price.

**Why is `postedAgo` not a date?** Totaljobs shows relative times on the results cards. Exact dates are on the job page only.

**Why are some salaries empty?** Employers often leave pay out of the advert.

**What if Totaljobs changes its layout?** The actor finds no result cards and writes an ERRORS record instead of returning bad rows. Layout changes need an update to the parser.

**Does it cover Scotland or Ireland?** It follows Totaljobs' own UK search; places are matched as Totaljobs matches them.

### Support

Use the Issues tab on the actor page. Totaljobs is a third-party site; this actor is not affiliated with Totaljobs or its owner.

# Actor input Schema

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

Job title, skill or company, e.g. `developer` or `data analyst`. Several separated by `;` run one after another.

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

Optional UK place, e.g. `London`, `Manchester`. Leave empty for all of the UK.

## `maxJobs` (type: `integer`):

For each keyword, read until this limit or the end of the results.

## `debugSave` (type: `boolean`):

Stores the first results page HTML in the key-value store (DEBUG_PAGE) and stops. For maintainers.

## Actor input object example

```json
{
  "keywords": "developer",
  "maxJobs": 100,
  "debugSave": false
}
```

# Actor output Schema

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

All totaljobs jobs from this run.

# 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": "developer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdatatools/totaljobs-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": "developer" }

# Run the Actor and wait for it to finish
run = client.actor("webdatatools/totaljobs-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": "developer"
}' |
apify call webdatatools/totaljobs-scraper --silent --output-dataset

```

## MCP server setup

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