# GitHub Email Scraper (`leads-scraper/github-email-scraper`) Actor

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.

- **URL**: https://apify.com/leads-scraper/github-email-scraper.md
- **Developed by:** [Leads Scraper](https://apify.com/leads-scraper) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 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.

1. The GitHub Email Scraper reads your input: keywords, location, email domains and limits.
2. It builds Google queries with the `site:` operator, for example `site:github.com maintainer "@gmail.com" "Berlin"`.
3. It fetches Google result pages asynchronously through the Apify GOOGLE_SERP proxy using `aiohttp`.
4. It parses each result block structurally, finding the `<h3>` title and the smallest block around it.
5. It extracts emails from the block text with a domain-filtered regex.
6. 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

```json
{
  "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

```json
[
  {
    "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, `.patch` endpoints 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 `expandQueries` exists and why turning it off reduces volume.
- **`possiblyTruncated`.** When this is `true`, Google's snippet ellipsis touched the email and it may be cut off. Verify those rows before sending anything.
- **`username` and `profileUrl` can be empty.** They are populated only when GitHub exposes a handle in the result. `github.io` pages and some repository documents show only a display name, leaving `accountName` filled but `username` `null` and `profileUrl` empty.
- **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](https://apify.com/leads-scraper/github-email-and-phone-number-scraper) | Emails and phone numbers from GitHub |
| [GitHub Phone Number Scraper](https://apify.com/leads-scraper/github-phone-number-scraper) | Public phone numbers from GitHub |
| [App Store Email Scraper](https://apify.com/leads-scraper/app-store-email-scraper) | Public contact emails from App Store |
| [Atlassian Marketplace Email Scraper](https://apify.com/leads-scraper/atlassian-marketplace-email-scraper) | Public contact emails from Atlassian Marketplace |
| [Bitbucket Email Scraper](https://apify.com/neuro-scraper/bitbucket-email-scraper) | Public contact emails from Bitbucket |
| [Chrome Web Store Email Scraper](https://apify.com/leads-scraper/chrome-web-store-email-scraper) | Public contact emails from Chrome Web Store |
| [CodePen Email Scraper](https://apify.com/neuro-scraper/codepen-email-scraper) | Public contact emails from CodePen |
| [Confluence Email Scraper](https://apify.com/neuro-scraper/confluence-email-scraper) | Public contact emails from Confluence |
| [Dev.to Email Scraper](https://apify.com/neuro-scraper/dev-to-email-scraper) | Public contact emails from DEV Community |
| [Docker Hub Email Scraper](https://apify.com/neuro-scraper/docker-hub-email-scraper) | Public contact emails from Docker Hub |
| [Figma Community Email Scraper](https://apify.com/neuro-scraper/figma-community-email-scraper) | Public contact emails from Figma Community |
| [Firefox Add-ons Email Scraper](https://apify.com/neuro-scraper/firefox-add-ons-email-scraper) | Public contact emails from Firefox Add-ons |
| [GitLab Email Scraper](https://apify.com/neuro-scraper/gitlab-email-scraper) | Public contact emails from GitLab |
| [Google Play Email Scraper](https://apify.com/leads-scraper/google-play-email-scraper) | Public contact emails from Google Play |
| [Hashnode Email Scraper](https://apify.com/neuro-scraper/hashnode-email-scraper) | Public contact emails from Hashnode |
| [HubSpot Marketplace Email Scraper](https://apify.com/leads-scraper/hubspot-marketplace-email-scraper) | Public contact emails from HubSpot Marketplace |
| [Hugging Face Email Scraper](https://apify.com/leads-scraper/hugging-face-email-scraper) | Public contact emails from Hugging Face |
| [Jira Email Scraper](https://apify.com/neuro-scraper/jira-email-scraper) | Public contact emails from Jira |
| [Maven Central Email Scraper](https://apify.com/neuro-scraper/maven-central-email-scraper) | Public contact emails from Maven Central |
| [Microsoft AppSource Email Scraper](https://apify.com/neuro-scraper/microsoft-appsource-email-scraper) | Public contact emails from Microsoft AppSource |
| [Salesforce AppExchange Email Scraper](https://apify.com/leads-scraper/salesforce-appexchange-email-scraper) | Public contact emails from Salesforce AppExchange |
| [Shopify App Store Email Scraper](https://apify.com/leads-scraper/shopify-app-store-email-scraper) | Public contact emails from Shopify App Store |
| [Slack App Directory Email Scraper](https://apify.com/leads-scraper/slack-app-directory-email-scraper) | Public contact emails from Slack App Directory |
| [SourceForge Email Scraper](https://apify.com/leads-scraper/sourceforge-email-scraper) | Public contact emails from SourceForge |
| [Stack Overflow Email Scraper](https://apify.com/leads-scraper/stack-overflow-email-scraper) | Public contact emails from Stack Overflow |
| [Unity Asset Store Email Scraper](https://apify.com/leads-scraper/unity-asset-store-email-scraper) | Public contact emails from Unity Asset Store |
| [Unreal Engine Marketplace Email Scraper](https://apify.com/leads-scraper/unreal-engine-marketplace-email-scraper) | Public contact emails from Unreal Engine Marketplace |
| [WordPress Plugin Directory Email Scraper](https://apify.com/neuro-scraper/wordpress-plugin-directory-email-scraper) | Public contact emails from WordPress Plugin Directory |
| [WordPress Theme Directory Email Scraper](https://apify.com/leads-scraper/wordpress-theme-directory-email-scraper) | Public contact emails from WordPress Theme Directory |
| [Zapier App Directory Email Scraper](https://apify.com/leads-scraper/zapier-app-directory-email-scraper) | Public contact emails from Zapier App Directory |
| [App Store Email and Phone Number Scraper](https://apify.com/leads-scraper/app-store-email-and-phone-number-scraper) | Emails and phone numbers from App Store |
| [Atlassian Marketplace Email and Phone Number Scraper](https://apify.com/neuro-scraper/atlassian-marketplace-email-and-phone-number-scraper) | Emails and phone numbers from Atlassian Marketplace |
| [Bitbucket Email and Phone Number Scraper](https://apify.com/neuro-scraper/bitbucket-email-and-phone-number-scraper) | Emails and phone numbers from Bitbucket |
| [Chrome Web Store Email and Phone Number Scraper](https://apify.com/neuro-scraper/chrome-web-store-email-and-phone-number-scraper) | Emails and phone numbers from Chrome Web Store |
| [CodePen Email and Phone Number Scraper](https://apify.com/neuro-scraper/codepen-email-and-phone-number-scraper) | Emails and phone numbers from CodePen |
| [Confluence Email and Phone Number Scraper](https://apify.com/neuro-scraper/confluence-email-and-phone-number-scraper) | Emails and phone numbers from Confluence |
| [DEV Community Email and Phone Number Scraper](https://apify.com/neuro-scraper/dev-to-email-and-phone-number-scraper) | Emails and phone numbers from DEV Community |
| [Docker Hub Email and Phone Number Scraper](https://apify.com/neuro-scraper/docker-hub-email-and-phone-number-scraper) | Emails and phone numbers from Docker Hub |
| [Figma Community Email and Phone Number Scraper](https://apify.com/neuro-scraper/figma-community-email-and-phone-number-scraper) | Emails and phone numbers from Figma Community |
| [Firefox Add-ons Email and Phone Number Scraper](https://apify.com/neuro-scraper/firefox-add-ons-email-and-phone-number-scraper) | Emails and phone numbers from Firefox Add-ons |
| [GitLab Email and Phone Number Scraper](https://apify.com/neuro-scraper/gitlab-email-and-phone-number-scraper) | Emails and phone numbers from GitLab |
| [Google Play Email and Phone Number Scraper](https://apify.com/leads-scraper/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.

# Actor input Schema

## `keywords` (type: `array`):

Search terms describing the GitHub accounts you want (niche, job title, industry).

## `location` (type: `string`):

Optional location phrase added to every query (e.g. "New York").

## `customDomains` (type: `array`):

Only emails ending with one of these domains are collected. With or without the leading @. Each domain is searched separately, so more domains means more results but a longer run - remove some for a faster, narrower search, or add your own (e.g. @company.com).

## `maxEmails` (type: `integer`):

Stop once this many unique emails have been collected.

## `countryCode` (type: `string`):

Two-letter country code for the search proxy (e.g. US, GB, DE). Empty for any.

## `expandQueries` (type: `boolean`):

Search each keyword x domain pair with several phrasings. Recommended - Google caps a single query at ~300 results.

## `queryModifiers` (type: `array`):

Extra words combined with each keyword when Expand queries is on. Tuned for GitHub.

## `maxPagesPerQuery` (type: `integer`):

Google rarely returns more than ~30 pages for one query.

## `maxConcurrency` (type: `integer`):

How many queries run in parallel.

## Actor input object example

```json
{
  "keywords": [
    "developer",
    "maintainer"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "maxEmails": 20,
  "countryCode": "",
  "expandQueries": true,
  "queryModifiers": [
    "email",
    "contact",
    "maintainer",
    "author",
    "support"
  ],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Records produced by GitHub Email Scraper, stored in the run's default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "developer",
        "maintainer"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com"
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "maintainer",
        "author",
        "support"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leads-scraper/github-email-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": [
        "developer",
        "maintainer",
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com",
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "maintainer",
        "author",
        "support",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("leads-scraper/github-email-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "developer",
    "maintainer"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "maintainer",
    "author",
    "support"
  ]
}' |
apify call leads-scraper/github-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,leads-scraper/github-email-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/C9q1o1d7W2QcCe2dj/builds/iNiZb4k1OmXtEPD6V/openapi.json
