Docs
One API for the OpenAI and Anthropic SDKs. Point yours at Lutheos and keep the rest of your code.
https://lutheos.com/v1 
Quick start
-
Create a key
Sign in and create an
lrsk-key in the dashboard. -
Set the base URL
https://lutheos.com/v1for the OpenAI SDK,https://lutheos.comfor the Anthropic SDK. -
Send a request
Name a model from the list. Set
streamto true to stream.
curl https://lutheos.com/v1/chat/completions \ -H "Authorization: Bearer lrsk-your-key" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-v4.1-flash-abliterated", "messages": [{"role": "user", "content": "Hello!"}], "stream": true }'from openai import OpenAI client = OpenAI( api_key="lrsk-your-key", base_url="https://lutheos.com/v1",) stream = client.chat.completions.create( model="deepseek-v4.1-flash-abliterated", messages=[{"role": "user", "content": "Hello!"}], stream=True,) for chunk in stream: print(chunk.choices[0].delta.content or "", end="")import OpenAI from "openai"; const client = new OpenAI({ apiKey: "lrsk-your-key", baseURL: "https://lutheos.com/v1",}); const stream = await client.chat.completions.create({ model: "deepseek-v4.1-flash-abliterated", messages: [{ role: "user", content: "Hello!" }], stream: true,}); for await (const chunk of stream) { process.stdout.write(chunk.choices[0]?.delta?.content ?? "");}Your key and the base URL
Authentication
Send your key with every request, as a bearer token or in x-api-key.
Keys start with lrsk-.
- OpenAI SDK base URL Any OpenAI-compatible client.
https://lutheos.com/v1- Anthropic SDK base URL The SDK adds /v1/messages itself.
https://lutheos.com- Bearer header What OpenAI-compatible clients send.
Authorization: Bearer lrsk-…- x-api-key header What the Anthropic SDK sends.
x-api-key: lrsk-…
Endpoints
Three paths on lutheos.com. The OpenAI SDK reaches
them from its base URL; the Anthropic SDK adds /v1/messages itself.
- POST
/v1/chat/completionsChat, in the OpenAI format. - POST
/v1/messagesMessages, in the Anthropic format. - GET
/v1/modelsThe models your key can call.
In the Anthropic format
from anthropic import Anthropic client = Anthropic( api_key="lrsk-your-key", base_url="https://lutheos.com",) message = client.messages.create( model="deepseek-v4.1-flash-abliterated", max_tokens=1024, messages=[{"role": "user", "content": "Hello!"}],) print(message.content[0].text)curl https://lutheos.com/v1/messages \ -H "x-api-key: lrsk-your-key" \ -H "anthropic-version: 2023-06-01" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-v4.1-flash-abliterated", "max_tokens": 1024, "messages": [{"role": "user", "content": "Hello!"}] }'Models
Open models on our partner's GPUs, with zero data retention. Pass the ID as model.
DeepSeek V4.1 Flash 1017 Abliterated
Refusals removed
deepseek-v4.1-flash-abliterated1M context · $0.08 in · $0.32 out per 1M tokens
Refusals kept
deepseek-v4.1-flash1M context · $0.08 in · $0.32 out per 1M tokens
GET /v1/models with your key lists the IDs it can call. More on the models list.
Streaming
Set stream to true and the reply arrives as server-sent events, in the
endpoint's own format: chat completion chunks from /v1/chat/completions,
Messages events from /v1/messages. Both SDKs read them for you, as in the
quick start.
Errors
An error comes back as an HTTP status and a JSON body in the endpoint's format, with an x-request-id header to quote if you write to us.
{ "error": { "message": "Invalid API key.", "type": "authentication_error", "param": null, "code": "invalid_api_key" }}| Status | Code | What to do |
|---|---|---|
| 400 | missing_model, invalid_body | Check the body: it needs a model and messages. |
| 401 | missing_api_key, invalid_api_key | Check the key you sent. |
| 402 | insufficient_credit | Top up your balance in the dashboard. |
| 429 | rate_limited | Wait the seconds in Retry-After, then retry. |
| 502, 503 | upstream_failed, no_supply | Nothing was charged. Retry with backoff. |