Checked September 22, 2026

Uncensored AI API with an OpenAI compatible endpoint

The LU Labs inference API speaks the OpenAI chat completions shape, so any OpenAI SDK or client works once you change the base URL to https://lu-labs.ai/api/inference/v1 and pass an lu_ key. One key reaches all 47 hosted chat models, and we add no moderation layer of our own on text. Credits start at 15 EUR with no subscription.

We build Locally Uncensored, the open source AI studio that runs models on your own machine. The hosted side at LU Labs exists for the models a single card cannot hold, and this page is about reaching it from your own code instead of from the chat window. What uncensored AI means on each route is set out on its own page.

Endpoint and authentication

The base URL is https://lu-labs.ai/api/inference/v1. Two routes live under it: POST /chat/completions answers, and GET /models returns the catalogue. Both take the key as a Bearer token in the Authorization header.

Keys are made in your LU Labs account, in the section "Cloud API keys", with the button "Create API key". The desktop app links there from Settings, General, Cloud API Keys. A key starts with lu_ and is shown exactly once, with the warning "Copy this key now. It will never be shown again." Up to five keys can be active at a time, and "Revoke this key" ends one. A key can spend credits and nothing else: it can never read or change the account behind it, so handing one to a script or a server is a bounded risk.

One thing to plan for before you write the billing side of your app: a key always draws credits at the model's rate. The Flash allowance that makes some models cost nothing inside the apps on an active paid plan does not apply to API traffic, Flash model or not. Read the cloud chapter of the handbook if you want the full wording as the app states it.

Code examples

The model id is the string the catalogue uses, passed through verbatim. Here is deepseek-ai/DeepSeek-V3.2, the everyday default, with curl:

curl https://lu-labs.ai/api/inference/v1/chat/completions \
  -H "Authorization: Bearer $LU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-V3.2",
    "messages": [{"role": "user", "content": "Write the opening of a noir scene."}]
  }'

The same call with the Python openai package, which needs only the base_url changed:

from openai import OpenAI

client = OpenAI(
    api_key="lu_your_key_here",
    base_url="https://lu-labs.ai/api/inference/v1",
)

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V3.2",
    messages=[{"role": "user", "content": "Write the opening of a noir scene."}],
)
print(resp.choices[0].message.content)

And in Node, with the official SDK:

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.LU_API_KEY,
  baseURL: "https://lu-labs.ai/api/inference/v1",
});

const stream = await client.chat.completions.create({
  model: "deepseek-ai/DeepSeek-V3.2",
  messages: [{ role: "user", content: "Write the opening of a noir scene." }],
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

Responses stream by default. Send "stream": false when you want the whole answer in one JSON body instead.

Which models are behind the key

All 47 chat models are reachable from every entitlement. There is no per plan model boundary: a 15 EUR credit pack sees the same list as Hosted Max, and upgrading buys credit volume rather than access. The numbers below are credits per output token, and the No refusals column comes from the measurement of 2026-09-10 described on the cloud page, where 24 of the 46 models measured answered an explicit adult fiction request in full.

Model idWhat it isCredits per output tokenNo refusals
Sao10K/L3-8B-Lunaris-v1-Turbosmall roleplay fine tune, lowest rate in the list0.005yes
openai/gpt-oss-120bopen weight reasoner, cheap per token0.017not marked
google/gemma-4-26B-A4B-itsmall generalist, reads images0.034yes
deepseek-ai/DeepSeek-V3.2the everyday default in the picker0.038yes
Gryphe/MythoMax-L2-13bthe old character writing standby0.04yes
NousResearch/Hermes-3-Llama-3.1-70Binstruction fine tune, steerable0.07yes
meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8mixture of experts, reads images0.08yes
Sao10K/L3.1-70B-Euryale-v2.2the 70B people pick for long scenes0.085no
NousResearch/Hermes-3-Llama-3.1-405Bthe 405B version of the same line0.1yes
Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbocoding focused, large context0.1yes
MiniMaxAI/MiniMax-M3generalist with a thinking toggle0.11yes
moonshotai/Kimi-K2.6the mid-size Kimi, reads images0.35yes
zai-org/GLM-5.3native reasoner with an effort ladder0.4no
Qwen/Qwen3.8-Maxthe largest Qwen instruct entry0.4951not marked
Qwen/Qwen3.8-2.4T-A95Bopen weight flagship reasoner0.6yes
moonshotai/Kimi-K3the heavyweight, images, 1M context1.425no

"Not marked" means the model was not part of the measured set or could not be scored, not that it refuses. Call GET /models for the authoritative current list, and see the model table and calculator for context windows, image input and reasoning controls per model.

Tool calls and agents

Tool definitions work on every chat model in the catalogue. Most of them take the tools parameter natively. For the roleplay fine tunes such as Lunaris, MythoMax, Hermes and Euryale, the upstream API refuses a tools payload, so the proxy translates your tool definitions into the prompt convention those models were trained on and parses the calls back out. Your client sends the same OpenAI shaped request either way. That is why agent and coding workflows are not limited to the well behaved models, which was the usual trade before.

The transport is an API layer detail, not a capability difference you configure. A model's tool transport is listed in the current model table alongside its context and reasoning controls.

Using it in SillyTavern, Aider, LibreChat, OpenClaw or curl

In SillyTavern, switch the API to Chat Completion, choose Custom (OpenAI-compatible) as the source, put https://lu-labs.ai/api/inference/v1 in the custom endpoint field and your lu_ key in the API key field, then connect and pick a model from the list it pulls.

In Aider, set OPENAI_API_BASE to the base URL and OPENAI_API_KEY to your key, then name the model on the command line. LibreChat takes the same pair as a custom endpoint in its config. OpenClaw and any other client with a custom OpenAI compatible provider field want exactly the same two values. For curl, the example above is the whole setup.

Limits and billing

Chat is capped at 60 requests per minute per account, which is a burst limit rather than a quota. Past that, your balance decides how long you keep going. Credit packs cost 15 EUR for 450,000 credits, 35 EUR for 1,100,000, 75 EUR for 2,400,000, 125 EUR for 4,050,000 and 300 EUR for 9,750,000. Any pack is available from the first purchase and pack credits never expire. If you prefer a subscription, Hosted is 19 EUR a month with 900,000 credits, Hosted Pro is 49 EUR with 2,350,000 and Hosted Max is 99 EUR with 5,000,000. Chat, image and video all draw on the same wallet.

We do not train on user data and we never sell it. Accounts and billing sit in the EU. A hosted request leaves your machine, which is what hosted means, and no wording on this page changes that. The full ladder is on the pricing page.

Check packs and estimated usage

What the API does not do

There is no image or video route under the endpoint. Only chat completions and the model list exist, so an /images/generations call has nothing to reach. Picture and clip generation run in the app and in the browser studio instead, where the account's own content policy setting applies: details of the image models are on the image generation page and of the video models on the video generation page. Embeddings, audio and fine tuning are not part of this endpoint either.

The catalogue is curated, so you cannot point a key at a checkpoint of your own. What a request may contain is decided server side and stays decided there: material involving minors is refused on every request without exception, photographs of real identifiable people need that person's consent, and the Terms of Service apply to API traffic exactly as they do in the app.

Fully local instead

If a hosted request is the wrong shape for your work, the desktop app for Windows and Linux is free and AGPL-3.0, and it runs whatever model you install on your own hardware, including abliterated builds. It also carries its own OpenAI compatible server: Settings, Voice & Remote, Local API starts one on port 8129 for every model on the machine, guarded by a token every request must carry, with a switch that decides whether the rest of your LAN may reach it. That is the same client integration story as above with nothing leaving the building.

The background on abliterated weights and what they actually change is in the abliterated models guide, and the offline setup route is in how to run uncensored AI locally. If you want the browser chat window rather than an endpoint, that is uncensored AI chat online. For how the hosted side compares with another provider, see LU Labs against Venice. What uncensored AI means, local and online covers the word itself on both sides.

FAQ

Is the API uncensored?

On text we add no moderation layer of our own, so a model answers the way it was trained. That is narrower than a promise that every model says everything: a fine tune trained to decline still declines. Of the 46 cloud chat models we measured on 2026-09-10, 24 answered an explicit adult fiction request in full, and only those carry the No refusals mark.

Which models can a key reach?

All 47 chat models in the catalogue. There is no per plan model boundary: a 15 EUR credit pack reaches the same list as Hosted Max. Plans and packs differ by credit budget, never by access. GET /api/inference/v1/models returns the current list.

Do API keys get the daily Flash allowance?

No. The Flash allowance of 500,000 combined input and output tokens per account per UTC day applies to app sessions on an active paid plan. A request through an API key always uses credits, Flash model or not.

Is it OpenAI compatible?

Yes. The endpoint speaks the OpenAI chat API. Point any OpenAI SDK or client at the base URL https://lu-labs.ai/api/inference/v1 and pass your lu_ key as the API key. POST /chat/completions answers and streams by default, and GET /models lists the catalogue.

Do you log prompts or train on them?

There is no training on user data and it is never sold. Accounts and billing are in the EU. A hosted request does leave your machine by definition, which is what hosted means, so if that is unacceptable for your work, run the free desktop app on your own hardware instead.

Can I use it with SillyTavern?

Yes. In SillyTavern pick Chat Completion, then Custom (OpenAI-compatible) as the source, enter https://lu-labs.ai/api/inference/v1 as the custom endpoint and your lu_ key as the API key, then connect and choose a model. The same settings work in Aider, LibreChat, OpenClaw and plain curl.

Are there rate limits?

Chat is limited to 60 requests per minute per account. Media jobs are limited to 30 per minute and uploads to 60 per minute, though those run in the app rather than through this endpoint. Beyond the burst limit, your credit balance is the constraint.

What is blocked everywhere?

Material involving minors is refused on every request, at every setting, with no exception. You may not upload a photograph of a real, identifiable person without their consent. The Terms of Service apply to API traffic exactly as they apply in the app.

47 hosted chat models behind one OpenAI compatible base URL, no moderation layer from us on text, credits from 15 EUR with no subscription.

Get credits and a key

Prefer everything offline? The desktop app is free, AGPL-3.0, Windows and Linux.

Current Hosted offer

Hosted includes 11 Flash models; Pro and Max include 12. Up to 500,000 combined input and output tokens per account per UTC day in app sessions. GLM 5.3 Flash uses credits on Hosted and joins the daily allowance on Pro and Max. API keys always use credits.

EUR 19/month, 900,000 shared monthly credits: up to 900 Neta Lumina Spicy images or 90 five-second LTX 2.3 Spicy clips. Every output spends the same wallet.

Each maximum spends the entire shared monthly wallet on one model. These are alternatives, not separate allowances. Input-image generation, character training, LoRA routes and additional operations cost extra. Spicy video uses an input image and five-second clips. Failed jobs and changing catalog prices can affect results.

Image models and exact quantities · Video models and exact quantities · Venice comparison · Current facts JSON