Skip to main content

Unofficial Python client for the Epstein Exposed public API

Project description

epsteinexposed

Credits: Erwin Lejeune — 2026-02-22

CI Codacy Badge codecov PyPI PyPI - Downloads Python PyPI - Format License: MIT Docs

Unofficial Python client for the Epstein Exposed public API.

Search persons, documents, flight logs, and emails from the Epstein case files — programmatically, with both sync and async interfaces.

Disclaimer: Inclusion in the Epstein Exposed database does not imply guilt or wrongdoing. All data is derived from publicly released government records, court filings, and verified reporting. Attribution to epsteinexposed.com is requested.

Installation

pip install epsteinexposed

Quick Start

Synchronous

from epsteinexposed import EpsteinExposed

with EpsteinExposed() as client:
    # Search persons
    persons = client.search_persons(q="clinton", category="politician")
    for p in persons.data:
        print(f"{p.name}{p.stats.flights} flights, {p.stats.documents} docs")

    # Get person detail
    detail = client.get_person("bill-clinton")
    print(detail.bio, detail.aliases)

    # Search documents
    docs = client.search_documents(q="little st james", source="court-filing")
    for d in docs.data:
        print(d.title, d.source_url)

    # Search flights
    flights = client.search_flights(passenger="trump", year=1997)
    for f in flights.data:
        print(f"{f.date}: {f.origin}{f.destination}")

    # Cross-type search
    results = client.search(q="wexner trust", type="documents")
    print(len(results.documents.results), "document hits")

Asynchronous

import asyncio
from epsteinexposed import AsyncEpsteinExposed

async def main():
    async with AsyncEpsteinExposed() as client:
        persons = await client.search_persons(q="maxwell")
        for p in persons.data:
            print(p.name)

asyncio.run(main())

Cloudflare & TLS Impersonation

The upstream API is behind Cloudflare bot protection, which blocks standard HTTP clients (httpx, requests) with a 403 challenge page. This library uses curl_cffi to impersonate a Chrome browser's TLS fingerprint, bypassing the challenge transparently.

client = EpsteinExposed(impersonate="chrome")  # default

API Coverage

Endpoint Method Client Method
GET /api/v1/persons Search/filter persons search_persons()
GET /api/v1/persons/:slug Person detail get_person()
GET /api/v1/documents Search documents (FTS5) search_documents()
GET /api/v1/flights Search flight logs search_flights()
GET /api/v1/search Cross-type search search()

Rate Limits

The upstream API enforces per-IP rate limits using a sliding window:

Endpoints Limit
/persons, /persons/:slug, /documents, /flights 60 requests / minute
/search 30 requests / minute

Exceeding the limit returns HTTP 429 and raises EpsteinExposedRateLimitError.

Response Models

All responses are parsed into typed Pydantic models:

  • PaginatedResponse[Person], PaginatedResponse[Document], PaginatedResponse[Flight]
  • PersonDetail (extended person with bio, aliases, black book status)
  • SearchResults (documents + emails)
  • PaginationMeta (total, page, per_page, timestamp)

Error Handling

from epsteinexposed import EpsteinExposed, EpsteinExposedRateLimitError

client = EpsteinExposed()
try:
    client.search_persons(q="test")
except EpsteinExposedRateLimitError:
    print("Rate limited — back off and retry")
Exception HTTP Code
EpsteinExposedValidationError 400
EpsteinExposedNotFoundError 404
EpsteinExposedRateLimitError 429
EpsteinExposedServerError 5xx
EpsteinExposedAPIError (base)

Development

git clone https://github.com/guilyx/epsteinexposed.git
cd epsteinexposed
make install-dev
make test          # unit tests (mocked)
make lint

Run integration tests against the real API (rate-limit aware):

pytest -m integration --no-cov

Documentation

Full docs at guilyx.github.io/epsteinexposed — built with Vite + React + Tailwind CSS. Run locally with make docs.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

epsteinexposed-0.2.0.tar.gz (14.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

epsteinexposed-0.2.0-py3-none-any.whl (12.4 kB view details)

Uploaded Python 3

File details

Details for the file epsteinexposed-0.2.0.tar.gz.

File metadata

  • Download URL: epsteinexposed-0.2.0.tar.gz
  • Upload date:
  • Size: 14.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for epsteinexposed-0.2.0.tar.gz
Algorithm Hash digest
SHA256 26ae28085ea072a17c6e433d42dd5769205b5d78212577d67949f34375e17824
MD5 83873222d587d3cc5caa76e2a120ef05
BLAKE2b-256 6b1b2c547cb612d83a5d7d4e80598ac8255256ed2a83c21ba5c48d6769c72700

See more details on using hashes here.

Provenance

The following attestation bundles were made for epsteinexposed-0.2.0.tar.gz:

Publisher: publish.yml on guilyx/epsteinexposed

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file epsteinexposed-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: epsteinexposed-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 12.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for epsteinexposed-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6ab5f622ed649acd676e47ef3485a7f93703a8523de26b7a036f539862483cf2
MD5 419c65849da4f9ecba669d31517f99d3
BLAKE2b-256 e3c22ba6b4d8a6d1607e3460d9133a01611a01dad25400fbb32f57de4e8fb524

See more details on using hashes here.

Provenance

The following attestation bundles were made for epsteinexposed-0.2.0-py3-none-any.whl:

Publisher: publish.yml on guilyx/epsteinexposed

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page