
Case Study
Hiring Signal Pipeline
We built a daily lead engine for recruitment agencies. Each morning it scans public job boards for companies that have just started hiring for the roles an agency places, finds one named person to write to, researches one checkable reason to write now, and drafts an opening line from that fact. It runs on free public sources only, with no paid data provider and no fee per lead. Every name is kept with the page it came from and checked against that page, every address says whether it was published or guessed, and nothing is ever sent. A person reads the digest and decides who hears from them.
- job postings scanned in one sweep
- 5,310
- companies matched to a named person
- 14/18
- unconfirmed names dropped, not shipped
- 3
- paid data providers or lead lists
- 0
The Challenge
A recruitment agency wins work by reaching a company in the weeks after it starts hiring, before an in-house team or a rival agency has the roles covered. The usual tools for this are paid lead databases and enrichment services that charge every month and promise a "verified" email they cannot always deliver. The cold email that most agencies send is also worn out: the same template, a guaranteed dollar figure, and a reason to write that the reader can tell was never checked. The goal was a system that finds real, recent hiring, puts a real person and a true reason behind every row, and costs nothing per lead.
Our Approach
Four rules shaped every stage. Free sources only, so the agency owns the whole system and pays no one per lead. Empty beats invented, so a missing fact or name leaves the field blank instead of filling it with something plausible. Every claim carries its source, so a recruiter can check any row in one click before writing to anyone. And the system drafts but never sends, because the account and the reputation at risk belong to the agency. The filter itself is a plain-English document the recruiter can read, listing the roles, regions and company sizes that count as a signal. It is also the file the pipeline runs, so editing it changes the next morning's list, and every row, kept or rejected, says why.
Finding New Hiring
The pipeline reads the public job board APIs of Greenhouse, Lever, Ashby and SmartRecruiters. Those boards are listed per company, so on their own they cannot say who just started hiring. The monthly Hacker News "Who is hiring?" thread fills that gap: it names new companies and links their boards, and the scrapers pick them up in the same run, so coverage grows every month. Postings are grouped by company and checked against the agency's own client list, so a company it already works with is flagged rather than pitched twice. A posting with no publish date keeps an empty date instead of today's, and a board that fails is named in the morning digest instead of quietly shrinking the list.
A Person to Write To
Job boards never list the hiring manager, so the first version found the company and the role but nobody to write to. The fix runs Claude with web search to find one named person per company, such as a founder, a head of talent, or the head of the team that is hiring, from the company's own site, press coverage or GitHub. The model's answer is not trusted on its own. Every page it cites is fetched, and the name has to appear on that page or it is dropped. LinkedIn is never used as a source. For the address, a person's own published email comes first. Next comes the company's format, learned from other addresses it has published, so a company that uses jdoe@ is not sent jane.doe@. A generic guess comes last, and only at a domain that matches the company's name. Guesses are labeled as guesses.
A Reason to Write Now
For each company, the research step asks for one specific fact from the last six months that a third party could check: a funding round with an amount and a month, a named launch, an acquisition, a new office. The prompt says an empty answer is the correct answer when nothing specific is known, and every reply then passes a screen in code. Hedges such as "appears to" or "reportedly" fail it, as do stock phrases such as "growing team" or "competitive market", and so does any sentence with no number, date, link or proper name a reader could look up. The opening line is drafted from that fact alone. When there is no fact, there is no line, rather than a template with the company's name dropped in.
The Result
The first full sweep scanned 5,310 postings and returned 35 signals, all with real posting dates, but none named a person or carried an address. With the people lookup in place, a run on October 16, 2026 scanned 692 postings and produced 31 signals across 18 companies. 14 of the 18 now have a named person, each linked to the page that names them, and 3 names the model suggested were dropped because their page did not confirm them. 8 companies had a checkable reason to write, and the rest were left blank on purpose. The limits are stated in the output too. A guessed address is not a verified mailbox, since checking one needs a paid service, so guessed rows should be sent a few a day. At large companies the named person is often an executive found in press coverage, which can be out of date, and the source link is there so it can be checked.
Technology & Deployment
The pipeline is a Node.js command-line tool with SQLite for storage. It runs in eight stages: scrape, dedupe, filter, enrich, research, draft, write and digest. A stage that fails is logged and skipped, so a broken lookup still leaves the agency a list and a digest that says what went wrong. Research and drafting call the local Claude command-line tool, and the pipeline still runs without it, just with those fields left empty. Each request has a hard time limit, and each job board gets one request at a time, spaced apart, so the free sources stay welcoming. Each morning produces a CSV, a JSON copy and a short digest, and re-running a day rewrites the same files without duplicate rows. The word "verified" cannot be stored at all: the database rejects it, and a test checks that it does. The suite has 50 tests and none touches the network.