Handshake Jobs Scraper
Pricing
from $0.02 / 1,000 job results
Handshake Jobs Scraper
Export public Handshake jobs with titles, employers, locations, pay, dates, and descriptions for recruiting research, talent intelligence, and analysis.
Pricing
from $0.02 / 1,000 job results
Rating
0.0
(0)
Developer
Hanna Nosova
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Share
Export anonymous public Handshake job listings from public Handshake search pages and direct job URLs. Build repeatable job-market snapshots for recruiting research, talent intelligence, and vacancy analysis without a Handshake login.
What you get
This Handshake jobs scraper exports one row for each unique anonymous public job posting. Capture canonical job identity, employer, location, classification, published compensation, dates, and descriptions that Handshake exposes publicly.
Who is it for?
- Recruiting teams building a reusable public job-market snapshot.
- Talent-intelligence analysts comparing public roles, locations, and compensation signals.
- Researchers and operations teams who need structured public job data in a spreadsheet, dashboard, or workflow.
Ready-to-run examples
Open a public example to inspect its input, run it, or reuse it as a task:
Discover a public category in a location
{"keywords": ["finance"],"locations": ["Austin, Texas"],"maxItems": 10,"includeDescriptions": true}
The Actor resolves these terms only through Handshake's public sitemap. Unsupported source categories or locations fail clearly instead of silently broadening your search.
Collect known public job pages
{"jobUrls": [{ "url": "https://app.joinhandshake.com/public/jobs/11369785" }],"maxItems": 1,"remoteOnly": false}
Input settings
| Input | Description |
|---|---|
keywords | Public Handshake job-category terms (for example, finance) resolved against the source sitemap. |
locations | Public location terms (for example, Austin, Texas or remote) resolved against the source sitemap. |
searchUrls | Public joinhandshake.com/find-jobs/ pages used to discover public jobs. |
jobUrls | Individual public app.joinhandshake.com/public/jobs/{id} pages. |
maxItems | Maximum unique jobs to save, from 1 to 1,000. |
includeDescriptions | Include the published HTML and normalized plain-text description. |
remoteOnly | Save only jobs explicitly published as remote. |
minSalary | Optional minimum published salary; jobs without a comparable published value are excluded. |
Output fields
| Group | Fields |
|---|---|
| Identity | jobId, jobUrl, title, scrapedAt, sourceSearchUrl |
| Employer | employerName, employerWebsite, employerLogoUrl, industry |
| Classification | jobType, roleGroups, employmentType, isRemote |
| Location | city, state, country |
| Compensation | salaryMin, salaryMax, salaryCurrency, salaryUnit, paySchedule |
| Dates | datePosted, validThrough |
| Description & application | descriptionHtml, descriptionText, qualifications, applicationUrl |
Example result
{"jobId": "11369785","jobUrl": "https://app.joinhandshake.com/public/jobs/11369785","title": "Software Developer (WSCE)-Junior","employerName": "AMEWAS","isRemote": false,"scrapedAt": "2026-09-03T12:37:11.608Z"}
Use cases
- Compare public job demand across roles or markets.
- Create periodic snapshots using
jobIdto identify new or changed listings. - Export public job descriptions for recruiting and labor-market research.
- Feed a dataset into an internal dashboard, spreadsheet, or AI analysis workflow.
API usage
Use the same input object with the Apify API. Replace APIFY_TOKEN with your token.
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('fetch_cat/handshake-jobs-scraper').call({jobUrls: [{ url: 'https://app.joinhandshake.com/public/jobs/11369785' }],maxItems: 1,});console.log(await client.dataset(run.defaultDatasetId).listItems());
from apify_client import ApifyClientclient = ApifyClient('APIFY_TOKEN')run = client.actor('fetch_cat/handshake-jobs-scraper').call(run_input={'jobUrls': [{'url': 'https://app.joinhandshake.com/public/jobs/11369785'}],'maxItems': 1,})print(client.dataset(run['defaultDatasetId']).list_items().items)
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~handshake-jobs-scraper/runs?token=APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"jobUrls":[{"url":"https://app.joinhandshake.com/public/jobs/11369785"}],"maxItems":1}'
For agent workflows, connect through Apify MCP and provide the same input JSON. You can also schedule runs or export the default dataset as JSON, CSV, Excel, XML, RSS, or HTML.
Pricing
Each run has a one-time start fee plus a charge for every unique public job saved to the default dataset. Review the current result rate and tier discounts on the Actor Pricing tab before a run starts.
Limits and responsible use
This Actor supports only anonymous public Handshake pages. It does not access accounts, institution-personalized results, applications, student data, employer administration pages, or private data. A null field means the public job page did not publish that value; the Actor never guesses it.
FAQ
Do I need a Handshake account? No. This Actor only uses anonymous public job pages.
Why did I get fewer results than maxItems? A source page may expose fewer public job links, or filters such as remoteOnly and minSalary can exclude jobs. Keyword/location discovery only supports categories and locations published in Handshake's current sitemap.
Can I use it with the API or MCP? Yes. Use the same input object through the Apify API, schedules, or the Actor's MCP tool.
What can I export from a public Handshake job page? When published, rows can include job identity, title, employer, location, employment type, compensation, dates, and descriptions. Missing public values remain null.
Does it include applications or student data? No. Those scopes are excluded from this public-data Actor.
Related Actors
- LinkedIn Jobs Scraper
- Indeed Jobs Scraper
- Google Jobs Scraper
- Ashby Jobs Scraper
- Greenhouse Jobs Scraper
Troubleshooting
No rows were returned. Confirm that each submitted URL is a public Handshake search page or a public job page. A public page can contain no currently available listings, and filters can remove otherwise available jobs.
A value is blank. Handshake does not publish every field on every job. Blank values are retained as null rather than guessed, including compensation, dates, qualifications, and application links.
I received fewer rows than requested. maxItems is a ceiling, not a promise that a source page contains that many public jobs. Use several public search URLs when you want to cover distinct public job collections.
Support
For help, open an issue from this Actor's Apify page and include: the public Handshake URL submitted; the input JSON with any sensitive values removed; the run ID; when the run occurred (including timezone); the expected and actual result counts; and one affected public job URL or job ID where available. Do not send account credentials, cookies, student data, application details, or other private information.