:8082). The complete schema lives at proxy-router/docs/swagger.yaml and is browsable at http://localhost:8082/swagger/index.html when your node is running.
If you’re looking for the hosted OpenAI-compatible Morpheus product (no node required), that is a separate service — see Inference API overview and apidocs.mor.org.
Authentication
All endpoints require Basic Authentication:Chat completions
POST /v1/chat/completions
OpenAI-compatible chat. The request body is forwarded to the provider; you don’t need a model field — it’s set by the provider based on session_id.
| Header | Purpose |
|---|---|
session_id (hex32) | Required for remote provider routing |
200 OK, text/event-stream (streaming) or application/json.
Audio transcriptions
POST /v1/audio/transcriptions
multipart/form-data. The body is forwarded — any field the provider accepts will pass through. Common fields:
| Field | Notes |
|---|---|
file | Audio file |
s3_presigned_url | Pre-signed URL for secure file access |
language | |
response_format | json / text / srt / verbose_json / vtt |
timestamp_granularities[] | word / segment |
output_content | |
enable_diarization | Boolean |
Audio speech (TTS)
POST /v1/audio/speech
JSON. Common fields: input (required), voice, response_format (mp3/opus/aac/flac/wav/pcm; default mp3), speed.
Embeddings
POST /v1/embeddings
Get providers
GET /blockchain/providers
Query params: offset, limit, order.
Get models
GET /blockchain/models
ModelType is one of LLM, STT, TTS, EMBEDDING, UNKNOWN. Use it to choose the appropriate endpoint family. Full sample response in proxy-router/docs/swagger.yaml.
Open session by model ID
POST /blockchain/models/:id/session
| Body field | Required | Notes |
|---|---|---|
sessionDuration | yes | Seconds |
directPayment | optional | |
failover | optional |
sessionID.
Close session
POST /blockchain/sessions/:id/close
closedAt >= endsAt) your full share is safeTransfer’d back to your wallet inside this same transaction. On early close a slice may be parked in userStakesOnHold with a 1-day timelock — you must call withdrawUserStakes (below) after the timelock to receive it. See Sessions: stake, close, claim for full mechanics.
List sessions for a wallet
GET /blockchain/sessions/user?user=0x…&offset=0&limit=20&order=desc
GET /blockchain/sessions/user/ids?user=0x…. Fetch one: GET /blockchain/sessions/0x<sessionId>.
Claim early-close on-hold balance (no node HTTP route)
There is no proxy-router HTTP route forwithdrawUserStakes today. You send a transaction to the Diamond (Inference) contract on Base directly:
0xa98a7c6b. The caller must be the delegatee allowed for that consumer (usually the same key your consumer node uses). iterations_ (e.g. 20) caps how many releasable on-hold rows to process per call. Read on-hold balance via getUserStakesOnHold(addr, iterations_) — see Where is my MOR? → Bucket 2.
Full schema
The complete OpenAPI schema lives atproxy-router/docs/swagger.yaml. When your proxy-router is running, the same spec is browsable interactively at http://localhost:8082/swagger/index.html.
