Using the Validator & SN Owner APIs
This guide shows how to interact with the two HTTP APIs in the BlockZero subnet: the Validator API (model distribution and checkpoint submission) and the SN Owner Phase API (cycle timing and phase coordination).
SN Owner Phase API
The SN owner runs a lightweight phase service that all participants query to determine the current training phase.
Check the current phase
curl http://<owner_ip>:<owner_port>/get_phase
Response:
{
"block": 54321,
"cycle_length": 45,
"cycle_index": 1207,
"cycle_block_index": 6,
"phase_name": "Train",
"phase_index": 1,
"phase_start_block": 54320,
"phase_end_block": 54339,
"blocks_into_phase": 1,
"blocks_remaining_in_phase": 18
}
Check when the next phase starts
curl http://<owner_ip>:<owner_port>/blocks_until_next_phase
Each entry returns [start_block, end_block, blocks_until].
Get DHT bootstrap peers
curl http://<owner_ip>:<owner_port>/get_init_peer_id
Returns a list of multiaddresses for bootstrapping inter-validator connections.
See the SN Owner Phase API Reference for full endpoint documentation.
Validator API
The validator runs a FastAPI server for model distribution and checkpoint submission. All endpoints except /health require Bearer token authentication.
Health check
curl https://<validator_host>:8080/health
Response:
{
"status": "healthy",
"model_loaded": true,
"current_block": 12345,
"phase": "train"
}
Download your expert group (miners)
During the Distribute phase, miners download their assigned expert group:
curl -H "Authorization: Bearer <BZ_AUTH_TOKEN>" \
-H "X-Expert-Group: 0" \
-H "X-Hotkey: <your_ss58_hotkey>" \
https://<validator_host>:8080/model/partial \
-o expert_group_0.pt
The response includes metadata headers (expert_group, block_number, model_version, content_hash) followed by binary tensor data.
Submit a checkpoint (miners)
During the Submit phase, miners upload their trained checkpoint:
curl -X POST https://<validator_host>:8080/submit \
-H "Authorization: Bearer <BZ_AUTH_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"hotkey": "<your_ss58_hotkey>",
"expert_group": 0,
"checkpoint_url": "https://your-server.com/checkpoint.pt",
"block_number": 12345,
"signature": "<url-safe-base64-ed25519-signature>"
}'
Response (202 Accepted):
{
"status": "accepted",
"submission_id": "550e8400-e29b-41d4-a716-446655440000",
"evaluation_eta_blocks": 5
}
Download the full model (validators)
Peer validators can download the complete model:
curl -H "Authorization: Bearer <BZ_AUTH_TOKEN>" \
https://<validator_host>:8080/model/full \
-o full_model.safetensors
Restricted to registered validators. Returns 403 Forbidden if the requester is not a validator.
Get a specific checkpoint (external clients)
External clients can request model checkpoints, optionally filtered by expert group:
# Full checkpoint
curl -H "Authorization: Bearer <BZ_AUTH_TOKEN>" \
https://<validator_host>:8080/get-checkpoint
# Specific expert group
curl -H "Authorization: Bearer <BZ_AUTH_TOKEN>" \
-F "expert_group_id=0" \
https://<validator_host>:8080/get-checkpoint
# Shared parameters only
curl -H "Authorization: Bearer <BZ_AUTH_TOKEN>" \
-F "expert_group_id=shared" \
https://<validator_host>:8080/get-checkpoint
See the Validator HTTP API Reference for full endpoint documentation.
Common Patterns
Polling for phase transitions
A typical miner or monitoring script polls the phase service to coordinate actions:
import requests
import time
OWNER_URL = "http://<owner_ip>:<owner_port>"
while True:
phase = requests.get(f"{OWNER_URL}/get_phase").json()
print(f"Block {phase['block']}: {phase['phase_name']} "
f"({phase['blocks_remaining_in_phase']} blocks remaining)")
if phase["phase_name"] == "Distribute":
# trigger model download
pass
elif phase["phase_name"] == "Submission":
# trigger checkpoint submission
pass
time.sleep(12) # ~1 block
Authentication
All validator API calls (except /health) require a Bearer token:
Authorization: Bearer <BZ_AUTH_TOKEN>
Set the token via the BZ_AUTH_TOKEN environment variable on the validator. Share this token with authorized miners.