← Lusha Talent SourcingCONTENT HISTORY

Update to Lusha Talent Sourcing

Snapshot Sep 30, 2026 · 23:12 UTC · version 1.0.0

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Source talent for an open position. Use when the user describes a position they are hiring for, pastes a job description, asks who is out there or available for a role, or asks to source, find or shortlist candidates or talent. Asks a few scoping questions first, then returns an ordered shortlist of people who fit the position and have been in their current job long enough to be open to a move, each with a reason to approach them now. Does not reveal contact details unless the recruiter asks.",
  "included_files": [
    {
      "relative_path": "references/shared-reference.md",
      "size_in_bytes": 27705
    }
  ],
  "name": "source-movable-talent",
  "skill_md_contents": "---\nname: source-movable-talent\ndescription: Source talent for an open position. Use when the user describes a position they are hiring for, pastes a job description, asks who is out there or available for a role, or asks to source, find or shortlist candidates or talent. Asks a few scoping questions first, then returns an ordered shortlist of people who fit the position and have been in their current job long enough to be open to a move, each with a reason to approach them now. Does not reveal contact details unless the recruiter asks.\n---\n\n# Source Movable Talent\n\nRead `references/shared-reference.md` first. It carries the terminology, the twenty hard rules, the\ntenure mechanism, the ordering rules and the cost table. This file is the flow.\n\n## What this skill is for\n\nA recruiter has a position to fill. They want talent that fits it and is actually\napproachable right now, with a reason to make contact. Not a database dump.\n\nTwo things make the answer good, and both are your job rather than the API's:\nasking enough to build a real brief before spending anything, and ordering the\npool that comes back so the recruiter reads from the top instead of reading\neverything.\n\n**Language.** You are sourcing talent, and each person in the shortlist is a\ncandidate. Talent for the pool and the activity, candidate for the individual, per\nshared reference section 1. Say \"sourcing talent in Berlin\" and \"the strongest\ncandidate in that pool\", not \"searching for candidates\" and not \"Erik is talent\".\n\n## Step 0. Ask, then restate. Before any tool call.\n\nAsk **at most three** questions, in one round, skipping anything the brief already\nanswered. Pick from these in priority order:\n\n1. **Location.** Which markets, and does remote count? Almost always needed and\n   almost never volunteered.\n2. **Level**, if the title is ambiguous. \"Engineer\" spans intern to staff.\n3. **Tenure**, offered as a default, not a question: \"I will look for people who\n   have been in the job two years or more, which usually means they are open to\n   a conversation. Say if you also want recent movers.\"\n4. **A must-have**, if the position implies one: a certification, a target\n   previous employer, a specific technology company background.\n\nIf they pasted a job description, most of this is answered. Read it before asking.\nAsking a recruiter something they just wrote down is the fastest way to lose them.\n\nThen **restate the brief in one line and name the filters**, before spending:\n\n> Senior backend engineers, Berlin or remote in Germany, in seat two years or\n> more, AWS certification preferred. I will search on level senior, department\n> Engineering and Technical, country DE, and exclude anyone who changed job since\n> August 2024. Say if that is wrong, otherwise I will run it.\n\nIf they decline to answer anything, proceed on defaults and say which defaults you\nused. Never ask twice.\n\n## Step 1. Resolve their words into real filter values\n\nUse `talent_search_filters`. Free, so there is no reason not to. Resolve from the\ntool, never from a list written into this file. That is hard rule 15.\n\nDepartments, levels and locations all have fixed vocabularies that will not match\nwhat the recruiter said.\n\nCertifications are worse. The same certification exists under several spellings,\nso pass **every** spelling or you miss most of the population, but pass **only the\ncertifications**. The same lookup returns course names, training badges, job\nsimulations and academy graduations, and those say nothing about level. **Keep\nonly values containing \"Certified\"**, then drop anything with Cert Prep, Early\nAdopter or a numbered course fragment. A blocklist was tested and is not enough;\nit leaves partner accreditations and a bare \"AWS\" behind. AWS alone returns\nexactly 100 values, which is the cap, and 36 of them are real certifications.\nShared reference section 6c.\n\nNever call `type: \"skills\"`. It returns an empty list.\n\n## Step 2. Optional. Build an employer pool first.\n\nOnly if the recruiter wants a why-now angle before a shortlist, for example\n\"who is hiring in fintech\" or \"find me people at companies that just had layoffs\".\n\nConfirm the current values with `employer_event_filters` first, then\n`employer_events` with contraction signals: `headcountDecrease1m`, `3m`, `6m`,\n`12m`, `riskNews`, `corporateStrategyNews`. Then feed those companies into the\nsearch.\n\nSkip this for a normal position brief. It bills 1 credit per event returned plus\n1 for the request, so twenty-five employers at the default cap can cost more than\nthe search that found them, on something they did not ask for. SHARED-REFERENCE\nsection 3.\n\n## Step 3. Search the talent pool\n\n`talent_search`, with the tenure exclude set two years back by\ndefault. Check the bounds in words before sending, per SHARED-REFERENCE section 5.\n\n**Ask for twice what you need.** Between two fifths and a half of what comes back\nwill be the wrong level and you are going to drop it in step 3a, so a shortlist of\n25 needs 50 records requested. That is 2 search credits rather than 1, and it\nleaves almost no margin: measured yields were 31 usable from 50 in Germany and 26\nfrom 50 in the UK.\n\nThen look at the size of the pool before you look at who is in it:\n\n- **Far too large** (six figures for a normal brief): tighten and say what you\n  tightened. Ordering a page drawn from 1.4 million is not a ranking. Narrow on\n  level, city rather than country, or a certification if they named one.\n- **Zero or nearly zero**: name the filter most likely responsible and offer to\n  widen it. Usually it is a certification, a city, or an over-precise title.\n  Never report an empty pool without a theory.\n- **Reasonable**: continue.\n\n## Step 3a. Drop the wrong level, then dedupe\n\nThe level filter matches title text as well as classification, so asking for\nsenior returns Senior Directors and Senior Vice Presidents. Measured twice, at 38%\noff-level in Germany and 46% in the UK, mostly directors.\n\nCompare each record's `jobTitle.seniority` against the level the recruiter asked\nfor, lower-cased on both sides, and drop anything that does not match. Full\nmechanism and the case-normalisation reason in SHARED-REFERENCE section 6a.\n\nThen **dedupe on the candidate `id`**. The same person comes back twice under two\nemployers, usually a consultancy and the client they sit at, with the same id and\nthe same title. SHARED-REFERENCE section 6d.\n\nSay the real numbers rather than hiding the loss: \"50 returned, 23 were the wrong\nlevel, one was a duplicate, here are the 25 strongest of the 26 that fit.\"\n\nIf they asked for a band, for example director and above, keep the whole band.\n\n## Step 4. Employer context, for the shortlist only\n\n`employer_events` on the companies in your shortlist, not on every\ncompany in the result set.\n\n**Set `maxResultsPerSignal` to 3.** The call bills 1 credit per event returned\nplus 1, so that parameter is the price: the same ten employers cost 40 credits at\nthe default and 15 at a cap of 3. Three events per employer is enough to spot a\nleadership change. Quote the ceiling, employers × the cap + 1, then report the\n`billing.creditsCharged` the response returns. SHARED-REFERENCE section 3.\n\nVerify the employer that comes back is the employer you asked about before you\nreport anything attached to it, per SHARED-REFERENCE section 6b. Then read\n`articleTitle` and `articleHighlight` rather than `eventSummary` and decide for\nyourself what the event is, per section 6e. The summary attaches a person and a\nrole to whichever tracked company the article names, so an employer that appears\nonly as somebody's former company has no event. A candidate's \"why now\" has to\ncome from something that actually happened at the company they work at today.\n\nThis is where the \"why now\" comes from, and it is the difference between this and\na LinkedIn search.\n\n## Step 5. Order it\n\nPer SHARED-REFERENCE section 6. Free, no calls.\n\nWeight by what they emphasised. Surface anyone the account already owns, since\nthose are free to open.\n\n## Step 6. Answer\n\nStructure, in this order:\n\n1. **One line on the talent pool you sourced from and how big it is**, and how\n   many you dropped on level. \"Senior backend engineers in Germany, two years or\n   more in seat: a talent pool of 1,240. I pulled 50, dropped 19 that came back at\n   the wrong level, and here are the 25 strongest of the 31 left.\"\n2. **The ordered shortlist.** One line per candidate: name, title, company,\n   location, LinkedIn link. Directly beneath each, one line of reason.\n3. **What it cost.** \"That was 1 search credit and 6 signal credits.\"\n4. **The offer.** Save this as a pipeline, open specific candidates at 1 credit\n   each, or widen the pool with lookalikes if it is too short.\n\nNo contact details. No data dumps. Reveal nothing.\n\nExample of one entry:\n\n> **3. Ravindra Sadaphule** — Senior Director of Engineering, Adobe, Cupertino ·\n> [LinkedIn](https://linkedin.com/in/ravinds)\n> Exact level match, four years in seat, and your account already has his\n> details so opening him is free.\n\n## Step 7. Save, if they want it\n\n`list_find` first to reuse an existing list rather than making a duplicate. Then\n`list_create` and `list_add_candidates`, or pass `list_id` straight into the\nsearch, which writes the results in one call.\n\nA saved list is the recruiter's **talent pipeline** from that point on. Saving\nreveals nothing. Say \"no reveal credits\" rather than \"free\", because the\nwrite cost has not been measured.\n\n## Step 8. Open specific candidates, only when asked\n\n`candidate_profile` with `reveal: [\"emails\"]`, on the people they named\nand nobody else. One credit each. Say the number before you run it.\n\nPhone only if they explicitly ask for a phone number, and say it is five credits\neach first.\n\n## Widening a short shortlist\n\n`similar_candidates` needs at least 5 seed people, so it only works once a list\nexists. Precision measured around 70% on test, with drift into unrelated senior\nprofiles, so offer it as a fallback and say so honestly. Two credits per ten\nresults.\n\nDo not reach for it when the recruiter gave clear criteria and the search was just\ntoo narrow. Widen the filters instead; that is free to retry.\n\n## Never, in this skill\n\n- Reveal anything the recruiter did not ask for.\n- Enrich anyone they did not name.\n- Claim to have screened on skills, or offer `private_email` as a filter.\n- Present job posts as a list of open roles.\n- Hand back an unordered shortlist.\n- Present a record at the wrong level because the filter let it through.\n- Present the same candidate twice because they came back under two employers.\n- Report a signal against a company without checking which entity came back.\n- Describe an event from its `eventSummary` without reading the article text.\n- Give someone a \"why now\" from an event the article attaches to a different\n  company, or to a company they used to work at.\n- Call one named person talent because they matched a filter.\n- Send an `email` parameter to any `list_*` tool.\n\n## Worked example\n\n**Recruiter:** I need a senior backend engineer in Berlin.\n\n**You:** Two quick things and I will run it. Berlin only, or remote in Germany\ntoo? And I will default to people who have been in the job two years or more,\nsince they are the ones open to a conversation. Say if you also want recent\nmovers.\n\n**Recruiter:** Remote in Germany is fine. Two years is good.\n\n**You:** Senior backend engineers, Germany, in seat two years or more, LinkedIn\nprofile required. Sourcing that now.\n\n*(filters, then search, then signals on the shortlist, then order)*\n\n**You:** That talent pool is 1,240 people: senior backend engineers in Germany who\nhave been in the job two years or more. I pulled 50, dropped 19 that came back at\ndirector or manager level despite the senior filter, and here are the 25 strongest\nof the 31 that fit.\n\n*(the ordered shortlist, each candidate with a reason)*\n\nThat was 2 search credits and 6 signal credits. Three of these candidates are\nalready in your account so opening them is free. Want me to save this as a\npipeline, open anyone specifically, or tighten the pool further?\n"
}

SHA-256 of public snapshot: 47f88c518ae80d16a7e234f25b7eb023acfc0b43b04ebcbfe44ec607e2b44334