GitHub Contributors Scraper
Pricing
from $2.99 / 1,000 contributors
GitHub Contributors Scraper
Extract public ranked contributors and repository metadata from GitHub repositories with optional public profile enrichment.
Pricing
from $2.99 / 1,000 contributors
Rating
0.0
(0)
Developer
w3crawler
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
What does GitHub Contributors Scraper do?
GitHub Contributors Scraper extracts ranked public contributors for one or more public GitHub repositories through GitHub's documented REST API. It is an API-oriented alternative to manually reviewing a repository's contributor list and can optionally fetch each selected contributor's public profile.
The Actor uses direct, unauthenticated public requests. It does not access private repositories, log in, accept caller tokens, bypass access controls, or fabricate missing values. Proxy configuration is not supported or accepted; requests are sent directly to GitHub.
Why use GitHub Contributors Scraper?
Use it for maintainer discovery, open-source project analysis, contribution ranking, and public profile context. Multiple repositories are normalized and deduplicated, processed sequentially, and limited to 20 repositories. Contributor rows and profile rows are intentionally separate: every normal row has a recordType and stable recordId, so bots, users, and profile enrichments cannot be confused. Transient timeouts and HTTP 408, 429, and 5xx responses receive bounded retries with backoff; other failures become explicit diagnostics.
What data can it extract?
| Group | Fields |
|---|---|
| Identity | recordType, recordId, repository, repositoryId, repositoryUrl, login, profileUrl |
| Ranking | contributorRank, contributions, contributorType |
| Profile | name, company, location, bio, avatarUrl, publicRepos, followers, following |
| Provenance | sourceUrl, extractionMethod, accessStatus, dataAvailable, enrichmentStatus, scrapedAt |
| Diagnostics | recordType=diagnostic, url, httpStatus, errorCode, and bounded error |
How to scrape GitHub contributors
- Open the Actor's Input tab.
- Enter
owner/repositorynames or public GitHub repository URLs. - Choose the contributor limit and whether public profiles should be enriched.
- Adjust the bounded timeout, delay, or transient retry count when needed.
- Start the run and inspect normal records separately from diagnostics using
recordType.
How much will it cost to scrape GitHub contributors?
The Actor's cost depends on the Apify plan and the number of dataset items written. Each repository requires a metadata request and a contributors request; profile enrichment adds up to one request per contributor with a public profile URL. More repositories, contributors, retries, and longer timeouts can increase run time and compute. Sequential execution and a configurable delay keep traffic conservative.
Input
See the input tab for the complete configuration. The accepted input is a JSON object:
Default smoke test
{}
Multiple repositories
{"repositories": ["apify/apify-cli", "https://github.com/octocat/Hello-World"],"maxContributors": 10}
Profile enrichment
{"repositories": ["apify/apify-cli"],"maxContributors": 3,"includeProfiles": true}
Developer options
{"repositories": ["apify/apify-cli"],"maxContributors": 3,"timeoutSecs": 30,"requestDelayMs": 100,"maxRequestRetries": 1}
repositories accepts at most 20 unique public repositories and defaults to apify/apify-cli when omitted or empty. maxContributors is 1–100 per repository. includeProfiles is false by default. timeoutSecs is 5–120 seconds, requestDelayMs is 0–5000 milliseconds, and maxRequestRetries is 0–3. Unknown properties, malformed repository names, and unsupported proxy settings are rejected.
Output
Contributor and profile rows share repository/login provenance but have different recordType values (contributor or profile) and stable IDs. A profile row is emitted only after its public profile request succeeds. Missing optional profile values are omitted. Diagnostics use recordType=diagnostic, dataAvailable=false, an errorCode, and the source URL; they are not successful contributor data. OUTPUT_SUMMARY reports requested and processed repositories, contributor/profile counts, retry-aware completion status, and diagnostic counts.
Contributor record
{"recordType": "contributor","recordId": "example%2Fproject:contributor:octocat","repository": "example/project","repositoryId": 123456,"repositoryUrl": "https://github.com/example/project","contributorRank": 1,"login": "octocat","profileUrl": "https://github.com/octocat","contributions": 42,"contributorType": "User","dataAvailable": true,"accessStatus": "public","extractionMethod": "github_rest_api","enrichmentStatus": "not_requested","sourceUrl": "https://api.github.com/repos/example/project/contributors?per_page=3&anon=false","scrapedAt": "2026-08-24T00:00:00.000Z"}
Profile record
{"recordType": "profile","recordId": "example%2Fproject:profile:octocat","repository": "example/project","login": "octocat","profileUrl": "https://github.com/octocat","name": "Example Author","publicRepos": 8,"followers": 12,"following": 4,"dataAvailable": true,"accessStatus": "public","extractionMethod": "github_rest_api","enrichmentStatus": "succeeded","sourceUrl": "https://api.github.com/users/octocat","scrapedAt": "2026-08-24T00:00:00.000Z"}
Diagnostic record
{"recordType": "diagnostic","recordId": "example%2Fproject:diagnostic:REPOSITORY_REQUEST_FAILED:https%3A%2F%2Fapi.github.com%2Frepos%2Fexample%2Fproject","repository": "example/project","dataAvailable": false,"accessStatus": "unavailable","extractionMethod": "github_rest_api","httpStatus": 404,"url": "https://api.github.com/repos/example/project","error": "Not found (HTTP 404)","errorCode": "REPOSITORY_REQUEST_FAILED","scrapedAt": "2026-08-24T00:00:00.000Z"}
Run summary
{"actor": "github-contributors-scraper","status": "succeeded","dataAvailable": true,"repositories": ["example/project"],"repositoriesRequested": 1,"repositoriesProcessed": 1,"contributorCount": 3,"profileRequestedCount": 3,"profileCount": 3,"normalRecordCount": 6,"diagnosticCount": 0,"completedAt": "2026-08-24T00:00:00.000Z"}
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
Tips and advanced options
Use includeProfiles=false for the lowest request volume. Keep a delay when processing several repositories, increase retries only for transient failures, and keep contributor limits reasonable for unauthenticated GitHub API use. The summary status is succeeded when all work has normal results, partial when normal results coexist with diagnostics, and blocked-or-empty when no contributor rows were available. A missing profile is never represented as a fabricated profile record.
FAQ, support, and responsible use
If a run has no normal rows, inspect OUTPUT_SUMMARY and the diagnostic errorCode; a rate limit, unavailable repository, timeout, or empty contributor list is reported explicitly. For bugs, include the run ID, input, summary, and representative diagnostic in the Actor's Issues tab. The API tab provides programmatic dataset and summary access.
Use only public data and follow GitHub's terms, API limits, robots guidance where applicable, and all privacy and data-protection laws. Our Actors do not extract private user data or bypass access controls, but public profile data can still be personal data; use it lawfully and consult qualified counsel when required. This Actor is not affiliated with GitHub.
Local validation
npm cinpm run checknpm testapify validate-schemaapify run --purge --input-file test/inputs/live-smoke.jsonnpm run validate