GitHub Users Scraper avatar

GitHub Users Scraper

Pricing

from $2.99 / 1,000 users

Go to Apify Store
GitHub Users Scraper

GitHub Users Scraper

Search public GitHub users and optionally enrich each result with its public profile fields.

Pricing

from $2.99 / 1,000 users

Rating

0.0

(0)

Developer

w3crawler

w3crawler

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

What does GitHub Users Scraper do?

GitHub Users Scraper searches the public GitHub user directory and returns one source-backed row per matching account. It can enrich each result with fields from GitHub’s public user API, while preserving search position, query, source URLs, stable identity, and timestamps. It does not access private profiles, private repositories, or authenticated account areas.

Why use GitHub Users Scraper?

Use it for public developer research, open-source community mapping, recruiting research, public profile analytics, or scheduled change monitoring you are authorized to perform. GitHub search qualifiers can narrow a run by login, location, language, follower range, and other public expressions. Search results are deduplicated before the global limit, and optional profile enrichment retains public fields without inventing missing values. Apify adds run history, API access, scheduling, monitoring, and integrations. No proxy rotation or access bypass is used. A local fixture option exists only for deterministic development tests.

What data can GitHub Users Scraper extract?

FieldTypeDescription
recordType, recordIdstringuser discriminator and stable case-insensitive login identity.
login, userId, typestring, integerPublic account identity and GitHub account type, including bots when returned.
name, bio, company, location, blogstringPublic profile text when exposed.
followers, following, publicRepos, publicGistsintegerPublic activity counts from the profile endpoint.
profileUrl, apiUrl, searchUrl, sourceUrlURLPublic profile, search, and API provenance.
searchQuery, searchPosition, searchScorestring, integer, numberSearch context and original one-based ranking.
dataAvailable, accessStatus, extractionMethod, scrapedAtboolean, string, date-timeContract, access, transport, and timing metadata.
Diagnostic fieldsmixedurl, bounded error, and errorCode for unavailable public sources.

How to scrape GitHub users

  1. Open the Actor in Apify Console and enter a public GitHub search expression in the Input tab.
  2. Set the maximum number of distinct users and choose whether to fetch public profile enrichment.
  3. Start the run, inspect the dataset and OUTPUT_SUMMARY, then connect or download the results through the API, an integration, or a schedule.

How much will it cost to scrape GitHub users?

Apify billing depends on the selected Actor pricing and compute used by each run; there is no fixed price promise here. Each run makes one public search request and, when enrichment is enabled, up to one profile request per selected result. More users, retries, long timeouts, and pacing increase runtime or request volume. Use a small maxItems for smoke tests and respect GitHub’s unauthenticated limits.

Input

See the input tab for the complete configuration. query defaults to octocat, is trimmed, and must be 1–256 characters. maxItems is a global distinct-user limit from 1–100 (default 20). includeProfiles defaults to true; when false, rows retain search fields only. requestDelayMs is 0–2000 milliseconds (default 100) between profile requests, maxRetries is 1–5 attempts (default 3) for each public API request, and the optional fixtureFile is a repository-relative JSON path for local tests. Unknown keys, null numeric controls, empty queries, absolute fixture paths, and parent-directory traversal are rejected.

Minimal/default run

{}

Search qualifiers with profile enrichment

{
"query": "location:Berlin followers:>100",
"maxItems": 25,
"includeProfiles": true,
"requestDelayMs": 100,
"maxRetries": 3
}

Fast discovery run

{
"query": "octocat",
"maxItems": 10,
"includeProfiles": false,
"requestDelayMs": 0,
"maxRetries": 1
}

Output

Normal user rows use recordType: "user" and dataAvailable: true. The search response order is preserved through searchPosition; deduplication uses a case-insensitive login, then public ID or API URL fallback. If profile enrichment fails, the search-backed row is retained and the summary increments profileRequestsFailed. If no usable row can be produced, a diagnostic row uses recordType: "diagnostic", dataAvailable: false, accessStatus: "unavailable", and a stable diagnostic ID.

Normal user row

{
"recordType": "user",
"recordId": "github-users:user:octocat",
"dataAvailable": true,
"accessStatus": "public",
"extractionMethod": "github_rest_api",
"login": "octocat",
"userId": 583231,
"profileUrl": "https://github.com/octocat",
"searchQuery": "octocat",
"searchPosition": 1,
"searchUrl": "https://api.github.com/search/users?q=octocat&per_page=5",
"sourceUrl": "https://api.github.com/users/octocat",
"scrapedAt": "2026-09-08T00:00:00.000Z"
}

Diagnostic row and summary

{
"recordType": "diagnostic",
"recordId": "github-users:diagnostic:no_results:https%3A%2F%2Fapi.github.com%2Fsearch%2Fusers%3Fq%3Doctocat%26per_page%3D20",
"dataAvailable": false,
"accessStatus": "unavailable",
"extractionMethod": "github_rest_api",
"url": "https://api.github.com/search/users?q=octocat&per_page=20",
"error": "The public GitHub user search returned no usable user records.",
"errorCode": "NO_RESULTS",
"scrapedAt": "2026-09-08T00:00:00.000Z"
}

OUTPUT_SUMMARY contains status, query, search and deduplication counts, profile-request counts, normal/diagnostic counts, requested limit, completion time, and the public search URL. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Tips and advanced options

Use search qualifiers to reduce the candidate set before increasing maxItems. Disable enrichment for a fast discovery pass, then rerun a narrower query with it enabled. maxItems is global after deduplication, while searchPosition always records the original response position. GitHub’s search endpoint is paginated by its API response, but this Actor requests only the bounded page sized to maxItems; it is not an unbounded crawler. Increase pacing or wait for the reset window when rate-limited. Never put credentials in a fixture or README; the Actor has no credential input.

FAQ, support, and responsible use

If a run has diagnostics, inspect OUTPUT_SUMMARY, errorCode, and url. Search results and public fields can change between runs, and GitHub may return rate limits or unavailable profiles. Report reproducible issues in the Actor’s Issues tab with the run ID, input, summary, and affected public URL. Use only data account owners made public, follow GitHub’s terms and rate limits, respect privacy and applicable law, and obtain legal advice for personal-data processing. This Actor is not affiliated with or endorsed by GitHub.

Local verification

npm ci
npm test
npm run check
apify validate-schema
apify run --purge --input-file test/inputs/live-smoke.json
npm run validate