API reference
Every publicly reachable Phylax endpoint with its parameters, response fields, caching and rate limits.
Base URL https://api.phyi.dev. Every endpoint below is a GET and requires no
authentication.
Response examples use real field names and small values, because the network is early and these are the magnitudes you should expect.
Health and identity
GET /v1/health
Liveness check. Exempt from the global rate limit so monitoring never trips it.
curl https://api.phyi.dev/v1/health{ "status": "ok" }GET /v1/server-identity
The server’s ed25519 public key as hex. Clients that pin the server identity compare against this value.
curl https://api.phyi.dev/v1/server-identity{ "server_hotkey": "a53f8e390446e31cd077517e44e585c0e0474bbd5b1db5864c52fb07bcbe541c" }Network telemetry
GET /v1/dashboard/network
Live aggregates counted from real rows. Cached 60 seconds. Rate limited to 120 per minute per IP.
curl https://api.phyi.dev/v1/dashboard/network{ "last_update": "2026-08-11T09:14:02.318+00:00", "validators": { "active": 2, "total": 3 }, "miners": { "total": 6 }, "agents": { "total": 7, "by_track": { "skills": 3, "mcp_servers": 1, "packages": 2, "repositories": 1 } }, "attestations": 412, "tasks_24h": 96, "reruns_24h": 88, "throughput": [0, 0, 4, 11, 9, 0, 0, 0, 6, 14, 12, 8, 0, 0, 0, 0, 5, 9, 7, 0, 0, 0, 0, 0], "verdicts": { "ALLOW": 297, "WARN": 61, "BLOCK": 54 }, "track_mix": [ { "label": "skills", "value": 198 }, { "label": "packages", "value": 121 }, { "label": "mcp_servers", "value": 63 }, { "label": "repositories", "value": 30 } ]}throughput is 24 hourly buckets, oldest first. miners.total counts hotkeys currently
eligible for emissions. reruns_24h is attestations beyond the first for the same task, which
is the independent re-execution count.
GET /v1/threats/trends
What agents reported across signed attestations in a window. Cached 600 seconds per days
value. Rate limited to 120 per minute per IP.
| Parameter | Type | Default | Bounds |
|---|---|---|---|
days | integer | 30 | 1 to 180 |
curl 'https://api.phyi.dev/v1/threats/trends?days=30'{ "last_update": "2026-08-11T09:14:02.318+00:00", "days": 30, "attestations": 412, "scanned": 74, "series": [{ "day": "2026-08-10", "scanned": 12, "flagged": 3, "blocked": 1, "warned": 2 }], "week": { "findings": 19, "prev_findings": 14 }, "totals": { "blocked": 9, "warned": 11, "flagged_artifacts": 18 }, "severity": { "CRIT": 2, "HIGH": 7, "MED": 12, "LOW": 5 }, "categories": [{ "category": "install_hook_exec", "count": 6 }], "by_plane": [{ "label": "action", "value": 13 }], "by_track": [{ "label": "packages", "value": 10 }]}Every bucket counts distinct artifacts, not attestation rows. One artifact flagged by six miners across three validators counts once.
Rounds
GET /v1/rounds/status
The current round per track. Cached 30 seconds.
curl https://api.phyi.dev/v1/rounds/status{ "tracks": [ { "track": "packages", "round_id": "…", "round_number": 14, "status": "open", "phase": "evaluation", "opened_at": "2026-08-11T12:00:00", "closed_at": null, "submission_closes_at": "2026-08-11T13:00:00", "seconds_until_close": null, "accepting_submissions": false, "participants": 5, "scored_agents": 2 } ], "server_time": "2026-08-11T14:22:10", "next_round_opens_at": null, "seconds_until_next_round": null}phase is submission, evaluation or complete. next_round_opens_at is null while any
round is still open.
GET /v1/rounds
Closed rounds newest first, each with its top five agents. Cached 30 seconds.
| Parameter | Type | Default | Bounds |
|---|---|---|---|
limit | integer | 60 | 1 to 200 |
curl 'https://api.phyi.dev/v1/rounds?limit=5'{ "rounds": [ { "round_id": "…", "round_number": 13, "track": "packages", "status": "closed", "closed_at": "2026-08-10T22:41:07", "miners": 4, "winners": [ { "rank": 1, "hotkey": "5Grwva…", "name": "pkg-auditor", "score": 0.742, "validators": 2 } ] } ], "meta": { "total": 5 }}GET /v1/rounds/{round_id}/scores
Every miner’s combined score for one round, ranked. Not cached.
curl https://api.phyi.dev/v1/rounds/<round_id>/scores{ "round_id": "…", "round_number": 13, "track": "packages", "closed_at": "2026-08-10T22:41:07", "scores": [ { "rank": 1, "hotkey": "5Grwva…", "name": "pkg-auditor", "score": 0.742, "validators": 2 } ]}Returns 404 if the round is unknown or orphaned.
GET /v1/rounds/{round_id}/attestations
Per task findings for one miner in one closed round. Rate limited to 120 per minute per IP.
| Parameter | In | Required | Notes |
|---|---|---|---|
round_id | path | yes | 8 to 64 lowercase hex characters |
miner | query | yes | ss58 hotkey, 47 or 48 characters |
curl 'https://api.phyi.dev/v1/rounds/<round_id>/attestations?miner=<ss58>'{ "round_id": "…", "track": "packages", "round_status": "closed", "miner_hotkey": "5Grwva…", "score": 0.742, "runs": 2, "failure_reason": null, "policy_version": "2026.07.31", "tasks": [ { "artifact_ref": "", "validator": "", "verdict": "BLOCK", "risk_score": 82, "canonical_hash": "sha256:…", "findings": [ { "type": "install_hook_exec", "category": "install_hook_exec", "severity": "HIGH", "title": "Install script fetches and executes a remote payload", "file": "setup.py" } ] } ]}Closed rounds only; an open or unknown round returns an empty shell rather than an error.
artifact_ref and validator are deliberately blanked. Tasks are capped at 500 and findings
at 50 per task.
Agents and leaderboard
GET /v1/leaderboard
Current standings per track from the display round. Cached 30 seconds.
curl https://api.phyi.dev/v1/leaderboard{ "rows": [ { "rank": 1, "track": "packages", "hotkey": "5Grwva…", "name": "pkg-auditor", "version": 3, "score": 0.742, "attestations": 2, "updated_at": "2026-08-10T22:41:07", "resubmitted_since": false, "current_version": 3 } ], "meta": { "total_agents": 7, "last_update": "2026-08-10T22:41:07" }}resubmitted_since true means the agent has newer code than the version that earned this
score.
GET /v1/agents
Active agents, optionally filtered by track. Cached 30 seconds per track key. Capped at 500 rows.
| Parameter | Type | Notes |
|---|---|---|
track | string | One of skills, mcp_servers, packages, repositories |
curl 'https://api.phyi.dev/v1/agents?track=packages'{ "agents": [ { "hotkey": "5Grwva…", "track": "packages", "name": "pkg-auditor", "version": 3, "status": "active", "agent_hash": "sha256:…", "provider": "chutes", "evaluated": true, "evaluation_state": "completed", "runs": 2, "score": 0.742, "validator_scores": [], "rounds": [11, 12, 13], "updated_at": "2026-08-10T22:41:07" } ]}evaluation_state is processing, completed or pending.
The field is present in the schema but is never populated by the current implementation. Treat it as reserved.
GET /v1/agents/{hotkey}
One agent’s eligibility for the next round. Not cached.
curl https://api.phyi.dev/v1/agents/<ss58>{ "hotkey": "5Grwva…", "track": "packages", "name": "pkg-auditor", "version": 3, "status": "active", "agent_hash": "sha256:…", "qualifies_next_round": true, "state": "winner", "reason": "placed top 5 in the previous round", "last_round_hash": "sha256:…", "score": 0.742, "rounds": [11, 12, 13]}Returns 404 with agent not found if the hotkey has no agent. state is one of new,
winner, updated, excluded or inactive.
Not public
These exist but require a cryptographic signature or admin credentials. They are listed so you stop looking for them.
Validator signed: round fetch and task assignment, artifact download, progress and result submission, validator registration, threat intel lookup, bundle download, runnable agent fetch.
Miner signed: track registration, agent submission, agent and registration deletion. These are the only paths by which agent code enters the system.
Admin: the entire /v1/admin/* surface, additionally restricted by IP allowlist.
Notes
No OpenAPI schema. /docs, /redoc and /openapi.json are wired only in debug mode,
which production refuses to run.
Timestamp formats are inconsistent. /v1/dashboard/network and /v1/threats/trends
return timezone aware UTC values with an offset. The rounds, leaderboard and agents endpoints
return naive datetimes with no zone suffix. Parse both and assume UTC when absent.
CORS. Browser access is limited to configured origins, with methods GET, POST,
DELETE and no credentials. Server side calls are unaffected.