PloidDocs
GitHub search (beta)

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/search

Search 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

FieldMatches
queryFree text over login, company, and repository names.
loginExact login, case-insensitive.
login_prefixLogin starts with this text (2 to 100 characters).
typeUser, Organization, Bot, or Mannequin.
companyCompany on the profile. Known aliases also match, so Google finds Alphabet.
repoWorked on this repository, as owner/name. Every repository the account worked on counts.
repo_ownerWorked on any repository this user or organization owns.
hireableMarked available for hire.
has_emailA public email was listed. The address itself is never returned.
site_adminGitHub staff.
github_starGitHub Stars program member.
min_commitsAt least this many commits pushed, 2011 through October 2025.
min_merged_pull_requestsAt least this many pull requests the account opened that were merged, 2011 through October 2025.
min_recent_pushesAt least this many pushes in the 12 months before the index was built.
active_sincePublic activity on or after this date, as YYYY-MM-DD.
languageOne of the account's ten most-used languages, for example Rust.
include_automationKeep likely bot, CI, and release accounts. They are left out by default unless login is given.
sortrelevance (default), commits, merged_pull_requests, recent_activity, or last_active.
limitResults per page, 1 to 100 (default 25); at most 10 with include_profiles.
offsetResults to skip, below 1,000.
include_profilesAttach 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-bot or nightly-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-search

Run 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:

FieldMeaning
linkedinHard filters on the linked LinkedIn profile: title, seniority, company, industry, location, written as in Search.
require_linkedinDrop accounts that could not be tied to a LinkedIn profile. Implied by linkedin filters.
limitGitHub 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.methodEvidenceconfidence
profile_linkThe GitHub profile lists this LinkedIn URL as a social account, website, or in bio.0.95
name_company_locationEvery word of the GitHub name matches one indexed person, as do employer and place.0.9
name_companyName and current employer match.0.8
name_locationName 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

ConditionStatus and code
No criteria, or an invalid field422 validation_failed
Not enough ACU or API-key budget402
Search timed out503 search_timeout
GitHub search is unavailable503 github_search_unavailable

See Errors & rate limits.