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.
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. |
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 ApifyClient
client = 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.
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.
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.