Extract public GitHub contributor email rows from repository commit history.
What does GitHub Contributor Email Scraper do?
GitHub Contributor Email Scraper collects public contributor contact and activity records from public GitHub repositories.
It reads public commit metadata and saves normalized rows with repository context, contributor name, public commit email, GitHub login when GitHub maps the commit to a profile, commit URL, commit date, and scrape timestamp.
Use it when you need a clean spreadsheet of public contributor email evidence instead of manually opening commits one by one.
Who is it for?
- 🧑💻 Developer relations teams finding active open-source contributors.
- 🧲 Technical recruiters discovering engineers working in relevant repositories.
- 🧾 OSS program managers mapping contributor activity across projects.
- 🏢 B2B sales teams researching public technology ecosystems.
- 📊 Vendor intelligence teams tracking public project participation.
- 🧪 Researchers analyzing public software collaboration patterns.
Why use it?
- GitHub-specific inputs for repositories and organizations.
- Public-only extraction from commit metadata.
- Optional GitHub token support for higher rate limits.
- Email deduplication across repositories.
- Noreply email filtering.
- Evidence links for every saved row.
- Ready-to-export dataset tables.
What data can it extract?
| Field | Description |
|---|---|
repository |
Full owner/repo repository name. |
owner |
Repository owner login. |
repo |
Repository name. |
commitSha |
Commit SHA used as evidence. |
commitUrl |
GitHub commit URL. |
authorName |
Public commit author name. |
authorEmail |
Public commit author email. |
isNoreplyEmail |
Whether the email is a GitHub noreply address. |
githubLogin |
GitHub login when GitHub maps the commit to a profile. |
profileUrl |
GitHub profile URL when available. |
committedAt |
Commit author timestamp. |
messageSnippet |
Short commit message snippet. |
sourceType |
Repository or organization source mode. |
scrapedAt |
Timestamp when the row was collected. |
Input options
You can provide one or more of these sources:
repositoryUrls— GitHub repository URLs such ashttps://github.com/apify/crawlee.repositories— compactowner/repovalues such asapify/crawlee.organization— a GitHub organization login for scanning public organization repositories.
You can also set:
maxCommitsPerReposinceuntilincludeNoreplyEmailsdedupeByEmailgithubToken
Example input
{
"repositoryUrls": [{ "url": "https://github.com/apify/crawlee" }],
"maxCommitsPerRepo": 100,
"includeNoreplyEmails": false,
"dedupeByEmail": true
}
Repository inputs
Repository URLs and owner/repo strings can be mixed in the same run.
Examples:
https://github.com/apify/crawleehttps://github.com/apify/apify-sdk-jsapify/crawleeapify/apify-sdk-js
Invalid or non-GitHub URLs are ignored during normalization.
Organization input
Set organization to scan public repositories from a GitHub organization.
For example:
{
"organization": "apify",
"maxCommitsPerRepo": 25,
"includeNoreplyEmails": false,
"dedupeByEmail": true
}
Organization scans can produce many rows. Use smaller commit limits for your first run.
Date filters
Use since and until to focus on a time window.
Examples:
2026-01-012026-01-01T00:00:00Z2026-06-30T23:59:59Z
Date filters are useful when you only need recent contributors.
Noreply email filtering
GitHub users can hide their real email and commit with a noreply address.
Set includeNoreplyEmails to:
falseto focus on non-noreply public commit emails.trueto include GitHub noreply addresses too.
The output includes isNoreplyEmail so you can filter exports later.
Dedupe behavior
When dedupeByEmail is enabled, the actor saves only the first row for each email address across all repositories.
Disable it if you want commit-level evidence for repeated appearances of the same contributor email.
GitHub token
A token is optional for public repositories, but recommended for larger runs.
Use a token when:
- You scan many repositories.
- You hit GitHub rate limits.
- You run organization-wide jobs.
- You need more stable throughput.
A public-repository read token is sufficient.
Output example
{
"repository": "apify/crawlee",
"owner": "apify",
"repo": "crawlee",
"commitSha": "abc123",
"commitUrl": "https://github.com/apify/crawlee/commit/abc123",
"authorName": "Example Developer",
"authorEmail": "dev@example.com",
"isNoreplyEmail": false,
"githubLogin": "exampledev",
"profileUrl": "https://github.com/exampledev",
"committedAt": "2026-01-01T12:00:00Z",
"messageSnippet": "Fix crawler retry handling",
"sourceType": "repository",
"scrapedAt": "2026-07-04T00:00:00Z"
}
How to run
- Add one or more repository URLs.
- Choose a maximum number of commits per repository.
- Decide whether to include noreply emails.
- Run the actor.
- Export the dataset as CSV, JSON, Excel, or via API.
Tips for best results
- Start with
maxCommitsPerRepobetween 25 and 100. - Use
sincefor recent contributor discovery. - Enable
dedupeByEmailfor lead lists. - Disable dedupe for audit trails.
- Add a GitHub token for organization scans.
- Expect some commits to have noreply emails.
Integrations
Use the output dataset in:
- CRM enrichment workflows.
- Recruiting spreadsheets.
- Developer relations lead queues.
- Open-source ecosystem dashboards.
- Vendor intelligence reports.
- Apify webhooks and integrations.
API usage with Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/github-contributor-email-scraper').call({
repositories: ['apify/crawlee'],
maxCommitsPerRepo: 50,
includeNoreplyEmails: false,
dedupeByEmail: true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
API usage with Python
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/github-contributor-email-scraper').call(run_input={
'repositories': ['apify/crawlee'],
'maxCommitsPerRepo': 50,
'includeNoreplyEmails': False,
'dedupeByEmail': True,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
API usage with cURL
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~github-contributor-email-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"repositories":["apify/crawlee"],"maxCommitsPerRepo":50}'
MCP usage
Connect this actor to Apify MCP Server when you want an AI assistant to run GitHub contributor research.
MCP URL pattern:
https://mcp.apify.com/?tools=fetch_cat/github-contributor-email-scraper
Claude Code setup:
claude mcp add apify-github-contributor-email --url "https://mcp.apify.com/?tools=fetch_cat/github-contributor-email-scraper"
Claude Desktop JSON configuration:
{
"mcpServers": {
"apify-github-contributor-email": {
"url": "https://mcp.apify.com/?tools=fetch_cat/github-contributor-email-scraper"
}
}
}
Example prompts:
- “Find public contributor emails from apify/crawlee and return deduplicated rows.”
- “Scan recent commits from this repository and summarize contributor domains.”
- “Run a small test with noreply emails excluded.”
Data quality notes
The actor returns public commit author emails. It does not infer private emails, bypass privacy settings, or enrich users from unrelated sources.
Some rows may contain GitHub noreply addresses, depending on the input setting and contributor privacy preferences.
GitHub login and profile URL are available when GitHub can map the commit author to a GitHub account.
Legality and ethical use
This actor is intended for public data workflows. Use the results responsibly and comply with applicable privacy, anti-spam, employment, and data protection rules.
Do not use exported emails for unsolicited bulk messaging. Keep a legitimate business purpose and honor opt-out requests where applicable.
Troubleshooting
Why did I get zero rows?
The repository may only contain noreply emails, your date range may be too narrow, or your commit limit may be too low. Try enabling includeNoreplyEmails or increasing maxCommitsPerRepo.
Why did the run hit a GitHub API limit?
Unauthenticated GitHub API requests have lower rate limits. Add githubToken for larger scans.
Why is githubLogin empty?
Not every commit author email is mapped to a GitHub account. The email and commit URL are still saved when public.
Support
If you find a repository that should return public commit emails but does not, open an issue with the input you used and a short description of the expected output.