| Worker | Version | Speed | Job | Start Chunk | Chunks | Progress | Last Seen |
|---|
| Worker | Keys Completed | Jobs |
|---|
| Worker | Address | Virtual Chunk Start | Virtual Chunk End | Job ID | Datetime |
|---|
| Request |
{
"name": "rig-01", // required: unique worker id
"hashrate": 5000000, // optional: keys/s, used to size the next job
"version": "1.3.3", // optional: shown on dashboard
"min_chunk_keys": "30000000", // optional: minimum desired job size in keys
"chunk_quantum_keys": "1048576" // optional: round job size up to this quantum
}
|
| Response |
{
"job_id": 42, // use in /submit and /heartbeat
"start_key": "0000...0000", // inclusive range start
"end_key": "0000...1c00" // exclusive range end
}
// worker scans [start_key, end_key)
// if the worker already owns an active job for the selected puzzle,
// the same job can be returned again.
{
"error": "No active puzzle configured"
}
{
"error": "All keyspace has been assigned"
}
|
| Example Usage |
curl -sS -X POST "$POOL_SERVER/api/v1/work" \
-H "Content-Type: application/json" \
-d '{
"name":"rig-01",
"hashrate":5000000,
"version":"1.3.3",
"min_chunk_keys":"30000000",
"chunk_quantum_keys":"1048576"
}'
|
| Request |
// completed normally { "name": "rig-01", "job_id": 42, "status": "done", "keys_scanned": 300000000 } // found one or more matching keys { "name": "rig-01", "job_id": 42, "status": "FOUND", "findings": [ { "found_key": "0000000000000000000000000000000000000000000000600000000000100000", "found_address": "16vXLNVjJwrfHirzHsZdzWNPrAXq7n9oRT" } ] } |
| Response |
{
"accepted": true
}
{
"accepted": false
}
{
"accepted": false,
"error": "chunk #42 not accepted, reported size: 123, expected size: 456. Chunk reclaimed."
}
// notes:
// - for status="done", keys_scanned is required
// - if keys_scanned < expected job size, the chunk becomes reclaimed
// - for status="FOUND", findings must be a non-empty array
// - duplicate findings are deduplicated server-side
|
| Example Usage |
curl -sS -X POST "$POOL_SERVER/api/v1/submit" \
-H "Content-Type: application/json" \
-d '{
"name":"rig-01",
"job_id":42,
"status":"done",
"keys_scanned":300000000
}'
curl -sS -X POST "$POOL_SERVER/api/v1/submit" \
-H "Content-Type: application/json" \
-d '{
"name":"rig-01",
"job_id":42,
"status":"FOUND",
"findings":[
{
"found_key":"0000000000000000000000000000000000000000000000600000000000100000",
"found_address":"16vXLNVjJwrfHirzHsZdzWNPrAXq7n9oRT"
}
]
}'
|
| Request |
{
"name": "rig-01",
"job_id": 42
}
|
| Response |
{
"ok": true
}
{
"error": "Missing name or job_id"
}
|
| Example Usage |
curl -sS -X POST "$POOL_SERVER/api/v1/heartbeat" \
-H "Content-Type: application/json" \
-d '{
"name":"rig-01",
"job_id":42
}'
|
| Request |
// active puzzle GET /api/v1/stats // specific puzzle GET /api/v1/stats?puzzle_id=1 |
| Response |
{
"stage": "PROD",
"puzzles": [
{ "id": 1, "name": "PUZZLE 71", "active": 1 }
],
"puzzle": {
"id": 1,
"name": "PUZZLE 71",
"start_hex": "0000...",
"end_hex": "0000...",
"total_keys": "1180591620717411303423",
"test_chunk": null,
"alloc_strategy": "virtual_random_chunks_v1",
"alloc_cursor": "2220012",
"virtual_chunk_size_keys": "33554432",
"virtual_chunk_count": "35184372088832",
"bootstrap_stage": 3,
"status": {
"state": "unsolved",
"label": "unsolved",
"target_type": "address",
"target_value": "1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU",
"checked_at": "2026-05-23T10:00:00Z",
"link": "https://mempool.space/address/1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU",
"note": null
}
},
"active_workers_count": 2,
"inactive_workers_count": 1,
"total_hashrate": 123456789,
"completed_chunks": 2490237,
"reclaimed_chunks": 0,
"total_keys_completed": "83751426068480",
"vis_revision": 42,
"virtual_chunks": {
"total": "35184372088832",
"started_vchunks": "2495003",
"completed_vchunks": "2490237",
"virtual_chunk_size_keys": "33554432",
"blocked_vchunk_count": "1024"
},
"shards": { // backward-compatible alias },
"workers": [
{
"name": "rig-01",
"hashrate": 5000000,
"last_seen": "2026-04-28 09:45:12",
"version": "1.3.3",
"min_chunk_keys": "30000000",
"chunk_quantum_keys": "1048576",
"fresh": true,
"assigned_here": true,
"active": true,
"current_chunk": 42,
"current_vchunk_run": "4604757760040 + 1904"
}
],
"scores": [],
"finders": []
}
|
| Example Usage |
curl -sS "$POOL_SERVER/api/v1/stats" curl -sS "$POOL_SERVER/api/v1/stats?puzzle_id=1" |
| Request |
GET /api/v1/visualization/heatmap GET /api/v1/visualization/heatmap?puzzle_id=1 |
| Response |
{
"puzzle_id": 1,
"loaded_at": "2026-05-24T08:11:29Z",
"cells": [
[1042, 83, 0, 1, 0, 0],
[1043, 11, 0, 0, 0, 1]
]
}
|
| Example Usage |
curl -sS "$POOL_SERVER/api/v1/visualization/heatmap" curl -sS "$POOL_SERVER/api/v1/visualization/heatmap?puzzle_id=1" |
| Request |
GET /api/v1/visualization/hilbert GET /api/v1/visualization/hilbert?puzzle_id=1 |
| Response |
{
"puzzle_id": 1,
"loaded_at": "2026-05-24T08:11:29Z",
"cells": [
[17, 4, 0, 0, 0, 0],
[18, 0, 0, 0, 1, 0]
]
}
|
| Example Usage |
curl -sS "$POOL_SERVER/api/v1/visualization/hilbert" curl -sS "$POOL_SERVER/api/v1/visualization/hilbert?puzzle_id=1" |
| Request |
GET /api/v1/visualization/allocator GET /api/v1/visualization/allocator?puzzle_id=1 |
| Response |
{
"puzzle_id": 1,
"loaded_at": "2026-05-24T08:11:29Z",
"generations": {
"all": {
"total_count": 2048,
"scatter": [
[0.0, 0.0008010864, 0],
[0.5, 0.5000000000, 3]
],
"gap_histogram": {
"bins": [12, 9, 4, 1],
"max_gap": 0.03125
},
"norm_gap_histogram": {
"bins": [0, 3, 8, 19],
"clip": 6.0
},
"metrics": {
"n": 2047,
"mean": 0.0004885,
"median": 0.0002441,
"p95": 0.0019531,
"max": 0.03125,
"cv": 1.87,
"max_over_mean": 63.97
}
},
"legacy": { "...": "same shape" },
"affine": { "...": "same shape" },
"feistel": { "...": "same shape" }
}
}
|
| Example Usage |
curl -sS "$POOL_SERVER/api/v1/visualization/allocator" curl -sS "$POOL_SERVER/api/v1/visualization/allocator?puzzle_id=1" |
| Request |
{
"puzzle_id": 1,
"source": "btcpuzzle.info",
"base_hex": "0000000000000000000000000000000000000000000000000000000000000001",
"step": "33554432",
"range_ids": ["0", "1", "42", "99"]
}
|
| Response |
{
"ok": true,
"inserted_ranges": 3,
"already_blocked": 1,
"invalid": 0,
"errors": []
}
{ "error": "Puzzle does not use virtual_random_chunks_v1 strategy" }
{ "error": "Puzzle not found" }
|
| Example Usage |
curl -sS -X POST "$POOL_SERVER/api/v1/admin/import-ranges" \
-H "Content-Type: application/json" \
-H "X-Admin-Token: $ADMIN_TOKEN" \
-d '{"puzzle_id":1,"source":"btcpuzzle.info","base_hex":"0000000000000000000000000000000000000000000000000000000000000001","step":"33554432","range_ids":["0","1","42"]}'
|
| Request |
{
"id": 2
}
|
| Response |
{
"ok": true,
"puzzle": {
"id": 2,
"name": "ALL BTC",
"active": 1
}
}
{
"error": "unauthorized"
}
{
"error": "Puzzle not found"
}
|
| Example Usage |
curl -sS -X POST "$POOL_SERVER/api/v1/admin/activate-puzzle" \
-H "Content-Type: application/json" \
-H "X-Admin-Token: $ADMIN_TOKEN" \
-d '{"id":2}'
|