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())

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()

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
make lint

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.1.0.tar.gz (12.5 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.1.0-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for epsteinexposed-0.1.0.tar.gz
Algorithm Hash digest
SHA256 714aecd24b52b1929060fcd3fbf572885b76837d88276a029d2fc19277d05091
MD5 16274ce674c13887d488d45723891df5
BLAKE2b-256 206dcacfe13e4427641a6ce44a3a63f498d0a3bf347e542371a9dc7a614bdb0b

See more details on using hashes here.

Provenance

The following attestation bundles were made for epsteinexposed-0.1.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.1.0-py3-none-any.whl.

File metadata

  • Download URL: epsteinexposed-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 11.7 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2d0156874f9072cade4f1975f584d41d5d874eb72129d0664ac6c972aa413a10
MD5 b58b205c47b799b40c196a78ec7fd16c
BLAKE2b-256 32f2ef75162769581436a100df4efad3d4ecf6fe86a2bf47da285423d0b9aa5f

See more details on using hashes here.

Provenance

The following attestation bundles were made for epsteinexposed-0.1.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