declassdb
Python client for DeclassDB.com — search declassified government documents from CIA, FBI, NSA, NARA, State Department, DoD, and NSArchive.
Install
pip install declassdb
For faster HTTP (optional):
pip install declassdb[httpx]
Quick Start
from declassdb import DeclassDB
db = DeclassDB(api_key="dk_live_...")
# Search across all sources
results = db.search("MKUltra")
for doc in results:
print(doc.title, doc.date)
API Key
Get your API key at declassdb.com/account#api-access.
You can pass it directly or set it as an environment variable:
export DECLASSDB_API_KEY=dk_live_...
# Reads from DECLASSDB_API_KEY automatically
db = DeclassDB()
Usage
Search All Sources
results = db.search("Star Gate", limit=10)
print(f"Found {results.total} documents")
for doc in results:
print(f"[{doc.source}] {doc.title} ({doc.date})")
print(f" {doc.url}")
Search Specific Sources
# Single source
results = db.search("uranium", source="cia")
# Multiple sources
results = db.search("uranium", source="cia,nsa")
# Convenience methods
results = db.search_cia("OXCART A-12")
results = db.search_fbi("Hoover")
results = db.search_nsa("SIGINT")
results = db.search_nara("Manhattan Project")
results = db.search_state("Cuba missile crisis")
Pagination
# Page through results
page1 = db.search("Vietnam", limit=20, page=1)
page2 = db.search("Vietnam", limit=20, page=2)
Get Counts Only
counts = db.counts("nuclear testing")
print(counts)
# {'cia': 342, 'fbi': 12, 'state': 89, 'nsa': 7, 'nara': 4521, ...}
Export to PDF
# Save search results as PDF
db.export_pdf("OXCART", source="cia", limit=10, output_path="oxcart_results.pdf")
# Or get raw bytes
pdf_bytes = db.export_pdf("OXCART", source="cia")
Check API Key Status
info = db.key_info()
print(f"Tier: {info.tier}")
print(f"Monthly quota: {info.quota}")
Work with Results
results = db.search("Bay of Pigs", source="cia", limit=5)
# Iterate
for doc in results:
print(doc.title)
# Index
first = results[0]
# Length
print(f"{len(results)} results returned")
# Raw dict
raw = results.to_dict()
Document Properties
Each Document object has:
doc.doc_id # Unique document identifier
doc.title # Document title
doc.url # URL to view the document
doc.pdf_url # Direct PDF URL (when available)
doc.date # Document date (YYYY-MM-DD)
doc.collection # Collection name
doc.snippet # Text snippet / description
doc.pages # Page count (when available)
doc.source # Source agency (cia, fbi, etc.)
Command-Line Interface
The package installs a declassdb command (also python -m declassdb). It
works both as a scriptable one-shot tool and as an interactive research REPL.
For the richest REPL (tab completion + persistent history), install the extra:
pip install declassdb[cli] # adds prompt_toolkit
pip install declassdb[all] # httpx + prompt_toolkit
One-shot commands
declassdb search "MKUltra" --source cia --limit 5
declassdb search "MKUltra" --json | jq '.results[].title'
declassdb info
declassdb export "OXCART" --format pdf -o results.pdf
declassdb export "OXCART" --format bibtex -o oxcart.bib
declassdb login # save your API key to ~/.declassdb/config.toml
declassdb upgrade # Paddle checkout to upgrade your tier
Output is colorized for a terminal and automatically stripped of ANSI codes
when piped. NO_COLOR is honored.
Interactive REPL
Run declassdb with no arguments to drop into the session:
declassdb> cia Star Gate
declassdb> next
declassdb> open 1
declassdb> cite 2 --format ris
declassdb> save 3 cold-war
declassdb> foia 1
declassdb> counts "uranium enrichment"
declassdb> collections
After a search you reference results by number — no re-querying or
copy-pasting IDs. Collections persist to ~/.declassdb/collections.json
across sessions.
REPL commands
| Group | Commands |
|---|---|
| Search & browse | search, cia/fbi/nsa/nara/state, next, prev, counts |
| Document actions | open, analyze, text, entities, foia, cite |
| Collections | save, collections, collection, export-collection |
| Session | info, history, upgrade, config, help, quit |
cite (BibTeX/RIS), foia (request letter), and collections are built
fully client-side from document metadata. analyze, entities, and full
OCR text are powered by the DeclassDB web app and are not exposed through
the public API yet — those commands say so and link to the document.
Config
Stored at ~/.declassdb/config.toml:
[auth]
api_key = "dk_live_..."
[defaults]
limit = 20
source = ""
format = "text"
[display]
color = true
page_size = 20
Change values from the REPL: config set defaults.limit 50.
Error Handling
from declassdb import DeclassDB, AuthenticationError, RateLimitError, DeclassDBError
db = DeclassDB(api_key="dk_live_...")
try:
results = db.search("test query")
except AuthenticationError:
print("Bad API key")
except RateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after} seconds")
except DeclassDBError as e:
print(f"API error ({e.status_code}): {e}")
Tiers
| Feature | Pro | Researcher |
|---|---|---|
| API calls | 1,000/month | 10,000/month + webhooks |
| Sources | CIA, FBI, State, NSA, NARA | All + full-text CREST PDF search |
| Export | JSON, text, PDF | + BibTeX, RIS citation export |
| Price | $50/yr (founder rate) | $100/yr (founder rate) |
Get your key: declassdb.com
Requirements
- Python 3.8+
- No required dependencies (uses stdlib
urllib) - Optional:
httpxfor faster HTTP
License
MIT
Links
- Website: declassdb.com
- API Docs: declassdb.com/docs/api
- Published by: ResilientMind AI LLC (SDVOSB)
Metadata
Release files for declassdb 0.5.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| declassdb-0.5.6.tar.gz | 44.6 kB | Without provenance | Details for declassdb-0.5.6.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| declassdb-0.5.6-py3-none-any.whl | Python 3 | none | any | Details for declassdb-0.5.6-py3-none-any.whl |
Total release size: 89.6 kB
Release files / declassdb-0.5.6.tar.gz
| Download URL | declassdb-0.5.6.tar.gz |
|---|---|
| Size | 44.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d5f2d8a39e39acc0710b74636fb17b0b962ff632c90c67fdc615daa6ac5586b6
|
|
BLAKE2b-256 checksum How to use checksums |
a8e1e67f2b7bdbcd1bb3e11da2c984c53355971e89ff6cbf3f7dd94f1b5bea36
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Release files / declassdb-0.5.6-py3-none-any.whl
| Download URL | declassdb-0.5.6-py3-none-any.whl |
|---|---|
| Size | 45.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e2a5345952b8cfb0b753c95744c3a70915835f31b6d4fde0ffb2823468fff59d
|
|
BLAKE2b-256 checksum How to use checksums |
7cd1b6d3db365b755bf345d73436b8ffbf44d2bc5c1cc351d9ba05cf112e43f8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Security for declassdb 0.5.6
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.