Skip to main content

Claude for Recruiting: Build a Candidate Shortlist from Job Boards and Team Pages

· 16 min read
Yassine El Haddad
Software Developer & Automation Specialist

I build production AI agents, web scrapers, and automation pipelines. Most of what I publish here comes from the actual problems they run into: proxies that get banned, anti-bot stacks that fingerprint your client, RAG that drifts when the underlying data moves. Stack: Python, TypeScript, Go, FastAPI, LangChain, Crawlee, Playwright, deployed on AWS, GCP, and Cloudflare.

Quick Answer

Paste a role spec into Claude Cowork. Claude uses Apify scrapers to pull job ads for the same role in your market, turns the hiring companies into a target list, reads those companies' public team pages, and scores the people it finds against your must-haves. Every score cites the line it came from. You review the list and decide who to contact; Claude only drafts outreach for the people you approve. Scraping for one role costs well under a dollar. The legal limits (GDPR, LinkedIn's and GitHub's terms) shape the workflow more than the tooling does, so they get their own section.

Sourcing tools sell you a database. This workflow builds a small, fresh one per role from pages that companies chose to publish, and it keeps a person in charge of every decision about a human being. That second part is not decoration: in the EU, the same scoring step that saves you an afternoon is the part regulators care most about.

What you end up with​

For each role, one spreadsheet with three tabs:

  1. Target companies. Companies hiring for the same profile in your area in the last month, with the stack and seniority signals from their ads. If they are hiring this profile, they already employ people who do the job.
  2. Shortlist. People listed on those companies' public team pages whose published title matches the role, with a fit score per must-have, each one citing the source line and URL, and unknown wherever the page says nothing.
  3. Outreach drafts. Written only after you mark people as approved, each with a short note on where you found them and how to opt out.

The flow:

role spec ──► job ads (LinkedIn, Indeed) ──► target companies
│
public team pages ◄──────────┘
│
▼
cited fit scores ──► YOU review ──► outreach drafts (approved only)

Let Claude set it up for you​

Paste this into a new Cowork task. Claude interviews you about the role, checks the Apify connector, runs a tiny test so you see real output and real cost, and only then runs the full search, stopping for your approval between stages.

Build a candidate shortlist for my roleInteractive setupPaste into Claude Cowork

Claude interviews you about the role, tests each scraper on a tiny sample, and builds the three-tab shortlist, asking before every step that costs money or writes files.

  1. Asks for the role spec, must-haves, nice-to-haves and locations, one question at a time
  2. Checks the Apify connector is connected, and explains how to add it if not
  3. Runs a small test of each scraper and shows the cost
  4. Builds the target-company list, then the cited shortlist, then waits for your review before drafting any outreach
Help me build a candidate shortlist for one open role, using the Apify connector.
Work through these stages in order. Ask me ONE question at a time, and stop for
my approval at the end of each stage.

1. INTERVIEW. Ask me, one at a time:
- the role title and a paste of the role spec (plain text)
- the 3-5 must-haves (skills, experience, languages)
- nice-to-haves, kept separate from must-haves
- the city or region, and whether remote candidates count
- companies to exclude (current clients, our own company, non-poach agreements)
- how many target companies to research (default 10)
Then repeat the must-haves back to me as a numbered list and wait for "OK".

2. CHECK THE CONNECTOR. Confirm you can use the Apify tools call-actor and
get-dataset-items. If not, tell me to add a custom connector named Apify
in Customize > Connectors with this URL, then stop:
https://mcp.apify.com?tools=actors,curious_coder/linkedin-jobs-scraper,valig/indeed-jobs-scraper,apify/website-content-crawler

3. TEST. Ask before running. Then run each Actor once on a tiny sample, with
callOptions.maxTotalChargeUsd set to 0.10:
- curious_coder/linkedin-jobs-scraper: keywords = role title,
location = my city, datePosted = "pastMonth", limitPerSource = 5,
scrapeCompany = false
- valig/indeed-jobs-scraper: title = role title, location = my city,
country = my two-letter country code, datePosted = "14", limit = 5
- apify/website-content-crawler on ONE team page of a company from the
test results: maxCrawlPages = 1, maxCrawlDepth = 0
Show me what came back and what each run cost.

4. TARGET COMPANIES. Ask before running. Run the two job scrapers again with
limitPerSource = 50 and limit = 50. Group the ads by company, drop
recruitment agencies and my exclusions, and rank companies by how closely
their ads match my must-haves. Save tab 1 of shortlist.xlsx: company, ad
titles, ad URLs, stack and seniority signals. Show me the top companies
and let me remove any before you continue.

5. TEAM PAGES. For each approved company, find its own public team, about or
people page on its own website (not LinkedIn, not GitHub). Show me the URLs
and ask before crawling. Crawl with apify/website-content-crawler,
maxCrawlPages = 3 per company, includeUrlGlobs limited to that company's
domain. Do not crawl any page behind a login.

6. SHORTLIST. From the crawled pages, extract only: name, published job title,
team, city, source URL. Do not collect photos, personal emails, phone
numbers, ages, or anything about health, family, religion or ethnicity,
and never guess any of these from a name or photo.
Score each person 0-2 on each must-have, using ONLY what the page says.
For every score, quote the line it is based on. If the page says nothing,
write "unknown" (not 0). Save tab 2. Then STOP and ask me to mark each
person approve / reject. Do not draft anything yet.

7. OUTREACH. Only for people I approved: draft a short, specific message that
says where we found their name (the source URL), why the role fits, and
that they can ask us to delete their details. Save tab 3.
Never send anything yourself.

Claude asks before each change it makes. Read each step before you approve it.

Re-run for a second locationPaste into Claude Cowork

Use in the same task once the first shortlist is done.

Repeat stages 4-6 for a second location: [CITY, COUNTRY CODE]. Reuse my
must-haves and exclusions. Add the results as new rows with a Location column,
skip anyone already on the shortlist, and stop for my review again.

The rest of this post explains what each stage does and why it is built this way, so you can adjust it rather than run it blind.

What you need​

Claude planA paid plan with Cowork
Apify accountThe free plan includes $5 of monthly usage credit, more than one role needs
ConnectorApify's remote MCP server added as a custom connector (setup guide)
Your inputA written role spec with must-haves you could defend to a candidate

Keep the connector lean. Apify's MCP server accepts a tools parameter, and listing only the Actors this workflow uses keeps Claude from wandering to other scrapers:

https://mcp.apify.com?tools=actors,curious_coder/linkedin-jobs-scraper,valig/indeed-jobs-scraper,apify/website-content-crawler

Apify's docs note that call-actor takes run limits such as maxTotalChargeUsd in its call options, which is why the setup prompt caps every test at $0.10.

Step 1: Map who is hiring for the same profile​

Job ads are the cleanest public signal in recruiting: they name a company, a stack and a seniority, and they contain no candidate data at all. A company hiring a senior data engineer in Berlin this month almost certainly employs data engineers in Berlin today.

ActorInputs this workflow usesPrice per job (free plan)
LinkedIn Jobs Scraperkeywords, location, datePosted: "pastMonth", limitPerSource, scrapeCompany: false$0.002 subject to change · verified 2026-10-21
Indeed Jobs Scrapertitle, location, country, datePosted: "14", limit$0.0001 subject to change · verified 2026-10-21

The LinkedIn Actor drops to $0.001 per job on paid Apify plans. Both charge a tiny per-run start fee on top.

We ran both on 2026-10-21 for "Senior Data Engineer" in Berlin, 10 jobs each, on a paid Apify plan. The LinkedIn run cost $0.010 (it would be about $0.02 on the free plan) and returned fields including title, companyName, location, postedAt, applicantsCount, seniorityLevel and the full descriptionText. The Indeed run cost $0.002 and returned title, employer, location, datePublished, baseSalary and description. A trimmed slice of what Claude turns that into:

Target companies (real output from a test run on 2026-10-21, trimmed)

Company names and ad titles are from public job ads. Only one of the ten Indeed ads published a salary range.

[
{ "company": "ABOUT YOU", "adTitle": "Senior Data Engineer - Shop Analytics (all genders)", "source": "LinkedIn", "posted": "2026-10-16" },
{ "company": "4flow", "adTitle": "Senior Data Engineer (d/f/m)", "source": "LinkedIn", "posted": "2026-10-20" },
{ "company": "Springer Nature", "adTitle": "Senior Data Engineer (Fixed-Term Contract)", "source": "Indeed" },
{ "company": "ALCEMY", "adTitle": "Backend Engineer - Data (m/f/d)", "source": "Indeed", "salary": "EUR 60,000-75,000 / year" }
]

Two things the test showed that the prompt now handles. First, recruitment agencies post a lot of these ads (one of our ten LinkedIn results was an agency advertising for an unnamed client), so stage 4 drops them. Second, keyword search drifts: a "Senior Data Engineer" search also returned a "Senior Software Engineer" ad. Ranking companies against your must-haves, instead of keeping every ad, filters that out.

For more on these two scrapers and the alternatives, see the Apify jobs scrapers comparison and the Indeed scraping guide.

Step 2: Read the companies' own team pages​

Many companies publish who works there: team pages, "about us" pages, engineering blogs with author bylines, conference speaker lists. Those pages were published by the employer, on purpose, which matters both legally and ethically.

Website Content Crawler turns a page into clean Markdown that Claude can read. It is billed by platform usage rather than per result: our one-page test with the browser-based crawler cost $0.013, including start-up. At three pages per company and 10 companies, plan on roughly $0.40 for this step.

On the test page, a public team page of a software company with over 200 staff, each person appeared as a name, a job title, a team and a city. Claude reduces that to the minimum the shortlist needs:

One extracted row (real output from a test run on 2026-10-21, anonymised)

Name and source URL removed for this article. The workflow keeps the source URL so every row can be checked.

{
"name": "[removed]",
"publishedTitle": "Graphics Lead",
"team": "Graphics Team",
"city": "London, UK",
"sourceUrl": "[removed]"
}

The same page also carried photos and a personal "about me" paragraph per person. The prompt tells Claude not to collect either. A shortlist does not need them, and data minimisation is a GDPR principle, not a nicety.

Team pages also have a limit you should plan around: they rarely list skills. Expect many unknown scores. That is the correct output. A tool that fills those gaps with confident guesses is producing fiction about real people.

Step 3: Score with citations, then stop​

The scoring rules in the prompt do three jobs:

  • Every score quotes its source line. You can check any score in seconds, and a score with no quote is visibly invented.
  • Missing evidence is unknown, not 0. A team page that does not mention Python is not evidence that someone lacks Python.
  • Claude stops after scoring. It does not rank people into "contact" and "skip". You do.

Keep a human in the loop, and keep bias out​

The point of the shortlist is to save you reading time, not to make the hiring decision. Concretely:

  • Score only job-relevant criteria you wrote down. Must-haves come from your interview answers, not from Claude's sense of a "strong profile". Vague criteria such as "culture fit" are where bias enters, so leave them out.
  • Never infer protected characteristics. The prompt forbids guessing age, gender, ethnicity, health or family status from names, photos or graduation years. Do not ask for it in follow-ups either.
  • Do not let source prestige stand in for skill. A company's brand is not a must-have unless you can say what skill it proves.
  • Look at who the list leaves out. Team pages over-represent companies that publish them, and senior people who write and speak publicly. If your shortlist looks uniform, widen the target companies before you narrow the people.
  • Review every person yourself before any outreach. Approve or reject; do not skim a ranked list from the top.

This is not legal advice, and recruiting law varies by country. These are the rules the workflow is built around. For the fuller picture, read Is Apify legal? and the web scraping legal guide.

GDPR applies to every name on your shortlist. A person's name and job title are personal data even when their employer published them. If you or the candidates are in the EU or UK, you need a lawful basis (recruiters usually rely on legitimate interest, which needs a documented balancing test), you should collect only what the purpose needs, and you should delete what you no longer use. Article 14 also requires you to tell people you collected their data indirectly: within a month at the latest, or at your first message to them if sooner. That is why the outreach drafts say where you found the person and how to opt out.

No LinkedIn profiles. LinkedIn's User Agreement prohibits using software, scripts or crawlers "to scrape or copy the Services, including profiles and other data". This workflow reads LinkedIn job ads, which contain no candidate data, and nothing else from LinkedIn. Those terms technically cover job ads too, which is one reason the workflow pairs LinkedIn with Indeed: if you would rather avoid LinkedIn entirely, drop it from the prompt and the method still works. Our LinkedIn scraping guide covers the policy context in more detail.

No GitHub scraping for recruiting. GitHub's Acceptable Use Policies restrict how information from the service may be used, whether scraped or collected through its API. They expressly prohibit using it for spamming, "including for the purposes of sending unsolicited emails to users or selling personal information, such as to recruiters, headhunters, and job boards". If a candidate links their GitHub in an application, read it yourself. Do not harvest it.

Automated hiring tools may be regulated where you hire. The EU AI Act lists AI systems used "to analyse and filter job applications, and to evaluate candidates" among its high-risk uses (Annex III, point 4), and New York City's Local Law 144 bars employers from using an automated employment decision tool unless it has had a bias audit within the past year, the audit summary is public, and candidates have been notified. Keeping the decision with a human reviewer is good practice everywhere, but it does not by itself settle these obligations. If you recruit at volume in these jurisdictions, check with counsel before you rely on any automated scoring.

What it costs​

StepVolumeCost on the Apify free plan
LinkedIn job ads50about $0.10
Indeed job ads50about $0.01
Team pages10 companies × 3 pagesabout $0.40 (estimate from our test)
One roleabout $0.50

The Claude side is covered by your plan's usage limits. Apify's free plan includes $5 of usage credit each month, enough for several roles. Prices were checked on 2026-10-21; the Actor pages are the source of truth.

When this is the wrong tool​

  • You need contact details at scale. This workflow deliberately collects no emails or phone numbers. Dedicated recruiting platforms with their own consented or licensed data are the better fit, and they handle the compliance paperwork for you.
  • The role is niche and the people do not appear on team pages. Referrals, communities and conference talks will beat any scraper.
  • You hire hundreds of people a year. At that volume, an applicant tracking system with audited screening is the right home for scoring, not a chat.

FAQ​

Frequently Asked Questions

Yes, for the research part. In Claude Cowork with the Apify connector, Claude can pull job ads for the same role to find companies that employ the profile, read those companies' public team pages, and score the people listed against your must-haves with a quoted source for each score. A recruiter should review the list and make every contact decision.

It depends on the source and where you hire. LinkedIn's User Agreement prohibits scraping profiles, and GitHub's Acceptable Use Policies prohibit using its data for unsolicited emails or selling personal information to recruiters. Under GDPR, even names and titles from a public company page are personal data, so you need a lawful basis, should collect only what you need, and must tell people you hold their data within a month. This is not legal advice; check with counsel for your situation.

Score only written, job-relevant must-haves; forbid any inference of age, gender, ethnicity or health from names or photos; mark missing evidence as unknown instead of zero; and have a person review every candidate before outreach. Also check who the list leaves out, since team pages over-represent people who publish publicly.

In our October 2026 tests, the scraping for one role came to about $0.50 on Apify's free plan: about $0.10 for 50 LinkedIn job ads, about $0.01 for 50 Indeed ads, and about $0.40 to read three team pages at each of 10 companies. Apify's free plan includes $5 of monthly usage credit.

Next steps​

If Apify is not connected to Cowork yet, start with the Cowork + Apify connector setup, then paste the setup prompt above into a new task. Read the legal ground rules once before your first real role, not after. For the recruiter and HR prompts that go with this workflow, see Claude prompts that use live web data.

Create a free Apify account and build your first shortlist →

Advertise on this page