Handshake Jobs Scraper

Export public Handshake jobs with titles, employers, locations, pay, dates, and descriptions for recruiting research, talent intelligence, and analysis.

Data fields

FieldTypeDescription
jobIdstringValue exported as jobId.
jobUrlstringValue exported as jobUrl.
titlestringValue exported as title.
employerNamestring | nullValue exported as employerName.
employerWebsitestring | nullValue exported as employerWebsite.
employerLogoUrlstring | nullValue exported as employerLogoUrl.
industrystring | nullValue exported as industry.
jobTypestring | nullValue exported as jobType.

Input preview

keywordsJob categories
locationsLocations
searchUrlsPublic Handshake search URLs
jobUrlsPublic Handshake job URLs
maxItemsMaximum jobs
includeDescriptionsInclude descriptions

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

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 jobId to 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.

Common questions

Questions and answers reused from the canonical actor README.

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.