Extract public GitHub developer profiles from usernames, profile URLs, and GitHub user-search queries.
Use this actor to turn GitHub handles into structured recruiting, developer-relations, sales, VC, and open-source intelligence data.
What does GitHub Profile Scraper do?
GitHub Profile Scraper collects public profile information from GitHub user pages and public GitHub API resources.
It accepts direct usernames, profile URLs, or GitHub user-search queries.
It returns one structured dataset row per GitHub profile.
You can use it to enrich a spreadsheet of handles, build a prospect list, or monitor developer communities.
The actor is designed for public data only.
It does not require a GitHub login for small runs.
You can optionally provide a GitHub token when you need higher GitHub API rate limits.
Who is it for?
Recruiters use it to enrich candidate lists with public GitHub profile signals.
Developer relations teams use it to identify active developers in a language, city, or ecosystem.
Sales and lead-generation teams use it to find technical contacts and public portfolio links.
VC and startup research teams use it to map builders, founders, and maintainers.
Open-source program offices use it to understand contributors and community members.
Security and compliance teams use it to review public account metadata for approved investigations.
Why use this actor?
- 👤 Scrape direct GitHub usernames or full profile URLs.
- 🔎 Use GitHub user-search syntax such as
location:Berlin language:Python followers:>50. - 📧 Capture public email, website, and Twitter/X fields when users publish them.
- 📊 Get followers, following, public repositories, gists, account age, and developer tier signals.
- ⭐ Optionally scan public repositories for total stars, forks, languages, and most-starred repository.
- ✅ Receive not-found rows for missing usernames so your input list stays auditable.
- 💸 Pay per saved profile result, not a large flat fee.
Input settings
| Setting | JSON key | Type / default | Description |
|---|---|---|---|
| GitHub usernames or profile URLs | usernames |
array, default ["torvalds","gaearon"] |
Enter GitHub handles such as torvalds or public profile URLs such as https://github.com/gaearon. |
| GitHub user search queries | searchQueries |
array, default ["location:Berlin language:Python followers:>50"] |
Optional GitHub user-search queries, for example location:Berlin language:Python followers:>50. Results are deduplicated with direct usernames. |
| Maximum profiles per search query | maxResultsPerQuery |
integer, default 5 |
How many user-search results to hydrate per query. Keep low for quick test runs. |
| Include repository summary | includeRepositories |
boolean, default false |
When enabled, scans each user's public repositories to calculate total stars, total forks, top languages, and most-starred repository. |
| Maximum repositories per user | maxRepositoriesPerUser |
integer, default 20 |
Repository scan cap used only when repository enrichment is enabled. |
Input options
GitHub usernames or profile URLs
Use usernames for exact handles or profile URLs.
Examples:
["torvalds", "gaearon", "https://github.com/sindresorhus"]
The actor normalizes URLs into GitHub logins.
Invalid usernames are skipped with a warning.
GitHub user-search queries
Use searchQueries for public GitHub user search.
Examples:
["location:Berlin language:Python followers:>50"]
You can use GitHub search qualifiers such as location, language, followers, repos, and creation date.
Search results are deduplicated against direct username inputs.
Maximum profiles per search query
Use maxResultsPerQuery to control the number of search hits hydrated per query.
Start with 5 to 20 for testing.
Increase it when you are confident the query returns the type of profiles you need.
Repository enrichment
Enable includeRepositories when you need star, fork, language, and most-starred repository signals.
Set maxRepositoriesPerUser to control how many public repositories are scanned per profile.
Repository enrichment is useful for ranking developer influence.
It is not required for basic contact enrichment.
Optional GitHub token
Use githubToken only if you need higher rate limits.
The token is treated as a secret input.
Small public-data runs can work without a token.
Example input
{
"usernames": ["torvalds", "gaearon"],
"searchQueries": ["location:Berlin language:Python followers:>50"],
"maxResultsPerQuery": 5,
"includeRepositories": false,
"maxRepositoriesPerUser": 30
}
Example output
{
"login": "torvalds",
"name": "Linus Torvalds",
"bio": null,
"company": "Linux Foundation",
"location": "Portland, OR",
"email": null,
"blog": null,
"twitterUsername": null,
"followers": 200000,
"following": 0,
"publicRepos": 8,
"accountAgeYears": 14.1,
"accountAgeTier": "veteran",
"developerTier": "mega",
"bestContact": "https://github.com/torvalds",
"profileUrl": "https://github.com/torvalds",
"sourceType": "username",
"sourceQuery": "torvalds",
"status": "ok",
"error": null,
"scrapedAt": "2026-07-03T00:00:00.000Z"
}
How to run it
- Open the actor on Apify.
- Add GitHub usernames, profile URLs, or search queries.
- Keep the first run small.
- Decide whether you need repository enrichment.
- Click Start.
- Export the dataset as JSON, CSV, Excel, or via API.
API usage
Run GitHub Profile Scraper from your own code with the Apify API.
Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
"usernames": [
"torvalds",
"gaearon"
],
"searchQueries": [
"location:Berlin language:Python followers:>50"
],
"maxResultsPerQuery": 5,
"includeRepositories": false,
"maxRepositoriesPerUser": 20
};
const run = await client.actor('fetch_cat/github-profile-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
Python
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("fetch_cat/github-profile-scraper").call(run_input={
"usernames": [
"torvalds",
"gaearon"
],
"searchQueries": [
"location:Berlin language:Python followers:>50"
],
"maxResultsPerQuery": 5,
"includeRepositories": false,
"maxRepositoriesPerUser": 20
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
cURL
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~github-profile-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"usernames":["torvalds","gaearon"],"searchQueries":["location:Berlin language:Python followers:>50"],"maxResultsPerQuery":5,"includeRepositories":false,"maxRepositoriesPerUser":20}'
Common workflows
Recruiting shortlist enrichment
Upload a list of GitHub handles from applications or referrals.
Export public profile, contact, and repository signals.
Sort by location, followers, languages, and developer tier.
Developer-relations prospecting
Search for developers by language and location.
Use repository enrichment to prioritize builders with public project traction.
Create outreach segments by ecosystem.
OSS community mapping
Enrich maintainers, stargazers, or contributor handles collected elsewhere.
Use account age and public metrics to understand community composition.
Sales and lead generation
Find technical buyers, founders, and engineers who publish public contact links.
Use bestContact to route email, website, or Twitter/X outreach workflows.
Integrations
Export CSV for spreadsheets and enrichment tools.
Send dataset items to a CRM with Apify integrations.
Use webhooks to trigger follow-up jobs when a run finishes.
Connect results to Clay, Airtable, Google Sheets, or a data warehouse.
Use Apify API clients from Node.js, Python, or cURL.
Use with AI agents via MCP
GitHub Profile Scraper can be used by AI assistants through the hosted Apify MCP server.
Claude Code setup
claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/github-profile-scraper"
Claude Desktop, Cursor, or VS Code JSON config
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/github-profile-scraper"
}
}
}
Example prompts
- "Run GitHub Profile Scraper with this input JSON and summarize the dataset."
- "Export the latest GitHub Profile Scraper results to a table I can review."
- "Schedule this Actor for monitoring and tell me what changed between runs."
Limits and caveats
GitHub controls public API rate limits.
Very large unauthenticated runs may hit rate limits.
A GitHub token can improve rate capacity.
Some users do not publish email, website, company, or location fields.
Repository enrichment scans public repositories and can take longer on accounts with many repos.
The actor does not bypass private profiles, deleted users, or authentication-only data.
Troubleshooting
Why did I get no email for a profile?
GitHub users often hide their email address.
The actor returns email only when it is public on the GitHub profile/API.
Check bestContact for a website, Twitter/X URL, or profile URL fallback.
Why did a search query return fewer users than expected?
GitHub search ranking and rate limits can affect public search results.
Make your query more specific, reduce the requested result count, or provide a GitHub token.
Why is repository enrichment slower?
Repository enrichment fetches public repositories for each profile.
Disable it when you only need contact and account-level profile fields.
Legality and responsible use
This actor extracts publicly available GitHub profile data.
Use the data in accordance with GitHub's terms, Apify's terms, and applicable privacy laws.
Do not use scraped contact information for spam.
Honor opt-out requests and maintain suppression lists for outreach.
Avoid collecting more data than your use case requires.
Dataset quality notes
The actor writes error rows for failed or missing profiles.
This keeps your exports aligned with your input list.
Successful rows have status set to ok.
Not-found rows have status set to not_found and are not charged as profile results.
Privacy notes
Only public profile fields are returned.
Secret inputs such as githubToken are not written to the dataset.
The actor does not attempt to infer private emails.
Version notes
Version 0.1 focuses on profile enrichment from usernames, profile URLs, and GitHub user-search queries.
Future versions may add additional public GitHub lead sources if they remain reliable and useful.
Support
Report bugs, wrong output, blocked runs, or missing fields from the Actor page. Include the Apify run ID or run URL, your input JSON, what you expected, what the Actor returned, and one reproducible public URL so the issue can be tested quickly.