-
-
Notifications
You must be signed in to change notification settings - Fork 6
API reference
| Surface | Authentication |
|---|---|
Dashboard and /admin/*
|
ADMIN_TOKEN through the login session, x-admin-token, or Bearer token |
| Inference, jobs, capacity, Realtime, and WebSocket |
PROXY_API_KEY or an entry from PROXY_API_KEYS/the dashboard; Bearer and x-api-key are accepted |
| Codex project registration |
CODEX_PROJECT_REGISTRATION_TOKEN through x-codex-project-token
|
/health and static dashboard assets |
Unauthenticated |
When no proxy key is configured, inference routes are open. Each application key records its application name in traces and isolates its deferred jobs. Applications still share the provider account pool and quota state; deferred scheduling fairness and result webhooks are configured per application.
/v1 is not reverse-proxied through Express in the native profile. Rust reads
the shared account store, performs authentication, routing, protocol
conversion, streaming, and upstream selection itself. Requests outside /v1
are forwarded by the edge to the loopback Node control plane.
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/v1/models, /v1/models/:id
|
Discovered models and enabled aliases |
POST |
/v1/responses |
OpenAI Responses; JSON, SSE, or WebSocket |
POST |
/v1/responses/compact |
Responses compaction |
POST |
/v1/chat/completions |
OpenAI Chat Completions; JSON or SSE |
POST |
/v1/messages |
Anthropic Messages compatibility; JSON or SSE |
POST |
/v1/realtime/calls |
Realtime WebRTC SDP negotiation |
GET |
/v1/realtime/voices, /v1/settings/voices
|
ChatGPT voice eligibility and catalog |
GET |
/v1/capacity, /v1/capacity/events
|
Application-visible capacity snapshot and resumable SSE |
GET/DELETE
|
/v1/jobs/* |
Deferred job state, events, results, and cancellation |
Inference and model routes are also exposed without /v1. Discovery
compatibility routes include /api/v1/models, /api/tags, /version,
/props, and /v1/props.
The model IDs in the examples are illustrative. Replace them with a model or
enabled alias returned by your own GET /v1/models response.
curl -X POST http://localhost:1455/v1/responses \
-H "Authorization: Bearer $MULTIVIBE_API_KEY" \
-H "content-type: application/json" \
-d '{
"model": "gpt-5.3-codex",
"input": "Explain quota-aware routing in one sentence."
}'Set "stream": true and use curl -N for SSE.
curl -X POST http://localhost:1455/v1/chat/completions \
-H "Authorization: Bearer $MULTIVIBE_API_KEY" \
-H "content-type: application/json" \
-d '{
"model": "gpt-5.3-codex",
"messages": [{"role": "user", "content": "Hello"}]
}'curl -X POST http://localhost:1455/v1/messages \
-H "x-api-key: $MULTIVIBE_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "gpt-5.3-codex",
"max_tokens": 512,
"messages": [{"role": "user", "content": "Hello"}]
}'MultiVibe maps Anthropic text, images, tools, tool results, usage, errors, and stream events to the selected upstream dialect.
Connect to ws://localhost:1455/v1/responses, authenticate during the upgrade,
and send Codex-style response.create frames:
import WebSocket from "ws";
const ws = new WebSocket("ws://localhost:1455/v1/responses", {
headers: { Authorization: "Bearer " + process.env.MULTIVIBE_API_KEY },
});
ws.on("open", () => {
ws.send(JSON.stringify({
type: "response.create",
model: "gpt-5.3-codex",
input: [{ role: "user", content: [{ type: "input_text", text: "Hello" }] }],
stream: true,
}));
});WebSocket transport is available for /responses only.
This is a Node.js example using the installed ws package; browser WebSocket
clients cannot attach the required authorization header during the handshake.
MultiVibe proxies the native multipart SDP handshake; audio then flows directly over the negotiated WebRTC connection. By default it selects an eligible OpenAI/ChatGPT account:
REALTIME_PROVIDER=openaiTo use a billed OpenAI-compatible Realtime API account, opt in explicitly:
REALTIME_PROVIDER=openai-compatible
REALTIME_WEBRTC_CALL_URL=https://api.openai.com/v1/realtime/callsThis mode is never selected silently as a fallback from a ChatGPT subscription.