Totaljobs Scraper 💰 $1.35/1K — UK Jobs, Salaries & Contacts avatar

Totaljobs Scraper 💰 $1.35/1K — UK Jobs, Salaries & Contacts

Pricing

from $1.35 / 1,000 results

Go to Apify Store
Totaljobs Scraper 💰 $1.35/1K — UK Jobs, Salaries & Contacts

Totaljobs Scraper 💰 $1.35/1K — UK Jobs, Salaries & Contacts

Extract UK job listings, salaries, company details and contact info from totaljobs.com. 8 server-side filters, incremental monitoring with repost detection, and Slack/Telegram/Discord alerts. Lead-gen ready — filter to only jobs with an email or phone.

Pricing

from $1.35 / 1,000 results

Rating

0.0

(0)

Developer

Corvuslab

Corvuslab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Share

What does Totaljobs Scraper do?

Totaljobs Scraper extracts structured job listings from totaljobs.com, the UK's largest independent job board. Enter a keyword like data analyst and a location like Manchester — or paste any Totaljobs search or detail URL — and get back clean, typed records with salary breakdowns, company details, posting dates, geo coordinates, descriptions in three formats (text, HTML, Markdown) and extracted contact information. Use the built-in lead-gen filter to keep only listings with an email or phone, turning every run into a ready-made outreach list. Export to JSON, CSV, Excel or pull from the API — no code required.

New to Apify? You can sign up for free and use the included monthly platform credit to try this Actor.

Why this scraper

  • Fast & low-cost — lightweight requests with no browser overhead, so large runs stay cheap.
  • 🧾 Rich, typed records — 60 structured fields per job, not raw HTML.
  • ♻️ Cheap to monitor — incremental mode re-scrapes only what changed (see below).
  • 🔔 Notifications built in — Telegram, Slack, Discord or any webhook.
  • 🤖 AI- & API-ready — compact output, MCP-friendly, one-click integrations.

Key features

  • 🔎 Search or URL scraping — run a keyword + location search, or paste Totaljobs search and detail URLs directly.
  • 🎚️ 8 server-side filters — job type, company type (direct / agency), posted within, sort order, radius, minimum salary (annual / daily / hourly) and exclude-sponsored — all applied on the site so you only download what you need.
  • 🧾 Structured salary — the human-readable salary string plus a parsed breakdown (min, max, currency, period) when the listing provides it.
  • 📝 3 description formats — plain text, HTML and Markdown, with optional length truncation to control LLM prompt cost.
  • 📇 Contacts & lead gen — emails, phones, URLs and social profiles extracted from every listing. Use the built-in require-contact filter to keep only leads with a verified email, phone or both — every run is a ready-made outreach list with no post-processing.
  • ♻️ Incremental monitoring with repost detection — schedule it and get only NEW, UPDATED and EXPIRED records; unchanged items are skipped before their page is even fetched. The repost detector flags jobs that reappear after expiring, so you never double-count a recycled vacancy.
  • 🔔 4 notification channels — Telegram, Slack, Discord or any generic webhook (n8n / Make / Zapier). Combine with incremental mode to get pinged only about genuinely new or changed jobs.
  • 🤖 AI-ready — compact mode + drop-empty output keep payloads small for LLMs and MCP tool chains.
  • 🚫 Exclude sponsored — strip promoted listings for cleaner organic results.

🚀 How to scrape Totaljobs

  1. Open the actor and enter a search keyword (e.g. data analyst) and optionally a location (e.g. London) — or paste a Totaljobs URL.
  2. Pick any combination of the 8 filters (job type, company type, posted within, sort, radius, minimum salary + period, exclude sponsored).
  3. Set Max results and choose whether to fetch full details.
  4. (Optional) Turn on incremental mode and a notification channel, then Schedule it.
  5. Click Start.
  6. Download the data as JSON, CSV or Excel, or pull it from the API.

New to Apify? Create a free account — it comes with monthly credit, no credit card required.


Input

Configure it in the visual editor — no code needed — or pass JSON via the API.

FieldWhat it does
queryKeyword search (comma-separate for multiple searches).
locationCity, town or region (e.g. London, Manchester). Leave empty for all UK.
startUrlsScrape specific Totaljobs search or detail URLs directly.
jobTypeFilter: permanent, contract, part-time, temporary or work from home.
companyTypeFilter: direct employer or agency.
postedWithinFilter: last 24 hours, 3, 7 or 14 days.
sortBySort by relevance, date or salary (high / low).
radiusSearch radius: 5, 10, 20 or 30 miles from the location.
minSalaryMinimum salary filter (period set by salaryPeriod).
salaryPeriodSalary period: annual (default), daily rate, or hourly rate.
excludeSponsoredSkip promoted / sponsored listings.
includeDetailsFetch each job's detail page for description, salary breakdown and coordinates.
requireContactKeep only listings with an email, phone or both — built-in lead-gen filter.
outputFieldsPick exactly which fields to include (e.g. ["title", "url", "salary"]). Overrides compact.
compactReturn only core fields — ideal for AI agents and MCP clients.
incrementalModeEmit only what changed since the last run.
maxResultsCap the number of records (0 = unlimited).

...and 35 inputs in total — the table shows the essentials; the rest cover notification channels, output/AI modes, repost detection and advanced tuning, all in the visual editor.

Example inputs

Basic keyword search

{ "query": "software engineer", "location": "London", "maxResults": 100 }

Filtered search — recent permanent roles above a salary floor

{
"query": "data analyst",
"location": "Manchester",
"jobType": "permanent",
"postedWithin": "7",
"minSalary": 35000,
"sortBy": "salary_high",
"maxResults": 200
}

Incremental monitoring with Slack alerts

{
"query": "devops engineer",
"location": "Bristol",
"incrementalMode": true,
"skipReposts": true,
"notifyOnlyChanges": true,
"slackWebhookUrl": "https://hooks.slack.com/services/T.../B.../xxx",
"maxResults": 0
}

Output

Each item in the dataset is one job listing. Fetch full details is on by default and enriches every record with the full description, structured salary, geo coordinates, benefits, company ratings and extracted contacts. Here is a real detail-enriched record:

{
"id": "107882681",
"title": "Software Engineer",
"url": "https://www.totaljobs.com/job/software-engineer/hackajob-ltd-job107882681",
"companyId": "1461528",
"companyName": "Hackajob Ltd",
"companyUrl": "https://www.totaljobs.com/jobs/hackajob-ltd?cmpId=1461528&cmp=1",
"companyLogoUrl": "https://tjgliveassets.s3.eu-west-1.amazonaws.com/company-logos/01a731a76abe4ee4b5f58b72600d5a61.png",
"companyWebsite": "https://hackajob.co",
"companyRating": null,
"location": "St James, South West London (SW1), SW1A",
"postCode": "SW1A",
"datePosted": "2026-08-21T15:09:05.95Z",
"workFromHome": "2",
"remoteType": "hybrid",
"salary": "£40k - £70k per year",
"salaryMin": 40000,
"salaryMax": 70000,
"salaryCurrency": "GBP",
"salaryPeriod": "year",
"description": "We are looking for a Software Engineer to join our team...",
"descriptionHtml": "<p>We are looking for a Software Engineer...</p>",
"descriptionMarkdown": "We are looking for a **Software Engineer**...",
"employmentType": "FULL_TIME",
"industry": "IT",
"benefits": ["Pension", "Private healthcare", "25 days holiday"],
"validThrough": "2026-10-02T15:09:05.95Z",
"latitude": 51.5014,
"longitude": -0.1419,
"country": "GB",
"region": "London",
"directApply": true,
"extractedEmails": ["careers@hackajob.co"],
"socialProfiles": { "linkedin": "https://linkedin.com/company/hackajob" },
"textSnippet": "hackajob is partnering directly with BAE Systems Digital Intelligence...",
"skills": ["Python", "AWS", "Docker"],
"isSponsored": false,
"publishFromDate": "2026-08-21T15:09:05.95Z",
"publishToDate": "2026-10-02T15:09:05.95Z",
"source": "totaljobs",
"searchKeyword": "software engineer",
"scrapedAt": "2026-08-24T12:52:14.173Z",
"detailFetched": true
}

Descriptions come as plain text, HTML and Markdown — choose the format with the Description format input, or truncate with Description max length to control LLM prompt cost.

When incremental mode is on, records carry a changeType field (NEW / UPDATED / EXPIRED) and repost-detection fields (isRepost, repostOfId, repostDetectedAt).

Data fields

  • Core — id, title, url, location, postCode, datePosted, salary, textSnippet, skills, labels, isSponsored, publishFromDate, publishToDate, harmonisedId, source, searchKeyword, scrapedAt.
  • Details (with includeDetails) — description, descriptionHtml, descriptionMarkdown, employmentType, industry, benefits, validThrough, salaryMin, salaryMax, salaryCurrency, salaryPeriod, latitude, longitude, country, region, streetAddress, directApply, workFromHome, remoteType.
  • Contacts & signals — extractedEmails, extractedPhones, extractedUrls, socialProfiles, phoneNumber, applyEmail, contactName.
  • Company — companyId, companyName, companyUrl, companyLogoUrl, companyWebsite, companyRating.
  • Incremental — changeType, contentHash, isRepost, repostOfId, repostDetectedAt.

Every field is present in standard mode (missing values are null); compact mode returns the core fields only, for lean AI/MCP payloads. Use outputFields to pick exactly the fields you need. With excludeEmptyFields enabled, null/empty fields are omitted entirely.


📇 Built-in lead-gen filter — no post-processing

Most scrapers dump everything and leave filtering to you. This one has a require-contact filter built in: set requireContact to email, phone, either or both and only listings with verified contact details make it into your dataset. Every run is a ready-made outreach list — no spreadsheet cleanup, no extra tools.

Combine it with incremental mode to get notified only when a new job with contact details appears:

{
"query": "sales manager",
"requireContact": "email",
"incrementalMode": true,
"notifyOnlyChanges": true,
"slackWebhookUrl": "https://hooks.slack.com/services/T.../B.../xxx"
}

💡 What can you do with Totaljobs data?

  • Lead generation — filter for listings with emails or phone numbers and feed them straight into your CRM or outreach tool.
  • Market & salary research — track salary ranges, employment types and in-demand skills across UK regions and industries.
  • Vacancy monitoring — schedule it with incremental mode + notifications for a live feed of new, updated and expired jobs in your niche.
  • Recruitment intelligence — spot which companies are hiring, how long their postings stay live and whether they repost expired roles.
  • Enrichment & aggregation — merge clean Totaljobs records with data from other boards into a single warehouse or spreadsheet.
  • AI agents & pipelines — compact output plugs straight into LLM/MCP workflows for automated job matching, summarization or alerting.

♻️ Incremental monitoring — pay for changes, not repeats

Schedule the actor and turn on incremental mode: each run compares against the last and emits only NEW / UPDATED / EXPIRED records — unchanged items are skipped before their detail page is fetched, so a daily watch costs a fraction of a full re-scrape.

Enable Skip reposts to automatically detect jobs that reappear after expiring — recycled vacancies are flagged rather than counted as new, giving you a cleaner change feed.

Daily churnof 1,000 trackedbillable recordsyou save
5 %1,0005095 %
15 %1,00015085 %
30 %1,00030070 %

The first run seeds the baseline and bills in full; every run after that bills only the delta.


💰 How much does it cost to scrape Totaljobs?

This Actor uses the pay-per-event pricing model: a small fee at run start plus a per-record fee. It runs on lightweight HTTP requests with no browser overhead, so the underlying platform cost is minimal.

RecordsEvent costTypical total
10~$0.02~$0.03
25~$0.04~$0.05
100~$0.15~$0.16
500~$0.69~$0.71
1,000~$1.36~$1.39

Event cost = $0.01 run start + $0.00135 per record. Total includes estimated compute and residential proxy.

Incremental mode slashes recurring costs. Unchanged records are skipped before their detail page is fetched, so a daily monitoring run bills only the delta — see the savings table above. New Apify accounts get $5 in monthly credit — enough to run several hundred jobs with no credit card.


🔌 Integrations & export

Export to JSON, CSV, Excel or an HTML table, or pull from the REST API and the JavaScript / Python clients. Runs on a schedule, connects to Google Sheets, Slack, Make, Zapier and n8n, and works as an MCP tool for AI agents via the Apify MCP server at https://mcp.apify.com — compact mode keeps token usage small.


🔗 Using the API

You can run this Actor from your own code. Example with the Apify Python client:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run_input = {
"query": "data analyst",
"location": "Manchester",
"jobType": "permanent",
"maxResults": 50,
}
run = client.actor("corvuslab/totaljobs-scraper").call(run_input=run_input)
print("Results: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

The Actor also works with the JavaScript/TypeScript client, the Apify CLI and the REST API.


❓ FAQ

Do I need a proxy or login? No login — it runs out of the box with residential proxy (included in the default config). No setup needed.

Can I get only new jobs on a schedule? Yes — turn on incremental mode and schedule it; each run emits only what changed and can notify your channel.

What are the 8 filters? Job type, company type (direct / agency), posted within, sort order, search radius, minimum salary (annual / daily / hourly), and exclude sponsored. All are applied on the site itself so you only download matching results.

What formats can I export? JSON, CSV, Excel, HTML table, or via the API.

Is it good for AI agents? Yes — enable compact mode; the output is MCP-friendly and you can truncate descriptions to control token cost.

How does repost detection work? When incremental mode is on, the actor remembers expired listings. If a job reappears with the same content, it is flagged as a repost rather than counted as new — so your change feed stays clean.

How many records can I get? As many as the search returns — set maxResults to cap the volume (0 = unlimited).

Can it notify me when new jobs appear? Yes — add a Telegram, Slack, Discord or generic webhook target under Notifications, and combine with incremental mode so you only get pinged about new and updated jobs.

Is scraping Totaljobs legal? This actor collects only publicly available data on totaljobs.com. You are responsible for how you use the extracted data — in particular any personal information — and for complying with the site's terms and applicable law (including the GDPR where it applies). Not affiliated with, endorsed by, or sponsored by Totaljobs or the StepStone Group.


Keywords: totaljobs scraper · totaljobs api · totaljobs.com scraper · UK job scraper · UK job board scraper · totaljobs data extraction · job listings scraper · scrape totaljobs · totaljobs salary data · UK recruitment data · job monitoring · job vacancy tracker · lead generation jobs UK · export totaljobs to CSV · export totaljobs to Excel · no-code job scraper · MCP tool for AI agents · totaljobs job alerts