---
title: "LibreChat custom endpoint: uncensored model setup"
canonical: https://uncensoredllm.ai/guides/librechat
generated: 2026-11-09T16:02:05.990Z
source: https://uncensoredllm.ai/guides/librechat
base_url: https://api.uncensoredllm.ai/v1
---

# LibreChat with an uncensored model

One custom endpoint in librechat.yaml: the name, the key from .env, the base URL with /v1, a models.default list of uncensored builds and a small titleModel. The mount, the cost of a chat and the errors.

Steps checked November 6, 2026 · prices as of November 9, 2026

LibreChat takes any OpenAI-compatible API as a custom endpoint in `librechat.yaml`: a name, a key, a base URL and a model list. One block, and the uncensored builds sit in its endpoint selector next to the rest, billed per token. The same ids work in [Open WebUI](https://uncensoredllm.ai/guides/open-webui) and in [OpenCode](https://uncensoredllm.ai/guides/opencode).

## Where the settings are

LibreChat reads `librechat.yaml` from the project root, and a custom endpoint is one item under `endpoints.custom`: a name, a key, a base URL and a model list. The key goes in `.env` and the YAML references it; LibreChat’s docs call the environment-variable reference the recommended form for `apiKey`. Docker users mount the file through `docker-compose.override.yml` and restart.

## Steps

1. Create a key in the [console](https://app.uncensoredllm.ai/console) and put it in `.env` next to `docker-compose.yml`:

```
# .env
UNCENSOREDLLM_API_KEY=sk-ullm-live-…
```

1. Add the endpoint to `librechat.yaml`. The ids under `models.default` are a starting list; any id on the [models page](https://uncensoredllm.ai/models) goes in the same way:

```
# librechat.yaml
version: 1.3.18
cache: true
endpoints:
  custom:
    - name: 'UncensoredLLM'
      apiKey: '${UNCENSOREDLLM_API_KEY}'
      baseURL: 'https://api.uncensoredllm.ai/v1'
      models:
        default:
          - 'glm-5.3-uncensored'
          - 'deepseek-v4-pro-uncensored'
          - 'deepseek-v4.1-flash-abliterated'
          - 'glm-5.3-abliterated'
          - 'glm-5.3-flash-uncensored'
        fetch: false
      titleConvo: true
      titleModel: 'glm-5.3-flash-uncensored'
      modelDisplayLabel: 'UncensoredLLM'
```

1. Keep the mount in the override file, then restart:

```
# docker-compose.override.yml
services:
  api:
    volumes:
      - type: bind
        source: ./librechat.yaml
        target: /app/librechat.yaml
```

`docker compose down && docker compose up -d` reloads the file. The endpoint then appears in the selector under the name you gave it, with the models in `models.default`.

## What each setting does

- name: UncensoredLLM the title in the endpoint selector; required and unique
- apiKey: ${UNCENSOREDLLM_API_KEY} reads the sk-ullm- key from .env; user_provided makes each user paste their own
- baseURL: https://api.uncensoredllm.ai/v1 with the /v1; LibreChat appends /chat/completions itself, so directEndpoint stays unset
- models.default: the ids above the picker, as long as fetch is false; required
- models.fetch: false true would load every model on the key into the picker
- titleConvo, titleModel: glm-5.3-flash-uncensored the automatic chat title and the small model that writes it
- modelDisplayLabel: UncensoredLLM the label beside the AI icon in the chat; "AI" by default

## Picking a model

LibreChat sends the whole conversation on every turn in the OpenAI format, and every build on the models page answers it. The cost column is one turn of 2,000 tokens in and 500 out at the catalog prices on 2026-11-09.

| Model | One turn | One title |
| --- | --- | --- |
| [GLM-5.3 Uncensored](https://uncensoredllm.ai/models/glm-5.3-uncensored) | $0.00099 | $0.0003 |
| [DeepSeek V4 Pro Uncensored](https://uncensoredllm.ai/models/deepseek-v4-pro-uncensored) | $0.0029 | $0.001 |
| [DeepSeek V4.1 Flash Abliterated](https://uncensoredllm.ai/models/deepseek-v4.1-flash-abliterated) | $0.0025 | $0.00088 |
| [GLM-5.3 Abliterated](https://uncensoredllm.ai/models/glm-5.3-abliterated) | $0.0065 | $0.0023 |
| [GLM-5.3 Flash Uncensored](https://uncensoredllm.ai/models/glm-5.3-flash-uncensored) | $0.00039 | $0.00011 |

A first reply on GLM-5.3 Uncensored is $0.00099; with `titleConvo` on, each new chat adds one title request of about 1,000 tokens in and 20 out, $0.0003 on GLM-5.3 Uncensored and $0.00011 on GLM-5.3 Flash Uncensored, which is why the example sets titleModel.

| Model | Build | Input $/M | Output $/M |
| --- | --- | --- | --- |
| [GLM-5.3 Uncensored](https://uncensoredllm.ai/models/glm-5.3-uncensored) glm-5.3-uncensored | Uncensored | $0.282 | $0.846 |
| [DeepSeek V4 Pro Uncensored](https://uncensoredllm.ai/models/deepseek-v4-pro-uncensored) deepseek-v4-pro-uncensored | Uncensored | $0.97 | $1.94 |
| [DeepSeek V4.1 Flash Abliterated](https://uncensoredllm.ai/models/deepseek-v4.1-flash-abliterated) deepseek-v4.1-flash-abliterated | Abliterated | $0.8488 | $1.6975 |
| [GLM-5.3 Abliterated](https://uncensoredllm.ai/models/glm-5.3-abliterated) glm-5.3-abliterated | Abliterated | $2.1825 | $4.365 |
| [GLM-5.3 Flash Uncensored](https://uncensoredllm.ai/models/glm-5.3-flash-uncensored) glm-5.3-flash-uncensored | Uncensored | $0.1053 | $0.3685 |

Prices per million tokens, read from the live catalog on 2026-11-09.

## Check it

From the machine that runs LibreChat, list the models the key can call; every id under `models.default` should be in the answer:

```bash
curl https://api.uncensoredllm.ai/v1/models -H "Authorization: Bearer sk-ullm-live-…"
```

Then send one streamed request the way LibreChat does. `-i` prints the headers: `x-uplink-request-id` names the request for support.

```bash
curl -i https://api.uncensoredllm.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-ullm-live-…" \
  -H "Content-Type: application/json" \
  -d '{"model": "glm-5.3-uncensored", "messages": [{"role": "user", "content": "Reply with the single word ok."}], "stream": true}'
```

If both work and LibreChat does not, the problem is in the YAML or the mount. Check the container log after `docker compose up`.

## Errors and fixes

- The endpoint is missing from the selector: the file is not mounted, or the YAML did not parse. The container log after `docker compose up` names the line.
- `401 invalid_api_key`: the key is wrong or revoked, or the variable name in `.env` does not match the one in `apiKey`.
- `402 insufficient_balance`: the balance does not cover the request. Top up in the console. `402 monthly_limit_reached` means the key hit the monthly spend limit you set on it.
- `404 model_not_found`: an id in `models.default` is not on the models page, or a display name was typed where the id belongs.
- `429 rate_limited`: the key hit its rate limit; every user of one endpoint shares one key and one limit. The response carries `retry-after`.
- Every model on the key shows up in the picker: `fetch` is on. Set it to `false` and keep the list in `models.default`.

## Sources

Field names, the env-var reference, the baseURL convention and the mount are from LibreChat’s own docs, read 2026-11-06: [Custom Endpoint Object Structure](https://www.librechat.ai/docs/configuration/librechat_yaml/object_structure/custom_endpoint) and [Custom Endpoints quick start](https://www.librechat.ai/docs/quick_start/custom_endpoints). Prices are from the live catalog at render.

## Questions

### Where does the LibreChat custom endpoint go?

In librechat.yaml in the project root, under endpoints.custom as one list item with name, apiKey, baseURL and models. Docker users mount the file through docker-compose.override.yml and restart.

### Does the baseURL include /v1?

Yes: https://api.uncensoredllm.ai/v1. LibreChat appends /chat/completions to it, the same way its own OpenAI-compatible examples carry a /v1 base. directEndpoint is for a URL that is already the full completions path.

### Can each LibreChat user bring their own key?

Yes. Set apiKey to user_provided and each user enters a key in the endpoint's settings and pays from their own balance. With an env-var reference, every user of the instance chats on the one key you set.

### Which models are OpenAI compatible?

Every model on the models page: all of them answer /v1/chat/completions in the OpenAI format with the same key, so any id there goes into models.default as it is spelled on the page. See the models page.

### What does LibreChat cost on this key?

LibreChat itself is free software; the tokens are what you pay, at the live prices in the table, from a prepaid balance with no subscription. A small titleModel keeps the title requests cheap.

Every model above is on the [uncensored model list](https://uncensoredllm.ai/models) with its live price per million tokens. [Per-token pricing](https://uncensoredllm.ai/pricing) sets the whole catalog side by side, and the [family directory](https://uncensoredllm.ai/uncensored) groups the builds by base model.

[Get a key](https://app.uncensoredllm.ai/console) Prepaid from $10, no subscription.

## New models and price changes, once a month.

New uncensored builds with their prices, price moves, and what the daily model check found.
