GitHub Contributor Email Scraper

Extract public GitHub contributor commit emails, names, logins, commit URLs, dates, and repository context from repos or organizations.

Data fields

FieldTypeDescription
repositorystringValue exported as repository.
ownerstringValue exported as owner.
repostringValue exported as repo.
commitShastringValue exported as commitSha.
commitUrlstringValue exported as commitUrl.
authorNamestring | nullValue exported as authorName.
authorEmailstringValue exported as authorEmail.
isNoreplyEmailbooleanValue exported as isNoreplyEmail.

Input preview

repositoryUrlsRepository URLs
repositoriesRepository names
organizationOrganization login
maxCommitsPerRepoMaximum commits per repository
sinceSince date
untilUntil date

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

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 as https://github.com/apify/crawlee.
  • repositories — compact owner/repo values such as apify/crawlee.
  • organization — a GitHub organization login for scanning public organization repositories.

You can also set:

  • maxCommitsPerRepo
  • since
  • until
  • includeNoreplyEmails
  • dedupeByEmail
  • githubToken

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/crawlee
  • https://github.com/apify/apify-sdk-js
  • apify/crawlee
  • apify/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-01
  • 2026-01-01T00:00:00Z
  • 2026-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:

  • false to focus on non-noreply public commit emails.
  • true to 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

  1. Add one or more repository URLs.
  2. Choose a maximum number of commits per repository.
  3. Decide whether to include noreply emails.
  4. Run the actor.
  5. Export the dataset as CSV, JSON, Excel, or via API.

Tips for best results

  • Start with maxCommitsPerRepo between 25 and 100.
  • Use since for recent contributor discovery.
  • Enable dedupeByEmail for 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.

Common questions

Questions and answers reused from the canonical actor README.

Is this actor collecting private GitHub emails?

No. It returns public commit author email values available in public GitHub commit metadata.

Can I export results to CSV?

Yes. Use the Apify dataset export menu or API to download CSV, JSON, Excel, and other formats.