# EpsteOut: searching court document archives for names in a LinkedIn export

> EpsteOut is a small Python script that takes a LinkedIn connections export and checks each name against a public index of Epstein court documents, producing an HTML report of matches with excerpts. It is a convenience wrapper over a name search, and the limits of that search are the limits of the tool.

**cfinke/EpsteOut** — See which of your LinkedIn connections appear in the Epstein files.

- Repository: https://github.com/cfinke/EpsteOut
- Stars: 638 · Forks: 42
- Language: Python
- License: MIT
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/cfinke-epsteout

## A name lookup, not an investigation

EpsteOut searches the publicly released Epstein court documents for mentions of your LinkedIn connections. The README states the project is not authorized, endorsed, or otherwise affiliated with LinkedIn Corporation, which is the correct disclaimer given that the input is a LinkedIn export and the search is not run through any LinkedIn interface.

The repository is small and readable in one sitting. At the top level there is a single script named EpsteOut.py, a requirements.txt, a README, a LICENSE, and an assets directory holding the logo and a screenshot of the report. There is no package structure, no test suite and no configuration system. The whole thing is one Python file and a dependency list.

The requirements are Python 3.6 or newer and the requests library, and the requirements file pins requests at 2.28.0 or newer. The licence is MIT, with a LICENSE file at the repository root, and the last push was on 2026-10-17 with the repository not archived.

The audience is narrow: someone who wants to run a name search over a public document index against a list of names they already hold. It is a convenience tool, not an analysis platform, and understanding it starts with accepting that the only thing it does is match names.

That framing matters for how you should read its output, and it is worth saying plainly at the start: a match is a string match on a full name, in a large pile of documents, and nothing more.

## Setup is a clone, a virtual environment and a requirements file

The setup steps are given in full, which is a sign the author expected people to actually run this:

```bash
git clone git@github.com:cfinke/EpsteOut.git
cd EpsteOut/
python3 -m venv project_venv
source project_venv/bin/activate
pip install -r requirements.txt
```

The clone uses the SSH form of the GitHub URL, so a key has to be set up, and the virtual environment is created in the project directory under the name project_venv. Activating it and installing the requirements is all that stands between a clone and a working script, since the dependency list is a single line.

There is one more thing to arrange before the script will work, and it is not in the setup section. The API that EpsteOut connects to has recently required an API key to access it, and the README says keys are available for free at a registration page on the epstein.dugganusa.com domain. The index of documents is provided by DugganUSA.com, according to the notes section.

So there are two separate services in play: the document index that supplies the searchable corpus, and your own key for querying it. A free key registered per user is a sensible arrangement for an API that is being used for something as spiky as this, and it also means the provider can see who is querying and how often, which is a fact worth knowing if the queries themselves are sensitive.

The tool sends the names from your export to that service. That is inherent to how it works, and it is the single most important thing to understand before running it, because a LinkedIn connections export is a list of the people in your professional network.

## Getting the connections file out of LinkedIn yourself

The input is a LinkedIn data export, and the README documents the whole path through LinkedIn's own settings in ten steps.

You log in to linkedin.com, click your profile icon in the top right, select Settings and Privacy, and click Data privacy in the left sidebar. Under the section on how LinkedIn uses your data, you click Get a copy of your data. Then you select Connections, or use the option for something in particular and check Connections; if Connections is not listed, the README says to choose the Download larger data archive option instead. You click Request archive, wait for LinkedIn's email, which the README says may take up to 24 hours, then download and extract the ZIP file and locate the Connections.csv file inside it.

The path through the settings menu is the kind of thing that changes, and the fallback to the larger archive is a useful detail for when the specific Connections option is not offered. The wait of up to 24 hours is the practical constraint on using this tool, since it cannot be run the same afternoon you decide to use it.

The CSV is read by the script and each name is queried. The README's notes are explicit about the matching behaviour, and this is the part that determines whether the results mean anything. The search uses exact phrase matching on full names, so John Smith will not match documents that contain only John or only Smith separately. Common names may produce false positives, and the README says to review the context excerpts to verify relevance.

Read together, those two notes define the tool's boundary. A person whose full name appears in the corpus is found. A person referred to by first name, or by a middle name, or by a nickname, or by a name in a language other than the one on the LinkedIn profile, is not found. The result is a list of names present in the corpus, not a list of people present in the corpus.

## Running the script and what lands in the HTML report

The usage is one command with a path to the export:

```bash
python EpsteOut.py --connections /path/to/Connections.csv
```

The options table lists two flags. The connections flag, with the short form c, is the path to the LinkedIn Connections.csv export and it is required. The output flag, short form o, is the output HTML file path, defaulting to EpsteOut.html. The README also shows a basic invocation with a path in the Downloads folder, and one with a custom output file name:

```bash
python EpsteOut.py --connections ~/Downloads/Connections.csv --output my_report.html
```

The result is an HTML report you can open in any web browser. The README describes what is in it. There is a summary giving the total number of contacts searched and how many had mentions. Then there are contact cards, one per contact with mentions, each showing the name, position and company, the total number of mentions across all documents, excerpts from each matching document, and links to the source PDFs on justice.gov. Contacts are sorted by number of mentions with the highest first.

The excerpts are the part that matters. A card is a claim that a name matched, and the excerpts are the evidence you use to judge it. A name that appears in a list of parties, a shipping manifest, a flight log and a phone book produces a large number of mentions and a card full of context that may have nothing to do with the person you know.

The output being a local HTML file also means the report does not need a server to be useful, and it is something you can read, keep, or delete without involving anyone else's infrastructure.

## Where EpsteOut is the wrong tool

The first wrong-tool case is anything requiring context. The search is exact phrase matching on full names, so a person who appears in the documents under a shortened name, a middle name, a variant spelling, or a maiden name will not be found, and the absence of a match proves nothing.

The second is drawing a conclusion from a match. A common name in a large document corpus will match. The README says so, and the report's design, showing excerpts rather than verdicts, is the right response to that. A tool that output a judgement would be a liability, and this one deliberately does not.

The third is a professional investigation. The script has no source filtering, no document type filtering, no date handling, no entity resolution and no way to merge two people who share a name. It also has no test suite, no error handling described and no logging beyond the report. It is a script for a personal question, not a tool for a due diligence process or a journalistic one.

The fourth is anyone without a LinkedIn account export to hand. The input is not optional and there is no alternative source of names, so the script is unusable for a question about a list of people from another source.

The fifth is a rate limit or an outage at the provider. The search depends on an external API that has recently changed its access model to require a key, and a tool that depends on a service whose access rules can shift without notice inherits that fragility. Nothing in the README describes retry behaviour, caching or what happens when a query fails partway through, so a run over a large contact list may leave a partial report with no clear marker of that.

The last point is about the data itself. The README is direct that the project is not affiliated with LinkedIn, and it is worth extending that caution: using a bulk export of your professional contacts to query a third-party service sends that list to someone else's infrastructure. That is a decision about your own network, and no code in this repository makes it for you.

## Licence, maintenance and what the repository does not cover

The licence is MIT, with the licence file at the repository root. That is a permissive grant with no requirement on downstream users beyond keeping the notice, and for a script of this size it means you can read it, adapt it, and run a modified copy without conditions.

The maintenance picture is thin but current. The last push was on 2026-10-17, the repository is not archived, and the primary language is Python. There are no GitHub releases, so version tracking is through the commit history alone, and the script has no version marker visible in the README.

The single dependency is requests, pinned at 2.28.0 or newer in requirements.txt, which keeps the supply chain surface to one package. The repository also has an assets directory with a logo and a report screenshot, and a.gitignore is not listed among the top level entries, so whether the virtual environment directory ends up committed is not something the repository answers.

What the README does not document is worth listing. There is no section on how the document index is built or how fresh it is, beyond naming DugganUSA.com as the indexer, so the reader has no way to judge coverage. There is no description of the API's rate limits, of what a key grants, or of whether the key is per-user or per-machine. There is no mention of caching, which matters because a run over a few hundred contacts produces a lot of lookups. And there is no section on handling a failure partway through a run, which is the most likely thing to go wrong with a script that queries an external service for every contact.

None of that makes the tool wrong for its purpose. It makes it a script whose behaviour you learn by running it, rather than one whose behaviour you can read off a specification.

## Conclusion

EpsteOut fits a person who already has a LinkedIn data export and wants a quick check of one name against one public document index, without writing a script. It is the wrong tool for anything requiring context, for name variants or partial matches, and for establishing that a person in a document is the person in your contacts list. Before running it, read the notes on exact phrase matching and false positives, get your own API key from the provider instead of sharing one, and treat the report as a list of names to check rather than a finding about anyone.

## FAQ

### What does EpsteOut do with my LinkedIn connections?

It reads the names from a Connections.csv export and searches a public index of Epstein court documents for exact phrase matches on full names, writing an HTML report of matches with excerpts.

### How do I install EpsteOut?

Clone the repository, create and activate a virtual environment, and install the requirements with pip install -r requirements.txt, using Python 3.6 or newer and the requests library.

### Does EpsteOut need an API key?

Yes, the README states the API it connects to has recently required an API key and that keys are available for free at a registration page on the epstein.dugganusa.com domain.

### What are the limits of the EpsteOut search?

The search uses exact phrase matching on full names, so a first name alone will not match, and common names may produce false positives, so the README advises reviewing the context excerpts.

## Sources

- [cfinke/EpsteOut on GitHub](https://github.com/cfinke/EpsteOut)
- [Issues](https://github.com/cfinke/EpsteOut/issues)
- [License: MIT](https://github.com/cfinke/EpsteOut/blob/main/LICENSE)
- [README](https://github.com/cfinke/EpsteOut/blob/main/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/cfinke-epsteout
