Totaljobs Scraper icon

Totaljobs Scraper

Scrape UK job listings from Totaljobs.com by keyword, location, filters, or URL. Extract 40+ fields including title, parsed salary range and period,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Totaljobs Scraper at a glance

Totaljobs Scraper is a ready-to-run Apify actor from abotapi for collecting jobs data. Its documented output includes job id, change type (incremental mode), title, brand and employer, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Jobs, Automation, Developer Tools
Pricing
$2.00 per 1,000 results (Free plan), from $1.20 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
36 options

Scrape UK job listings from Totaljobs.com by keyword, location, filters, or URL. Extract 40+ fields including title, parsed salary range and period, employer, logo, GPS location, skills, employment type, full description, posting date, and apply link.

What Totaljobs Scraper can do

  • 35+ fields per job from the listing page alone, no detail fetch required: title, parsed salary, employer, logo, location, posting source, and more.
  • Two ways to run. Build a search from keyword, location, and filters, or paste any Totaljobs.com search link and walk it forward.
  • Salary parsed for you. The free-text salary string on each listing is split into minimum, maximum, currency, and period (year, day, or hour), covering the daily and hourly rates common in UK job ads.
  • Real server-side filters. Job type, advertiser type (direct employer vs. agency), minimum salary by period, posted-within window, and sort order, all sent to the site itself rather than filtered after the fact.
  • Optional full detail pass. GPS coordinates, a structured address, the full description, employment type, a valid-through date, an apply type, a company profile, and any recruiter phone number or email visible on the listing itself.
  • One clear cap. maxListings is the single limit on how many jobs a run collects; leave maxPages unset to walk a search until Max jobs is reached, the site's last page, or the built-in ceiling of 1000 pages (25,000 jobs) per search or link, whichever comes first.

Choose what to collect

These inputs let you configure Totaljobs Scraper - UK Jobs, Salaries & Employers. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredHow to find jobs: build a search from filters, or paginate URLs you paste.

Choices: search, url

locationsarrayTowns, cities, counties, or regions (Search mode). Examples: 'London', 'Manchester', 'Edinburgh', 'Surrey'. One search runs per location. Leave empty for all of the UK.
keywordsstringJob title, skill, or company to search for. Example: 'nurse', 'java developer', 'project manager'. Leave empty to list all jobs in the location.
jobTypestringContract / working arrangement filter.

Choices: any, permanent, contract, temporary, part-time, work-from-home

companyTypestringRestrict to direct employers or recruitment agencies.

Choices: any, employer, agency

minSalaryintegerLowest salary to include. Combined with the salary period below. Leave empty for no minimum.
salaryTypestringUnit for the minimum salary filter.

Choices: annual, daily, hourly

Show 29 more inputs
More input fields
InputWhat it controls
postedWithinstringOnly jobs posted within this many days. Leave as Any time for no date filter.

Choices: 0, 1, 3, 7, 14

sortBystringResult ordering.

Choices: relevance, date, salary-desc, salary-asc, distance

remotebooleanSame as job type Work from home.
contractTypestringCONTRACT, FREELANCE, TEMPORARY and PART_TIME map onto the matching Job type. Job type wins when both are set.

Choices: CONTRACT, FREELANCE, TEMPORARY, PART_TIME

excludeSponsoredbooleanSkip rows the site marks as sponsored. Skipped rows are not pushed and not charged.
urlsarrayTotaljobs.com links to scrape (URL mode): search-result links (location, keyword, job type, company, filtered, sorted or paginated) and single job pages (/job/...). One example of each shape is prefilled. Filter fields above are ignored. A page number in a search link is honoured as the starting point. Unsupported links are skipped with a clear log message.
maxListingsintegerTotal jobs to collect across all searches. This is the main limit. Set 0 for unlimited (bounded by Max pages).
maxPagesintegerOptional safety limit on pages walked per location/URL (25 jobs per page). Leave empty or set to 0 to walk until the run stops at Max jobs, the site's own last page, or a repeat-page guard, with a built-in ceiling of 1000 pages (25,000 jobs) per search.
querystringAlias of Keywords. Keywords wins when both are set.
locationstringAlias of Locations for a single place, e.g. London.
startUrlsarrayAlias of URLs. Setting it without a mode switches the run to URL mode.
ageintegerRounded up to the nearest supported window (1, 3, 7, 14 days). Values above 14 apply no recency filter.
sortstringUsed when Sort by is left at its default.

Choices: relevance, date, salary_low, salary_high

maxResultsintegerAlias of Max jobs. Max jobs wins when both are set.
includeDetailsbooleanAlias of Fetch details.
descriptionFormatstringWith Fetch details: html keeps every description field, text keeps descriptionText only, markdown keeps descriptionMarkdown only.

Choices: html, text, markdown

descriptionMaxLengthintegerTruncate description fields to this many characters. 0 keeps the full text.
outputFieldsarrayKeep only these top-level fields in each row.
compactbooleanKeep only the core fields (ignored when Output fields is set).
excludeEmptyFieldsbooleanDrop null, empty text, empty list and empty object values from each row.
resumeFromRunIdstringOptional. ID of a previous run of this actor (or a dataset ID). Jobs already in that dataset are skipped, so this run returns only NEW jobs (a delta). Combine both runs' datasets for the full set. Max jobs then counts only the new jobs. For recurring daily monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching jobs as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED jobs. Turn on "Emit unchanged" or "Emit expired" only when you also want those jobs returned (and billed). State is kept separately for each distinct search/filter setup (or by State key below).
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from your search/filter settings, different searches then never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return jobs that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return jobs that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max jobs or Max pages capped it, or when Resume was used. This returns, and bills, extra synthetic rows.
ignoreFieldsForChangesarrayOptional. Field names that must not make a job count as UPDATED, for example salary or location.postalCode. A plain name is ignored wherever it appears, including inside nested objects; a dotted path ignores one nested location. Ignored fields stay in the output and are only left out of the comparison and changedFields. Rotating or ad-placement fields are already ignored by default.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

jobIdJob ID (text)
changeTypeChange type (incremental mode) (text)
titleTitle (text)
brandBrand (text)
employerEmployer (object)
locationLocation (object)
salarySalary (object)
datePostedPosted (text)
sourceSiteSource (text)
jobUrlURL (link)
changedFieldsChanged fields (incremental mode) (array)
firstSeenAtFirst seen (incremental mode) (date)
Show 13 more fields
lastSeenAtLast seen (incremental mode) (date)
employmentTypeEmployment (array)
industryIndustry (text)
jobLocationTypeWork type (text)
validThroughValid through (text)
applyTypeApply (text)
applyUrlApply link (link)
contactPhonesContact phones (array)
contactEmailsContact emails (array)
descriptionTextDescription (text)
companyCompany (object)
previousSeenAtPreviously seen (incremental mode) (date)
expiredAtExpired at (incremental mode) (date)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "rowType": "job",
  "brand": "totaljobs",
  "jobId": 100234567,
  "jobUrl": "https://www.totaljobs.com/job/warehouse-operative/sample-employer-job100234567",
  "applyUrl": "https://www.totaljobs.com/job/warehouse-operative/sample-employer-job100234567",
  "sourceSite": "Totaljobs.com",
  "title": "Warehouse Operative",
  "datePosted": "2026-03-14T00:00:00.000Z",
  "employer": {
    "id": 4820001,
    "name": "Sample Employer",
    "url": "https://www.totaljobs.com/jobs/sample-employer-ltd?cmpId=4820001",
    "logoUrl": "https://www.totaljobs.com/CompanyLogos/00000000000000000000000000000000.png",
    "isAnonymous": false
  },
  "location": {
    "text": "Slough, Berkshire, SL1",
    "postalCode": "ZZ1 1ZZ",
    "locality": "Slough",
    "region": "Berkshire",
    "country": "GB",
    "latitude": 51.51,
    "longitude": -0.59,
    "lat": 51.51,
    "lng": -0.59,
    "streetAddress": "1 Acme Way"
  },
  "salary": {
    "rawText": "£24,000 - £27,500 per annum",
    "min": 24000,
    "max": 27500,
    "currency": "GBP",
    "period": "year"
  },
  "skills": [],
  "textSnippet": "Join our busy distribution centre team on a full time basis, no experience necessary.",
  "isSponsored": false,
  "crossPostedCount": 0,
  "description": "Full HTML job description appears here when Fetch full job details is enabled.",
  "descriptionText": "Full job description text appears here when Fetch full job details is enabled.",
  "employmentType": [
    "FULL_TIME"
  ],
  "industry": "Logistics",
  "validThrough": "2026-04-14T00:00:00.000Z",
  "directApply": true,
  "applyType": "internal",
  "contactPhones": [
    "0000000000"
  ],
  "contactEmails": [
    "careers@sample-employer.example"
  ],
  "detailFetched": true
}

Ways to use this data

  • Recruitment agencies and job boards: aggregate live postings from Totaljobs.com to cross-post, compare, or fill gaps in your own listings.
  • Salary benchmarking and workforce research: build a dataset of parsed salary ranges by role, location, and job type across a whole market.
  • Market and competitor monitoring: track which employers are hiring, for which roles, and how listings change over time with incremental mode.
  • Recruitment and HR-tech lead generation: identify direct employers vs. agencies posting in a sector, with company profiles when the detail pass is on.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Totaljobs Scraper return?

The documented output for Totaljobs Scraper includes job id, change type (incremental mode), title, brand, employer, location, salary and posted. Availability of each field depends on the source page and the selected mode.

How much does Totaljobs Scraper cost?

It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed jobs on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated, and (once a prior complete scan has marked a job gone with Emit expired on) reappeared or expired jobs, and unchanged ones are not billed.

Why did my run return fewer jobs than I expected?

Check Max jobs: it caps the total scanned across all locations or URLs, and defaults to 20. Set it higher, or to 0, to collect until the site's last page or the built-in ceiling of 1000 pages (25,000 jobs) per search. In incremental mode, most jobs on a quiet recurring run are unchanged and suppressed by design; that is not a failed run.

Why did my run fail instead of returning an empty dataset?

If every result page is refused, the run stops with a clear message so "no jobs match this search" is never confused with "nothing could be read". A genuine zero-match search (a real result page reporting zero jobs) still succeeds with an empty dataset.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear, or Airtable.

Ready to collect with Totaljobs Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.