Handshake Jobs Scraper — Public Job Listings
Pricing
from $3.00 / 1,000 validated handshake job returneds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
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:
| Field | Description |
|---|---|
jobId, title, jobUrl | Handshake's public job identity, title, and canonical public URL. |
companyName, companyUrl, companyLogoUrl | Published employer identity and public links, when present. |
location, isRemote, employmentType, industry | Published workplace, remote, contract, and industry signals. |
salaryMin, salaryMax, salaryCurrency, salaryUnit | Published compensation; values are null when not publicly disclosed. |
postedAt, validThrough | Publication and expiry timestamps when the listing exposes them. |
descriptionHtml, descriptionText | The published description in HTML and plain text when descriptions are enabled. |
applyUrl, sourceSearchUrl, scrapedAt | Application 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:
| Charge | Price |
|---|---|
| Validated public Handshake job written to the dataset | $0.003 per job |
| Apify compute and network usage | Charged 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.