The panel's API. Loopback only: the request must come from a loopback address with a localhost or 127.0.0.1 Host header and (if present) a localhost Origin; anything else gets 403. Never proxy /api/* to a network. JSON in, JSON out; errors are {"error":{"message":"..."}} with a 4xx/5xx status.
Source of truth: router/http/api.mjs and router/http/api-chain.mjs. If this page and the code disagree, the code wins.
The OpenAI-compatible endpoint (/v1/*) is documented in USAGE; the peer protocol (/p2p/*) in PROTOCOL.
{url}: fetches the peer's signed hello and adds it. 400 cannot add peer: ... on failure (protocol mismatch, unreachable, private URL without --allow-private-peers)
DELETE /api/peers/:id
{ok:true}
POST /api/peers/refresh
re-fetch all peers
GET /api/trust
{allowedImages, allowedHw, issuer, audience}
PUT /api/trust
allowedImages: array of sha256:<64 hex>; allowedHw: subset of GCP_AMD_SEV, GCP_INTEL_TDX; jwksInline is test-only and needs ELYRA_ALLOW_TEST_TRUST=1
{upstreams:[{id,name,kind,baseUrl,hasKey,price,models,builtin}]} (keys are never returned, only hasKey)
POST /api/upstreams
{name, baseUrl} required; apiKey?, price? (your cost, USD/MTok, default 0), models?. Without models the node lists them from <baseUrl>/models (400 if it cannot, or if the source reports none). In TEE mode only local sources are accepted
GET /api/upstreams/detect
{found:[...]} probes localhost for Ollama (11434), LM Studio (1234), 8000, 8080
POST /api/upstreams/:id/refresh
re-discover models from the source
DELETE /api/upstreams/:id
remove (the built-in demo engine cannot be removed)
GET /healthz returns {"ok":true,"version","protocol","node","uptime","peersOnline"} and is safe to expose. GET /metrics (Prometheus, loopback only) never contains prompt text.