PRISM exposes public challenge routes and internal routes. The public routes are mounted under the /v1 prefix; the internal routes are mounted under /internal/v1 and require internal authentication.
Source: src/prism_challenge/routes.py:25; src/prism_challenge/app.py:64-72; docs/api.md:1-3.
Internal routes are not for miners. Every route under /internal/v1 requires internal authentication (Authorization: Bearer <shared-token>) and is called by the master, the proxy, or the worker — never directly by a miner. They are clearly marked INTERNAL below.
Public routes
POST /v1/submissions
Submit a two-script bundle directly to PRISM. The direct public route uses miner authentication headers (auth_required=True, resolved by authenticate_miner). In production, miner submissions usually enter through the proxy, which uses the internal bridge route instead.
{
"filename": "project.zip",
"code": "<base64 zip payload>",
"metadata": {}
}
Source: src/prism_challenge/routes.py:32-52; docs/api.md:15-31.
GET /v1/submissions/history
Returns daily submission counts over a window (days, default 90).
Source: src/prism_challenge/routes.py:55-67.
GET /v1/submissions/{submission_id}
Returns status and score fields:
{
"id": "...",
"hotkey": "...",
"epoch_id": 123,
"status": "completed",
"code_hash": "...",
"created_at": "...",
"error": null,
"final_score": 0.72,
"anti_cheat_multiplier": 1.0
}
final_score is the challenge-computed prequential bits-per-byte score (a lower bpb yields a higher final_score). status can be pending, running, completed, failed, rejected, or held. The response also carries q_arch, q_recipe, diversity_bonus, and penalty as legacy fields retained for response-schema stability; the live scoring path populates final_score.
Source: src/prism_challenge/routes.py:70-78; docs/api.md:37-61.
GET /v1/leaderboard
Returns submissions ranked by final_score for the current epoch (earliest-commit-wins on a tie, one entry per hotkey). Optional epoch_id query.
Source: src/prism_challenge/routes.py:81-103.
GET /v1/architectures
Legacy family-listing endpoint retained for API compatibility (limit, default 50).
Source: src/prism_challenge/routes.py:106-123; docs/api.md:68-70.
GET /v1/training-variants
Legacy variant-listing endpoint retained for API compatibility. Optional query parameters: architecture_id, limit.
Source: src/prism_challenge/routes.py:126-151; docs/api.md:72-75.
GET /v1/epochs/current and GET /v1/epochs
Return the current epoch id and length, and recent epochs (limit, default 50).
Source: src/prism_challenge/routes.py:154-175.
GET /v1/health/eval-jobs
Returns recent eval-job health entries (id, submission id, level, status, attempts).
Source: src/prism_challenge/routes.py:178-195.
GET /v1/gpu/status
Returns a GPU-lease summary (total GPUs, active leases, by status, by tier).
Source: src/prism_challenge/routes.py:198-219.
Internal routes
All internal routes require Authorization: Bearer <shared-token> and are gated by authenticate_internal. They are part of the subnet integration surface, not the miner API.
POST /internal/v1/bridge/submissions — INTERNAL
Receives subnet-verified submissions forwarded by the proxy. Gated by authenticate_internal. The verified hotkey is supplied by the trusted X-Platform-Verified-Hotkey header; miner-supplied identity headers are not trusted. The body can be raw ZIP bytes or JSON matching SubmissionCreate.
Authorization: Bearer <shared-token>
X-Platform-Verified-Hotkey: <hotkey>
X-Submission-Filename: project.zip
Content-Type: application/zip
Source: src/prism_challenge/app.py:68-86; _bridge_submission_create app.py:91-107; docs/api.md:106-119.
POST /internal/v1/worker/process-next — INTERNAL
Claims and processes one pending submission through the full pipeline: the static gates, the OpenRouter LLM hard gate, the forced-init re-execution, and prequential bits-per-byte scoring. Gated by authenticate_internal.
Source: src/prism_challenge/app.py:64-66; docs/api.md:121-124.
GET /internal/v1/get_weights — INTERNAL
The standard challenge contract route. Returns normalized, dry-run hotkey weights (one per hotkey, from that hotkey’s best final_score). Weights are never written on-chain. The handler is wired into the challenge app via get_weights_fn.
Source: src/prism_challenge/app.py:44-57; src/prism_challenge/weights.py:9-31; docs/api.md:101-104.
Service routes
GET /health returns challenge health metadata, and GET /version returns the challenge version, API version, SDK version, and capabilities.
Source: docs/api.md:7-13.
See Running PRISM for authentication configuration and deployment.