Totaljobs UK Vacancy Finder by Keyword, Area & Pay
Finds live UK vacancies on Totaljobs by job title and city, by browsing a whole region, or by salary band, returning title, company, salary, location and application link.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Choose what to scrape. The last three values are aliases kept for tasks saved before the revamp. |
keywords | array | optional | Job titles or search terms, e.g. `software developer` or `registered nurse`. Each keyword is searched separately. (mode=search) |
location | string | optional | UK town, city, county or postcode, e.g. `London`, `Manchester`, `Edinburgh`, `SW1A`. Leave empty to search the whole UK by keyword. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Choose what to scrape. The last three values are aliases kept for tasks saved before the revamp. |
keywords | array | optional | Job titles or search terms, e.g. `software developer` or `registered nurse`. Each keyword is searched separately. (mode=search) |
location | string | optional | UK town, city, county or postcode, e.g. `London`, `Manchester`, `Edinburgh`, `SW1A`. Leave empty to search the whole UK by keyword. |
postedWithin | string | optional | Only include jobs posted within this window. Leave empty for any date. |
workFromHome | string | optional | Include only home-working roles, or exclude them. Leave empty for both. |
jobType | string | optional | Employment type as classified by Totaljobs. Leave empty for all types. |
salaryMin | integer | optional | Only keep jobs whose advertised pay reaches this annual amount. Hourly and daily rates are converted to a yearly figure. Jobs without a published salary are skipped when a salary filter is set. |
salaryMax | integer | optional | Only keep jobs whose advertised pay starts at or below this annual amount. Hourly and daily rates are converted to a yearly figure. |
includeDetails | boolean | optional | Fetch full descriptions, exact posting and expiry dates, parsed salary bands, company details, map coordinates and apply links. Turn off for a faster, lighter listing-only run. |
onlyNewJobs | boolean | optional | Return only jobs that were not present in the previous run of this same search. The first run returns everything and seeds the baseline. |
maxItems | integer | optional | Maximum number of jobs to save. Totaljobs returns at most 100 jobs per search query; above that the actor automatically splits the search by area and filters to reach more. |
urls | array | optional | Search pages, company job pages or individual job pages. You can mix them. (mode=byUrls) |
Download the published input schema
View complete JSON
{
"description": "Find live UK vacancies on Totaljobs by keyword and area, browse a whole area, or scrape specific Totaljobs URLs. Optional filters: date posted, work from home, job type, sort order and salary band.",
"properties": {
"includeDetails": {
"default": true,
"description": "Fetch full descriptions, exact posting and expiry dates, parsed salary bands, company details, map coordinates and apply links. Turn off for a faster, lighter listing-only run.",
"prefill": false,
"title": "Open each job page",
"type": "boolean"
},
"jobType": {
"description": "Employment type as classified by Totaljobs. Leave empty for all types.",
"editor": "select",
"enum": [
"permanent",
"contract",
"temporary",
"part-time",
"work-from-home",
"full-time",
"internship",
"apprenticeship"
],
"enumTitles": [
"Permanent",
"Contract",
"Temporary",
"Part-time",
"Work from home",
"Full-time (legacy — no longer a Totaljobs filter, ignored)",
"Internship (legacy — no longer a Totaljobs filter, ignored)",
"Apprenticeship (legacy — no longer a Totaljobs filter, ignored)"
],
"title": "Job type",
"type": "string"
},
"keywords": {
"description": "Job titles or search terms, e.g. `software developer` or `registered nurse`. Each keyword is searched separately. (mode=search)",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"software developer"
],
"title": "Keywords",
"type": "array"
},
"location": {
"description": "UK town, city, county or postcode, e.g. `London`, `Manchester`, `Edinburgh`, `SW1A`. Leave empty to search the whole UK by keyword.",
"editor": "textfield",
"prefill": "London",
"title": "Location",
"type": "string"
},
"maxItems": {
"default": 100,
"description": "Maximum number of jobs to save. Totaljobs returns at most 100 jobs per search query; above that the actor automatically splits the search by area and filters to reach more.",
"maximum": 5000,
"minimum": 1,
"prefill": 3,
"title": "Max jobs",
"type": "integer"
},
"mode": {
"default": "search",
"description": "Choose what to scrape. The last three values are aliases kept for tasks saved before the revamp.",
"editor": "select",
"enum": [
"search",
"browseLocation",
"byUrls",
"searchJobs",
"searchByLocation",
"searchBySalary"
],
"enumTitles": [
"Search jobs by keyword and area",
"Browse every job in an area",
"Scrape specific Totaljobs URLs",
"Search jobs by keyword (legacy alias)",
"Browse every job in an area (legacy alias)",
"Search with a salary band (legacy alias)"
],
"prefill": "search",
"title": "Mode",
"type": "string"
},
"onlyNewJobs": {
"default": false,
"description": "Return only jobs that were not present in the previous run of this same search. The first run returns everything and seeds the baseline.",
"prefill": false,
"title": "Only new jobs",
"type": "boolean"
},
"postedWithin": {
"description": "Only include jobs posted within this window. Leave empty for any date.",
"editor": "select",
"enum": [
"1",
"3",
"7",
"14"
],
"enumTitles": [
"Last 24 hours",
"Last 3 days",
"Last 7 days",
"Last 14 days"
],
"title": "Date posted",
"type": "string"
},
"salaryMax": {
"description": "Only keep jobs whose advertised pay starts at or below this annual amount. Hourly and daily rates are converted to a yearly figure.",
"maximum": 500000,
"minimum": 0,
"title": "Maximum salary (£/year)",
"type": "integer"
},
"salaryMin": {
"description": "Only keep jobs whose advertised pay reaches this annual amount. Hourly and daily rates are converted to a yearly figure. Jobs without a published salary are skipped when a salary filter is set.",
"maximum": 500000,
"minimum": 0,
"title": "Minimum salary (£/year)",
"type": "integer"
},
"urls": {
"description": "Search pages, company job pages or individual job pages. You can mix them. (mode=byUrls)",
"editor": "stringList",
"items": {
"type": "string"
},
"title": "Totaljobs URLs",
"type": "array"
},
"workFromHome": {
"description": "Include only home-working roles, or exclude them. Leave empty for both.",
"editor": "select",
"enum": [
"only",
"exclude"
],
"enumTitles": [
"Only work-from-home jobs",
"Exclude work-from-home jobs"
],
"title": "Work from home",
"type": "string"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "Totaljobs UK Vacancy Finder Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
jobs | string | optional | Dataset containing all scraped Totaljobs UK job listings. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "UK vacancies from Totaljobs — job title, employer, location and map coordinates, posted and expiry dates, salary text and parsed salary band, full description, remote flag, company profile and apply links.",
"properties": {
"jobs": {
"description": "Dataset containing all scraped Totaljobs UK job listings.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Totaljobs vacancies",
"type": "string"
}
},
"title": "Totaljobs UK Vacancy Finder Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Jobs",
"transformation": {
"fields": [
"title",
"company",
"location",
"salary",
"salaryMin",
"salaryMax",
"jobType",
"workType",
"isRemote",
"postedDate",
"jobUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Totaljobs UK Vacancy Finder by Keyword, Area & Pay
Totaljobs carries tens of thousands of live UK vacancies, from warehouse shifts in Leeds to NHS roles in Manchester and contract work in London. This actor turns those public listing pages into structured records you can filter, chart or load into a spreadsheet: full descriptions, salary bands split into numbers and pay periods, exact posting and expiry dates, employer details, remote flags and apply links.
What this actor does
- Three ways in: search a keyword and area, browse every vacancy in an area, or paste Totaljobs search/company/job URLs.
- Filters that the site honours: date posted, work-from-home only or excluded, five employment types, and newest-first or relevance ordering.
- Salary band filtering: enter a yearly range and the actor keeps only postings whose advertised pay overlaps it, converting hourly and daily rates to a yearly figure.
- Rich per-job detail: the actor can open each vacancy to collect the complete description, exact ISO dates, structured salary, employer profile and map coordinates.
- No duplicates: recurring jobs, cross-posted listings and overlapping search slices are de-duplicated by Totaljobs job ID.
- Empty fields are omitted, never returned as
nullor a blank string.
Output per job
jobId— Totaljobs' numeric listing IDtitle— job title as postedcompany— employer namecompanyId,companyUrl,companyLogoUrl,companyJobsCount,companySectors[]— employer profile data when publishedcompanyIndustries[],companyEmployees,companyFounded,companyAddress,companyHeroImageUrl— extras from the employer's company profile when it has onelocation— location text as shown (often includes the postcode area)locationPostcode,locationCountry— parsed from the listinglocations[]— one entry per location for multi-site vacancies (locality,region,country,postalCode,latitude,longitude)locationLatitude,locationLongitude— coordinates for the primary location when the employer supplies themsalary— salary exactly as advertised (e.g.£45,000 - £55,000 per annum)salaryMin,salaryMax,salaryCurrency,salaryPeriod— parsed pay band (year,month,week,dayorhour)salaryAnnualMin,salaryAnnualMax— annualised equivalent used by the salary filterdescription— full plain-text description when job pages are openeddescriptionHtml— the employer's original formattingpostedDate— ISO 8601 posting date when job pages are opened; the relative label (3 days ago) otherwisepostedDateText— the relative label shown on the search resultsvalidThrough— ISO 8601 expiry dateemploymentType— e.g.FULL_TIME,CONTRACTOR,REMOTE_WORKING(multiple values joined with commas)contractType— the site's own label, e.g.Permanent Contract; On-siteworkType—On-site,HybridorRemotewhen the site states itisRemote—truefor telecommute/home-working vacanciesapplicantLocationRequirements— country the employer accepts applicants from, for remote rolesindustry— Totaljobs industry classificationdirectApply— whether the employer accepts applications on TotaljobsapplyType—internalorexternalapplyUrl,applicationUrl— link to start the application for this vacancyjobUrl— the vacancy page on TotaljobsrelatedJobs[]— up to 10 similar vacancies (jobId,title,url)labels[]— badges shown on the results page (e.g.FEATURED,PREMIUM)searchUrl,sourceKeyword,sourceLocation— which search produced the rowfirstSeenAt— ISO timestamp whenonlyNewJobsfirst returned this vacancyrecordType— alwaysjob·scrapedAt— ISO timestamp
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | search |
search (keyword + area), browseLocation (whole area), byUrls (paste URLs) |
keywords |
array | – | One or more job titles or search terms (mode=search) |
location |
string | – | UK town, city, county or postcode; empty = UK-wide |
postedWithin |
string | – | 1, 3, 7 or 14 days (site filter) |
workFromHome |
string | – | only or exclude (site filter) |
jobType |
string | – | permanent, contract, temporary, part-time, work-from-home |
salaryMin |
integer | – | Minimum annual pay in GBP (converted for hourly/daily rates) |
salaryMax |
integer | – | Maximum annual pay in GBP |
includeDetails |
boolean | true |
Open each job page for full descriptions, exact dates, salary bands and apply links |
onlyNewJobs |
boolean | false |
Return only jobs not seen in the previous run of the same search (the first run seeds the baseline) |
maxItems |
integer | 100 |
Maximum jobs to save (1–5,000) |
urls |
array | – | Totaljobs search, company or job URLs (mode=byUrls) |
Tasks saved before this revamp keep working: the old mode values searchJobs / searchByLocation / searchBySalary and the old job types full-time / internship / apprenticeship are accepted. The last three types are ignored because Totaljobs no longer offers them as filters.
Example: nursing jobs across Manchester, newest first
{
"mode": "search",
"keywords": ["registered nurse"],
"location": "Manchester",
"postedWithin": "7",
"maxItems": 200
}
Example: every permanent vacancy in Leeds within the last day
{
"mode": "browseLocation",
"location": "Leeds",
"postedWithin": "1",
"jobType": "permanent",
"maxItems": 100
}
Example: remote data roles paying at least £55,000
{
"mode": "search",
"keywords": ["data analyst"],
"workFromHome": "only",
"salaryMin": 55000,
"includeDetails": true,
"maxItems": 150
}
Example: paste a mixed set of Totaljobs URLs
{
"mode": "byUrls",
"urls": [
"https://www.totaljobs.com/jobs/software-developer/in-edinburgh",
"https://www.totaljobs.com/jobs/it-online-learning?cmpId=811550&cmp=1",
"https://www.totaljobs.com/job/software-developer/sanderson-government-and-defence-job107993953"
],
"includeDetails": true
}
Use cases
- Job seekers — collect every matching vacancy in one list with full descriptions and pay bands, without browsing page by page.
- Salary benchmarking — compare advertised ranges for a role across London, Manchester, Edinburgh and other UK regions.
- Recruitment agencies — monitor which employers are hiring, in which sectors, and how recently each vacancy was posted.
- Labour-market research — measure remote-work share, contract vs permanent mix, and posting volume by area.
- Sales and lead generation — identify companies actively hiring in a target industry and load their profile links into a CRM.
FAQ
How many jobs can one run return?
Set maxItems up to 5,000. Totaljobs serves at most 100 vacancies per individual search query, so for larger runs the actor automatically splits the search across the site's own location, work-from-home, job-type and skill facets, de-duplicating as it goes. In practice a broad query reaches roughly 1,000–1,400 distinct vacancies depending on the facets and related roles Totaljobs serves for that request (for "software developer" in London the site listed 2,692; runs reached 1,022, 1,200 and 1,391 unique). The actor splits by region, sub-area, work-from-home, job type, skills and related job titles; beyond the reachable set the slices repeat, so narrow the filters or split the query by area for deeper coverage.
Why are some jobs missing salary numbers?
Many UK employers advertise "Competitive" or omit pay entirely. The actor never invents a figure: the salary text is kept exactly as published, and numeric fields appear only when a real amount is shown.
Are date filters exact? Yes. When you choose a date window, every returned job is checked against its posting date, so results stay inside the window even on pages where Totaljobs' own date control is unavailable.
How does the salary filter treat hourly and daily rates?
Hourly pay is annualised over 2,080 hours and daily rates over 220 working days. A job is kept when its annualised range overlaps your salaryMin/salaryMax window. Jobs with no published pay cannot be verified, so they are skipped while a salary filter is active.
What is the difference between applyUrl and jobUrl?
jobUrl is the public vacancy page. applyUrl is the application entry point for that vacancy — for jobs with external application systems, Totaljobs asks you to sign in before forwarding you to the employer's site.
How do I get only the jobs posted since my last run?
Set onlyNewJobs to true and keep the rest of the search identical. The actor remembers the job IDs it returned for that search, so the next run returns only unseen vacancies. The first run returns everything and becomes the baseline.
Can I sort by relevance? No. Totaljobs only serves its newest-first order to anonymous requests; the relevance option depends on a signed-in session and cannot be combined with the filters. The actor always returns newest-first results.
Why do some records lack coordinates or a company logo? Only what the employer and Totaljobs publish is returned. Listings without a mapped address or logo simply omit those fields.
Does the actor need cookies, logins or a proxy setup? No. It uses only public pages and chooses a working UK connection automatically. Just fill in the input and run.
Is this affiliated with Totaljobs? No. This is an independent tool that reads publicly available Totaljobs pages. It is not affiliated with, endorsed by, or sponsored by Totaljobs or StepStone.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build aIDxbsncwKwDBt3AW. Documentation is regenerated from the default published build; private drafts are not included.