The People-Search Query Reference: Patterns, Matches, and Misses
You will pick the right query pattern for any candidate attribute, know exactly who it silently excludes, and translate it across GitHub, LinkedIn, and the open web.
Key takeaways
- GitHub's location: qualifier is raw free text, so searching location:"Berlin" silently drops anyone who typed "Deutschland" or left the field blank - part of why Refolk's index shows only 328 Go engineers in Germany against 2,869 in the US.
- A GitHub user search caps at 1,000 results and fires no error at the ceiling, so against 2,869 US Go engineers in Refolk's index roughly two-thirds are unreachable in one unsegmented query.
- On GitHub a framework is not a language: language:react returns nothing meaningful because React resolves to JavaScript, so you query the language and filter by framework topic instead.
- Self-reported skill tags over-count and can invert reality: Refolk's index returns more US Vue.js profiles (39,734) than React (33,536), the reverse of known adoption, so triangulate a tag against a title or owned-repo language before sizing a market.
- LinkedIn operators must be typed in ALL CAPS or they become ordinary search words, producing a string that runs cleanly while returning a different population.
- Google now serves only about 300 to 400 results per query and dropped the num=100 parameter, capping every page at 10 and raising the cost of the open-web fallback.
The job is narrow and specific: write a people-search query that returns the right candidates the first time, on whatever source is in front of you. This is a lookup reference for in-house recruiters, sourcers, and founders doing their own hiring, organized by the candidate attribute you are matching rather than by operator. For each attribute it states what the pattern proves, exactly where it fails quietly, and how the same intent is written across GitHub user search, LinkedIn X-ray, and open-web search. Jump to the row you need and leave.
Every generic cheat sheet teaches you AND, OR, NOT and hands you a few copy-paste strings. None of them tell you who a pattern silently misses. That silent miss is where good candidates disappear and where a thin result gets mistaken for a thin market. This reference is built around that gap.
What operators each source actually supports
Each source has a fixed operator set, and mixing them up is the first way a query fails. LinkedIn, Google X-ray, and GitHub user search do not share syntax, so a string that works on one breaks silently on another.
LinkedIn supports exactly five native operators: AND, OR, NOT, quotation marks for exact phrases, and parentheses for grouping. They must be typed in ALL CAPS - a lowercase "and" or "not" is treated as an ordinary search word and breaks the query without warning. LinkedIn does not support the asterisk wildcard, curly, square, or angle brackets, and the plus and minus signs are not officially supported either.
Google X-ray uses a different set. site: restricts to a single website such as site:linkedin.com/in, quotation marks match an exact phrase, intitle: finds a keyword in the page title, OR broadens and must be uppercase, and the minus sign excludes a keyword.
GitHub user search uses qualifiers, not boolean words. It accepts, in any combination: type (user or org), in:login, in:name, in:email, fullname:, repos:, location:, language:, created:, and followers:. Note two hard limits most cheat sheets omit: a GitHub query cannot exceed 256 characters or use more than five AND/OR/NOT operators.
The attribute-by-attribute query reference
This is the core of the document: for each candidate attribute, the pattern, what it proves, and how it lies. Read the row for the attribute you are matching, then translate across sources in the later section.
Title. The pattern is an OR-group of synonyms: ("Software Engineer" OR "Backend Developer" OR "Platform Engineer"). It proves the person self-describes with one of those labels. It lies when you use job-description language instead of candidate language - a search for "Software Engineer" misses someone titled "Backend Developer" unless you add the synonym. The fix is to list every title the target would self-apply before you write the string.
Skill. On LinkedIn and open web, skills are matched as quoted keywords. On GitHub, the language: qualifier matches the languages of repositories a user owns, not stated skills. This proves the person has shipped code in that language. It lies hardest on frameworks: language:react returns nothing meaningful because React is not a language and resolves to JavaScript or TypeScript. Query the language and filter by framework topic instead.
Seniority. There is no clean operator for seniority. Sourcers reach for created:<2022-01-01 on GitHub, which returns accounts opened before a date. It proves account age and nothing else - account age says little about seniority, and it surfaces dormant accounts that stopped committing years ago. On LinkedIn, seniority is approximated with title keywords like "Senior" or "Staff" inside the OR-group.
Location. On GitHub, location: reads a free-text field exactly as the user typed it, so location:"Berlin" does not match "Deutschland", "Remote", or an empty field. On open web you quote the place name. It proves the string appears in the profile's location field; it proves nothing about where the person actually is. This is the attribute where confident sourcers lose the most candidates.
Employer and activity. LinkedIn matches current and past employers as keywords. GitHub has no activity filter in user search - a profile with a city and the right language can belong to someone who stopped committing three years ago, and GitHub sorts them alongside people shipping every week.
Education. No documented GitHub or LinkedIn operator failure case is publicly established for education matching. Treat it as a keyword match on open web and LinkedIn, and do not assume the field is populated or standardized.
How the same intent is written across three sources
The same hiring intent translates into three different strings. Below is one intent - backend or software engineers in a city, writing a given language, with recruiter and jobs noise excluded - expressed three ways.
LinkedIn / X-ray base:
("Software Engineer" OR "Backend Developer" OR "Platform Engineer") AND "Python" AND "San Francisco" NOT recruiter NOT intern
Open-web (Google) X-ray:
site:linkedin.com/in/ ("Software Engineer" OR "Backend Developer") "San Francisco" "Python" -job -jobs -recruiter
GitHub user search:
language:python location:"San Francisco" followers:>10 type:userSwap the quoted title synonyms, the language, and the city for your own. Keep LinkedIn operators capitalized.
The three are not interchangeable one-for-one. The GitHub version proves shipped code but misses anyone whose location field reads "SF" or is blank. The open-web version reaches public profiles that may not surface inside LinkedIn, but it hits Google's served-result ceiling fast. The LinkedIn version has the richest title data but costs you against the monthly search limit. Running all three is how you catch the profiles each one drops.
Routing an attribute to its best source
- Verifiable language signalGitHub user search by language: and location:
- Title, employer, seniority precisionLinkedIn native boolean in ALL CAPS
- Profile not surfacing in-platformOpen-web X-ray with site:linkedin.com/in
- Translate the intentRe-express across the other two to catch misses
Writing the query the first time, in order
This is the procedure to run once per role. It moves from candidate-language synonyms through source selection, exclusions, and cap management, to a spot-check for silent misses.
From intent to three verified strings
- Define the role in candidate languageList every title and skill synonym the target would self-apply, not the words from the job description. Finish with an OR-group of titles and an OR-group of skills.
- Pick the source for the attributeRoute a verifiable language signal to GitHub, title or employer or seniority precision to LinkedIn, and non-surfacing profiles to open-web X-ray. Choose one source with a reason.
- Write the base string in that source's syntaxUse ALL-CAPS operators on LinkedIn, qualifiers on GitHub, and site: with minus exclusions on Google. The string should parse with no silent operator errors.
- Add exclusionsAdd NOT on LinkedIn or the minus sign on Google to strip junior, intern, recruiter, and jobs noise until the obvious false positives leave the first page.
- Narrow until under the result capSegment by location, date, or skill so the count sits below the source's documented ceiling and nothing is silently truncated.
- Translate the intent across sourcesRe-express the same query in the other two syntaxes to catch the profiles each source misses.
- Spot-check for silent missesManually verify a sample does not exclude valid candidates such as empty-location profiles or framework-only developers.
Two experienced practitioners order step one differently. One treats title-listing as a fixed first step; the other starts broad and adds NOT and parentheses iteratively after reading results. Both are defensible. What is not defensible is skipping the spot-check, because the failure modes below are invisible until you look.
The query above is the point of this whole reference. Writing it by hand means running location:"Berlin", then location:"Deutschland", then a blank-field pass, then merging and de-duplicating - and still missing the people who wrote "Remote". Asking in plain English and letting Refolk reconcile the location-field variants removes the step where most of a market disappears.
The result caps that truncate your pool without telling you
Every source caps the number of results it returns, and the dangerous ones give no error when you hit the ceiling. If your true population is larger than the cap, you are working a truncated pool and do not know it.
| Source | Results per query | Per page | Silent when hit? |
|---|---|---|---|
| GitHub Search API | 1,000 | 100 | Yes, no error |
| LinkedIn free | 1,000 | 10 | Partial warning |
| LinkedIn Sales Navigator | 2,500 | n/a | n/a |
| Google web search | ~300-400 served | 10 | Yes |
The GitHub cap is the trap. The API returns up to 1,000 results and fires no exception or error at the limit. Set that against Refolk's index of 2,869 US software and backend engineers who write Go: roughly two-thirds of them are unreachable in a single unsegmented query, and nothing tells you so.
Google compounds the problem on the open-web fallback. It serves only about 300 to 400 actual results per query no matter what headline total it claims, and in mid-2025 it stopped supporting the &num=100 parameter, so every page now returns 10 results. An X-ray that once needed one page to approach the ceiling now needs far more pagination. Treat the headline "166,000 results" as fiction and paginate to the real end.
LinkedIn free adds a second ceiling beyond the per-search cap: a Commercial Use Limit of roughly 300 people searches per month, resetting at midnight Pacific on the first of each month. Sales Navigator lifts the per-search cap to 2,500 but you still segment large populations.
How these queries go wrong: the silent misses
This is the most valuable section because every failure here is invisible until you check for it. Each one produces a plausible result that is quietly wrong. Below is the table of failure modes, what the false positive looks like, and how to check.
| Failure mode | What the false positive looks like | How to check |
|---|---|---|
| ALL-CAPS operator slip | A string that runs but returns a different population | Toggle an operator's case and confirm the result count changes |
| Framework-as-language on GitHub | Zero or reduced results read as "no candidates" | Query the underlying language and filter by framework topic |
| Free-text location gap | A thin pool mistaken for a thin market | Run local-language and country-name location variants |
| Account-age-as-seniority | A senior-looking account that stopped committing years ago | Cross-reference recent contribution activity |
| Silent 1,000-cap truncation | You believe you saw the whole population | If total_count is near 1,000, segment and re-run |
| Google ~300-result ceiling | Trusting the claimed headline count | Paginate to the real end; do not trust the total |
| Skill-tag inflation | Sizing a market off a noisy self-reported tag | Triangulate the tag against a title or owned-repo language |
The location gap deserves extra weight because it fails exactly where sourcers feel most confident. In Refolk's index, Germany shows 328 software and backend Go engineers against 2,869 in the US - an 8.7x gap. Some of that is a real market difference, but part is a field-format artifact: many German developers write "Deutschland" or leave the location blank, and location:"Berlin" cannot bridge that. A thin result reads as a thin market when it is a thin query.
| Country | Software/Backend Engineers with Go | Top employer in sample |
|---|---|---|
| United States | 2,869 | |
| Germany | 328 | |
| US:DE ratio (derived) | 8.7x | - |
There is a second lesson buried in that German sample: Google alone accounted for 32% of the Go profiles versus 12% in the US sample. A naive Go-in-Germany search leans heavily toward one employer's current and former staff, narrowing the diversity of your pipeline before you have read a single profile.
A thin result reads as a thin market when it is really a thin query.
Skill-tag inflation is the subtlest miss. Self-reported skill tags over-count, and they can invert reality.
| Skill tag | US profiles | Share vs React (derived) |
|---|---|---|
| React | 33,536 | 1.00x |
| Vue.js | 39,734 | 1.18x |
Refolk's index returns more US Vue.js profiles than React - the reverse of known framework adoption. That is not a market fact; it is evidence that a self-reported skill field is a weaker population signal than an owned-repo language or a title. Before you size a market off a skill tag, triangulate it against something the person had to do rather than claim.
Verify before you call the search done
Before you treat a result set as your population, run this checklist. It takes a few minutes and catches the misses that otherwise surface three weeks into the search when the pipeline runs dry.
Pre-flight checks before trusting a result set
- Every AND, OR, and NOT on LinkedIn is typed in ALL CAPS
- No GitHub query uses a framework name as a language: value
- Location is run across local-language, country-name, and blank-field variants
- Seniority is confirmed by activity or title, not by account age alone
- GitHub total_count is checked against 1,000 and segmented if near the cap
- Google results are paginated to the real end, not trusted on the headline total
- Any skill-tag count is triangulated against a title or owned-repo language
- The same intent has been run across all three sources
Keeping this reference current
The operators and failure modes in this document are stable, but two things change under you: the result caps and the field conventions. Caps move when a source changes its policy - Google's removal of the &num=100 parameter is the live example, and it shifted the open-web fallback from one page to many. Re-check the served-result ceiling on your primary source whenever a search that used to fill a pipeline suddenly runs thin for no obvious reason.
Field conventions drift too. The free-text location problem is permanent in shape but changes in detail as populations shift which labels they use. The practical habit is to keep a short list of the location variants that matter for your markets - the local-language name, the country name, "Remote", and blank - and run all of them every time rather than trusting a single string.
The deeper discipline is the one the failure-modes table teaches: treat every count as a claim to be checked, not a fact. A query that returns a number is not the same as a query that returned the right people. The reference above tells you, attribute by attribute, where the two diverge. Run the spot-check, translate across sources, and segment under the cap, and the query that returns the right candidates the first time stops being luck.
Questions practitioners ask
Why does my LinkedIn boolean search string return the wrong people even though it runs?
Almost always a lowercase operator. LinkedIn supports exactly five native operators - AND, OR, NOT, quotation marks, and parentheses - and they must be typed in ALL CAPS. A lowercase "and" or "not" is read as an ordinary search word, so the query runs cleanly but matches a different population. Toggle an operator's case and watch whether the result count changes; if it does, you had a slip.
Why does GitHub return no candidates when I search by a framework like React?
On GitHub the language: qualifier matches the languages of repositories a user owns, and a framework is not a language. language:react resolves to nothing meaningful because React code registers as JavaScript or TypeScript. Query the underlying language instead - language:javascript - and filter repositories by a framework topic. Reading the empty result as a thin candidate pool is the common false positive.
How many results can a single people search actually return?
Each source caps hard. The GitHub Search API returns up to 1,000 results per query with no error when you hit the ceiling. LinkedIn free returns up to 1,000 per search and Sales Navigator up to 2,500. Google serves only about 300 to 400 actual results per query regardless of the headline total it claims. Segment under the relevant cap or you are working a truncated pool.
Why does my German developer market look so much smaller than the US one?
Part of it is real and part is a field-format artifact. GitHub's location: is free text, so location:"Berlin" drops anyone who typed "Deutschland" or left the field blank. In Refolk's index, Germany shows 328 Go engineers against 2,869 in the US, an 8.7x gap that the free-text field inflates. Run the metro's local-language and country-name variants before you conclude the market is thin.
Can I trust a skill-tag count when sizing a candidate market?
Not on its own. Self-reported skill tags over-count and can invert reality. Refolk's index returns more US Vue.js profiles (39,734) than React (33,536), the reverse of known framework adoption, which signals tag inflation. Triangulate any skill tag against a job title or an owned-repo language signal before you size a market off it.
Try it on the search you came here for
Stop building boolean strings. Just describe the person.
Type one sentence. I plan the search, read GitHub, public LinkedIn and Crunchbase records, and the open web as it is right now, and hand back a ranked list with the reason next to every name.
01Describe them
One plain sentence. Role, city, stack, stage, whatever matters to you.
02I read the web live
GitHub, public LinkedIn and Crunchbase records, the open web. Not a database that went stale last quarter.
03You read the shortlist
Ranked, with the reasoning under every name. Open a profile, ask a follow-up, narrow it down.
- Staff backend engineers in NYC who shipped Rust in production
- Series A fintechs in SF under 50 people, growing headcount this year
- Maintainers of fast-growing Rust web frameworks on GitHub
- No boolean, no filters, no seat to buy. One box.
- Read at search time, so a profile updated yesterday counts today.
- Every step visible as it runs, every name with its reason.
500 free credits on sign-up. No card, no demo call. See real searches.