Handshake Jobs Scraper avatar

Handshake Jobs Scraper

Pricing

from $0.05 / 1,000 job listings

Go to Apify Store
Handshake Jobs Scraper

Handshake Jobs Scraper

Collect anonymous public Handshake jobs by keyword, location, search URL, or job URL. Export employer, classification, compensation, dates, and full descriptions.

Pricing

from $0.05 / 1,000 job listings

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

127

Total users

29

Monthly active users

6 days ago

Last modified

Share

🔎 Find and export public Handshake jobs

Recruiters, labor-market researchers, and job-data teams can use Handshake Jobs Scraper to collect anonymous public Handshake listings without a Handshake login or API key. Get job identity, employer, classifications, locations, compensation, dates, and full descriptions in structured rows for analysis and recurring workflows.

📦 Handshake job data you can export

Each dataset row represents one unique successful public Handshake job. Missing source values remain null or empty arrays rather than being invented.

Data groupFields
Identityid, title
Employeremployer.id, employer.name, employer.url, employer.logoUrl, employer.industry, employer.description, employer.websiteUrl, employer.emails, employer.phones, employer.socialUrls
ClassificationroleTypes, employmentTypes, workplace
Locationlocations
Compensationcompensation.minAmount, compensation.maxAmount, compensation.currency, compensation.cadence
DatespostedAt, firstActiveAt, expiresAt
DescriptiondescriptionHtml

🚀 How to collect Handshake jobs

  1. Add keywords or locations, or submit a public Handshake search or job URL in startUrls.
  2. Optionally add locations and job filters.
  3. Choose maxDiscoveryItems to bound search-discovered output.
  4. Run the Actor and open the default dataset.

You can combine keyword discovery, public search URLs, and direct job URLs in one run. Duplicate canonical jobs are returned once across all submitted sources.

⚙️ Input

FieldTypeWhat it does
keywordsarray of stringsJob titles, skills, or terms used to discover public listings.
locationsarray of stringsCities, regions, countries, or other location terms used for discovery, with or without keywords.
startUrlsarray of objectsPublic Handshake search-result URLs or individual public job URLs. Search filters in a URL are kept.
startUrls[].urlstringA public search or job URL.
employersarray of stringsIncludes jobs whose employer name matches one of the supplied values. Leave empty for any employer.
countriesarray of stringsIncludes jobs with a matching published country, such as United States. Leave empty for any country.
employmentTypesarray of stringsIncludes published classifications such as full-time, part-time, internship, or co-op. Leave empty for any classification.
workplacestringIncludes any workplace status, remote jobs only, or on-site jobs only.
postedWithinDaysintegerIncludes jobs with a published date inside the chosen number of days, from 1 to 365. Leave unset for any posting date.
compensationFilterobjectApplies a minimum published amount for one ISO currency and pay cadence. Jobs without comparable pay are excluded.
compensationFilter.amountnumberMinimum published amount, at least 0.
compensationFilter.currencystringThree-letter ISO 4217 currency code, such as USD.
compensationFilter.cadencestringPay period: hour, month, or year.
maxDiscoveryItemsintegerStops after this many matching jobs from keywords, locations, and search URLs. The minimum is 1, with no fixed maximum. Leave empty to return all available matching jobs until the source is exhausted. Duplicates, filtered listings, and unreadable jobs do not count. Direct job URLs are bounded by the submitted list.
onlyNewJobsbooleanReturns only jobs not seen in earlier runs of this Actor. Each job must still be readable and valid. On the first run, all matching jobs are new. Defaults to false.

Example input

This is the public input from a successful default-input run.

{
"keywords": [
"software engineer"
],
"locations": [],
"startUrls": [],
"employers": [],
"employmentTypes": [],
"workplace": "any",
"maxDiscoveryItems": 10,
"onlyNewJobs": false
}

🧾 Output

Each row is one public job. Employer contact fields can be empty when no public values are found.

FieldTypeWhat it does
idstringStable Handshake job ID used to remove duplicates.
titlestringPublished job title.
employerobjectPublished employer details.
employer.idstring or nullHandshake employer ID when shown.
employer.namestringPublished employer name.
employer.urlstring or nullPublic Handshake employer profile URL when available.
employer.logoUrlstring or nullEmployer logo URL when shown.
employer.industrystring or nullPublished industry.
employer.descriptionstring or nullPublished employer summary.
employer.websiteUrlstring or nullPublished employer website URL when available.
employer.emailsarray of stringsPublic contact emails found on the employer website. Can be empty.
employer.phonesarray of stringsPublic employer phone numbers when available.
employer.socialUrlsarray of stringsPublished employer social profile URLs when available.
roleTypesarray of stringsPublished role or job-function groups.
employmentTypesarray of stringsPublished employment types, such as internship or full-time.
locationsarray of stringsPublished work locations.
workplacestring or nullremote, hybrid, or on-site when known.
compensationobject or nullPublished pay, or null when no comparable pay is shown.
compensation.minAmountnumber or nullLower pay amount, or the single published amount.
compensation.maxAmountnumber or nullUpper pay amount when shown.
compensation.currencystringISO 4217 currency code.
compensation.cadencestringPay period: hour, day, week, month, or year.
postedAtstring or nullExact posting date and time when available.
firstActiveAtstring or nullSource date and time when the job first became active, when available.
expiresAtstring or nullPublished application expiry date and time when available.
descriptionHtmlstringFull source job description in HTML.

Example job

This complete row comes from a successful run of the current beta build.

{
"id": "11578366",
"title": ".Net Developer",
"employer": {
"id": "529828",
"name": "Sapot Systems Inc",
"url": null,
"logoUrl": "https://joinhandshake-production.imgix.net/app/public/assets/institutions/529828/original/hs-emp-logo-data.?ixlib=rb-4.1.1&w=150&h=150&fit=crop&v=1583270365&s=b5063d963ddb1d13e2cc93c4ea5c6ade",
"industry": "Internet & Software",
"description": "With the today's dynamic business environment and ever changing processes there is a compelling need to partner with a reliable and credible Enterprise Applications service provider and implementor. Sapot Systems has been expanding its operations and has a great team of certified and Dynamic consultants backed by experience from different industries to enable professional Enterprise services.",
"websiteUrl": "http://www.sapotsystems.com",
"emails": [
"brandon@sapotsystems.com"
],
"phones": [
"18552872768",
"+1 (855) 287-2768"
],
"socialUrls": [
"https://www.linkedin.com/in/arun-reddy-315700b4",
"https://www.linkedin.com/in/brandon-staley-b0391535/",
"https://www.linkedin.com/in/hymasagi",
"https://www.linkedin.com/in/venkata-pradeep-p-a5b10b41"
]
},
"firstActiveAt": "2026-10-01T18:30:00.000Z",
"roleTypes": [
"Software Developers and Engineers"
],
"employmentTypes": [
"full-time",
"job"
],
"locations": [
"USA"
],
"workplace": "remote",
"compensation": {
"minAmount": 30,
"maxAmount": 40,
"currency": "USD",
"cadence": "hour"
},
"postedAt": "2026-10-02T16:26:57.000Z",
"expiresAt": "2026-10-31T18:30:00.000Z",
"descriptionHtml": "<p>Title :: .Net Developer<br>Remote role<br>long term contract</p><p>We are looking for a .NET Developer with 4–5 years of experience in developing and maintaining scalable applications using C#, .NET Core, and Web APIs.<br>The candidate should have hands-on experience with MongoDB, including database design, queries, and performance optimization.<br>Strong exposure to AWS services, cloud deployments, and application integration is required.<br>Experience with REST APIs, microservices, Git, CI/CD, and Agile development practices is preferred.<br>The ideal candidate should have strong problem-solving skills and the ability to work independently as well as collaboratively with cross-functional teams.</p>"
}

💳 Pricing

This Actor uses pay-per-event pricing with account-tier rates. You are charged for each unique successful Handshake job listing saved to the default dataset. Duplicates, filtered candidates, unavailable jobs, malformed jobs, and runs with no saved jobs do not create this job charge.

Use maxDiscoveryItems to bound search-discovered output and cost. Submitted direct job URLs are separate from that discovery limit and remain bounded by the number of URLs you provide.

🔌 Integrations

Export the dataset as JSON, CSV, Excel, XML, RSS, or HTML. You can also run the Actor through the Apify API, schedule recurring snapshots, trigger webhooks, and connect results to supported Apify integrations.

❓ FAQ

Can I submit a Handshake search URL or a single job URL?

Yes. startUrls accepts public Handshake search-result URLs and individual public job URLs. You can combine them with keyword discovery in the same run.

Why did a filter exclude a job with no published value?

Date, country, workplace, employment-type, and compensation filters require comparable public source data. A listing without the value needed for a selected filter is excluded rather than guessed.

Are duplicate jobs returned or charged twice?

No. The Actor uses canonical Handshake job identity to deduplicate the same job across all sources in a run. Only a unique successful listing saved to the default dataset creates the job charge.

Does maxDiscoveryItems limit direct job URLs?

No. It limits jobs returned from keywords, locations, and public search URLs. Direct job URLs are bounded by the submitted URL list itself.

Can this Actor alert me when a job changes or expires?

Use onlyNewJobs to collect jobs not seen in earlier runs. The Actor does not generate change or expiry alerts itself. Schedule runs and compare job IDs and fields in your own datastore or workflow to track those changes.

Do I need a Handshake account, institution access, or API key?

No. The Actor collects only anonymous public Handshake listings. It does not access institution-personalized results, saved jobs, applications, applicant data, or private account pages.

📝 Changelog

v2.0 (06-10-2026)

  • Job rows no longer include url, descriptionText, or yearly pay estimates. Use descriptionHtml for the full job description.
  • Employer rows now include website, phone, and social links when found. Public email lookup runs without the removed includeEmployerEmails option.
  • Filter jobs by country with countries.
  • Use onlyNewJobs to skip jobs seen in earlier runs.
  • Search by location without a keyword.
  • Leave maxDiscoveryItems unset to collect all matching jobs until sources run out. The limit no longer has a fixed maximum or a default of 10.
  • Job rows now include firstActiveAt when the search source provides it.
  • Each saved job gets a progress line with the count so far.
  • Failed jobs found within a search no longer cause public warnings. Search warnings name submitted values once instead of generated URLs.

v0.1

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré