Handshake Jobs Scraper — Public Job Listings avatar

Handshake Jobs Scraper — Public Job Listings

Pricing

from $3.00 / 1,000 validated handshake job returneds

Go to Apify Store
Handshake Jobs Scraper — Public Job Listings

Handshake Jobs Scraper — Public Job Listings

Extract anonymous public Handshake job listings from public search or direct job URLs. Returns normalized titles, employers, locations, compensation, dates, descriptions, and canonical application URLs for early-career hiring research.

Pricing

from $3.00 / 1,000 validated handshake job returneds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

Handshake Jobs Scraper

Extract structured job data from Handshake's anonymous public job pages. This actor is built for recruiting teams, job-market researchers, and AI agents that need a clean export of public early-career and graduate opportunities—not applicant, student, or employer-account data.

It accepts public Handshake SEO search pages such as https://joinhandshake.com/find-jobs/remote/software-engineering/, discovers the listings shown there, follows each public job page, and returns one normalized record per unique job. You can also submit known https://app.joinhandshake.com/public/jobs/{id} URLs for direct lookup.

What it extracts

Each successful dataset item is a validated public JobPosting record with a stable shape:

FieldDescription
jobId, title, jobUrlHandshake's public job identity, title, and canonical public URL.
companyName, companyUrl, companyLogoUrlPublished employer identity and public links, when present.
location, isRemote, employmentType, industryPublished workplace, remote, contract, and industry signals.
salaryMin, salaryMax, salaryCurrency, salaryUnitPublished compensation; values are null when not publicly disclosed.
postedAt, validThroughPublication and expiry timestamps when the listing exposes them.
descriptionHtml, descriptionTextThe published description in HTML and plain text when descriptions are enabled.
applyUrl, sourceSearchUrl, scrapedAtApplication path, originating public search page, and extraction timestamp.

The actor does not infer salary, invent location data, scrape account-only Handshake content, or return student/applicant information.

When to use it

Use this actor when you need to:

  • Refresh a public inventory of Handshake opportunities for recruiting or labor-market research.
  • Monitor a specific public Handshake search category for newly visible jobs.
  • Import public roles into an internal spreadsheet, CRM, dashboard, or semantic-search pipeline.
  • Enrich a known public Handshake job URL with the visible description, employer, compensation, and dates.
  • Filter supplied public results by title, company, remote status, or published compensation.

For account-specific results, personalized recommendations, applications, messages, student profiles, or private employer data, this is not the right tool. It deliberately supports only the anonymous public pages that can be loaded without a Handshake account.

Inputs

searchUrls is for public SEO result pages. Start with the prefilled remote-software-engineering page or use another joinhandshake.com/find-jobs/... URL that you have opened publicly. The actor discovers all public job links on that page, then requests each detail page.

jobUrls is for direct public lookups. Supply one or more app.joinhandshake.com/public/jobs/{id} URLs when you already know the job IDs and do not need search discovery.

maxItems caps unique records across both input modes. Use it to keep collection volume and billable rows predictable. includeDescriptions defaults to true; disable it when you only need the summary fields. The remaining filters are local post-extraction filters: they narrow the rows found from the URLs you supplied and do not perform an unauthenticated global Handshake search.

Example: discover public remote engineering jobs

{
"searchUrls": [
"https://joinhandshake.com/find-jobs/remote/software-engineering/"
],
"maxItems": 25,
"includeDescriptions": true,
"remoteOnly": true,
"titleIncludes": "engineer"
}

Example: look up known public jobs

{
"jobUrls": [
"https://app.joinhandshake.com/public/jobs/11209339",
"https://app.joinhandshake.com/public/jobs/11209137"
],
"maxItems": 2,
"includeDescriptions": true
}

Output example

{
"jobId": "11209137",
"title": "Software Engineer",
"companyName": "Neurohire.ai",
"location": "Remote",
"isRemote": true,
"employmentType": "FULL_TIME",
"salaryMin": 80000,
"salaryMax": 90000,
"salaryCurrency": "USD",
"salaryUnit": "YEAR",
"postedAt": "2026-07-15T14:20:17.000Z",
"jobUrl": "https://app.joinhandshake.com/public/jobs/11209137",
"applyUrl": "https://app.joinhandshake.com/public/jobs/11209137",
"sourceSearchUrl": "https://joinhandshake.com/find-jobs/remote/software-engineering/",
"scrapedAt": "2026-07-19T00:00:00.000Z"
}

API and agent use

Use this tool when an agent has a public Handshake search URL or public job URL and needs structured public job data. It returns one dataset item per persisted job and writes a compact OUTPUT record plus detailed RUN_SUMMARY diagnostics to the default key-value store.

The actor is designed for simple, narrow tool calls. Use a direct job URL for one job; use a public search URL for discovery. Do not use it to apply to jobs or to obtain private Handshake data.

Pricing

Pricing is Pay per event + usage:

ChargePrice
Validated public Handshake job written to the dataset$0.003 per job
Apify compute and network usageCharged separately by the platform

Only records that pass the actor's validation and are successfully written to the default dataset are charged as job-scraped. A run with maxItems: 10 has at most $0.03 in result-event charges, plus Apify platform usage. Invalid candidates, duplicate records, and failed pages are not billed as job records.

Reliability and limits

The actor uses an HTTP-first path because Handshake's public SEO pages provide server-rendered job cards and individual public job pages expose Schema.org JobPosting data. It retries transient HTTP errors, deduplicates by public job ID, and preserves useful rows when some input pages fail.

Every terminal path writes OUTPUT and RUN_SUMMARY with one of: COMPLETE, PARTIAL, VALID_EMPTY, INVALID_INPUT, UPSTREAM_FAILED, or CONFIG_ERROR. A valid public URL that returns no matching rows is a successful VALID_EMPTY run; a blocked or unavailable public route with no useful output is reported honestly as UPSTREAM_FAILED.

Public pages can change, expire, or become unavailable. Use sourceSearchUrl and scrapedAt to retain collection provenance, and schedule modest, recurring runs rather than treating a listing as permanently available.

Responsible use

Collect only public job-posting data and use it according to applicable law and the source platform's terms. Do not use this actor to make automated employment decisions or to collect applicant, student, or other private personal data.