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

4 days ago

Last modified

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.
  • Empty results never masquerade as a crash. If every request during a search is refused, that search stops with a log warning, but the run still finishes successfully with whatever it found; only a proxy setup failure, an unreadable Resume target, or combining Incremental mode with a Resume target that already has tracked jobs ends the run as failed.
  • 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. 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 mode with a keyword and sort order:

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

Daily monitoring of one location, incremental mode on:

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

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, and 0 removes it. Max result pages caps how many pages are walked per search or link; left at 0, a walk stops naturally once a page comes back empty, the source reports no further pages, or a page returns nothing that this run had not already collected, whether that is because the walk is genuinely done or for the guard-related reason described below under 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. 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.
  • Every walk, with or without Resume or Incremental mode, treats a page that returns zero ids not already collected this run as the end of that search, regardless of whether the source itself still reports further pages. On an ordinary, stable search this matches the true end. This has two different consequences depending on how the run started:
    • On a fresh scheduled Incremental run (no Resume), the risk is narrow but real. seenIds starts empty each run, so a page only trips this guard if it repeats ids an earlier page of this same run already returned, which needs the feed to shift enough mid-walk (a burst of new postings, or an unstable sort order on ties) to duplicate a page. When it does happen, a walk that stopped this way still counts as a complete scan, so with Emit expired on it can produce EXPIRED rows for jobs that were simply never reached rather than actually gone.
    • On a Resumed run, the risk is much higher and easy to trigger. resumeFromRunId seeds seenIds with everything the earlier, interrupted run already collected, which is typically several pages' worth. On a newest-first search, if any new jobs were posted since that earlier run, the whole feed shifts down by that many positions, so the resumed run's very next page can turn out to be entirely made of ids the earlier run already saw, even though genuinely new jobs sit further down the list. The walk stops there, and continuing a large interrupted pull with Resume is not reliable once the underlying search has moved at all.

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.
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.
urlsarray(prefill: sample link)hijobs.net links to walk (URL mode only): the newest listing, a location facet, a filtered search link, or a single job link. 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 removes the cap.
maxPagesinteger0Cap on result pages walked per search or link. 0 removes the cap; 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.
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 listing source is open, so the default works for most runs; the run automatically switches to an alternate connection if requests are refused repeatedly.
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 listing data source is open, so the default proxy setting works for most runs, and the run automatically switches to an alternate connection when one is refused. For large or frequent pulls, choose the Residential proxy group under Connection for the most reliable connections.

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 hijobs.net's data source refuses every request during a search, that search stops early and logs a warning, but the run still finishes successfully with whatever it found, possibly nothing, rather than being marked failed. Three things do end a run as failed: a proxy configuration problem that stops the run from starting at all, a resumeFromRunId that cannot be read, and setting incrementalMode together with a resumeFromRunId whose target already has tracked jobs saved (the two cannot be combined that way). If a run keeps coming back empty, try the Residential proxy group, rerun for a fresh connection, or paste your own proxy URLs.

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...
💼 France Travail Scraper
Scrape job offers from France Travail with titles, companies, locations, salaries...
💼 Monster Jobs Scraper
Scrape Monster.com job listings from search and direct job URLs. Extract full...
💼 StepStone.de
Scrape StepStone.de jobs by keyword, location, filters, or URL. Extract 35+ fields...
💼 Workday Jobs Scraper
Scrape job postings from any Workday-hosted careers site on Myworkdayjobs.com. Paste...
🏷️ 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.