Company Email Pattern Finder: GitHub Commits + MX Check
The format a company actually uses, from its own commits.
Give it company domains and it returns the email format each company uses, measured from the commit authors in its public GitHub organization, with a confidence score, the alternatives, MX records and the mail provider. Every row also carries the organization's profile, tech stack and recent activity.
oswaldocarabano/company-email-pattern-finder
{
"domains": ["vercel.com", "mercadolibre.com", "jetbrains.com"],
"maxReposPerOrg": 5,
"commitsPerRepo": 300,
"includeSamples": false,
"includePersonalEmails": false
}- Version
- v0.1.4
- Memory
- 512 MB
- Browser
- none
- Proxy
- None; GitHub API and git protocol
Short answer
The Company Email Pattern Finder Actor works out a company's email format — `first.last@`, `flast@`, `first@` and the less common shapes — by matching the corporate addresses in its public GitHub commits against the commit authors' names. Measured on 46 company domains chosen before measuring (148,821 commits), it found the GitHub organization for 44 (95.7%) and measured a pattern from real commits for 38 of those 44 (86.4%); 22 of 44 reached a confidence of 0.75 or higher. The Actor checks MX records over DNS and never contacts a mail server, so no individual address is verified. Pricing is $0.03 per domain with a GitHub organization and $0.003 per domain without one.
Key points
- The Company Email Pattern Finder found a GitHub organization for 44 of 46 company domains chosen before measuring (95.7%), on 1 October 2026.
- A pattern was measured from real commits for 38 of those 44 companies (86.4%), and 22 of 44 reached a confidence of 0.75 or higher.
- `first.last` won for 22 of the 38 measured companies, `first` for 7 and `flast` for 6, so a blind `first.last` guess is wrong for roughly two companies in five.
- Only 29.2% of the 8,265 distinct addresses seen in company repositories were on the company's own domain; GitHub noreply, personal and other-company addresses are never used as evidence.
- By default a row contains only company-level data; individual addresses appear only when the user enables `includeSamples` or `includePersonalEmails`.
- The Company Email Pattern Finder never connects to a mail server: it reads public commits and DNS MX records, and `catchAll` is always null.
What it does
Give it company domains and it returns the email format each company uses, measured from the commit authors in its public GitHub organization, with a confidence score, the alternatives, MX records and the mail provider. Every row also carries the organization's profile, tech stack and recent activity.
{
"domain": "vercel.com",
"githubOrg": "vercel",
"orgName": "Vercel",
"orgIsVerified": true,
"publicRepos": 239,
"publicMembers": 72,
"orgMatchConfidence": "confirmed",
"pattern": "first.last",
"patternConfidence": 0.77,
"patternConfidenceLevel": "high",
"patternInferred": false,
"patternExample": "jane.doe@vercel.com",
"alternatives": [
{ "pattern": "first", "confidence": 0.09, "matches": 2 },
{ "pattern": "last", "confidence": 0.03, "matches": 1 }
],
"evidenceCount": 20,
"mxValid": true,
"emailProvider": "Google Workspace",
"catchAll": null,
"commitSource": "git",
"commitsScanned": 1282,
"uniqueEmailsSeen": 110,
"corporateEmailsFound": 20,
"noreplyEmails": 32,
"personalEmailsSeen": 34,
"activeCommitters90d": 50,
"notes": []
}Why this one
Evidence instead of a lookup table
A typical email-format lookup returns the most common format for a domain from a database of collected addresses. The Company Email Pattern Finder derives the format from the company's own engineers' commits, counts the matches, and publishes the alternatives with their confidence, so a 0.77 `first.last` with a 0.09 `first` behind it reads differently from a 0.10 guess.
No SMTP, by design
Per-address verification means opening a connection to the mail server and asking whether a recipient exists. That gets sending IPs blocklisted and is easy to abuse, so the Actor stops at the MX lookup. Pair it with a verifier if per-address validation is needed.
Company data by default
The default row holds the pattern, its confidence, counts, MX and the public organization profile, and no individual's address. The corporate addresses behind the pattern are released only with `includeSamples`, and personal-domain addresses only with `includePersonalEmails`, both off by default.
One IP, one quota
Without a token GitHub allows 60 API requests an hour, enough for about 15 domains. The Actor does not rotate IPs to multiply that quota and never shares a token: when the limit is reached the run ends, lists the domains it did not process and does not charge them.
Use cases
- Learn whether a company writes `jane.doe@` or `jdoe@` before constructing any address by hand.
- Enrich a list of company domains with mail provider, tech stack and engineering activity.
- Find developer-tool prospects that are active on GitHub, with their languages and how many people commit.
- Check which domains have no MX records and cannot receive email, without sending a message.
Input
Every field has a default, and the defaults are deliberately small so a first run is cheap enough to inspect before you commit to a sweep. This table mirrors the Actor's own input schema field for field.
| Field | Default | What it does |
|---|---|---|
domainsstring[] | ["nubank.com.br"] | Company domainsA domain, a website URL or any email of the company. Personal email domains are skipped. |
githubOrgsstring[] | [] | GitHub organizationsA login such as `stripe` or an organization URL, when the organization is already known. |
knownPeoplestring[] | [] | People to build emails forpersonal data`Jane Doe` applies to every domain; `Jane Doe, stripe.com` to one. Each row gets their most likely address with the pattern's confidence. |
githubTokenstring | null | GitHub tokenRaises the API limit from 60 to 5,000 requests an hour. A fine-grained token with no permissions is enough. Never logged. |
commitSourcestring | git | Where to read commits`git` fetches commit metadata only, about 300 commits per repository in a second, without API quota. `api` reads 100 commits per request from the API quota. |
maxReposPerOrginteger | 5 | Repositories per organizationMost recently updated repositories, 1 to 30. Measured on 44 companies: 1 repository found a pattern for 32, 3 for 36, 5 for 36. |
commitsPerRepointeger | 300 | Commits per repositoryLatest commits read per repository, 50 to 3,000: authors, committers and co-authors. |
includeForksboolean | false | Include forked repositoriesOff by default: forks mostly hold the original project's commits. |
checkMxboolean | true | Check MX recordsDNS lookup of the domain's mail servers and provider. No email is sent and no mail server is contacted. |
includeSamplesboolean | false | Include evidence emailspersonal dataAdds the corporate addresses behind the pattern, with name, repository and date. Turn on only with a lawful basis to process them. |
evidenceLimitinteger | 25 | Maximum evidence emails per domain1 to 200. All addresses are still counted. |
includePersonalEmailsboolean | false | Include personal-domain emailspersonal dataLists gmail.com, outlook.com and similar addresses of committers. Never used as evidence; these are private individuals' addresses. |
maxConcurrencyinteger | 3 | Domains in parallel1 to 8. The GitHub API limit usually decides the speed, not this number. |
Output and fill rates
A field being in the schema is not the same as it having a value. The percentages below were counted on real runs; the sample sizes are in Measurements. Anything not listed here is not promised.
| Field | Filled | Meaning |
|---|---|---|
githubOrgstring | 95.7% | With `orgMatchConfidence` and `orgMatchReasons`. Found for 44 of 46 domains; confirmed by own-domain commits for 38. |
patternstring | not measured | With `patternConfidence`, `patternConfidenceLevel`, `patternInferred` and `patternExample`. Measured from commits for 38 of 44 domains with an organization; otherwise a provider guess marked inferred. |
alternativesobject[] | not measured | Competing patterns with their confidence and match count. `patternTie` flags ties. |
evidenceCountinteger | not measured | Corporate addresses that match a pattern by name. |
mxValidboolean | 97.7% | With `mxHosts` and `emailProvider`. MX found for 43 of 44 domains. |
catchAllnull | not measured | Always null: it cannot be known without SMTP, and the Actor never uses SMTP. |
techStackobject[] | not measured | Languages by repository count and share, with bytes of code when a token is given. With `topTopics` and `topRepos`. |
activeCommitters90dinteger | not measured | With `lastCommitAt`, `commitsScanned` and `reposScanned`. |
uniqueEmailsSeeninteger | not measured | With `corporateEmailsFound`, `noreplyEmails`, `personalEmailsSeen` and `otherDomainEmails`: counts, not addresses. |
candidatesobject[] | not measured | The most likely address for each person in `knownPeople`, with the pattern's confidence. Empty unless names are given. |
evidenceobject[] | not measured | Corporate addresses behind the pattern, with name, repository and date. Only with `includeSamples`. |
Every key is always present. A field that exists but is empty comes back as explicit null, so a parser never has to guess.
Datasets
Different record types go to different datasets, so the main table never carries columns that are blank on most rows.
defaultOne row per company domain, 80 fields, every field present in every row and null when there is no value.billedError rowsInputs that cannot be processed, such as personal email domains or typos, and domains left unprocessed when the GitHub quota ran out.never billed
Pricing
Pay per delivered result. Charges are applied as each row is produced rather than in a lump at the end, so an aborted run bills only for what it actually gave you.
| Event | Price | Notes |
|---|---|---|
apify-actor-startActor start | $0.00001 | Charged per gigabyte of run memory, minimum one event. Effectively free. |
domainCompany domain | $0.03 | One domain with its GitHub organization found: pattern with confidence and alternatives, MX and provider, organization profile, tech stack and activity. |
domain-no-githubDomain without GitHub | $0.003 | One domain with no public GitHub organization: MX, provider and the provider's most common pattern, marked as a guess. |
Measurements
Each figure is shown with the method that produced it. A benchmark without a method is a marketing claim wearing a number's clothes.
Sample
46 domains, 148,821 commits, 8,265 addresses
US, EU and Latin American tech companies chosen before measuring, 5 repositories × 300 commits each, 1 October 2026, as reported in the Actor's README.
Organization found
44 of 46 domains (95.7%)
Confirmed by commits from the company's own domain for 38 of the 44.
Pattern measured from commits
38 of 44 companies (86.4%)
Confidence 0.75 or higher for 22 of 44 (50%), 0.5 or higher for 28 of 44 (63.6%).
Winning patterns
first.last 22, first 7, flast 6
Of the 38 measured; `firstlast`, `firstl` and `first-last` won once each.
Addresses in company repositories
29.2% company domain
Of 8,265 distinct addresses: 25.1% GitHub noreply, 23.1% personal, 18.5% other companies. Only company-domain addresses count as evidence.
Latin American subset
5 of 8 measured, 3 high confidence
Same sample and date. Eight companies is too few for a rate, so counts are published instead.
Repositories needed
1 repo: 32; 3 repos: 36; 5 repos: 36
Companies with a measured pattern out of 44, by repositories read. Median matching emails 3, 15 and 30.
Mail providers
Google Workspace 34 of 44
From MX records. Proofpoint 5; Microsoft 365, Mimecast and others 1 to 2 each. MX found for 43 of 44.
What it will not do
Stated plainly so you can judge fit before spending anything.
- Only companies with a public GitHub organization and commits from their own domain get a measured pattern; the rest get the most common pattern for their mail provider, marked as a guess with confidence 0.10.
- Without a GitHub token, GitHub allows 60 API requests an hour, about 15 domains per run. With a token, about 500 domains an hour.
- No address is verified. `catchAll` is always null because whether a server accepts every recipient cannot be known without SMTP.
- The organization match can be wrong for generic names. Each row reports `orgMatchConfidence` and `orgMatchReasons`; `confirmed` means the organization's commits contain addresses on the requested domain, which held for 38 of 44.
- Latin American companies measured weaker: of 8, a pattern was measured for 5 and reached high confidence for 3.
- Forked repositories are skipped by default, because their commits mostly belong to the original project's authors.
Privacy
- A corporate email address tied to a name is personal data in the EU, and a pattern applied to a named person produces one.
- By default the row is company-level data only: pattern, confidence, counts, MX and the public organization profile, with no individual's address.
- Corporate addresses behind the pattern appear only with `includeSamples`, and personal-domain addresses only with `includePersonalEmails`; the input asks the user to enable them only with a lawful basis.
- GitHub's Acceptable Use Policies forbid using its information for spamming, including sending unsolicited emails to users or selling personal information to recruiters, headhunters and job boards.
- The GitHub token, when given, is never logged or written to the output.
- Removal requests: privacy@actorstack.dev
See also the data removal process.