Refolk
StandardProcess, data, and compliance

The Lawful-Use Standard for Repository-Sourced Contact Data

You can grade any repository-sourced contact record as usable, restricted, or must-discard, cite the rule behind the verdict, and have a second reviewer reach the same grade.

16 min readLast reviewed August 12, 2026Read as Markdown

Key takeaways

  • GitHub's Acceptable Use Policy bans using Service information, whether scraped, collected through the API, or obtained otherwise, for selling personal information to recruiters, headhunters, and job boards.
  • Public visibility does not create a lawful basis; without a dated Legitimate Interests Assessment on file before processing begins, the legal basis does not exist and the record grades must-discard.
  • Any commit-author address ending in users.noreply.github.com is a non-contactable placeholder, not a mailbox, and must be rejected before grading.
  • The API is not a compliance loophole: the AUP applies the same restriction to API-collected data, so intended use is the load-bearing variable, not access path.
  • A removal request must be actioned within one month, extendable by two, and an acknowledgement without confirmed deletion is non-compliant.
  • In Refolk's index there are 91 Rust-skilled engineers in Germany against 607 in the US, a 6.7x gap that pushes cross-border sourcing into GitHub's global terms and EU GDPR at once.

This standard resolves one question, record by record: is a name, email, or handle I pulled from a public repository lawful to store and use for outreach? It is written for recruiting and revenue operations and anyone answerable for how the data was gathered. It turns scattered platform terms and data-protection rules into a pass/fail grade, so two reviewers looking at the same record reach the same verdict with the same cited rule.

The generic lawful-sourcing standard covers candidate data broadly. Repository data has its own traps: platform terms that name recruiter outreach outright, commit-metadata quirks like noreply placeholders, and the wide gap between "publicly visible" and "lawful to contact." This document names each trap and tells you exactly which rule decides the grade.

What the standard grades and where it applies

This standard grades a single repository-derived contact record: one person, one identifier (name, email, or handle), captured from a public repository or its metadata. It applies the moment you hold a real identifier and intend to store or contact.

The grade is one of three values, and every record lands in exactly one.

GradeMeaningTrigger
UsableStore and contactReal mailbox, AUP-fit use, dated LIA on file, transparent template
RestrictedHold, do not contact yetMissing LIA, unclear use, or a privacy signal to review
Must-discardDelete nowNoreply placeholder, banned use, or no lawful basis

Two rules sit above everything else and decide most cases before you look at anything subtle. First, GitHub's Acceptable Use Policy (AUP) bans using Service information for selling personal information to recruiters, headhunters, and job boards, and applies that ban whether the data was scraped, collected through the API, or obtained otherwise. Second, public visibility alone does not create a lawful basis under GDPR; you need a documented Legitimate Interests Assessment (LIA) on file before you process. A record fails the standard if it trips either rule, no matter how clean it looks otherwise.

Why platform terms decide this before GDPR does

Start with the platform terms, because they can rule out a use that GDPR might otherwise permit. GitHub's Acceptable Use Policy names recruiter, headhunter, and job-board use as a prohibited purpose in plain text, and the legacy Corporate Terms of Service repeats the same ban.

The exact AUP language matters, so hold it precisely. You may not use information from the Service, whether scraped, collected through the API, or obtained otherwise, for spamming purposes, including for the purposes of sending unsolicited emails to users or selling personal information, such as to recruiters, headhunters, and job boards. The policy adds a positive obligation: if you collect any personal information from the Service, you will only use it for the purpose the user authorized, will reasonably secure it, and will respond promptly to complaints, removal requests, and "do not contact" requests.

Two consequences fall out. The banned act that the terms name outright is selling or sharing the list to recruiters, headhunters, or job boards. If the data leaves your controller boundary to any of those, that is the one use the terms prohibit by name, and the record cannot be usable. Sending your own unsolicited outreach off scraped commit emails also runs into the spamming clause. This is why "github terms of service recruiting outreach" is not a settled green light; the terms were written with this exact activity in mind.

The terms were written with recruiter outreach in mind, so intended use is the load-bearing variable, not access path.

The API is not a safe harbour

A common misread: an official token or the REST API somehow launders the record. It does not. The AUP applies the recruiter, headhunter, and job-board ban to data obtained by any method, and it lists the API explicitly alongside scraping. So "github commit email scraping legal" and "collected it through the API instead" land in the same place for personal-information use.

The paths differ only in rate limits, which is an operational constraint, not a permission.

MethodPrimary limit per hour
Unauthenticated60
Authenticated user or PAT5,000
GHEC org app15,000

Column source: GitHub REST API rate-limit documentation. Read this table as capacity, not as a compliance signal. Authenticating raises your ceiling from 60 to 5,000 requests per hour; it does nothing to the AUP restriction on what you may then do with a person's data.

Reading commit-email metadata correctly

Every Git commit identifies its author by an email address, but not every address is a mailbox. The single most common false positive in this work is treating a GitHub noreply placeholder as a contactable email, so classify the email form before anything else.

There are three forms you will meet in git log:

  • A real address, a genuine mailbox the author committed with.
  • The classic noreply placeholder, of the form username@users.noreply.github.com, which a user picks when worried about spam for browser-based operations.
  • The ID-prefixed noreply variant, which accounts created after July 18, 2017 receive, reported to look like 123456+username@users.noreply.github.com.

The rule is mechanical: inspect the author and committer email in git log, and reject any address ending in users.noreply.github.com. It is a non-contactable placeholder, not a mailbox. This is a check two reviewers will always agree on, which is exactly why it belongs at the front of the pipeline.

Email classification path

  1. Read git log
    Pull the author and committer email from commit metadata
  2. Test the suffix
    Does the address end in users.noreply.github.com
  3. Placeholder branch
    If yes, flag non-contactable and grade must-discard
  4. Real-mailbox branch
    If no, carry a real-email flag into the lawful-basis checks
Every record passes this gate before it can be graded usable.

One quirk defeats a naive privacy assumption. GitHub's private email setting only affects new commits. If a user later goes private, any real address already in the historical log stays exposed. That does not make the old address safe to use; it makes the capture date load-bearing. Check the capture date against the user's current settings before relying on a historical address, and treat a real email on a now-private account as restricted, not automatically usable. A privacy signal makes the balancing test in your LIA harder, not easier.

Why "publicly visible" is not "lawful to contact"

Public visibility does not create a lawful basis. To rely on legitimate interests under Article 6(1)(f), a controller must first document a Legitimate Interests Assessment, and without a completed LIA on record before processing begins, the legal basis does not exist. This is the rule most repository-sourcing runs get wrong, and it is the answer to "gdpr git commit personal data" and "email github contributors legal basis."

The LIA is a three-part test:

  1. Purpose test. Are you pursuing a legitimate interest?
  2. Necessity test. Is your specific use necessary for that purpose?
  3. Balancing test. Do the person's interests override your legitimate interest?

Their interests are likely to override yours if they would not reasonably expect you to use the information in that way, or if your use would cause unjustified harm. A developer publishing code so others can build on it did not publish so a recruiter could email them; that expectation gap is what the balancing test exists to catch.

Transparency is a separate, mandatory obligation. Businesses must state how the recipient's data was obtained. So even a record with a clean LIA still needs outreach that names the source. The LIA makes the processing lawful; the transparency line makes the contact lawful.

EUR 20M
GDPR maximum fine, or 4% of global turnover
The ceiling that makes provenance discipline a business risk, not a formality.

Note two moving parts to re-check rather than memorise. The EDPB tightened legitimate-interest criteria in its Guidelines 1/2024, so re-read the current ICO legitimate interests guidance before you finalise a template LIA. And an erasure audit across 764 controllers in 32 states rated compliance only "average," with 9 data protection authorities opening investigations; the recurring failure was missing internal procedure, not deletion mechanics. That is precisely the source-URL and LIA-reference discipline this standard enforces.

Where thin talent pools raise the temptation to over-collect, Refolk lets you ask for the specific people you need in plain English rather than commit-mining every repository by hand, which keeps you away from the aggressive collection that draws complaints. Rust talent is scarce, and scarcity is exactly where a single ignored "do not contact" is most visible.

The record fields two reviewers both need

No authority publishes a canonical field list, so this is a synthesis driven by GDPR accountability: maintain records of your data sources, your legitimate interest assessments, and systems to honor opt-outs and deletion. The six fields below are the minimum for two reviewers to grade a record identically.

FieldWhat it recordsWhat its absence means
Source URLImmutable pointer to where you captured itCannot verify provenance; grade restricted
Capture dateWhen you pulled itCannot check against privacy-setting changes
Email-type flagReal mailbox versus noreply placeholderCannot rule out a non-contactable address
Repository licenceLicence on the source repoMissing context for the balancing test
LIA referencePointer to the dated assessmentNo lawful basis; grade must-discard
DSAR statusOpen, closed, or noneCannot prove removal loop is honored

Pair these with a data subject request log that tracks the request date, identity verification steps, systems modified, and the final response. Provenance is where audits fail, not deletion mechanics, so the fields above are the spine of the whole standard. A record missing its LIA reference or a real-email flag cannot be graded usable, and that is a rule, not a judgement call.

Repository contact record schema
source_url:            https://github.com/<org>/<repo>/commit/<sha>
capture_date:          2024-06-01
email:                 jane@example.com
email_type:            real            # real | noreply
repo_licence:          MIT
lia_reference:         LIA-2024-014     # dated assessment on file
lia_date:              2024-05-20       # must precede first_contact_date
intended_use:          own_outreach     # own_outreach | internal_pipeline | (never: sell/share)
first_contact_date:    (blank until sent)
dsar_status:           none             # none | open | closed
grade:                 usable           # usable | restricted | must-discard
rule_cited:            AUP-fit + LIA-2024-014 dated before contact

One row per person. Fill every field before grading; a blank in a required field forces a restricted or must-discard grade.

The grading procedure

Run every record through these seven steps in order. The procedure is designed so the mechanical checks (steps 1, 2, 6) catch most rejects cheaply before the expensive human judgement (step 4) is spent.

Grade a repository-sourced contact record

  1. Capture with provenance
    Pull the record via API or web and record the source URL and capture date on the record. Done when every record carries an immutable source pointer.
  2. Classify the email
    Flag any address ending in users.noreply.github.com as a non-contactable placeholder; only a real mailbox proceeds. Done when each record carries a real-versus-placeholder flag.
  3. Check platform-terms fit
    Confirm the intended use is not selling personal information to recruiters, headhunters, or job boards, and complies with the Privacy Statement. Done when the intended use is written down and matched against the AUP clause.
  4. Run and record the LIA
    Complete the purpose, necessity, and balancing tests before contacting anyone. Done when a dated LIA exists on file with a date that precedes first contact.
  5. Draft transparent outreach
    Write a template stating your identity, purpose, how the data was obtained, and an opt-out. Done when the template names the source.
  6. Grade the record
    Assign usable, restricted, or must-discard and cite the exact rule. Done when two reviewers independently reach the same grade.
  7. Handle removal and retention
    Log intake, verify identity, delete, and confirm within one month. Done when the DSAR log shows a dated closed loop.

On the last step, the sources disagree on one detail worth deciding as policy. The one-month erasure window is extendable by two months for complex or numerous requests, provided you notify the person. Whether the clock pauses during identity verification is contested: one reading runs it from the date of receipt, while ICO-aligned guidance lets the time limit begin when you obtain any additional information you need, such as identity verification. Pick one interpretation, write it into your policy so both reviewers apply it the same way, and log a dated closed loop either way. Recruiting retention is commonly cited at 6 to 12 months absent documented grounds to keep longer.

How this goes wrong

Most bad grades come from a small set of repeatable mistakes. Each has a false positive, meaning the record looks fine, and a mechanical check that catches it. Treat this table as the reviewer's fault list.

Failure modeWhat it looks likeThe check
Noreply treated as contactable123456+jane@users.noreply.github.com looks like a mailboxReject any address ending in users.noreply.github.com
Visible equals lawfulA real email in git log assumed fair gameIs there a dated LIA on file? If not, must-discard
API as loophole"We used the official token"Check intended use, not collection method
Backdated LIAAssessment dated after outreach beganLIA date must precede first-contact date
Selling or sharingList handed to a third partyDoes data leave your controller boundary?
Ignored do-not-contactAcknowledged but not deletedDSAR log must show a closed loop within one month
Stale private emailReal email captured before user went privateCheck capture date against current settings

Two of these deserve extra weight because they are the ones a rushed reviewer waves through.

A backdated LIA is legally worthless. Without a completed LIA on record before processing begins, the legal basis does not exist, so the assessment's date must predate the first-contact date in the record. This is a mechanical comparison two reviewers can perform in seconds, and it should be a hard stop.

An acknowledgement is not a deletion. When someone asks to be removed, replying "noted" does not close the loop. The AUP requires prompt response to removal and "do not contact" requests, and GDPR requires action without undue delay. The DSAR log has to show a dated, confirmed deletion, not a promise.

Why cross-border sourcing multiplies the exposure

EU-based teams reaching into larger overseas talent pools fall under GitHub's global terms and under GDPR at once, so the same record can trip both gates. The supply numbers show why the pull toward cross-border sourcing is strong.

CountryRust engineersTop employers
United States607Google, Oxide Computer, Meta
Germany91Helsing, Wolt, Siemens
US-to-Germany ratio6.7x-

Counts and employers are from Refolk's index; the ratio is derived. US Rust supply is 6.7 times Germany's, so an EU team short on local Rust talent will reach into the US pool. That does not shed either obligation. GitHub's AUP is global, so it applies to every record regardless of the subject's location. GDPR applies whenever the data subject is in the EU, and it can apply to EU controllers processing non-EU data. The record you pull from a US contributor and the record you pull from a Berlin contributor face the same AUP gate; only the second adds the full GDPR overlay, but your safest policy is to run both gates on every record so reviewers never have to decide jurisdiction mid-grade.

6.7x
US Rust engineer supply versus Germany in Refolk's index
The gap that drives EU teams into overseas pools while keeping both sets of rules in force.

Verify before you call it done

Run this checklist against a batch before you sign it off. Every item is a checkable statement, not a topic, and a "no" on any required item forces a restricted or must-discard grade.

Batch sign-off

  • Every record has an immutable source URL and a capture date.
  • Every real email has been distinguished from users.noreply.github.com placeholders.
  • No record's intended use is selling or sharing to recruiters, headhunters, or job boards.
  • A dated LIA exists on file for the processing activity, dated before any first contact.
  • The outreach template states identity, purpose, how the data was obtained, and an opt-out.
  • Two reviewers independently reached the same grade on a sample of records.
  • The DSAR log shows every removal request closed with a dated, confirmed deletion within one month.
  • Retention is set to 6 to 12 months unless documented grounds justify longer.

Keeping the standard current

Two inputs to this standard move over time, so re-check them on a fixed cadence rather than trusting a snapshot. The GitHub Acceptable Use Policy and Corporate Terms of Service can be revised; re-read the current AUP text before each new sourcing programme and confirm the recruiter, headhunter, and job-board clause still reads as quoted here. The legitimate-interest criteria also shift: the EDPB tightened them in Guidelines 1/2024, so re-read the current ICO legitimate interests guidance and refresh your LIA template when the guidance updates.

Set a recurring review, tie it to the LIA reference field so every record points at the version of the assessment it was graded under, and re-grade any record whose privacy setting or source terms have changed since capture. A standard that overclaims is worse than none; where the sources genuinely disagree, such as whether the erasure clock pauses for identity verification, write your chosen interpretation into policy so both reviewers apply it the same way, and revisit it if authoritative guidance settles the question.

Questions practitioners ask

Is scraping GitHub commit emails legal for recruiting?

The collection method is not the deciding factor. GitHub's Acceptable Use Policy bans using Service information, whether scraped, collected through the API, or obtained otherwise, for selling personal information to recruiters, headhunters, and job boards. Separately, GDPR requires a documented lawful basis before you process a real email. A commit email can be lawful to hold only if your intended use clears the AUP and a dated Legitimate Interests Assessment predates first contact. Absent either, grade the record must-discard.

Does using the GitHub API instead of scraping make the data compliant?

No. The Acceptable Use Policy collapses the distinction explicitly, applying the restriction to data whether scraped, collected through the API, or obtained otherwise. An official token changes your rate limit, not your permission. Unauthenticated requests are capped at 60 per hour and authenticated ones at 5,000, but neither path launders the record. The load-bearing variable is intended use, not access path.

Why can't I contact someone whose email is publicly visible in git log?

Public visibility alone does not create a lawful basis. Under Article 6(1)(f) you must document a Legitimate Interests Assessment covering the purpose, necessity, and balancing tests before processing begins. Their interests override yours if they would not reasonably expect this use or if it would cause unjustified harm. Without a completed LIA on record before you act, the legal basis does not exist regardless of how visible the address was.

What is the noreply email format and how do I spot it?

GitHub offers a private commit address of the form username@users.noreply.github.com. Accounts created after July 18, 2017 get an ID-number-prefixed variant that looks like 123456+username@users.noreply.github.com. Inspect the author and committer email in git log; any address ending in users.noreply.github.com is a placeholder, not a mailbox, and must be flagged non-contactable before grading.

How long do I have to delete data after a removal request?

One month from receipt, extendable by two months for complex or numerous requests provided you notify the person. Sources conflict on whether the clock pauses while you verify identity: one reading runs it from receipt, ICO-aligned guidance lets you wait until you obtain the information you need. Pick one interpretation, write it into your policy, and log a dated closed loop. An acknowledgement without confirmed deletion is non-compliant.

Can I keep an old commit email after the user switched to a private setting?

Be careful. Private email settings only affect new commits; a historical address already in the log stays exposed. That does not make it safe to use. Check the capture date against the user's current settings, and treat a real address on a now-private account as restricted pending review rather than automatically usable. If they have signalled they want privacy, the balancing test in your LIA gets harder, not easier.

Try it on your own search

Stop building boolean strings. Just describe the person.

Type one sentence and I plan the search, read GitHub, public LinkedIn and Crunchbase records, and the open web live, then hand back a ranked shortlist with the reasoning behind every name. No filters to learn, no export to clean up, no sales call to sit through.

  • One sentence in, a ranked shortlist out. No boolean, no filters, no seat to buy.
  • Read live at search time, not from a database that went stale last quarter.
  • Watch every step as it runs, and see why each name made the list.

500 free credits on sign-up. No card, no demo call. See real searches.

Read next