GitHub Email Scraper
Pricing
from $2.49 / 1,000 results
GitHub Email Scraper
GitHub Email Scraper SD - GitHub Email Scraper is a lead generation tool that extracts leads with public contact emails, account names and profile URLs from GitHub results by keyword, location and email domain - GitHub email extractor.
Pricing
from $2.49 / 1,000 results
Rating
0.0
(0)
Developer
Leads Scraper
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Share
GitHub Email Scraper - extract public developer emails from GitHub search results
The GitHub Email Scraper is an Apify Actor that collects publicly indexed contact emails linked to GitHub accounts, repositories and GitHub Pages sites. You give it keywords, optional location and the email domains you care about, and it returns a clean dataset of leads.
Developers publish email addresses everywhere on GitHub: in profile bios, in README files, in package manifests, in CONTRIBUTING and SECURITY docs, in issue threads and in project sites hosted on github.io. When Google indexes those pages, the GitHub Email Scraper can find them.
This is the tool people are looking for when they search for a GitHub email finder, a way to find developer emails from GitHub, or a GitHub email extractor that produces a spreadsheet instead of one address at a time.
What the GitHub Email Scraper actually reads
The GitHub Email Scraper reads only what Google has already indexed on github.com and github.io. It builds Google queries with the site: operator, fetches result pages through the Apify GOOGLE_SERP proxy, and pulls emails out of titles and snippets.
It does not read git history, it does not clone repositories, and it does not call the GitHub API. There is no login, no browser, no JavaScript rendering and no cookies anywhere in the pipeline.
That distinction matters. Commit metadata, package.json author fields and issue threads are only reachable here when those pages appear in Google's public index, not because the Actor walks the repository.
Who the GitHub Email Scraper is built for
Technical recruiters sourcing engineers, developer relations teams building a launch list, open-source maintainers looking for peer projects, and agencies doing developer lead generation all need the same thing: a repeatable way to turn a niche into contactable accounts.
The GitHub Email Scraper turns "Rust developer, London, Gmail addresses" into rows you can filter, dedupe and export as CSV, JSON, Excel or feed into an API.
Key features of the GitHub Email Scraper
| Feature | What it does |
|---|---|
Google site: dorking | Queries github.com and github.io through the Apify GOOGLE_SERP proxy |
| Query expansion | Runs base, quoted and intitle: variants plus one variant per query modifier; base queries run first |
| Domain-filtered extraction | Keeps only emails ending in your customDomains values |
| Global deduplication | One row per unique email across every query and every page of the run |
| Obfuscation handling | Understands name [at] domain [dot] com, name (at) domain, name @ domain.com, domain .com, zero-width characters and the full-width @ |
| Junk filter | Rejects placeholders such as email@, yourname@, test@, xxx@ and single-character locals |
| Boundary-correct matching | @gmail.com never matches inside @gmail.company or @gmail.com.br |
| Soft-wrap repair | Drops a hit that is only the tail of another email in the same result block |
| Structural parsing | Locates the <h3> title then the smallest surrounding block, instead of relying on Google's CSS class names |
| Whole-page fallback | If Google's markup changes, the run degrades to "emails without account details" rather than "no emails" |
| Block detection | CAPTCHA, "unusual traffic" and consent pages are detected and retried, not counted as empty |
| Retries and backoff | Up to 3 attempts per page with exponential backoff and a fresh proxy session per request |
| Requeue of failures | Blocked or failed queries are re-queued once at the end of the run |
| Async concurrency | An asyncio worker pool with a shared stop signal on maxEmails |
| Resumable state | Progress is stored in the key-value store keyed by a hash of the input, with throttled saves plus saves on PERSIST_STATE, MIGRATING and ABORTING |
| Streaming output | Every lead is pushed to the dataset immediately, so partial results survive an abort |
| Run summary | Logs pages fetched, blocked pages, retries and emails per page |
How the GitHub Email Scraper works
The GitHub Email Scraper pipeline is deliberately simple, which is why it is fast and hard to break.
- The GitHub Email Scraper reads your input: keywords, location, email domains and limits.
- It builds Google queries with the
site:operator, for examplesite:github.com maintainer "@gmail.com" "Berlin". - It fetches Google result pages asynchronously through the Apify GOOGLE_SERP proxy using
aiohttp. - It parses each result block structurally, finding the
<h3>title and the smallest block around it. - It extracts emails from the block text with a domain-filtered regex.
- It deduplicates globally and pushes each lead straight to the Apify dataset.
Why query expansion exists
Google caps a single query at roughly 300 results. One query therefore has a hard ceiling no matter how many pages you allow.
Query expansion is how the GitHub Email Scraper gets past that ceiling: every keyword is combined with every email domain in several phrasings, and each variant is a separate query with its own 300-result budget.
The default queryModifiers for this Actor are tuned for GitHub - email, contact, maintainer, author, support - because those are the words that actually appear next to addresses in repository documentation.
What the GitHub Email Scraper does not do
It does not log into GitHub, use GitHub's API, open github.com directly, render JavaScript, read commit history, or access anything that is not already public in Google's index. It is not affiliated with or endorsed by GitHub.
GitHub Email Scraper input fields
Every field below is optional except keywords. Defaults are the ones shipped in the Actor's input schema.
| Field | Type | Default | Meaning |
|---|---|---|---|
keywords | array (required) | ["developer", "maintainer"] | Search terms describing the GitHub accounts you want (niche, job title, industry) |
location | string | "" | Optional location phrase added to every query |
customDomains | array | ["@gmail.com", "@yahoo.com"] | Only emails on these domains are kept; the leading @ is optional |
maxEmails | integer 1-10000 | 20 | Stop after this many unique emails |
countryCode | string | "" | Two-letter country for the search proxy (US, GB, DE...) |
expandQueries | boolean | true | Search each keyword x domain pair in several phrasings |
queryModifiers | array | ["email", "contact", "maintainer", "author", "support"] | Extra words combined with each keyword when expansion is on |
maxPagesPerQuery | integer 1-50 | 30 | Page cap per query |
maxConcurrency | integer 1-20 | 5 | Parallel queries |
Example GitHub Email Scraper input
{"keywords": ["rust developer", "open source maintainer", "devops engineer"],"location": "Berlin","customDomains": ["@gmail.com", "@protonmail.com"],"maxEmails": 500,"countryCode": "DE","expandQueries": true,"queryModifiers": ["email", "contact", "maintainer", "author", "support"],"maxPagesPerQuery": 30,"maxConcurrency": 5}
Tuning the GitHub Email Scraper for better yield
Specific keywords beat generic ones in the GitHub Email Scraper. kubernetes operator maintainer will out-perform developer because it matches the language people actually write in their profiles and docs.
Add more domains rather than more keywords when a run comes back thin. Each extra domain multiplies the number of distinct queries, and each query brings its own result budget.
Leave expandQueries on. Turning it off gives you one query per keyword and domain, which is faster but caps out quickly.
GitHub Email Scraper output fields
Every dataset item produced by the GitHub Email Scraper carries all 14 fields below. Fields are never omitted; they are empty or null when GitHub did not expose the value in Google's result.
| Field | Meaning |
|---|---|
network | Platform name |
keyword | The keyword that produced the lead |
query | The exact Google query used |
title | Raw result title |
accountName | Account label Google prints (handle, display name, or organisation) |
fullName | Display name parsed from a profile-style title; empty for repository or doc pages |
username | URL-safe GitHub handle when one is exposed; otherwise null |
profileUrl | Canonical https://github.com/{username} URL when a handle is known; otherwise empty |
url | Direct platform link when exposed, else the profile URL |
description | Bio or snippet text, cleaned of labels and engagement counters |
email | Lower-cased email address |
emailDomain | The matched domain, for example @gmail.com |
possiblyTruncated | true when Google's snippet ellipsis touched the email - verify before sending |
foundAt | ISO 8601 UTC timestamp |
Example GitHub Email Scraper output
[{"network": "GitHub","keyword": "rust developer","query": "site:github.com rust developer \"@gmail.com\" \"Berlin\"","title": "Lena Hoffmann (lhoffmann) - GitHub","accountName": "lhoffmann","fullName": "Lena Hoffmann","username": "lhoffmann","profileUrl": "https://github.com/lhoffmann","url": "https://github.com/lhoffmann","description": "Rust and systems engineer in Berlin. Maintainer of a few crates. Reach me at lena.hoffmann.dev@gmail.com","email": "lena.hoffmann.dev@gmail.com","emailDomain": "@gmail.com","possiblyTruncated": false,"foundAt": "2026-08-31T09:14:22.481Z"},{"network": "GitHub","keyword": "open source maintainer","query": "site:github.com intitle:\"open source maintainer\" \"@gmail.com\"","title": "orbital-tools/orbital-cli: README - maintainers and contact","accountName": "orbital-tools","fullName": "","username": "orbital-tools","profileUrl": "https://github.com/orbital-tools","url": "https://github.com/orbital-tools/orbital-cli","description": "Maintainers: security reports to orbital.maintainers@gmail.com. Please do not open public issues for ...","email": "orbital.maintainers@gmail.com","emailDomain": "@gmail.com","possiblyTruncated": true,"foundAt": "2026-08-31T09:14:29.113Z"},{"network": "GitHub","keyword": "devops engineer","query": "site:github.io devops engineer contact \"@protonmail.com\"","title": "Docs - Contact the team","accountName": "Docs","fullName": "","username": null,"profileUrl": "","url": "https://kestrel-ops.github.io/docs/contact/","description": "For consulting or incident support, email kestrel.ops@protonmail.com","email": "kestrel.ops@protonmail.com","emailDomain": "@protonmail.com","possiblyTruncated": false,"foundAt": "2026-08-31T09:15:03.902Z"}]
The third row is the honest case: a GitHub Pages site under github.io carries a real email but no GitHub handle, so username is null and profileUrl is empty. That is a Google limitation, not a bug.
Use cases for the GitHub Email Scraper
| Use case | How the GitHub Email Scraper helps |
|---|---|
| Technical recruiting | Build a sourcing list of engineers by stack, role and city, with a profile URL to review before you write |
| Developer relations | Find maintainers of projects adjacent to yours before a launch or a beta programme |
| Open-source outreach | Reach the people listed as contacts in README, CONTRIBUTING and SECURITY docs |
| Developer lead generation | Feed a devtools or API product pipeline with accounts that match a technical niche |
| Partnership research | Identify organisations publishing tooling in your category and the address they publish for contact |
| Security disclosure | Collect published security contact addresses for projects you depend on |
| Market and ecosystem research | Measure how many projects in a niche publish a public contact channel at all |
| Conference and community programmes | Assemble a speaker or contributor shortlist from a technology keyword |
Recruiting and sourcing engineers
Recruiters use the GitHub Email Scraper because GitHub is where engineers demonstrate skill rather than describe it. A keyword like kubernetes plus a city gives you evidence and a contact route in one row.
Always review profileUrl before contacting someone. The GitHub Email Scraper gives you the address; qualifying the person is still your job.
Developer relations and launch lists
DevRel teams pair the GitHub Email Scraper with the npm Email Scraper and the PyPI Email Scraper to reach the same maintainers through the registries they publish to.
Expected results from the GitHub Email Scraper
In live test runs against Google, roughly 7 out of 10 parsed GitHub results carried an account identity - a handle, a display name, or both - and profile URLs resolved well.
That is a strong ratio for this family of Actors, because GitHub profile and repository titles are unusually well structured in Google's index.
The remaining rows are still useful leads: they carry email, emailDomain, url, description and query, just without a resolved handle. Volume itself always depends on your keywords, domains and location - no yield is guaranteed.
Limitations of the GitHub Email Scraper
Read this section before you plan a campaign around GitHub Email Scraper output.
- Publicly indexed emails only. The GitHub Email Scraper finds an address only when it is already visible in Google's index. Addresses hidden behind GitHub's noreply setting, private profiles or unindexed pages are out of reach.
- No git history and no API. Commit author emails,
.patchendpoints and API responses are not read. Only Google result titles and snippets are parsed. - Google's ~300-result cap. A single query returns about 300 results maximum, which is exactly why
expandQueriesexists and why turning it off reduces volume. possiblyTruncated. When this istrue, Google's snippet ellipsis touched the email and it may be cut off. Verify those rows before sending anything.usernameandprofileUrlcan be empty. They are populated only when GitHub exposes a handle in the result.github.iopages and some repository documents show only a display name, leavingaccountNamefilled butusernamenullandprofileUrlempty.- Apify GOOGLE_SERP proxy required. The Actor cannot run without Apify proxy credentials.
- Free plan cap. Free Apify plans are limited to 100 emails per run. Paid plans are uncapped.
- Variable results. Output depends on keywords, domains and location, and Google's index changes over time. Two runs of the GitHub Email Scraper a month apart will not be identical.
Responsible use
Developer emails collected by the GitHub Email Scraper are published for project correspondence - bug reports, security disclosures, maintenance questions. Treat them that way.
If you contact people in the EU or UK, GDPR applies: have a lawful basis, identify yourself, say where you got the address, and honour opt-outs immediately. Respect GitHub's community norms and any "no recruiters" note in a profile or README.
Bulk unsolicited email to maintainers is the fastest way to get your domain blocked and your company remembered badly. Small, relevant, personal beats large and generic every time.
GitHub Email Scraper FAQ
Does the GitHub Email Scraper read git commit history?
No. It does not read git history, clone repositories or call the GitHub API. It parses Google search results for pages on github.com and github.io that Google has already indexed.
Does it need a GitHub login or token?
No. There is no authentication, no browser, no JavaScript rendering and no cookies. The only credential needed is your Apify account's GOOGLE_SERP proxy access.
Where do the emails come from?
From the text Google prints in result titles and snippets - profile bios, README and CONTRIBUTING files, package manifests, issue threads and github.io project sites that expose an address publicly.
How many emails can the GitHub Email Scraper return?
maxEmails accepts 1 to 10000 and defaults to 20. Free Apify plans are capped at 100 emails per run; paid plans are uncapped. Actual volume depends on your keywords and domains.
Why is username sometimes null?
Because Google did not expose a GitHub handle for that result. The row still carries email, accountName, url and description. This happens most often on github.io pages and documentation files.
What does possiblyTruncated: true mean?
Google's snippet ellipsis touched the email, so the address may be incomplete. Verify those rows before you use them.
Can I restrict the GitHub Email Scraper to corporate domains?
Yes. Put the domains you want in customDomains - for example ["@acme.io", "@example.com"]. Only emails ending in those domains are kept, and the leading @ is optional.
Does it handle obfuscated addresses like name [at] gmail [dot] com?
Yes. The extractor normalises [at], (at), spaced @, spaced .com, zero-width characters and the full-width @, and it filters placeholders such as test@ and yourname@.
Can I run it for a specific country?
Set countryCode to a two-letter code such as US, GB or DE to steer the search proxy, and put a city or region in location to add it to every query.
What happens if the run is interrupted?
Progress is saved in the key-value store keyed by a hash of your input, with saves on PERSIST_STATE, MIGRATING and ABORTING. Leads are pushed to the dataset as they are found, so nothing already collected is lost.
Will it break when Google changes its HTML?
Parsing is structural rather than class-name based, and there is a whole-page fallback parser. A layout change degrades the GitHub Email Scraper to "emails without account details" rather than "no emails".
Is the GitHub Email Scraper affiliated with GitHub?
No. It is an independent Apify Actor and is not supported, endorsed or affiliated with GitHub or Microsoft.
Related Actors
The GitHub Email Scraper is part of a Developer & Technology family of Apify Actors that all work the same way on different platforms. Run several to cover an ecosystem rather than a single site.
| Actor | What it collects |
|---|---|
| GitHub Email and Phone Number Scraper | Emails and phone numbers from GitHub |
| GitHub Phone Number Scraper | Public phone numbers from GitHub |
| App Store Email Scraper | Public contact emails from App Store |
| Atlassian Marketplace Email Scraper | Public contact emails from Atlassian Marketplace |
| Bitbucket Email Scraper | Public contact emails from Bitbucket |
| Chrome Web Store Email Scraper | Public contact emails from Chrome Web Store |
| CodePen Email Scraper | Public contact emails from CodePen |
| Confluence Email Scraper | Public contact emails from Confluence |
| Dev.to Email Scraper | Public contact emails from DEV Community |
| Docker Hub Email Scraper | Public contact emails from Docker Hub |
| Figma Community Email Scraper | Public contact emails from Figma Community |
| Firefox Add-ons Email Scraper | Public contact emails from Firefox Add-ons |
| GitLab Email Scraper | Public contact emails from GitLab |
| Google Play Email Scraper | Public contact emails from Google Play |
| Hashnode Email Scraper | Public contact emails from Hashnode |
| HubSpot Marketplace Email Scraper | Public contact emails from HubSpot Marketplace |
| Hugging Face Email Scraper | Public contact emails from Hugging Face |
| Jira Email Scraper | Public contact emails from Jira |
| Maven Central Email Scraper | Public contact emails from Maven Central |
| Microsoft AppSource Email Scraper | Public contact emails from Microsoft AppSource |
| Salesforce AppExchange Email Scraper | Public contact emails from Salesforce AppExchange |
| Shopify App Store Email Scraper | Public contact emails from Shopify App Store |
| Slack App Directory Email Scraper | Public contact emails from Slack App Directory |
| SourceForge Email Scraper | Public contact emails from SourceForge |
| Stack Overflow Email Scraper | Public contact emails from Stack Overflow |
| Unity Asset Store Email Scraper | Public contact emails from Unity Asset Store |
| Unreal Engine Marketplace Email Scraper | Public contact emails from Unreal Engine Marketplace |
| WordPress Plugin Directory Email Scraper | Public contact emails from WordPress Plugin Directory |
| WordPress Theme Directory Email Scraper | Public contact emails from WordPress Theme Directory |
| Zapier App Directory Email Scraper | Public contact emails from Zapier App Directory |
| App Store Email and Phone Number Scraper | Emails and phone numbers from App Store |
| Atlassian Marketplace Email and Phone Number Scraper | Emails and phone numbers from Atlassian Marketplace |
| Bitbucket Email and Phone Number Scraper | Emails and phone numbers from Bitbucket |
| Chrome Web Store Email and Phone Number Scraper | Emails and phone numbers from Chrome Web Store |
| CodePen Email and Phone Number Scraper | Emails and phone numbers from CodePen |
| Confluence Email and Phone Number Scraper | Emails and phone numbers from Confluence |
| DEV Community Email and Phone Number Scraper | Emails and phone numbers from DEV Community |
| Docker Hub Email and Phone Number Scraper | Emails and phone numbers from Docker Hub |
| Figma Community Email and Phone Number Scraper | Emails and phone numbers from Figma Community |
| Firefox Add-ons Email and Phone Number Scraper | Emails and phone numbers from Firefox Add-ons |
| GitLab Email and Phone Number Scraper | Emails and phone numbers from GitLab |
| Google Play Email and Phone Number Scraper | Emails and phone numbers from Google Play |
Leave a review
If the GitHub Email Scraper saved you time, please leave a star rating and a short review on the Actor page.
Reviews are how other buyers judge whether a tool works, and they tell us which features to build next.
If something did not work, email neurodata.apify@gmail.com instead - bugs get fixed faster than they get complained about.
Support
Questions, a bug, or a custom build of the GitHub Email Scraper for your own domain list? Email neurodata.apify@gmail.com and we will get back to you.