Introduction
BruteFather is a public reference resource for the 160 Bitcoin Puzzle transaction (created in 2015, extended in 2017 and 2019). Every page on this site is backed by a free, read-only HTTP API you can call from any client โ browser, Telegram bot, Discord widget, mobile app, terminal script.
This documentation covers the public surface only. No authentication is required for any endpoint listed below. Cabinet-only features (mining stats, withdrawals, settings) are documented inside the user cabinet after Telegram login.
What is the Bitcoin Puzzle?
The Bitcoin Puzzle is a single transaction that locks 1000 BTC into 160 separate outputs, one per bit-length from 1 to 160. The private key for output N is a random integer in the half-open interval [2^(N-1), 2^N).
Solving puzzle N means finding that scalar. The smaller bits (1..70) have already been solved by various researchers. The larger bits (71..160) remain open and carry growing prize pools.
Status terminology
solvedPrivate key revealed; address balance fully spent or near zero.
exposedPublic key has been published on-chain via a prior spend, but the private key is still secret. These puzzles are vulnerable to Pollard's Rho / Kangaroo.
unsolvedOnly the address (P2PKH hash160) is known. The public key has never been revealed.
Public API v1
Base URL: https://brutefather.ru/api/v1/
All responses are JSON unless a download is explicitly requested. CORS is open to every origin. Every successful response includes a catalog_version field so clients can detect when the dataset has been updated.
Endpoints
GET
/api/v1/puzzles
Full catalog of all 160 puzzles. Query params: status = solved/exposed/unsolved; min_bit, max_bit (1..160); refresh=1 bypasses the edge cache.
GET
/api/v1/puzzle/{bit}
Single puzzle by bit number (1..160). Returns address, prize, status, hash160, public key (if exposed), private key (if solved), live balance.
GET
/api/v1/address/{addr}
Reverse lookup: same payload as /puzzle/{bit} when the address belongs to one of the 160 puzzles, 404 otherwise.
GET
/api/v1/stats
Aggregate counters: how many puzzles are solved, exposed, unsolved, plus total prize and live unspent BTC.
GET
/api/v1/export/puzzles.json
Download the entire dataset as a single pretty-printed JSON file.
GET
/api/v1/export/puzzles.csv
Same dataset as CSV (10 columns, header row included).
GET
/api/puzzles/stream
Server-Sent Events. One event per catalog change (status flip, balance delta, new exposure). Keep the connection open.
GET
/puzzle/{bit}
Server-rendered HTML detail page for a single puzzle. Includes proper OpenGraph / Twitter meta so links unfurl nicely in Telegram, X, Discord, Slack.
Code examples
curl
# list all unsolved puzzles in the 71..80 range
curl -s 'https://brutefather.ru/api/v1/puzzles?status=unsolved&min_bit=71&max_bit=80'
# one puzzle
curl -s 'https://brutefather.ru/api/v1/puzzle/71'
# by address
curl -s 'https://brutefather.ru/api/v1/address/1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU'
JavaScript (browser, no key)
const res = await fetch('https://brutefather.ru/api/v1/puzzle/71');
const data = await res.json();
console.log(data.address, data.balance_btc, data.ui_status);
Python
import requests
r = requests.get('https://brutefather.ru/api/v1/stats', timeout=10)
print(r.json()['counts'])
Telegram bot snippet
# Fetch the next unsolved puzzle and post it to a chat
import requests
js = requests.get('https://brutefather.ru/api/v1/puzzles?status=unsolved').json()
for p in js['items'][:5]:
print(f"#{p['bit']:>3} {p['address']} {p['btc']} BTC")
Bulk downloads
Two static-style endpoints serve the entire catalog as a single file with proper Content-Disposition headers:
- /api/v1/export/puzzles.json — JSON, ~120 KB
- /api/v1/export/puzzles.csv — CSV (
bit, address, btc, balance_btc, status, ui_status, hash160, pubkey, private_key, updated_at)
Both are cached at the edge for 60 seconds. Schedule your re-downloads accordingly.
Live SSE stream
For real-time dashboards, subscribe to /api/puzzles/stream. The stream emits an event whenever the catalog version increments โ i.e. balance changes, a new public key is exposed, or a puzzle gets solved.
const es = new EventSource('https://brutefather.ru/api/puzzles/stream');
es.onmessage = (e) => {
const ev = JSON.parse(e.data);
console.log('catalog updated', ev);
};
Keep-alive comments (:keepalive) are sent every 30 seconds so corporate proxies don't drop the connection.
Response fields
Every puzzle object follows the same shape:
bit integer 1..160 — puzzle number
address P2PKH Bitcoin address
hash160 RIPEMD-160(SHA-256(pubkey)) hex, 40 chars
btc prize size in BTC at puzzle creation
balance_btc live unspent balance (refreshed via mempool.space)
status raw status: unsolved, solved, exposed
ui_status same as status, used by the UI badge color
pubkey compressed secp256k1 public key (66 hex chars) — only if exposed
private_key scalar in hex (64 chars) — only if solved & published
updated_at unix timestamp of last on-chain check
Rate limits & caching
- Soft limit: ~30 requests/sec per IP across
/api/. Bursts up to 40 are allowed.
- Edge cache: 30 s for
/api/v1/puzzles, /puzzle/{bit}, /api/v1/stats. 60 s for exports. Use ?refresh=1 to force a fresh on-chain check (do not abuse).
- Every response includes
X-Cache-Status (HIT/MISS/BYPASS) and standard Cache-Control headers.
- If you need higher throughput or guaranteed freshness, run a local mirror by replaying the SSE stream.
Per-puzzle pages
Each puzzle has its own URL at https://brutefather.ru/puzzle/{bit} (1..160). These are full, self-contained HTML pages with:
- Live balance auto-refreshed every 30 seconds via JS.
- Cryptographic data block (address, hash160, public key, private key, key range
2^(bit-1) โค k < 2^bit).
- Verify-on-chain links to mempool.space, blockstream.info, blockchain.com, and privatekeys.pw.
- OpenGraph + Twitter Card meta tags — share a link in Telegram/Discord/Slack and you get a proper preview.
- Canonical URL pointing back to itself; all 160 pages are in sitemap.xml so search engines can index them.
Examples: #66 ยท #71 ยท #130
Scan modes (BruteFather software)
This site also distributes the BruteFather scanner — a Rust-based, GPU-accelerated address scanner with 17 modes. A short reference:
- Random — uniform random scalars across the full 256-bit space.
- Sequential — linear sweep starting from a configurable offset.
- Puzzle — targeted scan inside
[2^(bit-1), 2^bit) for a chosen puzzle.
- Brain wallet — hashed-passphrase derivations against a wordlist.
- BIP39 — mnemonic recovery (full + partial seeds).
- Hybrid / Markov / Dictionary — mixed strategies for weak-key research.
- Kangaroo — Pollard's lambda for puzzles with exposed public keys.
See /modes for the full list with descriptions, performance numbers, and (soon) animated demos.
Contact & community
This API is provided as a public reference. We do not store or process any personal data from API consumers. Cached responses contain only public on-chain information.