goPool’s status UI is backed by a small set of HTTP JSON endpoints intended for monitoring, dashboards, and the built-in web UI.
This document describes the HTTP /api/* endpoints exposed by the status webserver (not Bitcoin Core JSON-RPC, and not Stratum’s JSON-RPC messages).
- Base URL: same host/port as the status UI (
server.status_listen/server.status_tls_listen). - Disable APIs: start the daemon with
-no-jsonto disable all/api/*handlers. - Schema versioning: responses include
api_version(currently"1"). There is no version prefix in the URL path. - Encoding: JSON (snake_case keys) via
sonic.
If server.status_tls_listen is enabled, the HTTP listener (if configured) redirects to HTTPS with a 307 Temporary Redirect. This applies to both the HTML UI and JSON APIs.
Successful responses set Content-Type: application/json.
Most errors are returned using http.Error(...) and therefore:
- use a relevant HTTP status code (e.g.,
400,401,403,404,405,500) - return a plain-text body (not a JSON error envelope)
time.Timefields are encoded as RFC3339 JSON strings (example:"2026-01-31T19:55:02Z").- Many endpoints also expose timestamp strings explicitly (usually RFC3339).
Some responses include time.Duration values (for example uptime or render_duration).
In JSON, these are encoded as integers representing nanoseconds (because time.Duration is an int64).
The “public snapshot” endpoints are served from an in-memory cache and include:
Cache-Control: no-cache, no-store, must-revalidateX-JSON-Updated-At: RFC3339 timestamp of the cached payloadX-JSON-Next-Update-At: RFC3339 timestamp when the cache will be refreshed
Note: despite the name, these responses are not intended to be browser-cacheable; the cache is server-side.
Some public endpoints censor sensitive user data (worker identifiers and hashes) so they can be safely embedded in a public status page.
In particular:
- worker names may be shortened
- wallet addresses may be shortened
- share hashes may be shortened
- some fields (like
wallet_script/last_share_detail) may be cleared
Public (no auth):
GET /api/overview— overview page snapshot (default refresh ~10s)GET /api/pool-page— pool diagnostics snapshot (default refresh ~10s)GET /api/node— node info snapshot (default refresh ~10s)GET /api/server— server diagnostics snapshot (default refresh ~10s)GET /api/pool-hashrate— fast pool hashrate/block timer snapshot (default refresh ~5s)GET /api/blocks— recent blocks list (default refresh ~3s; supports?limit=)
Authenticated (Clerk/session-based):
POST /api/auth/session-refresh— refreshes/sets the Clerk session cookie using a validated tokenGET /api/saved-workers— saved workers list + online/offline status snapshot for current userGET /api/saved-workers/history?hash=<sha256|pool>— compact hashrate/best-share history for a saved worker (orpool)POST /api/saved-workers/notify-enabled— toggle per-worker notificationsPOST /api/discord/notify-enabled— toggle account-level Discord notificationsPOST /api/saved-workers/one-time-code— mint one-time Discord linking codePOST /api/saved-workers/one-time-code/clear— clear one-time Discord linking code
Overview snapshot used by the home page.
Response object: OverviewPageData
api_version(string)active_miners(int)active_tls_miners(int)shares_per_minute(number, optional)pool_hashrate(number, optional)pool_tag(string, optional)btc_price_fiat(number, optional)btc_price_updated_at(string, optional; RFC3339)fiat_currency(string, optional)render_duration(int; duration nanoseconds)workers(array ofRecentWorkView, censored)banned_workers(array ofWorkerView, censored and truncated)best_shares(array ofBestShare, censored)miner_types(array ofMinerTypeView; optional)
Types referenced:
-
RecentWorkViewname(string; censored)display_name(string; censored)rolling_hashrate(number)hashrate_accuracy(string; optional;"~"while warming up,"≈"while settling; omitted when stable)difficulty(number)vardiff(number)share_rate(number)accepted(integer)connection_id(string)
-
WorkerView(used forbanned_workers; values are censored/truncated)name(string; censored)display_name(string; censored)banned(boolean)banned_until(string; RFC3339; optional)ban_reason(string; optional; brief)
-
BestShareworker(string; censored)difficulty(number)timestamp(string; RFC3339)hash(string; censored; optional)display_worker(string; optional)display_hash(string; optional)
Example:
curl -sS https://STATUS_HOST/api/overview | jq .Pool diagnostics snapshot used by /pool.
Response object: PoolPageData
api_version(string)blocks_accepted(integer)blocks_errored(integer)rpc_gbt_last_sec(number)rpc_gbt_max_sec(number)rpc_gbt_count(integer)rpc_gbt_headers_last_sec(number; latest non-longpoll request through response headers)rpc_gbt_body_last_sec(number; latest non-longpoll response body read)rpc_gbt_decode_last_sec(number; latest non-longpoll JSON envelope and result decode)rpc_gbt_apply_notify_last_sec(number; latest decoded template through miner notification dispatch)rpc_gbt_apply_notify_max_sec(number)rpc_gbt_apply_notify_count(integer)rpc_submit_last_sec(number)rpc_submit_max_sec(number)rpc_submit_count(integer)rpc_errors(integer)share_errors(integer)rpc_gbt_min_1h_sec(number)rpc_gbt_avg_1h_sec(number)rpc_gbt_max_1h_sec(number)stratum_safeguard_disconnect_count(integer; optional)stratum_safeguard_disconnects(array ofPoolDisconnectEvent; optional)error_history(array ofPoolErrorEvent; optional)
PoolErrorEvent:
at(string; RFC3339; optional)type(string)message(string)
PoolDisconnectEvent:
at(string; RFC3339; optional)disconnected(integer)reason(string; optional)detail(string; optional)
Example:
curl -sS https://STATUS_HOST/api/pool-page | jq .Bitcoin node info snapshot used by /node.
Response object: NodePageData
api_version(string)node_network(string; optional)node_subversion(string; optional)node_blocks(integer)node_headers(integer)node_initial_block_download(boolean)node_connections(integer)node_connections_in(integer)node_connections_out(integer)node_peers(array ofNodePeerInfo; optional)node_pruned(boolean)node_size_on_disk_bytes(integer)node_peer_cleanup_enabled(boolean)node_peer_cleanup_max_ping_ms(number)node_peer_cleanup_min_peers(integer)genesis_hash(string; optional)genesis_expected(string; optional)genesis_match(boolean)best_block_hash(string; optional)
NodePeerInfo:
display(string)ping_ms(number)connected_at(integer; Unix seconds)
Example:
curl -sS https://STATUS_HOST/api/node | jq .Server diagnostics snapshot used by /server.
Response object: ServerPageData
api_version(string)uptime(int; duration nanoseconds)rpc_error(string; optional)rpc_healthy(boolean)rpc_disconnects(integer)rpc_reconnects(integer)accounting_error(string; optional)job_feed(objectServerPageJobFeed)process_goroutines(integer)process_cpu_percent(number)go_mem_alloc_bytes(integer)go_mem_sys_bytes(integer)process_rss_bytes(integer)system_mem_total_bytes(integer)system_mem_free_bytes(integer)system_mem_used_bytes(integer)system_load1(number)system_load5(number)system_load15(number)
ServerPageJobFeed:
last_error(string; optional)last_error_at(string; optional; RFC3339)error_history(array of string; optional)zmq_healthy(boolean)zmq_disconnects(integer)zmq_reconnects(integer)last_raw_block_at(string; optional; RFC3339)last_raw_block_bytes(integer; optional)block_hash(string; optional)block_height(integer; optional)block_time(string; optional; RFC3339)block_bits(string; optional)block_difficulty(number; optional)
Example:
curl -sS https://STATUS_HOST/api/server | jq .Fast “headline stats” endpoint used for the hashrate UI and block timer.
Query parameters:
include_history(optional)2: includephh(quantized compact history for chart priming)
Response object:
api_version(string)pool_hashrate(number)phh(PoolHashrateHistoryQuantized; optional; returned wheninclude_history=2)block_height(integer)block_difficulty(number)block_time_left_sec(integer; signed seconds)-1means “block timer not started yet”<0(other values) means the target interval has been exceeded (overdue)
recent_block_times(array of string; RFC3339)next_difficulty_retarget(object; optional)height(integer)blocks_away(integer)duration_estimate(string; optional; human-readable)
template_tx_fees_sats(integer; optional)template_updated_at(string; optional; RFC3339)updated_at(string; RFC3339)
PoolHashrateHistoryQuantized:
s(integer; start Unix second)i(integer; bucket interval in seconds)n(integer; number of buckets)p(array of uint16; presence bitset)h0(number; hashrate min)h1(number; hashrate max)hq(array of uint16; hashrate q8 values for buckets)
Example:
curl -sS https://STATUS_HOST/api/pool-hashrate | jq .Recent block list.
Query parameters:
limit(optional int;1..100; default10)
Response: JSON array of FoundBlockView objects. Values are censored for safe display.
FoundBlockView:
height(integer)hash(string; censored)display_hash(string; censored)worker(string; censored)display_worker(string; censored)timestamp(string; RFC3339)share_diff(number)pool_fee_sats(integer; optional)worker_payout_sats(integer; optional)confirmations(integer; optional)result(string; optional;"possible","winning", or"stale")
Example:
curl -sS 'https://STATUS_HOST/api/blocks?limit=25' | jq .These endpoints require a valid authenticated user context (unless the daemon is started in local no-auth mode):
GET /api/saved-workersGET /api/saved-workers/historyPOST /api/saved-workers/notify-enabledPOST /api/discord/notify-enabledPOST /api/saved-workers/one-time-codePOST /api/saved-workers/one-time-code/clear
POST /api/auth/session-refresh is also authenticated/validated, but specifically used to establish or refresh the Clerk session cookie from a token.