GitHub Users Scraper
Pricing
from $2.99 / 1,000 users
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
Maintained by CommunityActor 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?
| Field | Type | Description |
|---|---|---|
recordType, recordId | string | user discriminator and stable case-insensitive login identity. |
login, userId, type | string, integer | Public account identity and GitHub account type, including bots when returned. |
name, bio, company, location, blog | string | Public profile text when exposed. |
followers, following, publicRepos, publicGists | integer | Public activity counts from the profile endpoint. |
profileUrl, apiUrl, searchUrl, sourceUrl | URL | Public profile, search, and API provenance. |
searchQuery, searchPosition, searchScore | string, integer, number | Search context and original one-based ranking. |
dataAvailable, accessStatus, extractionMethod, scrapedAt | boolean, string, date-time | Contract, access, transport, and timing metadata. |
| Diagnostic fields | mixed | url, bounded error, and errorCode for unavailable public sources. |
How to scrape GitHub users
- Open the Actor in Apify Console and enter a public GitHub search expression in the Input tab.
- Set the maximum number of distinct users and choose whether to fetch public profile enrichment.
- 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 cinpm testnpm run checkapify validate-schemaapify run --purge --input-file test/inputs/live-smoke.jsonnpm run validate