Resume Scraper & Candidate Sourcing - Hacker News avatar

Resume Scraper & Candidate Sourcing - Hacker News

Pricing

from $20.00 / 1,000 candidate profiles

Go to Apify Store
Resume Scraper & Candidate Sourcing - Hacker News

Resume Scraper & Candidate Sourcing - Hacker News

Resume scraper and candidate sourcing for recruiting teams: parses the monthly Hacker News Who wants to be hired thread into developer profiles with email, resume URL, GitHub, tech stack, seniority and remote preference. Candidates actively looking. Export CSV, JSON or API.

Pricing

from $20.00 / 1,000 candidate profiles

Rating

0.0

(0)

Developer

Andres Garcia-Baquero Leon

Andres Garcia-Baquero Leon

Maintained by Community

Actor stats

0

Bookmarked

14

Total users

5

Monthly active users

11 days ago

Last modified

Share

Hacker News Who Wants to Be Hired Scraper - Candidates

Get a sourcing-ready dataset of software engineers who publicly said they want a new job this month. This Actor turns the monthly "Ask HN: Who wants to be hired?" thread into structured candidate profiles with location, tech stack, remote and relocation preferences, resume link, GitHub, LinkedIn and a contact email.

You do not get a pile of HTML comments. You get rows you can filter, score and push straight into your ATS, CRM or sourcing spreadsheet.

Job scrapers vs this Actor

Everyone scrapes the "Who is hiring?" side. That is the demand side, and it is crowded. This Actor covers the supply side: the candidates themselves.

A job scraper gives youThis Actor gives you
Open roles and company job adsReal people actively looking for work
Companies you then have to pitchCandidates who asked to be contacted
Company-focused datasetsCandidate-authored top-level comments
Company name, title, descriptionLocation, stack, seniority, email, resume, GitHub, LinkedIn
Leads you must qualify for intentStated intent to be hired, in their own words
Something you sell intoSomething you place, which is the billable side

Example output

Selected fields from real October 2026 comment 50035466, captured 12-Oct-2026. This profile links a project site but does not label a CV: the project is retained in otherLinks, not promoted to resumeUrl.

{
"location": "Boston, MA",
"remote": true,
"willingToRelocate": true,
"seniority": "senior",
"yearsExperience": 6,
"resumeUrl": null,
"resumeUrlSource": "unavailable",
"githubUrl": null,
"linkedinUrl": "https://www.linkedin.com/in/eddie-tai-5182a752",
"contactScore": 4,
"hasContact": true,
"hnUrl": "https://news.ycombinator.com/item?id=50035466",
"hnUser": "taieddie8"
}
hnUserlocationremoteresumeUrlresumeUrlSourcecontactScore
taieddie8Boston, MAtruenullunavailable4

Output fields

FieldTypeDescription
locationstringStated location (city, country, timezone)
remoteboolean / nullParsed from the Remote: line
willingToRelocateboolean / nullParsed from the Willing to relocate: line
technologiesarrayClean array of technologies, for example ["Rust", "Kubernetes", "Postgres"]
senioritystringprincipal, senior, mid, junior, or unspecified
yearsExperienceinteger / nullYears of experience when stated
emailstring / nullContact email, including de-obfuscated name at domain dot com forms
resumeUrlstring / nullURL on a Resume/CV-labelled line, or a conservative CV/resume path hint; not a validated document
resumeUrlSourcestringlabelled, path_hint, or unavailable; see attribution rules below
githubUrlstring / nullGitHub profile
linkedinUrlstring / nullLinkedIn profile
otherLinksarrayPersonal site, portfolio, blog and similar links
contactScoreinteger0-7 heuristic (email=3, attributed resume URL=2, GitHub=1, LinkedIn=1); not verification or candidate quality
hasContactbooleanEmail, attributed resume URL, or LinkedIn was found; GitHub alone does not set this flag
hnUrlstringDirect link to the HN comment
hnUserstringHN username
postedAtintegerUnix timestamp
threadTitlestringFor example Ask HN: Who wants to be hired? (August 2026)
textstringFull plain-text profile

How to use it

  1. Click Try for free on the Actor page in Apify Store.
  2. Leave the input empty. Running with empty input {} works out of the box: it parses the latest "Who wants to be hired?" thread with no filters. Add filters only when you want a narrower list.
  3. Click Start and watch candidates stream into the dataset while the run is still going.
  4. Export the results as CSV, JSON, Excel, XML or HTML, pull them through the Apify API, or fire a webhook into your own system.

Input

{
"threadType": "wants_to_be_hired",
"month": "latest",
"remoteOnly": true,
"mustHaveEmail": true,
"requiredTech": ["rust", "kubernetes"],
"maxResults": 500
}
FieldTypeDefaultDescription
threadTypestringwants_to_be_hiredwants_to_be_hired (job seekers) or freelancer (Freelancer? Seeking freelancer? thread)
monthstringlatestlatest or a specific month like July 2026
threadIdstring-Override: parse a specific HN story item ID
remoteOnlybooleanfalseOnly candidates open to remote work
willingToRelocateOnlybooleanfalseOnly candidates willing to relocate
mustHaveEmailbooleanfalseOnly candidates with a detected email
requiredTecharray[]Match ANY of these technologies
keywordsarray[]Match ANY keyword anywhere in the profile
maxResultsinteger500Max profiles to return (1-1000)

Example 1: remote senior Rust candidates

{
"threadType": "wants_to_be_hired",
"month": "latest",
"remoteOnly": true,
"requiredTech": ["rust"],
"keywords": ["senior"],
"maxResults": 200
}
{
"threadType": "wants_to_be_hired",
"month": "July 2026",
"mustHaveEmail": true,
"keywords": ["resume", "cv"],
"maxResults": 500
}

This input does not require an actual CV URL. For a CV-oriented shortlist, filter output rows where resumeUrlSource == "labelled" and resumeUrl != null. path_hint is weaker evidence; inspect the original text and hnUrl. You are charged for every delivered candidate profile, not only those passing a downstream filter.

Resume attribution - not document verification

  • labelled: an HTTP(S) URL occurs in a line explicitly labelled Resume, Résumé, CV, or Resume/CV. An empty label can continue onto the next nonempty URL-only line.
  • path_hint: there is no explicit resume label, but a link path contains a separate cv or resume token (for example /files/resume.pdf). This remains a heuristic, not proof of a CV.
  • unavailable: no attributable URL was found. resumeUrl is null. A personal homepage, portfolio, paper PDF or project link is not silently substituted for a CV; links remain in otherLinks (up to five) and the full comment remains in text.
  • A label saying "available on request" does not borrow a URL from another field. Real hrefs on the labelled line recover truncated display text. Unsupported inline layouts may produce nulls rather than a guessed URL.
  • The Actor does not download, validate or enrich linked CV documents, nor verify emails, identities, employment status or availability. Source comments can include non-human accounts or promotional posts; delivery is not certification of a human candidate.

Use cases

  • Technical recruiters - build a monthly shortlist of inbound, remote-ready engineers before your competitors read the thread.
  • Recruiting and staffing agencies - refill the bench every month with candidates who have stated hiring intent.
  • Talent pipelines - accumulate months of profiles into one searchable pool segmented by stack, seniority and location.
  • Headhunting - filter for principal and senior seniority plus a specific stack, and go direct with an email or resume in hand.
  • Talent market and salary research - track which stacks, locations and remote preferences dominate month over month.
  • ATS and CRM enrichment - match parsed GitHub, LinkedIn and resume URLs onto records you already hold.
  • Freelance vendor discovery - switch threadType to freelancer to source contractors instead of full-time hires.

Integrations

Connect the output to whatever you already run:

  • Zapier, Make and n8n for no-code automations.
  • Slack to drop new matching candidates into a sourcing channel.
  • Google Sheets and Airtable for shared shortlists.
  • Airbyte to load candidates into your warehouse.
  • LangChain and the Apify integrations for AI screening and ranking.
  • REST API and webhooks to trigger runs and receive results in your own stack.

Set a monthly schedule in Apify so the Actor fires shortly after each new thread goes up, and every month's candidates land in your pipeline without anyone remembering to press a button.

Field coverage

Historical measurement on the August 2026 thread (54 parsed profiles from the first 60 comments), before the stricter resume attribution introduced on 12-Oct-2026. This table is not current coverage and its resume/score figures must not be extrapolated to the current parser:

FieldCoverage
location98%
technologies92%
remote85%
willingToRelocate79%
resumeUrl79%
email70%
hasContact (any channel)94%

Coverage depends on what each candidate chose to include in their post.

Pricing

Pay per result - you only pay for candidate profiles actually returned.

EventPrice
Candidate profile$0.02
Actor start$0.00005

Illustrative billing: 400 delivered profiles cost $8 plus the Actor-start event, not a promise of 400 candidates in a month. Start pricing is per GB with a minimum of one event. Use maxResults, filters and Apify's maxTotalChargeUsd to control event spend. Named-event delivery is atomic: only the chargeable prefix is written when the budget is reached. Owner QA events are not seller revenue.

Reliability

  • Uses the documented Hacker News Firebase API + Algolia HN Search for discovery; no browser, proxy or login. Public access is not a commercial reuse licence.
  • Retries with exponential backoff on rate limits and 5xx responses.
  • Incremental pushing - a late failure still leaves you the results already parsed.
  • A single malformed comment can never fail the run.

FAQ

Do I need a Hacker News account or API key? No. There is no login, no cookie and no proxy configuration. The Actor reads the official public Hacker News Firebase API and uses Algolia HN Search to find the right monthly thread.

Is this legal? Public visibility and API access do not establish permission for every commercial reuse. Posts can contain personal data; you remain responsible for applicable source terms, a lawful processing basis, retention, opt-outs and GDPR or other local requirements. Use for relevant recruiting, not bulk unrelated marketing. No legal clearance or resale permission is asserted by this Actor.

How fresh is the data? The "Ask HN: Who wants to be hired?" thread is posted once a month. With month: "latest" the Actor targets the newest matching thread indexed by Algolia, and candidates keep posting to it throughout the month, so re-running gives you newly added profiles.

Why are some fields empty or null? They can be absent in the source or not recognised by the heuristic parser. Seniority, years, de-obfuscated emails, contactScore and path_hint are derived, not verified facts. If someone omits an email or a recognised Remote: line, those fields can be null. Resume attribution favours nulls over substituting unrelated links.

Can I get past months? Yes. Set month to a specific month like "July 2026", or pass a threadId to parse a specific HN story item ID directly. Run it once per month to backfill a full pipeline.

Will it break? Documented APIs reduce browser maintenance but do not guarantee availability. Rate limits and 5xx responses are retried with exponential backoff. Incremental delivery preserves previously written rows; failed comment reads can reduce coverage, and a billing failure is not swallowed as a successful delivery.

Can I get freelancers instead of full-time job seekers? Yes. Set threadType to freelancer to parse the "Freelancer? Seeking freelancer?" thread instead.

Historical selection and coverage limits

  • Omit month or use the literal "latest" to select the newest matching thread indexed by Algolia (not necessarily the current calendar month).
  • Historical input must use a full English month and four-digit year, exactly like "January 2020". Abbreviations, lowercase month names, surrounding whitespace, empty strings and null are rejected; they are not corrected.
  • Historical discovery searches the requested month in titles and paginates the matching search results. The exact thread type and month/year in the title are checked again against HN Firebase before comments are parsed. An unavailable month raises a clear error, never a fallback to latest. Algolia indexing gaps and API errors can prevent resolution of a real thread.
  • threadId remains an explicit override and takes precedence over month (and thread type where applicable). It bypasses automatic month selection; verify the ID you supply. Each output row includes threadId, threadTitle and threadMonth (resolved from the source title, or null for a custom title without a recognised monthly suffix).
  • These are heuristic parsers of top-level comments, not a complete archive. Deleted/dead comments are omitted. Failed comment reads are logged and skipped, so a successful run can still contain fewer profiles/listings than the thread. Check warnings before treating a backfill as complete. Filters, result limits, posting activity and parsing rules also reduce coverage.

Local regression checks (no Apify runs)

From this actor directory, with httpx and apify installed:

python -B -m unittest -v test_main.HistoryTests
HN_LIVE_TESTS=1 python -B -m unittest -v test_main.LiveTests

The first command uses mock HTTP responses and an Actor stub, including failure and no-delivery assertions. The opt-in second command only reads public Algolia and HN Firebase to verify January 2020 thread resolution; it does not publish rows or verify Cloud billing.

Troubleshooting

ProblemFix
Zero results returnedYour filters are too strict. Remove requiredTech / keywords or turn off remoteOnly and mustHaveEmail, then re-run.
Fewer results than expectedRaise maxResults (max 1000). Early in the month the thread simply has fewer comments.
Month not foundCheck the exact "July 2026" format and source availability. No other month is substituted. A verified threadId bypasses discovery.
email is null for many rowsThose candidates did not post an email. Filter with mustHaveEmail: true, or use resumeUrl and githubUrl instead.
Technologies look incompleteThe parser only extracts what the candidate wrote. Use the text field for the full raw profile.
Run cost higher than expectedPricing is per candidate profile returned. Lower maxResults and tighten filters.
Run slower than expected on big threadsLarge threads mean more API calls. Results are pushed incrementally, so you can start reading the dataset before the run finishes.
Need results in another systemExport to CSV, JSON, Excel, XML or HTML, or wire up a webhook or the REST API integration.

Feedback and reviews

Did this Actor save you sourcing time? A short, honest review on the Store helps other recruiters find it. Positive or critical, both are welcome.

Something missing or broken (a field, a filter, a month that fails)? Please open an issue so it can be fixed quickly.

Responsible use

These public comments may contain personal data and are not identity-verified. Source access does not itself authorise resale or every downstream use. Use for relevant recruiting, minimise retention, honour opt-outs, and comply with applicable source terms and data-protection requirements. The Actor does not establish your lawful basis or accept source agreements for you.

Source-terms caveat (reviewed 12-Oct-2026): the Y Combinator Terms of Use cover subdomains and reference the HN Guidelines. Their Commercial Use section restricts commercial copying/distribution/resale unless expressly authorised, and Site Content restrictions address scraping/data gathering. The documented HN API demonstrates technical access; it does not by itself resolve commercial reuse rights. Specific permission or an applicable exception has not been verified for this product. This is an unresolved contractual question, not a declaration that every API use is unlawful. No additional source agreements are accepted by this Actor.

Store categories: JOBS, LEAD_GENERATION, DEVELOPER_TOOLS