GitHub search (beta)
Find GitHub accounts by company, repository, commits, recent activity, language, and profile flags, optionally with each account's live public profile.
Beta
GitHub search is in beta for API keys with the people:search scope. Older full-access keys that hold people:enrich and agent:chat also work. Fields
may be added before general availability; existing fields keep their meaning.
POST /v1/github/searchSearch Ploid's index of GitHub accounts. Every criterion is a filter, combined with AND; give at least one.
curl https://api.ploid.com/v1/github/search \
-H "Authorization: Bearer $PLOID_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"repo": "vercel/next.js",
"min_commits": 100,
"active_since": "2026-01-01",
"sort": "commits",
"limit": 10,
"include_profiles": true
}'Criteria
| Field | Matches |
|---|---|
query | Free text over login, company, and repository names. |
login | Exact login, case-insensitive. |
login_prefix | Login starts with this text (2 to 100 characters). |
type | User, Organization, Bot, or Mannequin. |
company | Company on the profile. Known aliases also match, so Google finds Alphabet. |
repo | Worked on this repository, as owner/name. Every repository the account worked on counts. |
repo_owner | Worked on any repository this user or organization owns. |
hireable | Marked available for hire. |
has_email | A public email was listed. The address itself is never returned. |
site_admin | GitHub staff. |
github_star | GitHub Stars program member. |
min_commits | At least this many commits pushed, 2011 through October 2025. |
min_merged_pull_requests | At least this many pull requests the account opened that were merged, 2011 through October 2025. |
min_recent_pushes | At least this many pushes in the 12 months before the index was built. |
active_since | Public activity on or after this date, as YYYY-MM-DD. |
language | One of the account's ten most-used languages, for example Rust. |
include_automation | Keep likely bot, CI, and release accounts. They are left out by default unless login is given. |
sort | relevance (default), commits, merged_pull_requests, recent_activity, or last_active. |
limit | Results per page, 1 to 100 (default 25); at most 10 with include_profiles. |
offset | Results to skip, below 1,000. |
include_profiles | Attach each account's live public GitHub profile. |
Results are ranked by relevance when query or company is set, otherwise by merged pull requests, then commits. Merged pull requests need someone else
to accept the work, so mirrors and automated accounts rarely rank high on them. sort ranks by one activity measure instead: recent_activity is pushes
in the last 12 months, and last_active is the latest public activity.
Activity data
Activity comes from public GitHub events in GH Archive, 2011 to the latest index build. Repositories count under their current
name, so work on zeit/next.js counts for vercel/next.js. Private work is not visible.
- Commits and pull requests stop at October 2025, when GitHub stopped publishing them in public events. Commits are those the account pushed, including merges, so maintainers who merge others' work count high. Commits pushed to forks are left out, since syncing a fork pushes its upstream's history, and a repository counts at most 20 commits per push, so an imported history does not read as years of work.
- Pushes run to the latest build and are the measure of recent work. From 2026, public events carry far fewer pull requests and reviews, so those counts understate recent activity.
- Automation is a best guess: GitHub's bot accounts, logins such as
release-botornightly-builds, and accounts pushing more than 10,000 times a year. Some team and CI accounts with ordinary logins still get through. - Languages are the main language of each repository the account contributed to, weighted by its commits and pull requests there.
Response
{
"data": {
"results": [
{
"login": "ada",
"github_id": 1234,
"type": "User",
"company": "Stripe",
"hireable": false,
"has_email": true,
"site_admin": false,
"github_star": false,
"repos": ["vercel/next.js", "stripe/stripe-node"],
"repo_count": 2,
"profile_url": "https://github.com/ada",
"activity": {
"commits": 1840,
"pushes": 1210,
"pushes_last_12m": 96,
"pull_requests": 412,
"merged_pull_requests": 350,
"reviews": 288,
"active_months": 71,
"first_active_at": "2016-03-02",
"last_active_at": "2026-10-09",
"languages": ["TypeScript", "Go"],
"top_repos": [
{
"repo": "vercel/next.js",
"commits": 920,
"pushes": 610,
"pull_requests": 240,
"merged_pull_requests": 210,
"last_active_at": "2026-10-09"
}
]
},
"profile": {
"username": "ada",
"name": "Ada Lovelace",
"bio": "...",
"location": "San Francisco",
"followers": 420,
"topLanguages": ["TypeScript", "Go"],
"topRepos": []
}
}
],
"returned": 1,
"total": { "value": 1, "relation": "eq" },
"offset": 0,
"limit": 10,
"next_offset": null
},
"meta": { "request_id": "req_...", "credits_charged": 2 }
}repos lists up to 100 repositories. activity is null for an account with no public activity on record, and top_repos lists its ten busiest
repositories. profile appears only with include_profiles and is null when GitHub returns no profile for the account. Emails and
phone numbers are never returned; find them with POST /v1/enrich.
Page with next_offset, up to 1,000 results deep. The last page before that limit shrinks to fit, so next_offset can always be sent back with the same
limit. total counts up to 10,000 matches exactly; above that, relation is gte.
Pricing
A search costs 1 ACU, and each live profile found costs 1 ACU more, charged together when the search completes. Rejected and failed searches are not charged.
GitHub to LinkedIn
POST /v1/github/people-searchRun the same GitHub search, read each account's live profile, and tie it to a LinkedIn profile. Then filter on the LinkedIn side, for example to keep only senior engineers in the Bay Area.
curl https://api.ploid.com/v1/github/people-search \
-H "Authorization: Bearer $PLOID_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"repo_owner": "vercel",
"type": "User",
"linkedin": {
"location": { "any_of": ["San Francisco", "New York"] },
"seniority": "senior"
}
}'The request takes every GitHub criterion above (at least one is required), plus:
| Field | Meaning |
|---|---|
linkedin | Hard filters on the linked LinkedIn profile: title, seniority, company, industry, location, written as in Search. |
require_linkedin | Drop accounts that could not be tied to a LinkedIn profile. Implied by linkedin filters. |
limit | GitHub accounts per page, 1 to 10 (default 10). |
Each result has github (the account with its live profile), linkedin, and match. A match is one of:
match.method | Evidence | confidence |
|---|---|---|
profile_link | The GitHub profile lists this LinkedIn URL as a social account, website, or in bio. | 0.95 |
name_company_location | Every word of the GitHub name matches one indexed person, as do employer and place. | 0.9 |
name_company | Name and current employer match. | 0.8 |
name_location | Name and place match. | 0.65 |
Two different people tied at the best evidence are ambiguous, so neither is linked, and linkedin and match are null. A listed LinkedIn profile that
Ploid has not indexed yet comes back with indexed: false and empty fields, and cannot pass linkedin filters. Matching uses Ploid's people index and
the GitHub profile only; it runs no web search.
Pages advance over GitHub accounts: scanned counts the accounts a page examined, and next_offset moves past them, so a filtered page can return fewer
people than it scanned. A search costs 1 ACU plus 1 ACU per returned person, charged together.
Errors
| Condition | Status and code |
|---|---|
| No criteria, or an invalid field | 422 validation_failed |
| Not enough ACU or API-key budget | 402 |
| Search timed out | 503 search_timeout |
| GitHub search is unavailable | 503 github_search_unavailable |
See Errors & rate limits.
