ActorStack.dev
Lead generationDeveloper toolsv0.1.4updated 2 October 2026

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

input.json
{
  "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.
On this page11 sections

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.

output — one row
{
  "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.

FieldDefaultWhat 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.
githubTokenstringnullGitHub tokenRaises the API limit from 60 to 5,000 requests an hour. A fine-grained token with no permissions is enough. Never logged.
commitSourcestringgitWhere 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.
maxReposPerOrginteger5Repositories 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.
commitsPerRepointeger300Commits per repositoryLatest commits read per repository, 50 to 3,000: authors, committers and co-authors.
includeForksbooleanfalseInclude forked repositoriesOff by default: forks mostly hold the original project's commits.
checkMxbooleantrueCheck MX recordsDNS lookup of the domain's mail servers and provider. No email is sent and no mail server is contacted.
includeSamplesbooleanfalseInclude evidence emailspersonal dataAdds the corporate addresses behind the pattern, with name, repository and date. Turn on only with a lawful basis to process them.
evidenceLimitinteger25Maximum evidence emails per domain1 to 200. All addresses are still counted.
includePersonalEmailsbooleanfalseInclude personal-domain emailspersonal dataLists gmail.com, outlook.com and similar addresses of committers. Never used as evidence; these are private individuals' addresses.
maxConcurrencyinteger3Domains 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.

FieldFilledMeaning
githubOrgstring95.7%With `orgMatchConfidence` and `orgMatchReasons`. Found for 44 of 46 domains; confirmed by own-domain commits for 38.
patternstringnot measuredWith `patternConfidence`, `patternConfidenceLevel`, `patternInferred` and `patternExample`. Measured from commits for 38 of 44 domains with an organization; otherwise a provider guess marked inferred.
alternativesobject[]not measuredCompeting patterns with their confidence and match count. `patternTie` flags ties.
evidenceCountintegernot measuredCorporate addresses that match a pattern by name.
mxValidboolean97.7%With `mxHosts` and `emailProvider`. MX found for 43 of 44 domains.
catchAllnullnot measuredAlways null: it cannot be known without SMTP, and the Actor never uses SMTP.
techStackobject[]not measuredLanguages by repository count and share, with bytes of code when a token is given. With `topTopics` and `topRepos`.
activeCommitters90dintegernot measuredWith `lastCommitAt`, `commitsScanned` and `reposScanned`.
uniqueEmailsSeenintegernot measuredWith `corporateEmailsFound`, `noreplyEmails`, `personalEmailsSeen` and `otherDomainEmails`: counts, not addresses.
candidatesobject[]not measuredThe most likely address for each person in `knownPeople`, with the pattern's confidence. Empty unless names are given.
evidenceobject[]not measuredCorporate 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.billed
  • Error 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.

EventPriceNotes
apify-actor-startActor start$0.00001Charged per gigabyte of run memory, minimum one event. Effectively free.
domainCompany domain$0.03One 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.003One 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.

Frequently asked questions

Does the Company Email Pattern Finder verify that an address exists?
No. Verifying an address requires SMTP probing, a RCPT TO conversation with the mail server, which gets IPs blocklisted and is easy to abuse. The Actor returns the pattern, its confidence and the MX records, and `catchAll` is always null.
Why read GitHub commits to find an email format?
Engineers at many tech companies commit with their work address, and each commit pairs that address with the author's name. In the measurement, 29.2% of the 8,265 addresses in company repositories were on the company's own domain, which is enough evidence to name the format for most of them.
What happens when a company has no GitHub organization?
The row reports the MX records, the mail provider and the most common pattern for that provider, marked `patternInferred: true` with confidence 0.10. That row costs $0.003 instead of $0.03.
How many domains can one run handle?
Without a GitHub token, about 15, because GitHub allows 60 unauthenticated API requests an hour. When that limit is reached the run ends successfully, lists the unprocessed domains and does not charge them. With a token, about 500 domains an hour.
Does the output contain personal email addresses?
Not by default. The default row holds the pattern, confidence, counts, MX and the organization profile. Individual corporate addresses appear only with `includeSamples`, and personal-domain addresses only with `includePersonalEmails`, which the input asks you to enable only with a lawful basis.

Guides for this Actor