GitHub User & Org Scraper
Pricing
Pay per event
GitHub User & Org Scraper
Fetch GitHub user or organisation metadata — name, bio, company, location, blog, public repo count, follower count, and (optionally) the user's pinned/public repositories. Free GitHub REST API, optional token for higher rate limits.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
🎯 What this scrapes
GitHub exposes every user and org profile via its REST API. This Actor takes a list of usernames or org slugs, fans them out in parallel, and writes one row per profile with hireable status, bio, public repo count, followers/following, account creation date, and (optionally) the full list of their public repos.
🔥 What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not Python. - 🌐 Residential proxy rotation via Apify Proxy — fresh session and exit IP on every block.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per page,Retry-Afterhonoured. - 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
💡 Use cases
- B2B lead gen — pull GitHub orgs in a given location, filter by public_repos > N, enrich with company website.
- Recruiting — find devs whose bio mentions a target framework and whose hireable flag is true.
- Influencer mapping — rank developers by follower count within a topic via combination with the repo Actor.
- ATS enrichment — pipe candidate GitHub URLs through this Actor to enrich your applicant tracker.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
usernames | array | yes | ['torvalds', 'apify'] | GitHub usernames or organisation slugs, one per line. Profile URLs are also accepted — we strip the host. |
githubToken | string | no | '—' | Personal access token. Without one you get 60 requests/hour; with one, 5 000/hour. |
includeRepos | boolean | no | False | Adds a repos array (up to 100 most-recently-updated public repos with name + stars). One extra API call per user. |
maxReposPerUser | integer | no | 30 | Cap on repos returned per user when includeRepos=true. Hard ceiling 100. |
concurrency | integer | no | 6 | Parallel API requests. |
proxyConfiguration | object | no | {'useApifyProxy': False} | Apify Proxy optional — GitHub's REST API does not IP-block at reasonable volumes. |
Example input
{"usernames": ["apify"],"includeRepos": false,"concurrency": 4,"proxyConfiguration": {"useApifyProxy": false}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
login | string | GitHub username or org slug. |
type | string | User or Organization. |
name | ['string', 'null'] | Display name. |
company | ['string', 'null'] | Self-declared company. |
blog | ['string', 'null'] | Profile blog/homepage URL. |
location | ['string', 'null'] | Self-declared location. |
email | ['string', 'null'] | Public email — null when the user keeps it private. |
bio | ['string', 'null'] | Profile bio. |
twitter_username | ['string', 'null'] | Linked X (Twitter) handle. |
public_repos | integer | Public repository count. |
public_gists | integer | Public gist count. |
followers | integer | Follower count. |
following | integer | Following count. |
html_url | string | Profile URL. |
avatar_url | string | Avatar image URL. |
hireable | ['boolean', 'null'] | Self-declared hireable flag. |
created_at | string | Account creation timestamp. |
updated_at | string | Last profile update timestamp. |
repos | ['array', 'null'] | Public repos summary (when includeRepos=true). |
scraped_at | string | When this row was recorded. |
Example output
{"login": "apify","type": "Organization","name": "Apify","blog": "https://apify.com","location": "Prague, Czechia","public_repos": 412,"followers": 856,"html_url": "https://github.com/apify"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.005 | One-off warm-up charge per run |
result | $0.003 | Per dataset item |
Example: 1 000 results at the rates above ≈ $3.00. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
We hit only the /users/{login} endpoint. Contribution graphs, sponsor lists, and starred repos are not in scope. Private-org membership requires authentication and is also out of scope.
❓ FAQ
Why is email empty?
GitHub hides email by default. We surface whatever the public API returns; we don't probe commit metadata or noreply addresses.
Are organisations supported?
Yes — the API returns Organization type for orgs and User for personal accounts. Same dataset shape.
Does this respect GDPR?
We only fetch fields GitHub publishes publicly. Don't ingest output into outreach systems without your own legal sign-off.
Can I get a user's contribution graph?
Not via this Actor — GitHub's public REST API doesn't expose it. Use a graph-specific Actor.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.