Skip to content

API reference

Thibaut Rey edited this page Sep 7, 2026 · 1 revision

🔗 API surface

Authentication

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.

Public endpoints

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.

Responses example

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.

Chat Completions example

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"}]
  }'

Anthropic Messages example

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.

Responses over WebSocket

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.

Realtime voice

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=openai

To 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/calls

This mode is never selected silently as a fallback from a ChatGPT subscription.

Clone this wiki locally