383,579 EMAILS INDEXED • USDC ON BASE • $0.001/QUERY • NO KYC • NO API KEYS • JUST PAY AND QUERY • POWERED BY X402 • COURT-RELEASED DOCUMENTS • FULLY STRUCTURED JSON • 383,579 EMAILS INDEXED • USDC ON BASE • $0.001/QUERY • NO KYC • NO API KEYS • JUST PAY AND QUERY • POWERED BY X402 • COURT-RELEASED DOCUMENTS • FULLY STRUCTURED JSON •   
PUBLIC RECORDS API

the receipts
are available onchain

Every court-released Epstein email. OCR'd, structured, and queryable through a pay-per-request API. No accounts. No keys. Just USDC and a wallet.

383,579 emails
$0.001 per query
0 accounts needed

wallet in, data out.

Your x402 client pays the micro-fee automatically. One HTTP call, one USDC transfer, structured JSON returned. That's it.

$0.001
per request • USDC on Base • no gas fees • facilitator-sponsored
1.

make the call

Hit /api/emails or /api/search. Your x402 client sees the 402, signs a USDC payment, and retries automatically.

2.

payment settles

Coinbase's facilitator verifies and settles. No gas needed. No approval txns. Sub-second on Base.

3.

get your data

Structured JSON with sender, recipient, date, subject, body, and source PDF provenance. Paginated. Filterable.


degens, journalists, agents.

If you're querying public records for alpha, building an investigation tool, or wiring up an AI agent to search court docs.

>_

prediction traders

Query programmatically to inform your positions. Search names, dates, and connections faster than anyone reading PDFs by hand.

&&

researchers

Full-text search across every field. Filter by sender, recipient, date. Export structured data. Cross-reference other datasets.

//

AI agents

Listed on the x402 Bazaar. Your agent can discover, pay, and query autonomously. No API keys to manage. No OAuth dance.


pip install, paste, query.

Fund a wallet with USDC on Base. Drop this into your project. That's the whole onboarding.

# pip install "x402[httpx,evm]" eth_account

import asyncio, json
from eth_account import Account
from x402 import x402Client
from x402.http.clients import x402HttpxClient
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact.register import register_exact_evm_client

# your wallet (needs USDC on Base)
account = Account.from_key("0xYOUR_PRIVATE_KEY")
client = x402Client()
register_exact_evm_client(client, EthAccountSigner(account))

async def main():
    async with x402HttpxClient(client) as http:
        # paginate through all results (max 1000/req)
        all_results = []
        offset = 0
        while True:
            resp = await http.get(
                f"https://epsteinemails.xyz/api/search?q=ghislaine&limit=1000&offset={offset}"
            )
            data = resp.json()
            all_results.extend(data["results"])
            if not data["has_more"]:
                break
            offset = data["next_offset"]
        print(f"fetched {len(all_results)} total results")

asyncio.run(main())

endpoints

GET /api/emails x402 list & filter

Structured queries. Filter by sender, recipient, date, subject. Filters combine with AND logic. Doesn't search body text -- use /api/search for that.

Query Parameters

ParamTypeDescription
fromstringFilter by sender
tostringFilter by recipient
subjectstringFilter by subject line
datestringFilter by date (e.g. "2017")
source_filestringFilter by source PDF
limitintMax per page (default: 1000)
offsetintPagination offset

Response

FieldTypeDescription
totalintTotal matching records
returnedintRecords in this page
has_moreboolMore pages?
next_offsetint|nullNext page offset

Examples

# filter by sender
GET /api/emails?from=jeffrey&limit=10

# combine filters
GET /api/emails?from=jeffrey&subject=schedule&limit=25

# paginate
GET /api/emails?offset=0       # page 1
GET /api/emails?offset=1000    # page 2
GET /api/emails?offset=2000    # page 3
GET /api/search x402 full-text search

Searches across all fields at once: from, to, subject, body, date, cc, bcc. Use this when you don't know which field has what you're looking for.

Query Parameters

ParamTypeDescription
qstringSearch query (required)
limitintMax per page (default: 1000)
offsetintPagination offset

Response

FieldTypeDescription
total_matchesintTotal matching records
returnedintRecords in this page
has_moreboolMore pages?
next_offsetint|nullNext page offset

Examples

# search all fields
GET /api/search?q=ghislaine

# smaller pages
GET /api/search?q=palm+beach&limit=100

# paginate
GET /api/search?q=2003&offset=0       # page 1
GET /api/search?q=2003&offset=1000    # page 2