The Inference API
Kataleptic serves frontier open-source and proprietary models from a single OpenAI-compatible endpoint. Drop-in for any OpenAI or OpenRouter client — change the base URL, keep your code.
https://api.kataleptic.com/v1Bearer dg_...OpenAI-compatible JSON / SSEQuickstart
Three minutes from zero to your first token.
- Get a key. Sign up for a free API key — no card required. After confirming your email, you'll receive $2 in prepaid credit.
-
Pick a model. Browse the
models catalogue. Start with
meta/llama-3.3-70b($0.30 / $0.40 per MTok) for day-to-day work. Model IDs are OpenRouter-styleprovider/model(openai/gpt-5.5); the bare name (llama-3.3-70b) works too. - Fire a request. Your existing OpenAI SDK works. Just change the base URL.
curl https://api.kataleptic.com/v1/chat/completions \
-H "Authorization: Bearer $DUGUET_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "meta/llama-3.3-70b",
"messages": [
{ "role": "user", "content": "Hello from Kataleptic." }
]
}'
from openai import OpenAI
client = OpenAI(
base_url="https://api.kataleptic.com/v1",
api_key=os.environ["DUGUET_API_KEY"],
)
resp = client.chat.completions.create(
model="meta/llama-3.3-70b",
messages=[{"role": "user", "content": "Hello from Kataleptic."}],
)
print(resp.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.kataleptic.com/v1",
apiKey: process.env.DUGUET_API_KEY,
});
const resp = await client.chat.completions.create({
model: "meta/llama-3.3-70b",
messages: [{ role: "user", content: "Hello from Kataleptic." }],
});
console.log(resp.choices[0].message.content);
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.kataleptic.com/v1",
apiKey: process.env.DUGUET_API_KEY!,
});
const resp = await client.chat.completions.create({
model: "meta/llama-3.3-70b",
messages: [{ role: "user", content: "Hello from Kataleptic." }],
});
console.log(resp.choices[0].message.content);
Authentication
All requests carry an API key in the Authorization
header, Bearer scheme. Keys start with dg_ and
are shown only once at signup — save them securely.
Authorization: Bearer dg_177984c7a0e3ef28tHi0zHgQXdjYLHdLqm87M3kPmQ6OLSYf
Inspect a key's state (usage, remaining credit, call count) at
GET /v1/auth/key.
$ curl https://api.kataleptic.com/v1/auth/key \
-H "Authorization: Bearer $DUGUET_API_KEY"
{
"data": {
"label": "[email protected]",
"usage": 0.0014,
"limit": 2.00,
"is_free_tier": true,
"rate_limit": { "requests": 500, "interval": "60s" },
"tokens_used": { "prompt": 2431, "completion": 802 },
"calls": 17
}
}
Chat completions
POST /v1/chat/completions — OpenAI-compatible. All
standard parameters are accepted: messages,
temperature, top_p, max_tokens,
stream, stop, seed,
frequency_penalty, presence_penalty.
The response includes OpenRouter-compatible extensions:
provider— the model's real upstream provider (e.g."openai","meta","mistralai")native_finish_reason— upstream raw reason, preserved alongside the normalisedfinish_reasonusage.cost— dollar cost of this call, computed from the per-model price
Request example — with tool use
{
"model": "meta/llama-3.3-70b",
"messages": [
{ "role": "system", "content": "You are a research assistant." },
{ "role": "user", "content": "Summarise the paper at arxiv.org/abs/2401.XXX" }
],
"temperature": 0.3,
"max_tokens": 1024,
"tools": [{
"type": "function",
"function": {
"name": "fetch_url",
"description": "Fetch the text of a URL",
"parameters": {
"type": "object",
"properties": { "url": { "type": "string" } },
"required": ["url"]
}
}
}]
}
Response
{
"id": "chatcmpl-9ecf…",
"object": "chat.completion",
"created": 1776293537,
"model": "meta/llama-3.3-70b",
"provider": "meta",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "…"
},
"finish_reason": "stop",
"native_finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 142,
"completion_tokens": 387,
"total_tokens": 529,
"cost": 0.000197,
"is_byok": false
}
}
Streaming
Pass "stream": true to receive a Server-Sent-Events
stream of chat.completion.chunk objects. The stream
ends with data: [DONE]. All chunks carry
provider and the prefixed model name.
from openai import OpenAI
client = OpenAI(
base_url="https://api.kataleptic.com/v1",
api_key=os.environ["DUGUET_API_KEY"],
)
stream = client.chat.completions.create(
model="mistralai/mistral-large-3",
messages=[{"role": "user", "content": "Write a haiku about inference."}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content or ""
print(delta, end="", flush=True)
Transcription
POST /v1/audio/transcriptions — OpenAI-compatible
multipart upload. Send the audio file and a model id; you get the
transcript back. Billed per minute of audio.
curl https://api.kataleptic.com/v1/audio/transcriptions \
-H "Authorization: Bearer $DUGUET_API_KEY" \
-F model="gpt-4o-mini-transcribe" \
-F file="@meeting.mp3"
gpt-4o-mini-transcribe— the cheapest ($0.0045/min); bulk and background audio.gpt-transcribe— current-generation accuracy ($0.006/min).gpt-4o-transcribe— GPT-4o accuracy with semantic context.gpt-4o-transcribe-diarize— speaker-labelled transcripts for multi-speaker meetings.whisper-large-v2— timestamps and subtitles ($0.0097/min), rate-limited to about 3 requests per minute; see below.
Subtitles and timestamps: the gpt-* models
return json or text only. For
verbose_json (word and segment timestamps),
srt or vtt, use
whisper-large-v2. It is rate-limited to about 3
requests per minute; use gpt-4o-mini-transcribe for
volume. Azure retires it on 2026-12-15, and after
that no model on Kataleptic returns timestamps or subtitles.
For live audio, stream it instead:
gpt-live-transcribe and gpt-realtime-whisper
run as a realtime transcription session at
wss://api.kataleptic.com/v1/realtime?intent=transcription,
returning partial and final transcripts as you speak — see
streaming transcription.
Retiring 2026-10-23: whisper-large-v3-turbo
and the compatibility names whisper-1,
whisper, whisper-large-v3 and
large-v3. Switch to gpt-4o-mini-transcribe
now — see retiring models.
Embeddings
POST /v1/embeddings — OpenAI-compatible. Returns
vector representations suitable for semantic search and RAG.
curl https://api.kataleptic.com/v1/embeddings \
-H "Authorization: Bearer $DUGUET_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nomic-ai/nomic-embed",
"input": "Embeddings map text to vectors for semantic search."
}'
Batching: input accepts an array of strings to
embed in one request.
Retiring 2026-10-23: nomic-embed, the only
embedding model, retires on 2026-10-23 and nothing replaces it.
After that date /v1/embeddings has no model to serve.
Realtime voice
Speech-to-speech over WebSocket at
wss://api.kataleptic.com/v1/realtime — wire-compatible
with the OpenAI Realtime API, so unmodified OpenAI realtime clients
work. Three tiers behind one endpoint: a cascade with
~250 ms to first audio (kataleptic-realtime), HD neural
voices via Azure Voice Live
(kataleptic-realtime-hd), and native speech-to-speech
(gpt-realtime-2.1, plus a -mini volume
tier and the previous gpt-realtime-2).
Full reference: quickstart, the tier comparison,
session.update fields, transcript events, telephony /
G.711, streaming transcription and pricing live on the
Realtime voice page.
Retiring 2026-10-23: the cascade tier
kataleptic-realtime, its Piper voices, and selecting it
with ?model=<chat model>. Move to
kataleptic-realtime-hd or
gpt-realtime-2.1 / gpt-realtime-2.1-mini —
see retiring models.
Models
Fifty-two models — open-source and proprietary chat and reasoning,
image, video, realtime voice, transcription and embeddings. Eleven
of them retire on 2026-10-23; see
retiring models. The full live
list, with prices, is at GET /v1/models; the
models page
describes each one.
Retiring on 2026-10-23
On 2026-10-23 we retire every model we host on our
own GPU, together with the compatibility names that point at them.
They will not be aliased to other models. From that date a request
naming one of them fails with HTTP 410 and
error.code: "model_retired", and the message names the
replacement. The replacements are all live now, so you can switch
today.
| Retiring | Switch to |
|---|---|
qwen3-8b, qwen2.5-coder-7b, gemma3-27b, glm4-9b | Any chat model, e.g. gpt-5.4-mini, llama-3.3-70b or deepseek-v4-flash. |
mistral-nemo-12b | mistral-medium-3.5, or any of the above. |
whisper-large-v3-turbo | gpt-4o-mini-transcribe (cheapest) or gpt-transcribe. For timestamps, SRT or VTT: whisper-large-v2, until Azure retires it on 2026-12-15. |
whisper-1, whisper, whisper-large-v3, large-v3 (compatibility names for the model above) | gpt-4o-mini-transcribe. From 2026-10-23 it is also the default when a transcription request names no model. |
whisper-large-v3-turbo-stream, parakeet-tdt-0-6b-stream, and the /v1/listen endpoint | gpt-live-transcribe or gpt-realtime-whisper in a realtime transcription session. /v1/listen is removed. |
kataleptic-realtime, piper-tts, and /v1/realtime?model=<chat model> | kataleptic-realtime-hd, or gpt-realtime-2.1 / gpt-realtime-2.1-mini. |
gpt-realtime, gpt-4o-realtime*, gpt-audio* on /v1/realtime (compatibility names for the cascade) | gpt-realtime-2.1-mini. From 2026-10-23 it is also the default for a realtime session that names no model. The real ids gpt-realtime-2, gpt-realtime-2.1 and gpt-realtime-2.1-mini are unaffected. |
nomic-embed | No replacement: no embedding model will be offered. |
Rate limits
Free trials: 20 requests / minute and two concurrent requests per account, shared across keys. Paid accounts normally allow 120 requests / minute and eight concurrent requests; individual capacity agreements may differ. Source IP and platform capacity limits also apply. Signup permits five requests per source IP per hour and three confirmation emails per inbox per hour, including Gmail aliases. Free credit is limited to one $2 trial per eligible inbox and a shared daily allocation. If that allocation is full, your confirmation page tells you when to retry.
When a request would exceed the limit, the API returns HTTP
429 with a Retry-After header.
Errors
All errors follow the OpenAI shape:
{
"error": {
"message": "Invalid or missing API key",
"type": "authentication_error"
}
}
| Status | Type | When |
|---|---|---|
400 | invalid_request_error | Malformed body or unsupported parameter. |
401 | authentication_error | Missing, invalid, or disabled API key. |
402 | insufficient_quota | Credit exhausted. Top up via email for now. |
404 | model_not_found | Unknown model id. See /v1/models. |
429 | rate_limit_exceeded | Slow down. |
5xx | upstream_error | A backend provider is misbehaving. We'll tell you which. |
OpenRouter compatibility
Every response body mirrors OpenRouter's extensions: provider,
native_finish_reason, usage.cost,
usage.is_byok. Model IDs use the model's real
upstream provider as an OpenRouter-style prefix —
openai/gpt-5.5, meta/llama-3.3-70b,
mistralai/mistral-large-3 — and the bare name
(gpt-5.5) is accepted too. /v1/models
lists both forms.
If you're migrating from OpenRouter, set
base_url to https://api.kataleptic.com/v1
and adjust model names. That's the whole migration.
Support
One inbox. Answered by the person who wrote this.