HiJobs.net Scraper - Jobs, Salaries, Employers & Locations avatar

HiJobs.net Scraper - Jobs, Salaries, Employers & Locations

Pricing

from $1.20 / 1,000 listing results

Go to Apify Store
HiJobs.net Scraper - Jobs, Salaries, Employers & Locations

HiJobs.net Scraper - Jobs, Salaries, Employers & Locations

Scrape hijobs.net job listings via the official mobile API: title, employer, salary range, location, hours, sector, contract, closing date, apply email and full description, plus employer record, industries and geo. Search by keywords, location and filters, or paste hijobs.net URLs. Includes.

Pricing

from $1.20 / 1,000 listing results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Security

Limited permissions

Share

HiJobs.net Scraper: Scotland Highlands and Islands Job Listings, Salaries and Employer Contacts

HiJobs.net Scraper turns hijobs.net, the job board for Scotland's Highlands and Islands (Inverness, Oban, Skye, the Outer Hebrides, Argyll and Moray), into structured data. It reads the same JSON feed the HIJOBS mobile app uses, so every listing comes back with the title, employer, structured salary range, location, hours, sector, contract type, and posting and closing dates, plus (when detail lookup is on) the full description, apply contact and employer profile. Build a search from keywords and filters, or paste hijobs.net links directly, then export the results as JSON, CSV or Excel, or read them through the API.

Why This Scraper?

  • Richer output than the rendered site. Every listing carries a real structured salary range, structured hours, sector and specialism, and the closing date. Detail lookup adds the full description, apply contact and the employer's profile and website.
  • Superset of competitor fields. Every field the market leader exposes, plus the nested employer record, industries, specialisms and geo coordinates from the detail source.
  • Search and URL modes. Build a search from keywords, location, employer type, hours, contract type, sort order and salary range, or paste any hijobs.net search, location facet or single job link and walk it forward.
  • Incremental change monitoring. Run the same search on a schedule and get NEW and UPDATED jobs on later runs. Turn on Emit expired to also see EXPIRED jobs once a run has confirmed, with a full scan, that a tracked job is gone; a job that comes back after that is marked REAPPEARED.
  • Resume support. Continue a large interrupted pull from a pasted run or dataset ID without returning or charging for jobs already collected.
  • A refused connection never masquerades as an empty search. A search that genuinely has no jobs finishes successfully with zero rows. A run that could not load a single page (every connection was refused or failed) ends as failed with a clear status message instead of reporting a successful empty run.
  • MCP connector export. Optionally pipe results into Notion, Linear, Airtable or another MCP server, one row per vacancy, ready for CSV, Excel, JSON or API export.

Use Cases

  • Recruiters and staffing agencies: monitor new postings and pay bands across the Highlands and Islands to benchmark against other agencies.
  • Relocation and regional job boards: aggregate current openings for people considering a move to the Highlands, Islands or Argyll.
  • Rural labour market research: track sector mix, contract types and salary bands over time in a remote UK jobs market.
  • Charity and public sector recruiters: compare pay and hours for similar roles advertised by other local employers.
  • Career sites and aggregators: keep a feed of Highlands and Islands vacancies current with scheduled Incremental mode runs.

Data You Get

Each scraped vacancy is one dataset row of type: "job". Listing fields are always present; the description, apply contact and employer record come from detail lookup when Fetch full job details is on (the default).

FieldExample
jobId702451
jobUrlhttps://hijobs.net/job/702451/seasonal-visitor-centre-assistant
titleSeasonal Visitor Centre Assistant
companyNameGlensparrow Community Projects
salary{ "currency": "GBP", "min": 22000, "max": 27500, "unit": "year", "raw": "£22,000 to £27,500 per annum" }
locationFort William
sector / specialismCharity & Voluntary / Community Outreach
hours35 per week
contractTypeTemporary
postedDate2026-02-01T08:30:00
closingDate2026-03-15T23:59:00
remotefalse
applyTypeexternal / email / internal
applyEmailrecruitment@glensparrowprojects.example
externalApplyUrlhttps://glensparrowprojects.example/apply
contactNameRecruitment Team
recruiterTypecharity-cic
companyWebsitehttps://www.glensparrowprojects.example
descriptionTextFull description of the role appears here.
referenceJob Number: 7042
requiresCvtrue
numberVacancies2
changeTypeNEW / UPDATED / REAPPEARED / EXPIRED (incremental mode)

Detail lookup also adds the nested employer profile, latitude and longitude, industries, specialisms, a keywords list, promoted and remote flags, prerequisites and the full raw detail passthrough. Detail lookup also adds expiresAt, isOnFire, isBlind, numberBumps, lastBumpedAt, the employer-set questions and automatedResponse, rate extras, the main sector, specialism and location, and companyDomain. The dataset has three views: Overview, Detail and Changes. The Changes view shows the incremental columns. Incremental mode adds changedFields, firstSeenAt and lastSeenAt alongside changeType.

Sample shape: values above are illustrative placeholders, not from a live listing.

How to Use

  1. Pick a mode: search (build from keywords and filters) or url (paste hijobs.net links).
  2. Fill in the fields for that mode, and set Fetch full job details depending on whether you need the full description and apply contact.
  3. Set Max jobs (and optionally Max result pages) to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search mode, newest jobs:

{
"mode": "search",
"maxItems": 20
}

Search by keyword:

{
"mode": "search",
"keywords": "chef",
"sort": "relevance",
"fetchDetails": true,
"maxItems": 20
}

Daily monitoring of one location:

{
"mode": "search",
"where": "Oban",
"incrementalMode": true,
"emitExpired": true,
"maxItems": 0
}

URL mode with no edit scrapes one example of each supported link shape: the newest listing, a keyword search, a location page, a filtered search, a later page (?pg=2) and a single job. Leaving urls out of the input does the same. Accepted link shapes: the listing page, a location page, a filtered search link (with an optional pg= start page) and a single job link. ?pg=N starts at page N, counted in pages of 100 jobs, and walks forward from there; a run that starts at a later page never produces EXPIRED rows, because it did not read the earlier pages. Employer pages, other hijobs.net pages and non-hijobs.net links are skipped with a warning in the log; if none of the pasted links can be scraped (or urls is empty) the run ends FAILED with a status message naming the reason, instead of finishing as an empty success.

URL mode with a filtered search link and a location facet:

{
"mode": "url",
"urls": [
"https://hijobs.net/search/results?employers=charity-cic&where=Scotland&sort=relevance",
"https://hijobs.net/jobs/oban"
],
"fetchDetails": true,
"maxItems": 30
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/hijobs-net-jobs-scraper").call(run_input={"mode": "search", "keywords": "chef", "maxItems": 20})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], job["companyName"], job["salary"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/hijobs-net-jobs-scraper').call({ mode: 'search', keywords: 'chef', maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

How Max jobs and Max result pages shape a run

Max jobs is the one soft cap on a run: it stops after that many jobs across every search or link. A hard cap of 100000 jobs per run always applies, and 0 means that cap. Max result pages caps how many pages are walked per search or link; left at 0, a walk is still limited to 1000 pages and stops naturally once a page comes back empty, the source reports no further pages, or three pages in a row return nothing this run had not already collected (see Resume and recurring updates).

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips everything already collected there, so you do not pay twice.
  • Incremental mode (incrementalMode) is for scheduled runs over the same search. Each job is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless Emit unchanged is on), REAPPEARED or EXPIRED. EXPIRED is only produced on a run that has Emit expired on and completes a full, uncapped scan of the tracked search, never on a run that was stopped early by Max jobs, Max result pages, or Resume, or that started at a later page with ?pg=. REAPPEARED then appears automatically on any later run, even one with Emit expired off, the first time a job that an earlier full scan marked EXPIRED turns up again. stateKey names or shares the stored state; with Incremental mode off, output is exactly as before.
  • A search walk ends when the source reports no further pages, a page comes back empty, or three pages in a row return nothing this run had not already collected. A single repeated page no longer ends the walk, so a Resumed run, or a feed that shifts while it is read, still reaches the newer jobs further down. A walk that stopped on the three-repeat guard is not treated as a complete scan, so it never produces EXPIRED rows.
  • Changes that do not count. These values change without the job content changing, so they are kept in the output but never make a job UPDATED or appear in changedFields: the relative-time texts postedFriendly and postedRelative ("2 weeks ago", at any depth); the bump and popularity values lastBumpedAt, numberBumps and isOnFire; and inside rawDetail the employer bump values last_bump, number_bumps and weighting_date, the IsOnFire badge, the neighbouring-job pointers (NextTitle, NextURL, PrevTitle, PrevURL, NavDict) and the anonymous-visitor flags isInShortlist and isHidden. Everything else counts, including rawDetail.questions (the employer's screening questions), the posting date added and the employer record, so a re-posted job or a changed question set is UPDATED and billed. You can add more field names in ignoreFieldsForChanges; names match at any depth and also apply to jobs already tracked, so adding a name never re-emits or re-bills jobs you already have. Fields this build added to the output (companyDomain, expiresAt, questions, rateExtras, rateInfo, mainLocation, mainSector, mainSpecialism, automatedResponse, isBlind) are left out of the comparison only for a tracked job whose stored copy was saved before they existed, and only on its first run after upgrading; after that they count like any other field. A real change in any other field during that first run is still UPDATED.

Send results into your apps (MCP connectors)

This actor can optionally pipe results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify Settings and Integrations, then select it in the input. For Notion, also provide the parent page URL where item pages will be created.

Each connector receives a condensed, human readable summary per item (a title and the key fields flattened to plain text), not the full JSON. The complete record always stays in the Apify dataset. Leave the field empty to skip the export entirely.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch builds a query from the filter fields below; url walks pasted hijobs.net links instead and ignores the filter fields.
keywordsstring(prefill: empty)Free text keyword search across job title, skills and employer (search mode only). Leave blank to return the newest jobs with no keyword filter.
wherestring(none)Town, region or area to search within, for example Inverness, Scotland or Oban (search mode only). Leave blank for all locations.
employerTypestring(none, Any)Restrict results to one employer type: Charity / CIC, Direct Employer, Agency, Recruitment Consultant or Local Government (search mode only).
hoursstring(none, Any)Restrict results to Full Time or Part Time (search mode only).
contractTypestring(none, Any)Restrict results to one contract type: Permanent, Contract, Interim, Graduate, Temporary, Casual, Student Placement or Volunteer (search mode only).
sortstringaddedOrder results by newest first, date, highest salary or relevance (search mode only).
salaryFrominteger(none)Only return jobs advertised at or above this figure (search mode only). Leave blank for any.
salaryTointeger(none)Only return jobs advertised at or below this figure (search mode only). Leave blank for any.
featuredOnlybooleanfalseOnly return jobs the employer promoted as featured (search mode only).
postedWithinHoursinteger(prefill: 0)Used to key Incremental mode's automatic state (a different value starts a separately tracked search); in the current build it does not filter which jobs are returned or shorten a run. Leave at 0.
urlsarrayone example of each supported shapehijobs.net links to walk (URL mode only), one example of each shape by default: the newest listing (/jobs), a keyword search (/search/results?Keywords=...), a location page (/jobs/<location>), a filtered search link, a later page (?pg=N, pages of 100 jobs) and a single job link (/job/<id>/<slug>). Employer pages are not supported. If no link is usable the run ends FAILED. Multiple links are supported. Ignored in search mode.
fetchDetailsbooleantrueFetch each job's detail record for the full description, apply contact, employer profile, industries, specialisms and geo coordinates. Adds one request per job and is billed as a detail-enrichment charge in addition to the per-listing charge. A pasted single job URL (URL mode) always fetches and is charged for the detail record regardless of this setting, since that is the only way to read a single job page.
maxItemsinteger20Stop after this many jobs across all searches or links combined. 0 means the hard cap of 100000 jobs per run, which is also the highest accepted value.
maxPagesinteger0Cap on result pages walked per search or link. 0 means the hard cap of 1000 pages; see "How Max jobs and Max result pages shape a run" above.
resumeFromRunIdstring(none)Continue one specific interrupted run from a pasted run or dataset ID. Cannot be combined with Incremental mode once that state already has tracked jobs.
incrementalModebooleanfalseRecurring change monitoring for scheduled runs of the same search. See "Resume and recurring updates" above for exactly when REAPPEARED and EXPIRED appear.
stateKeystring(none)Optional name for the Incremental mode state, to keep it stable or to share it deliberately across differently configured runs.
ignoreFieldsForChangesarray[]Incremental mode only: field names that never count as a change (kept in the output, never UPDATED, not in changedFields). postedFriendly and postedRelative are always ignored, as are the bump and visitor values listed under "Changes that do not count".
emitUnchangedbooleanfalseAlso return (and bill) jobs unchanged since the last Incremental mode run, marked UNCHANGED.
emitExpiredbooleanfalseAlso return (and bill) jobs tracked before but no longer found, marked EXPIRED, and only on a run that completes a full, uncapped scan of the tracked search.
proxyobject{ "useApifyProxy": true }Connection settings. The run starts on the default Apify proxy; if that is refused, the run moves to Apify Residential when your plan includes it, then to a backup connection, and says so in the log. Custom proxy URLs and direct mode are used exactly as given, with no backup connection.
mcpConnectorsarray(none)Optional: send a summary of each job to apps you authorized under Apify Settings and Integrations.
notionParentPageUrlstring(none)Notion connector only: parent page under which job pages are created.
maxNotifyListingsinteger50Cap on jobs written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values above are illustrative placeholders, not from a live listing.

{
"type": "job",
"source": "hijobs.net",
"sourceProvider": "hijobs",
"jobId": "702451",
"slug": "seasonal-visitor-centre-assistant",
"jobUrl": "https://hijobs.net/job/702451/seasonal-visitor-centre-assistant",
"scrapedAt": "2026-02-15T09:00:00.000Z",
"title": "Seasonal Visitor Centre Assistant",
"description": "<p>Full description of the role appears here.</p>",
"descriptionText": "Full description of the role appears here.",
"descriptionTeaser": "A short teaser of the role.",
"postedDate": "2026-02-01T08:30:00",
"postedFriendly": "15 February 2026",
"postedRelative": "2 weeks ago",
"closingDate": "2026-03-15T23:59:00",
"companyName": "Glensparrow Community Projects",
"recruiterType": "charity-cic",
"recruiterSlug": "glensparrow-community-projects",
"companyWebsite": "https://www.glensparrowprojects.example",
"contactName": "Recruitment Team",
"employer": { "client_name": "Glensparrow Community Projects", "web_url": "https://www.glensparrowprojects.example" },
"location": "Fort William",
"city": "Fort William",
"country": "Scotland",
"remote": false,
"latitude": 56.8198,
"longitude": -5.1052,
"salary": { "currency": "GBP", "min": 22000, "max": 27500, "unit": "year", "raw": "£22,000 to £27,500 per annum" },
"salaryMin": 22000,
"salaryMax": 27500,
"categories": ["Charity & Voluntary", "Community Outreach"],
"sector": "Charity & Voluntary",
"specialism": "Community Outreach",
"contractType": "Temporary",
"hours": "35 per week",
"hoursValue": 35,
"applyType": "email",
"applyEmail": "recruitment@glensparrowprojects.example",
"externalApplyUrl": null,
"flags": ["Promoted"],
"keywordsList": ["visitor", "centre", "seasonal"],
"reference": "Job Number: 7042",
"requiresCv": true,
"numberVacancies": 2,
"prerequisites": "Full UK driving licence preferred.",
"industries": [{ "industry_id": 12, "industry_name": "Charity & Voluntary" }],
"specialisms": [{ "specialism_id": 34, "specialism_name": "Community Outreach" }],
"rawDetail": {}
}

Plan Requirement

Runs on any Apify plan. The hijobs.net website itself sits behind a browser challenge that a plain connection cannot pass, but this actor reads the open listing data source behind it and never loads the website pages, so the challenge does not affect runs. Which Apify proxy tier is accepted depends on your plan, so the run adapts instead of assuming one: it starts on the default Apify proxy, moves to Apify Residential when your plan includes it, then to a backup connection, and says so in the log ("Served over the backup connection"). Apify free plans do not include residential proxies: the log then shows a boxed warning and the run continues on the backup connection. If no page can be loaded, the run ends as failed with a message that says whether your plan lacks proxy access, whether the backup connection could not load the pages, or that the requests failed (a connection problem, not an empty search).

FAQ

How much does it cost?

You pay a flat charge when the run starts, plus a per-listing charge for every job returned, plus a detail-enrichment charge for every job whose full detail record is fetched. Fetch full job details defaults to on, so most runs also pay the detail charge per job; turn it off for a lighter run using only listing fields. A pasted single job URL always fetches and is charged for the detail record, since that is the only way to read a single job page. The Pricing tab shows current rates.

This actor collects only publicly available job listing data. You are responsible for how you use it: follow hijobs.net's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Employer names, contact details and salaries are published by the employer or recruiter for the purpose of hiring.

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

Yes. Schedule the actor and turn on Incremental mode. Later runs return NEW and UPDATED jobs by default; unchanged ones are not billed unless Emit unchanged is on. EXPIRED jobs, and the REAPPEARED jobs that can follow them, only start appearing once a run has Emit expired on and completes a full, uncapped scan of the tracked search.

Does the recency filter stop the run early?

postedWithinHours currently affects how Incremental mode automatically separates state for differently scoped searches; it does not filter which jobs are returned or shorten a run in this build. Use Max jobs and Max result pages to bound a run's size, and Incremental mode to see only what changed since the last run.

Why did my run return an empty dataset instead of failing?

If the data source cannot be reached for a whole search, that search stops early with a log warning and keeps whatever it already collected. If not a single page could be loaded, the run ends as failed with a status message (a connection problem, not an empty search). A search that returns zero jobs on a successful response finishes successfully with no rows. Other failures: a proxy configuration problem, a resumeFromRunId that cannot be read, and incrementalMode combined with a resumeFromRunId whose target already has tracked jobs. Near the platform time limit the run stops starting new pages, saves its state and exits cleanly with partial results.

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.

🔗 Want more jobs data?

Pair this actor with these related scrapers from the same team:

💼 s1jobs Scraper
Scrape jobs from s1jobs.com across Scotland and the UK. Search by keyword, location, or...
💼 IrishJobs.ie Scraper
Scrape job listings from IrishJobs.ie by keyword, location, job type, salary, recency, or...
💼 France Travail Scraper
Scrape job offers from France Travail with titles, companies, locations, salaries...
💼 StepStone.de
Scrape StepStone.de jobs by keyword, location, filters, or URL. Extract 35+ fields...
💼 Monster Jobs Scraper
Scrape Monster.com job listings from search and direct job URLs. Extract full...
🏷️ FINN.no Jobs Scraper
Scrape active FINN.no job listings by search filters or URL. Extract 30+ fields including...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.