Back to WayJet

API & Docs

v1· Updated Jul 2026

WayJet is an OpenAI-compatible gateway. Point any OpenAI SDK at the base URL below, use a sk- API key, and call every provider through one unified API.

Multiple providers

OpenAI, Anthropic, Gemini, Groq, and more behind one API.

OpenAI-compatible

Point any OpenAI SDK at the base URL — no code changes.

Streaming

Token-by-token SSE on chat completions out of the box.

Keys & budgets

Scoped keys, per-period spend limits, and usage tracking.

Counts reflect your gateway catalog once models load.

Introduction#

Every request goes to a single base URL. Because the gateway speaks the OpenAI wire format, existing SDKs and tools work unchanged — you only swap the base URL and key.

http://localhost:8080/v1

Authentication#

Authenticate with a bearer token in the Authorization header. Create a sk--prefixed key on the API keys page — the secret is shown only once, so store it somewhere safe.

header
Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxx
Never expose a key in client-side code. Call the gateway from your server, or proxy it.
Create an API key

Quickstart#

Send your first chat completion. Set WAYJET_API_KEY to your API key.

curl http://localhost:8080/v1/chat/completions \
  -H "Authorization: Bearer $WAYJET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "Hello"}]
  }'
Try it in the Playground

Chat completions#

POST /v1/chat/completions — the core endpoint. Requests and responses follow the OpenAI schema; the gateway adds provider and cache_status to the response.

ParameterTypeDescription
model*stringModel id, e.g. gpt-4o
messages*arrayConversation messages (role + content)
streambooleanStream tokens back as server-sent events
temperaturenumberSampling temperature, 0–2 (default 1)
max_tokensintegerMaximum tokens to generate
top_pnumberNucleus sampling probability mass
toolsarrayFunction/tool definitions the model may call
tool_choicestring | objectForce or constrain tool selection
response_formatobjecte.g. { "type": "json_object" } for JSON mode
reasoning_effortstringlow · medium · high (reasoning models)
stopstring | arrayUp to 4 stop sequences
seedintegerBest-effort deterministic sampling
providerstringGateway-only — pin the request to one provider

* required

Streaming#

Set stream: true to receive tokens as server-sent events. Each event is a data: line with a delta; the stream ends with data: [DONE].

curl http://localhost:8080/v1/chat/completions \
  -H "Authorization: Bearer $WAYJET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "Hello"}],
    "stream": true
  }'
# → server-sent events: lines of  data: {...}  terminated by  data: [DONE]

Embeddings#

POST /v1/embeddings — vectorize text for search and RAG. Accepts a string or an array of strings.

curl http://localhost:8080/v1/embeddings \
  -H "Authorization: Bearer $WAYJET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-embedding-3-small",
    "input": "The quick brown fox"
  }'

Audio (speech)#

POST /v1/audio/speech turns text into spoken audio (billed per input character), and POST /v1/audio/transcriptions turns an uploaded audio file into text (billed per audio-minute). Both are OpenAI-compatible.

Text-to-speech

curl http://localhost:8080/v1/audio/speech \
  -H "Authorization: Bearer $WAYJET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "tts-1",
    "input": "The quick brown fox jumped over the lazy dog.",
    "voice": "alloy"
  }' \
  --output speech.mp3

Speech-to-text

Upload the file as multipart/form-data. Set response_format to srt, vtt, or verbose_json for timestamped subtitles instead of plain text.

curl http://localhost:8080/v1/audio/transcriptions \
  -H "Authorization: Bearer $WAYJET_API_KEY" \
  -F "model=whisper-1" \
  -F "file=@audio.mp3" \
  -F "response_format=json"   # json (default) · text · srt · vtt · verbose_json

Models#

GET /v1/models returns the catalog available to your key, each with pricing and capability metadata.

shell
curl http://localhost:8080/v1/models \
  -H "Authorization: Bearer $WAYJET_API_KEY"
Browse all models

CLI tools (Claude Code, Codex)#

The gateway speaks the Anthropic Messages API (POST /v1/messages) and the OpenAI Responses API (POST /v1/responses), so the popular coding CLIs point straight at WayJet and bill through your own key — no proxy, no per-vendor SDK. Point each tool at a model you can call.

Claude Code

Add to ~/.claude/settings.json. The key rides ANTHROPIC_AUTH_TOKEN (or ANTHROPIC_API_KEY as the x-api-key header), and each tier maps to a model of your choice.

~/.claude/settings.json
{
  "hasCompletedOnboarding": true,
  "env": {
    "ANTHROPIC_BASE_URL": "http://localhost:8080",
    "ANTHROPIC_AUTH_TOKEN": "sk-your-key",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "your-opus-squad",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "your-sonnet-squad",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "your-haiku-squad"
  }
}

Codex

Codex uses the OpenAI Responses API by default — no wire_api = "chat" override needed.

~/.codex/config.toml
model = "your-squad"
model_provider = "wayjet"

[model_providers.wayjet]
name = "WayJet"
base_url = "http://localhost:8080/v1"
wire_api = "responses"
~/.codex/auth.json
{
  "auth_mode": "apikey",
  "OPENAI_API_KEY": "sk-your-key"
}

Tip: append :online to a model name for live web search, or pass models: ["fallback"] for automatic fallback.

Errors#

Errors use standard HTTP status codes and an OpenAI-style envelope.

json
{
  "error": {
    "message": "Incorrect API key provided.",
    "type": "authentication_error",
    "code": null,
    "param": null
  }
}
StatusTypeMeaning
200OKThe request succeeded
400invalid_request_errorMalformed request or invalid parameters
401authentication_errorMissing, invalid, or revoked API key
403permission_errorThe key is not allowed to perform this action
404not_found_errorUnknown model or resource
429rate_limit_errorRate limit hit, or a budget was exceeded
500api_errorAn unexpected gateway error
View your usage & rate limits

Endpoints#

The endpoints you can call with an API key. Keys, usage, and budgets are managed from the dashboard.

MethodEndpointDescription
POST/v1/chat/completionsChat completion (streaming + non-stream)
POST/v1/embeddingsCreate embeddings
POST/v1/audio/speechText-to-speech (audio out)
POST/v1/audio/transcriptionsSpeech-to-text (transcription)
GET/v1/modelsList available models
POST/p/{provider}/{path}Provider passthrough (native API)

Changelog#

Notable changes to the public API. The base URL stays /v1 for backward compatibility.

  • Jul 2026CLI tools: use Claude Code (/v1/messages) and Codex (/v1/responses) directly. Web search via :online, request-level models[] fallback, and generation stats (/v1/generation).
  • Jul 2026Audio: text-to-speech (/v1/audio/speech) and speech-to-text (/v1/audio/transcriptions, with srt/vtt/verbose_json formats).
  • Jun 2026Provider passthrough (/p/{provider}) documented; reasoning_effort added.
  • May 2026Embeddings endpoint + JSON mode (response_format) support.
  • Apr 2026Streaming (SSE) on chat completions; provider pinning.