Skip to main content
Every HTTP and WebSocket route the VoicEra stack exposes, extracted from the routers. Use this to find a path fast; use /docs on a running API for the always-current schema, request bodies, and response models. The API serves interactive OpenAPI docs at http://localhost:8000/docs and ReDoc at /redoc. Those are generated from the same routers this page was extracted from, so they never drift.
This page is hand-maintained, not generated from a spec — this site has no static OpenAPI file wired into its build. That means it and the per-resource pages under Endpoints can drift from the routers and from each other if one is updated without the other. When you add or change a route, update both this page and its resource page in the same change, and treat /docs on a running API as the tiebreaker if they ever disagree.

Auth column values

The dependencies are defined in apps/api/app/auth.py. Role checks are not dependencies — they are explicit HTTPException raises inside the handler, so a wrong role returns 403, not 401.

API — :8000

Every router below is mounted under settings.API_V1_PREFIX, which defaults to /api/v1 (apps/api/app/config.py). The paths in this table already include that prefix. GET / and GET /health are declared directly on the app in apps/api/app/main.py and are not prefixed. POST /api/v1/calls/inbound and PATCH /api/v1/calls/* take a Bearer token, not X-API-Key, even though the runtime is the usual caller. The runtime obtains that token from POST /api/v1/users/bot/token, which is the one route that trades the internal key for a JWT.

Runtime — :7860

Three routes, all declared in apps/runtime/routes/ and mounted with no prefix (apps/runtime/app.py). Nothing here is authenticated: the runtime trusts the network and the identifiers in the URL.
The runtime authenticates nothing. /answer and /agent/{org_id}/{agent_id} are reachable by anyone who can reach the port, and /answer is the route your telephony provider calls, so it must be publicly resolvable. Put it behind a reverse proxy and restrict by source where you can — see Security hardening.

Model-server gateway — :8100

Declared in model-server/gateway/app/main.py. The gateway is the only published port in the model-server stack; the STT, TTS, and LLM containers are reachable only by service name on the internal network. No route requires authentication. A request to a slot with no model deployed returns 503 with "type": "upstream_not_configured"; a WebSocket route sends a JSON error frame and closes with code 1013.
model-server/README.md states that the LLM slot has never been built or started, so the vLLM flags behind /v1/chat/completions are unverified. Treat that route as untested.