Findings from building the product, the experiments we ran, the legal line as the courts have drawn it, and the recommendations we are following. Written so a recruiter, a hiring manager, or counsel can read it in ten minutes.
Kaen ranks the people who engage with a company's posts by intent and by fit against what that company hires for. To do that it needs, per post, the full list of people who reacted and commented with their names and headlines, and for the engineers who clear the intent bar, the full public profile. It also needs the post itself: date, author, text, and LinkedIn's own reaction and comment counts, so coverage can be checked.
Two things it does not need today, and which only a logged-in account can provide: connection degree and mutual connections, and the ability to send a message. Those belong to the reachability and outreach layer discussed at the end.
Every post page displays a reaction and a comment count. The vendor actors enumerate the lists independently, so the two can be compared.
| Post | LinkedIn shows | Vendor returned | Coverage |
|---|---|---|---|
| Marlow launch (Daniel Arden) | 571 · 81 | 569 · 81 | 99.6% · 100% |
| Marlow launch (Theo Varga) | 147 · 21 | 147 · 21 | 100% · 100% |
| Northwind video post | 60 · 10 | 60 · 9 | 100% · 90% |
The gaps are people who withdrew a reaction or set their profile private after LinkedIn cached the count, plus one comment that was deleted.
A second vendor was run on the same post. Its free tier allowed ten rows. All ten reactors were present in the first vendor's list with the identical profile id, reaction type, and headline. The two vendors are reading the same source.
We fetched post pages the way a browser does with no account, and looked for the endpoints LinkedIn's own page uses.
| Needed | Public page, no login |
|---|---|
| Post date, author, text, counts | Available, in the page's structured data. This is the one request Kaen makes to LinkedIn itself. |
| Reactor list | Not available. The reaction count links to a sign-up page. |
| Comments | 9 of 21 embedded, with no way to load more. |
| LinkedIn's internal reactions API | 403 without a session. |
| A reactions page URL | 404. |
Conclusion. A self-built, public-only scraper cannot produce the reactor list the queue depends on. The only self-built scraper that can is a logged-in one, which means an account.
Kaen stays on the public side of that line for ingestion, and treats its vendor as swappable so a vendor's legal trouble does not become ours: raw output is cached, two vendors accept the same inputs, and the normalizer reads both.
The actors Kaen uses advertise themselves as cookie-free. Our logged-out experiment shows what that means: the customer supplies no cookies. Since the reactor list is not reachable without a session, the vendor is operating sessions on its side. That is their legal exposure, not ours, and it is why the vendor tier is one lawsuit from disappearing.
Design consequence. Never let a single vendor be a foundation. Cache everything, keep two vendors interchangeable, and keep the intent scoring independent of where the rows came from. Kaen does all three today.
The alternative that is not a vendor at all is LinkedIn's Recruiter System Connect and Talent APIs, the sanctioned route ATS vendors use. It requires partner approval and time, and becomes realistic once in-house teams are paying customers.
These are the signals LinkedIn describes publicly and that get accounts restricted. They are listed so the recommendation below makes sense, not as a checklist to defeat.
Position. Kaen will not build to defeat these controls, and will not run account pools. Doing so is the fact pattern behind every lost case above, and it would put a recruiter's seat and the company's name at risk for a feed a vendor sells for two dollars per thousand rows.
A member can connect their own LinkedIn through Unipile. Kaen reads it and never posts or sends: their connections and sent invitations once on connect, and how they are connected to a candidate whose card they open. Their connections are read again at most every 30 days, only when they open Kaen and the stored ones are out of date, and a mutual connection missing a photo or a link is read on its own, counted in the same daily limit as the lookups and stopping 10 short of it.
If they ask, Kaen reads the messages they sent in one-to-one conversations in the last 12 months, once, to set up their voices. It reads at most their newest 300 conversations, drops what the other person wrote as it reads, and drops every message not about a role or hiring without storing it. The result waits for their review and is deleted when they use it, discard it, disconnect, or leave it for 14 days. After that Kaen keeps the voices and the examples they kept, and the examples go when they disconnect.
When something breaks, on our servers or in the browser, an error report goes to Sentry. It carries ids and the sender's IP address: no names, no LinkedIn data and no messages.
Posts, reactors, commenters, profiles, company pages, and team rosters through the public-data vendors, with coverage checked against LinkedIn's counts on every post and a second vendor kept interchangeable. This is the current architecture.
A browser extension that acts only on the page the recruiter has open, when they click: reading connection degree and mutual connections on a profile they are looking at, and sending through LinkedIn's own compose box one message at a time. Human pace, human triggered, on their own account. That yields reachability and reply tracking with nothing automated to detect.
Kaen fetches a post's public page once, logged out, to read its date, author, counts, and canonical link. That is what any browser does when the link is opened. If a customer prefers zero direct requests, the vendor can supply the same metadata.
Recruiter System Connect and the Talent APIs are how ATS vendors get seat data legitimately. Apply once in-house teams are paying.
Work email bounces, GitHub activity, personal sites, and company page changes are cheap, legally clean, and often earlier than a profile edit. They also keep the product working if the vendor tier degrades.