GitHub Gmail Scraper avatar

GitHub Gmail Scraper

Pricing

from $4.19 / 1,000 leads

Go to Apify Store
GitHub Gmail Scraper

GitHub Gmail Scraper

Find GitHub developer emails, including Gmail addresses, from public profiles and commits. Search by username, organization, repository or keyword. Export JSON, CSV, Excel or use the API.

Pricing

from $4.19 / 1,000 leads

Rating

0.0

(0)

Developer

ParseBird

ParseBird

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Categories

Security

Limited permissions

Share

GitHub Gmail Scraper

GitHub Gmail Scraper finds the public email addresses of GitHub developers, including Gmail and work addresses, from their profiles and public commits.

Build developer lists from usernames, organizations, repositories or a GitHub user search, and get each person's email, email source, company, location, website, followers in 22 structured fields.

Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

Actor ID: parsebird/github-gmail-scraper. Python: from apify_client import ApifyClient; client = ApifyClient("<APIFY_TOKEN>"); run = client.actor("parsebird/github-gmail-scraper").call(run_input={"usernames": ["torvalds", "gvanrossum"], "maxResults": 2, "enrichEmailFromCommits": True}); items = client.dataset(run["defaultDatasetId"]).list_items().items. Inputs: usernames (string[], default []), orgs (string[], default []), repos (string[] as owner/repo, default []), searchQuery (string, GitHub user search syntax, default ""), maxResults (integer >= 1, default 100, total across inputs), enrichEmailFromCommits (boolean, default true), githubToken (secret string, optional, needed for emails set on profiles), proxyConfiguration (object, default {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}), disableUsageStats (boolean, default false). Output fields: type, login, name, html_url, email, email_source (profile|commit|none), company, location, blog, twitter_username, hireable, bio, followers, following, public_repos, public_gists, account_created_at, profile_updated_at, query, scraped_at, parse_confidence, warnings. API spec: https://apify.com/parsebird/github-gmail-scraper/api/openapi. Get a token: https://console.apify.com/account/integrations.

What is GitHub Gmail Scraper?

GitHub Gmail Scraper is a GitHub email scraper and an alternative to calling the GitHub REST API yourself. Give it GitHub usernames, organizations, repositories or a user search, and it returns one structured lead per person, with the public email when one can be found.

The easiest way to try it is to press Start with the two example usernames. Results appear in a table you can download as JSON, CSV or Excel.

The Actor returns any public address it finds, so results include Gmail, company and personal-domain emails. To keep Gmail only, filter the email column for @gmail.com after the run.

What can GitHub Gmail Scraper do?

  • 🔎 Four input modes: direct usernames, public organization members, repository contributors, and GitHub user search. Combine them in one run.
  • 📬 Commit email lookup: when a profile shows no email, the Actor checks that person's public commits and keeps only addresses on commits GitHub links to their account.
  • 🧹 Clean leads: duplicates are removed case-insensitively, organizations and bots are left out, and GitHub noreply addresses and machine-generated hostnames are never returned as emails.
  • 🏷️ Traceable results: every lead shows where its email came from (email_source) and which input found it (query).

Because it runs on the Apify platform, you also get:

  • Scheduling for daily or weekly refreshes
  • API access and client libraries for Python and JavaScript
  • Integrations with tools like Make, Zapier, Slack and Google Sheets
  • Exports in JSON, CSV, Excel, XML and HTML

What data can you extract from GitHub?

FieldDescription
login, name, html_urlGitHub username, display name and profile URL
emailPublic email address, or null if none was found
email_sourceprofile, commit or none
company, location, bioDetails from the profile
blog, twitter_usernameWebsite and X username
hireableGitHub's "available for hire" flag, true or null
followers, following, public_repos, public_gistsPublic account metrics
account_created_at, profile_updated_atAccount dates
queryInput that found this person: username, org:<name>, repo:<owner/repo> or search:<query>
scraped_atUTC time the record was created
parse_confidence, warningsQuality signals (see the FAQ)

How to scrape GitHub emails

  1. Open GitHub Gmail Scraper and go to the Input tab.
  2. Fill in any mix of Usernames, Organizations, Repositories and User search query, for example location:berlin language:python. See GitHub's user search syntax.
  3. Set Max results, the total number of leads across all inputs.
  4. Leave Find emails in public commits on to look for emails hidden from profiles.
  5. Optionally add a GitHub token under Advanced. It's the only way to read emails people have set on their profiles (see the FAQ).
  6. Press Start, then open the results and check email_source and warnings.
  7. Download the dataset, or repeat the run with Apify Schedules. Weekly is a reasonable starting point.

Input parameters

ParameterTypeRequiredDefaultDescription
usernamesarrayNo[]GitHub usernames or profile URLs
orgsarrayNo[]Organizations; each public member is added
reposarrayNo[]owner/repo or repository URLs; contributors are added
searchQuerystringNo""GitHub user search query
maxResultsintegerNo100Maximum leads across all inputs, at least 1
enrichEmailFromCommitsbooleanNotrueCheck public commits when the profile shows no email
githubTokenstring (secret)NononeToken for 5,000 requests per hour and profile emails; needs no scopes for public data
proxyConfigurationobjectNoResidentialProxy for GitHub requests. With a token and this default, requests go direct; a changed setting is used as supplied
disableUsageStatsbooleanNofalseSkip the USAGE_STATS record in this run's key-value store

Provide at least one of usernames, orgs, repos or searchQuery.

{
"usernames": ["torvalds", "gvanrossum"],
"maxResults": 2,
"enrichEmailFromCommits": true,
"disableUsageStats": false
}

Output example

Real records from a test run, with the email addresses hidden here. Download results in JSON, CSV, Excel, XML or HTML.

[
{
"type": "user",
"login": "gvanrossum",
"name": "Guido van Rossum",
"html_url": "https://github.com/gvanrossum",
"email": "<hidden for privacy>",
"email_source": "commit",
"company": "Microsoft",
"location": "San Francisco Bay Area",
"blog": "https://python.org/~guido/",
"twitter_username": "gvanrossum",
"hireable": null,
"bio": null,
"followers": 27307,
"following": 4,
"public_repos": 29,
"public_gists": 12,
"account_created_at": "2012-11-26T18:46:40Z",
"profile_updated_at": "2026-10-24T03:53:36Z",
"query": "username",
"scraped_at": "2026-11-08T06:55:27Z",
"parse_confidence": 1,
"warnings": []
}
]

Each run also stores a summary in the OUTPUT record of its key-value store, with lead counts plus any skipped or failed inputs.

Use cases

  • Find maintainers of a dependency to report a security issue or ask about licensing
  • Reach the contributors of a project about something that concerns their work
  • Research who works in an open-source organization or technology community
  • Enrich a list of GitHub usernames you already have with public profile details

Read the legal section below before using emails for outreach.

How it works

  1. The Actor turns your inputs into a list of accounts, in the order usernames, organizations, repositories, search, and removes duplicates.
  2. It reads each public profile through GitHub's REST API. Organizations and bots are skipped.
  3. If the profile shows no usable email and commit lookup is on, it checks up to 3 of the person's recently pushed repositories, their own before forks.
  4. It keeps the most frequent valid address on commits linked to that account.
  5. It stops at maxResults. Inputs are only read as far as needed.

How much does it cost to scrape GitHub emails?

GitHub Gmail Scraper uses pay-per-event pricing. Compute and proxy costs are included in the event price.

EventFreeBronzeSilverGold
Actor start (once per run)$0.005$0.005$0.005$0.005
Lead, per event$0.00479$0.00459$0.00439$0.00419
Lead, per 1,000$4.79$4.59$4.39$4.19

A lead is one person saved to the dataset, with or without an email. On the Free plan, 1,000 leads cost $4.79 plus the $0.005 start fee. If no users can be resolved, no leads are charged. Set a maximum cost per run in the run options and the Actor stops when it's reached.

Python and JavaScript API examples

Install the Apify client and call the Actor from your code. Your token is on the Integrations page.

Python

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/github-gmail-scraper").call(run_input={
"searchQuery": "location:berlin language:python",
"maxResults": 50,
})
for lead in client.dataset(run["defaultDatasetId"]).iterate_items():
if lead["email"]:
print(lead["login"], lead["email"], lead["email_source"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/github-gmail-scraper').call({
orgs: ['pallets'],
maxResults: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((lead) => lead.email));

Limits and edge cases

ConditionWhat you getWhat to do
No public email foundThe lead is returned and charged, with email: null and email_source: "none"Keep the row or filter on email
Only noreply addresses foundThey aren't used; the warning only_noreply_emails_found is addedTreat as no public email
User has no public repositoriesCommit lookup is skipped; the warning no_public_repos is addedUse the profile fields
Organization placed in UsernamesIt's skipped and not chargedPut it in Organizations
Repository isn't owner/repoIt's skipped and listed in OUTPUTUse the owner and name separated by one slash
No users could be resolved0 leads, nothing charged, and OUTPUT has error: "no_users_resolved"Check spelling and inputs
Profile lookup keeps failingIt's retried with fresh sessions, then listed under failed in OUTPUTAdd a token and rerun
Commit lookup fails after the profile is readThe lead is kept, with the warning commit_lookup_failed and parse_confidence: 0.8Rerun that user
Search matches over 1,000 accountsGitHub returns the first 1,000 at mostNarrow the query or split it, for example by location
Repository too large for GitHub's contributor listAuthors of up to 500 recent commits are used insteadAdd more inputs if you need more people

Scraping publicly available data is generally legal, but what you do with it matters, and emails are personal data. Results can fall under regulations such as the GDPR and laws on unsolicited marketing like CAN-SPAM. Don't process personal data without a legitimate reason, and consult your lawyers if you're unsure. For background, see Apify's post on the legality of web scraping.

GitHub also sets its own rules. Its Acceptable Use Policies say you may not use information from the service for spamming purposes, including sending unsolicited emails to users, or for selling personal information, such as to recruiters, headhunters and job boards. You are responsible for following these rules with the data you collect.

Other lead and email tools from ParseBird

FAQ

Does it only return Gmail addresses? No. It returns whichever public address it finds, whether that's Gmail, a company domain or a personal domain. Filter the email column for @gmail.com if you only want Gmail.

Why do I need a token to get profile emails? In our tests, GitHub's API returned no profile email to anonymous requests, even for accounts whose public email matched a GitHub search. Without a token, emails come from public commits only. With a token, the email a person chose to show on their profile is returned as email_source: "profile". Create a personal access token; it needs no scopes for public data.

Why is email empty for some people? They may have no public commits, commit with GitHub's noreply address, or have commits that aren't linked to their account. The Actor doesn't guess addresses.

How accurate are commit emails? A commit email is what the author's Git client recorded when the commit was made, so it can be old. Only addresses on commits GitHub links to that account are used.

What does parse_confidence mean? It's 1 when all lookups for the lead finished, and 0.8 when the commit lookup failed, so the lead may be missing an email.

What is the usage statistics record? A USAGE_STATS record in this run's own key-value store with counts of inputs, leads and API requests. Your token and results aren't included, and it isn't sent elsewhere. Turn on Skip the usage statistics record to leave it out.

How many leads can I get without a token? GitHub allows 60 anonymous requests per hour per IP address, so the Actor rotates proxy sessions. With a token, the limit is 5,000 requests per hour; a lead with commit lookup can take up to 5 requests.

Can I use it through the API or with AI agents? Yes. See the API tab and connect it to tools through integrations or the Apify MCP server.

Something isn't working. Where can I report it? Open a ticket in the Issues tab. Feedback and feature requests are welcome.