Epstein Files API

Search 398,560 DOJ documents programmatically. Free tier available.

Get Free API Key

API Tiers

Anonymous
100/day
Deprecated March 13, 2026
  • No key required
  • Rate limited by IP
  • Sunset March 2026
Pro
10,000/day
$29/mo (coming soon)
  • Attribution optional
  • Priority support
  • Bulk export
Enterprise
100,000/day
Contact us
  • SLA guarantee
  • Dedicated support
  • Custom integrations

Quick Start

1. Get an API Key

Register for free at /register.html. You'll receive a key like dugusa_abc123...

2. Make Your First Request

# Search for "Prince Andrew"
curl -X POST "https://epstein.dugganusa.com/indexes/epstein_files/search" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q": "Prince Andrew", "limit": 20}'

3. Check Your Usage

curl "https://analytics.dugganusa.com/api/v1/api-keys/usage" \
  -H "Authorization: Bearer YOUR_API_KEY"

Authentication

Include your API key in the Authorization header:

Authorization: Bearer dugusa_your_api_key_here
Anonymous Access Sunset

Anonymous access (no API key) is deprecated and will be disabled on March 13, 2026. Register for a free API key to continue access.

Endpoints

Search Documents

POST /indexes/epstein_files/search

Full-text search across 398,560 DOJ Epstein documents.

ParameterTypeDescription
qstringSearch query (required)
limitintegerResults per page (default: 20, max: 1000)
offsetintegerPagination offset
filterstringMeilisearch filter syntax
sortarraySort fields (e.g., ["efta_id:asc"])
# Example: Search with filters
curl -X POST "https://epstein.dugganusa.com/indexes/epstein_files/search" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "q": "flight log",
    "limit": 50,
    "filter": "dataset = \"dataset3\"",
    "attributesToHighlight": ["content"]
  }'

Search via GET (Legacy)

GET /api/v1/search

Simple GET-based search. Proxied to Meilisearch.

ParameterTypeDescription
qstringSearch query (required)
indexesstringIndex name(s), comma-separated
limitintegerResults per page
# Simple search
curl "https://analytics.dugganusa.com/api/v1/search?q=Leon+Black&indexes=epstein_files&limit=20" \
  -H "Authorization: Bearer YOUR_API_KEY"

API Key Management

POST /api/v1/api-keys/register

Register for a new API key. Rate limited to 5 registrations per hour per IP.

GET /api/v1/api-keys/usage

Check your current usage and remaining quota.

GET /api/v1/api-keys/verify

Verify your API key is valid.

Response Format

{
  "hits": [
    {
      "efta_id": "EFTA00022136",
      "content": "Document text content...",
      "dataset": "dataset3",
      "pages": 5,
      "char_count": 12847,
      "people": ["prince_andrew", "virginia_giuffre"],
      "locations": ["new_york"],
      "doj_url": "https://www.justice.gov/..."
    }
  ],
  "estimatedTotalHits": 228,
  "processingTimeMs": 12,
  "query": "Prince Andrew"
}

Rate Limits

Rate limits reset daily at midnight UTC. Check your usage via the /api/v1/api-keys/usage endpoint.

TierDaily LimitRate Limit Headers
Anonymous100X-RateLimit-Limit, X-RateLimit-Remaining
Free500X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
Pro10,000X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
Enterprise100,000X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

Tip: Cache responses on your end. Document content doesn't change frequently.

Attribution Requirement

Free tier requires displaying the "Powered by DugganUSA" attribution badge on any project using this API.

Badge HTML

<a href="https://epstein.dugganusa.com">
  <img src="https://epstein.dugganusa.com/badge.svg" alt="Powered by DugganUSA" />
</a>

Pro and Enterprise tiers do not require attribution.

Available Indexes

IndexDocumentsDescription
epstein_files398,560DOJ SDNY Epstein release (Datasets 1-12)
blog70+DugganUSA analysis articles

Error Codes

CodeMeaning
401Invalid or missing API key
429Rate limit exceeded
400Invalid request parameters
500Server error (please report)

Code Examples

Python

import requests

API_KEY = "dugusa_your_key_here"
SEARCH_URL = "https://epstein.dugganusa.com/indexes/epstein_files/search"

response = requests.post(
    SEARCH_URL,
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    },
    json={"q": "Gates Foundation", "limit": 50}
)

data = response.json()
for hit in data["hits"]:
    print(f"{hit['efta_id']}: {hit['content'][:100]}...")

JavaScript

const API_KEY = "dugusa_your_key_here";

async function searchEpsteinFiles(query) {
  const response = await fetch(
    "https://epstein.dugganusa.com/indexes/epstein_files/search",
    {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${API_KEY}`,
        "Content-Type": "application/json"
      },
      body: JSON.stringify({ q: query, limit: 50 })
    }
  );
  return response.json();
}

searchEpsteinFiles("Deutsche Bank").then(data => {
  console.log(`Found ${data.estimatedTotalHits} documents`);
});

Support

Questions? Issues? Reach out: