This page gives prose context for the endpoints integrators reach for first when calling the proxy-router HTTP API (i.e. the API your local node exposes on :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:
See API auth.

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.
HeaderPurpose
session_id (hex32)Required for remote provider routing
Response: 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:
FieldNotes
fileAudio file
s3_presigned_urlPre-signed URL for secure file access
language
response_formatjson / text / srt / verbose_json / vtt
timestamp_granularities[]word / segment
output_content
enable_diarizationBoolean

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 fieldRequiredNotes
sessionDurationyesSeconds
directPaymentoptional
failoveroptional
Response includes sessionID.

Close session

POST /blockchain/sessions/:id/close
Response includes the on-chain transaction hash. Note on refunds: on natural expiration (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
Variant for IDs only: 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 for withdrawUserStakes today. You send a transaction to the Diamond (Inference) contract on Base directly:
Function selector: 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 at proxy-router/docs/swagger.yaml. When your proxy-router is running, the same spec is browsable interactively at http://localhost:8082/swagger/index.html.