Skip to content

Docs

One API for the OpenAI and Anthropic SDKs. Point yours at Lutheos and keep the rest of your code.

Base URL https://lutheos.com/v1
Peter Paul Rubens, The Fall of Phaeton (detail), c. 1604–08. National Gallery of Art, Washington.

Quick start

  1. Create a key

    Sign in and create an lrsk- key in the dashboard.

  2. Set the base URL

    https://lutheos.com/v1 for the OpenAI SDK, https://lutheos.com for the Anthropic SDK.

  3. Send a request

    Name a model from the list. Set stream to 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  }'

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/completions Chat, in the OpenAI format.
  • POST /v1/messages Messages, in the Anthropic format.
  • GET /v1/models The 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)

Models

Open models on our partner's GPUs, with zero data retention. Pass the ID as model.

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 body
{  "error": {    "message": "Invalid API key.",    "type": "authentication_error",    "param": null,    "code": "invalid_api_key"  }}
StatusCodeWhat to do
400missing_model, invalid_bodyCheck the body: it needs a model and messages.
401missing_api_key, invalid_api_keyCheck the key you sent.
402insufficient_creditTop up your balance in the dashboard.
429rate_limitedWait the seconds in Retry-After, then retry.
502, 503upstream_failed, no_supplyNothing was charged. Retry with backoff.