sipgate-ai STT

Speech-to-text API. OpenAI- and ElevenLabs-compatible interfaces on the same key — point whichever SDK you already use at this host.

👉 Interactive playground — try batch & realtime transcription in the browser, no setup.

Endpoints

MethodPathAuthWhat
GET/healthznoLiveness check
GET/v1/modelsyesList available models
POST/v1/audio/transcriptionsyesOpenAI-style batch transcription
POST/v1/speech-to-textyesElevenLabs-style batch transcription
WS/v1/realtimeyesOpenAI-style realtime streaming
WS/v1/speech-to-text/realtimeyesElevenLabs-style realtime streaming

Authentication

One API key works for both protocols and all endpoints (except /healthz). Send via whichever header your client library already speaks:

Authorization: Bearer <key>       # OpenAI SDKs
xi-api-key: <key>                 # ElevenLabs SDKs

WebSocket clients that can't set custom headers (browsers) also accept the key via the Sec-WebSocket-Protocol subprotocol entry (bearer.<key>) or the ?api_key= / ?token= query parameter.

Models

Pass the model identifier in the model (OpenAI) or model_id (ElevenLabs) field. Authenticated clients can list the available identifiers via /v1/models. Provider-default names from the OpenAI and ElevenLabs SDKs are accepted without modification.

Realtime streaming (WebSocket)

Two bidirectional WebSocket surfaces — the client streams PCM audio up while the server streams transcripts back. These are not in the Swagger/OpenAPI spec: OpenAPI cannot describe WebSocket endpoints. Both pick a backend from the requested model the same way the batch endpoints do, and authenticate with the same key (see above).

WS /v1/realtime — OpenAI Realtime style

Client → server (JSON text frames):

Server → client (JSON):

WS /v1/speech-to-text/realtime — ElevenLabs Realtime style

Connection config is passed as query parameters:

Client → server (JSON): {"audio_base_64": "<base64 PCM>"} to stream audio, {"commit": true} to finalise (when manual).
Server → client (JSON, discriminated by message_type): session_started, partial_transcript {"text": "…"}, committed_transcript (or committed_transcript_with_timestamps) {"text": "…"}, error.

Quick examples

OpenAI-style batch:

curl -X POST https://stt.sipgate.ai/v1/audio/transcriptions \
  -H "Authorization: Bearer $KEY" \
  -F file=@sample.wav \
  -F language=de \
  -F response_format=verbose_json

ElevenLabs-style batch with raw PCM (skips server-side ffmpeg, lower latency):

ffmpeg -i sample.wav -f s16le -ac 1 -ar 16000 sample.pcm
curl -X POST https://stt.sipgate.ai/v1/speech-to-text \
  -H "xi-api-key: $KEY" \
  -F file=@sample.pcm \
  -F file_format=pcm_s16le_16 \
  -F language_code=deu

WebSocket streaming (ElevenLabs flavour, with websocat):

websocat -t "wss://stt.sipgate.ai/v1/speech-to-text/realtime?\
encoding=pcm_16000&sample_rate=16000&\
commit_strategy=MANUAL&language_code=deu&token=$KEY"

API documentation