How to use Darkbloom with Open WebUI

Updated · Checked with Open WebUI 0.12.3 on

Short answer: yes. In Open WebUI, open Settings, click Connections under the Admin heading, click the gear beside the OpenAI connection, set its URL to https://api.darkbloom.dev/v1, paste your Darkbloom key and save. Open WebUI then lists Darkbloom’s models in its model picker. By default it also sends about 5,800 tokens of built-in tool definitions with every message and makes three extra background requests after the first one, so our one-line first message cost about $0.0005, and the cost section shows how to cut that. Darkbloom runs open-weight models on Macs and is a public alpha, so start with a small test.

At a glance

ItemValue
Base URLhttps://api.darkbloom.dev/v1
KeyCreated on the API console page of the Darkbloom console. Open WebUI stores it as plain text in its own database, and any admin account can reveal it.
BillingPrepaid credits, charged per token, with a minimum of $0.0001 per request. Minimum deposit $0.50 (Darkbloom docs).
Model in Open WebUIChosen in the model picker, which lists Darkbloom’s models by name, for example Gemma 4 26B (ID gemma-4-26b)
Tested withOpen WebUI 0.12.3 on October 23, 2026
Darkbloom statusPublic alpha (Darkbloom console)
Where to set itSettings, then Connections under the Admin heading: edit the OpenAI connection that Open WebUI starts with. Open WebUI has no Darkbloom choice.

How do I use Darkbloom with Open WebUI?

Open WebUI’s connection form has no Darkbloom choice. It does not need one: its OpenAI connection takes any web address that answers OpenAI’s API, and Darkbloom does. So you edit the connection that Open WebUI starts with, https://api.openai.com/v1, so that it points at Darkbloom. The steps below describe Open WebUI 0.12.3, which we ran in Docker on our own machine. Menu names can differ in other versions, and we did not run the pip, Kubernetes or desktop installs.

  1. Get a Darkbloom API key. Open the Darkbloom console and sign in, add credits (the minimum is $0.50, and Darkbloom says credits are non-refundable and never expire), then choose API console in the console’s left menu and Create API key (Darkbloom’s docs call this page Settings → API Keys). The console shows the key only once, so copy it right away. Every key spends from your prepaid balance, so add only what you are willing to spend while you test, and watch your first chats, because Open WebUI sends several requests for one message.
  2. Start Open WebUI. If you already run it, skip to step 4. Otherwise install Docker, make a secret with openssl rand -hex 32, and run the command from Open WebUI’s docs with that secret in place of your-secret-key. Then open http://localhost:3000 in your browser. The first start took 20 to 32 seconds on our machine, and once 99 seconds when the machine was busy, so give it a minute or two.
    The command in Open WebUI’s docs
    docker run -d -p 3000:8080 \
      --add-host=host.docker.internal:host-gateway \
      -v open-webui:/app/backend/data \
      -e WEBUI_SECRET_KEY=your-secret-key \
      --name open-webui --restart always \
      ghcr.io/open-webui/open-webui:main
  3. Create the admin account. The first screen says Welcome to your AI home. Click Get started, enter a name, an email address and a password, and click Create Admin Account. The first account is the administrator, and it exists only on your machine. A What's New in Open WebUI box opens next: click Okay, Let's Go!.
  4. Open the connections page. Click your avatar at the bottom left and choose Settings. In the list on the left of the Settings window, find the Admin heading and click Connections under it.
  5. Point the OpenAI connection at Darkbloom. The page lists one connection under Manage OpenAI API Connections, with the address https://api.openai.com/v1. Click the gear beside it. In the Edit Connection window, replace the address in URL with the one below, leave Auth on Bearer, and paste your key into the box beside it. Leave API Type on Chat Completions.
    URL
    https://api.darkbloom.dev/v1
    API Key
    YOUR_DARKBLOOM_API_KEY
  6. Test the connection, then save it. Saving does not test a connection, so click the icon of two circular arrows beside the URL first. Server connection verified means Darkbloom accepted the key. OpenAI: invalid API key means the key is wrong, and OpenAI: Network Problem means the URL is not Darkbloom’s address. Then click Save in the window, and Save again at the bottom right of the page. OpenAI API settings updated confirms it.
  7. Send a message. Close Settings. You land on a new chat, and if you do not, click the pencil icon at the top of the narrow bar on the left. Open WebUI chose Gemma 4 26B for us. To choose another model, click the model name at the bottom right of the message box. Type Say hello in five words. and press Enter. The reply appears, and then Open WebUI makes up to three more requests: a title for the chat in the sidebar, follow-up suggestions under the reply, and tags.
  8. Optional: switch off what you do not use. In Settings, click the second Interface in the left list, the one under the Admin heading. Under Generation, switch off Title Generation, Follow Up Generation and Tags Generation, starting with the lowest, because the rows below a switch move up when you turn it off. Click Save at the bottom right. Then click Models under Admin, open Model Defaults, Model Capabilities and Builtin Tools, switch off the tools you do not use and click Save. The cost section shows what each switch saves.

What does each setting in Open WebUI mean?

The first rows are the fields of the connection and the rest are the admin settings that mattered when we tested. We left every setting that is not listed at its default.

SettingWhat to enter, and what it does
Connection: URLhttps://api.darkbloom.dev/v1. Open WebUI adds /models for the test and the model list, and /chat/completions for chats. A trailing slash made no difference. Without /v1, or with a mistyped host, the test says OpenAI: Network Problem.
Connection: Auth and API KeyLeave Auth on Bearer, as Open WebUI presets it, and paste your Darkbloom key. Open WebUI sends it as Authorization: Bearer <key> (checked with a test server). The key shows as dots, and the eye icon beside it shows the text. We did not try the other Auth choices (None, Session, OAuth and Entra ID).
Connection: API TypeChat Completions, as preset: Open WebUI sends POST /v1/chat/completions. Responses makes it send POST /v1/responses instead. Darkbloom accepted that, and a chat, its title, its follow-ups and its tags all worked, but Darkbloom’s docs describe only chat completions, so the steps leave it alone.
Connection, Advanced: Model IDsEmpty as preset: Open WebUI lists every model that Darkbloom returns, by Darkbloom’s name. To list only some, type an ID, click +, repeat for the next one and save. The picker then shows exactly those IDs, written as IDs and not as names. This hides models that your key may not use.
Connection, Advanced: Forward cookies, Headers, Passthrough params, Prefix ID, Provider and TagsLeft as preset (off, empty, and Default). Forward cookies would send your Open WebUI cookies to the server of this connection, which is Darkbloom, so keep it off. We did not try the other Provider choices.
Admin, Interface: Title Generation, Follow Up Generation and Tags GenerationOn as preset, and each is a separate request to Darkbloom. Click Save at the bottom right after you change them. With all three off, a message made one request.
Admin, Interface: External Task ModelCurrent Model as preset, which runs the three background requests on the model you chat with. Choose another model here to run them on that one. With gemma-4-26b chosen, the title and follow-up requests ran on it while the chat stayed on a different model.
Admin, Interface: Tool SearchOff as preset, and marked experimental. On, Open WebUI sent 13 tool definitions instead of 36, and the message was 2,248 tokens in instead of 5,799.
Admin, Models, Model Defaults, Model Capabilities: Builtin Tools36 tool definitions go with every chat message while the 17 switches are on, as preset. With all 17 off, the message was 25 tokens in. Switch off only what you do not use.
Admin, Models, Model Defaults, Model Parameters: max_tokensDefault as preset: Open WebUI sends no limit, so Darkbloom adds its own default of 8192 (Darkbloom docs). Click Default to change it to Custom, type a number and save. With 1000, the chat request carried max_tokens: 1000. The title request always carries its own limit of 1000.
Admin, Connections: Ollama APIOn as preset, with the address http://host.docker.internal:11434. With no Ollama on your machine it only adds a line to the log (see the errors table). We left it on.

Which Darkbloom model should I use with Open WebUI?

Use any ID that GET /v1/models returns. On October 23, 2026 it listed 12 models, shown here from the cheapest output price up, in US dollars per million tokens. Check the live prices before you rely on a number; that public list also names models that are not online. A key can be limited to some models, and Darkbloom refuses any other with a 403 (see the errors table).

Model IDContext window, tokensInput, $ per million tokensOutput, $ per million tokensFeatures Darkbloom lists
gpt-oss-20b131,072$0.018$0.09none listed
nvidia-nemotron-3.5-lightning262,144$0.025$0.12tools, reasoning
EigenLabs/Ternary-Bonsai-2-9B-MLX-2bit262,144$0.08$0.13tools, reasoning
Qwen3.5-9B262,144$0.08$0.13tools, image input
glm-5.3-flash262,144$0.065$0.18tools, reasoning, image input
gemma-4-26b131,072$0.042$0.22tools, reasoning, json mode, image input
mimo-v2.6-flash-mopd1,048,576$0.10$0.28tools, reasoning
nvidia-nemotron-3.5-super262,144$0.075$0.35tools, reasoning, json mode, image input
ternary-bonsai-2-27b262,144$0.075$0.50tools, reasoning, image input
qwen3.6-35b-a3b-vl-mtp-mxfp8262,144$0.05$0.70tools, image input
qwen3.5-35b-a3b262,144$0.065$0.75tools, image input
EigenLabs/Qwen3.8-27B-4bit-mtp262,144$0.035$2.20tools, image input

Open WebUI lists models by the name Darkbloom gives them, not by their ID, so gemma-4-26b appears as Gemma 4 26B. If another tool or an error message asks for the ID, use the second column of this table.

Name in Open WebUIModel ID
GPT-OSS 20Bgpt-oss-20b
Nemotron 3.5 Lightningnvidia-nemotron-3.5-lightning
Ternary Bonsai 2 9BEigenLabs/Ternary-Bonsai-2-9B-MLX-2bit
Qwen 3.5 9BQwen3.5-9B
Z.ai: GLM-5.3-Flashglm-5.3-flash
Gemma 4 26Bgemma-4-26b
Xiaomi: MiMo-V2.6-Flashmimo-v2.6-flash-mopd
NVIDIA: Nemotron 3.5 Supernvidia-nemotron-3.5-super
PrismML Bonsai 2 27Bternary-bonsai-2-27b
Qwen 3.6 35B A3Bqwen3.6-35b-a3b-vl-mtp-mxfp8
Qwen3.5 35B A3Bqwen3.5-35b-a3b
Qwen 3.8 27BEigenLabs/Qwen3.8-27B-4bit-mtp

A listed model can still be refused with a 403 if your key is limited to some models, and the picker does not know which ones those are. Either choose only models you know your key allows, or list those under Advanced, Model IDs in the connection. We ran gemma-4-26b for the cost numbers and EigenLabs/Qwen3.8-27B-4bit-mtp for the thinking checks. A model that thinks first spends part of any token limit on its thinking. Darkbloom’s list does not mark EigenLabs/Qwen3.8-27B-4bit-mtp as a reasoning model, but it thinks: with max_tokens at 30 it used all 30 tokens, and Open WebUI showed only Thought for less than a second, with no answer and no error.

Which Open WebUI features work with Darkbloom?

We ran the chat features. For the others, the last rows say what we know.

FeatureWhat we sawNotes
Chat with streamingWorked with gemma-4-26b and EigenLabs/Qwen3.8-27B-4bit-mtp. A thinking model’s reply shows a collapsed Thought for line above the answer.Open WebUI streams the reply by default.
Chat title, follow-up suggestions and tagsWorked. Each is its own request. A tags request that Darkbloom answered with 429 was skipped without any message.See the cost section.
Built-in toolsWorked with gemma-4-26b. We asked for the time, the model called get_current_timestamp, Open WebUI showed View Result from get_current_timestamp, and the answer followed. That took two chat requests.We ran this one tool. The other built-in tools (Memory, Notes, Knowledge Base, Web Search and the rest) were not run.
API Type ResponsesWorked for a chat, its title, its follow-ups and its tags, through POST /v1/responses.Darkbloom’s docs describe only chat completions.
Embeddings for uploaded filesNot run in Open WebUI. Called directly, Darkbloom answers 404 endpoint POST /v1/embeddings is not implemented.Open WebUI uses a local embedding model unless you switch its embedding engine. Its docs say the OpenAI engine takes its address and key from RAG_OPENAI_API_BASE_URL and RAG_OPENAI_API_KEY, which default to OPENAI_API_BASE_URL and OPENAI_API_KEY. So after the environment variable route below, that engine would send embeddings to Darkbloom and get the 404.
Image attachments, file uploads, knowledge bases, voice, image generation, web search and the code interpreterNot run.Darkbloom lists image input for some models (see the models table).

How much does Open WebUI cost with Darkbloom, and how do I keep it low?

Darkbloom bills the tokens you use from your prepaid balance: (input tokens × input price + output tokens × output price) ÷ 1,000,000, with a minimum of $0.0001 per request. Open WebUI adds more to a request than your message, and it makes extra requests. With its default settings, the one-line message Say hello in five words. to gemma-4-26b made four requests:

RequestTokens in and outBilled by Darkbloom
Your message, with 36 built-in tool definitions5,799 in, 8 out$0.000244
Chat title (made once, for the first message)272 in, 10 out$0.0001, the minimum
Follow-up suggestions (made after every reply)334 in, 46 out$0.0001, the minimum
Tags (made once, for the first message)209 in, 17 out$0.0001, the minimum, or no charge when Darkbloom answered 429
All four6,614 in, 81 out$0.000544

Only the chat request is above the minimum, because it carries the tool definitions (about 5,800 tokens) for a reply of 8 tokens. At the October 23, 2026 prices that request is worth $0.000245, and Darkbloom billed $0.000244, because it rounds each part down. Six other chat requests of this size (5,583 to 5,929 tokens in, one of them on another model) were each billed exactly $0.0002, and we do not know why. Darkbloom’s usage log lists cached_tokens for a request that reused cached text, and Darkbloom bills those tokens at a lower cached price ($0.021 per million tokens for Gemma 4 26B, instead of $0.042), but these six rows list none.

These figures come from several runs, and they vary a little. In our last run the follow-ups were 47 tokens out, and the usage log had no row for the tags request, so that message cost $0.000444. In our earlier runs, a tags request that Darkbloom answered with 429 had no row either.

A later message in the same chat is cheaper to set up. The second message was one chat request that carried the earlier messages (3 messages in all) and the tool list, 5,820 tokens in, and one follow-up request of 353 tokens in. Open WebUI did not make a title or tags again. A question that made the model call a tool cost two chat requests, 5,810 and 5,929 tokens in, each carrying the whole tool list.

What Open WebUI doesWhat it costs youHow to reduce it
Sends its built-in tool definitions with every chat message36 tool definitions, about 5,800 tokens in on every chat request, and again on the second request of a tool call.Switch off the tools you do not use under Builtin Tools. With all 17 off, our message was 25 tokens in and 2 out, billed the minimum. Or switch on Tool Search under Interface, which is experimental: 13 tool definitions, 2,248 tokens in, 8 out, also billed the minimum.
Makes up to three extra requests for the first messageA title, follow-up suggestions and tags, each billed at least $0.0001. The follow-ups come again after every reply.Switch off Title Generation, Follow Up Generation and Tags Generation under Interface. With those three and the built-in tools off, a message was one request, billed the minimum.
Runs those extra requests on the model you chat withWith a thinking model they cost much more. With the built-in tools off, EigenLabs/Qwen3.8-27B-4bit-mtp was billed $0.000186 for the reply, $0.000219 for the title, $0.001328 for the follow-ups and $0.000162 for the tags: $0.001895 for one message.Choose a cheap model under External Task Model in Interface. With gemma-4-26b chosen, our title and follow-up requests ran on it at the minimum, $0.0001 each, while the chat stayed on the thinking model.
Resends the earlier messages with every messageThe longer the chat, the more tokens in on each request.Start a new chat for a new topic.
Sends no answer length limitOpen WebUI sends none, so Darkbloom adds its default of 8192 (Darkbloom docs), and a long answer is billed for all its tokens.Set max_tokens under Model Parameters, and leave room for thinking if the model thinks first.

Open WebUI shows no price of its own, so check your real spend in the Darkbloom console, or call GET /v1/payments/usage with your key (Darkbloom docs: usage history).

Can I set up Open WebUI with environment variables instead?

Yes, on a new data folder. Open WebUI reads OPENAI_API_BASE_URL and OPENAI_API_KEY the first time it starts and saves them in its database. After that it uses the saved values: when we started the same data volume again with different values, the first ones stayed. Open WebUI’s docs say ENABLE_PERSISTENT_CONFIG=False makes the environment win on every start, and that settings you change on screen are then not kept, which is what we saw when we tried it.

The same command with Darkbloom set from the start
docker run -d -p 3000:8080 \
  --add-host=host.docker.internal:host-gateway \
  -v open-webui:/app/backend/data \
  -e WEBUI_SECRET_KEY=your-secret-key \
  -e OPENAI_API_BASE_URL=https://api.darkbloom.dev/v1 \
  -e OPENAI_API_KEY=YOUR_DARKBLOOM_API_KEY \
  --name open-webui --restart always \
  ghcr.io/open-webui/open-webui:main

Started this way on an empty volume, Open WebUI listed all 12 models that Darkbloom returned that day without any click in Settings. We did not send a chat through this route. docker inspect open-webui shows the key, so use the screens in the steps if other people can run Docker on your machine.

Where does Open WebUI keep my API key?

In plain text, in Open WebUI’s own database. That is a SQLite file, webui.db, in Open WebUI’s data folder (/app/backend/data in Docker, which is the open-webui volume in the documented command). Every admin account can see the key: the Edit Connection window shows it as dots, the eye icon beside it shows the text, and Open WebUI’s admin interface returns it. If the key leaks, delete it in the Darkbloom console and create a new one.

PlaceWhat we saw
webui.db, in the config tableThe key is stored as plain text. Chats are stored as plain JSON in the same file.
The Edit Connection windowDots, and the eye icon beside them shows the text. Any admin can do this.
Open WebUI’s admin interface, GET /openai/configAn admin gets the key back.
docker inspect, if you use OPENAI_API_KEYThe key is listed in the container’s environment.
The container’s logThe key did not appear.
Passwords of Open WebUI accountsStored hashed (bcrypt), not as text.

Anyone who can read the data volume or its backups can read your key and your chats, so protect them like the key itself.

What do the common errors mean?

In a chat, an error shows as a grey banner under the model name. The connection test shows its result as a pop-up at the top right. Each row was seen in Open WebUI 0.12.3, except the empty-balance row. Two rows, the invalid key and the output tokens banner, came from a test server that answers as Darkbloom does.

What you seeCauseFix
OpenAI: invalid API key when you test the connectionDarkbloom does not accept the key. This is the text its API returns for a wrong key.Copy the key again in full, without quotes or spaces, or create a new key in the console.
OpenAI: Network Problem when you test the connectionOpen WebUI could not get a model list from that address. We saw it with no /v1 at the end, with a mistyped host and with a port that was not open.Set URL to exactly https://api.darkbloom.dev/v1 and test again.
The model picker says Select a model, its list says No models available, and sending a message shows Model not selectedOpen WebUI has no models to list because the connection test fails: the key or the address is wrong.Open Connections, test the connection again and fix what the pop-up names.
A grey banner with this API key is not permitted to use model "Qwen3.5-9B" (the name of the model you chose)Darkbloom answered 403 model_not_allowed. Either the key has an Allowed models list that does not include this model, or the ID is not a real one: Darkbloom gives the same answer for an ID that does not exist.Check the ID letter for letter against GET /v1/models. If it is listed, open the key on the console’s API console page, choose Edit, and add the model to Allowed models, or leave that list blank to allow every model. To hide models that your key may not use, list only the allowed ones under Advanced, Model IDs in the connection.
A grey banner with output_tokens rate limit exceeded, followed by retry after and a number of secondsDarkbloom answered 429 because the account used its output tokens per minute. Darkbloom’s API contract lists other 429 causes too: requests per minute for the key or the account, and input tokens per minute. Open WebUI’s background requests get it as well and skip it without a message: the tags request did in 4 of the 7 chats of one of our sessions.Wait for the number of seconds that the banner names and send the message again.
A grey banner with draining rate limit exceeded, followed by retry after 3sDarkbloom’s coordinator was draining. Its API contract says it then refuses new requests with 429 and retry after 3s while it finishes the ones it accepted. It happened once in our tests and was over within two minutes.Wait a few seconds and send the message again.
The answer is empty and only Thought for less than a second showsA model that thinks first used the whole token limit for its thinking. With max_tokens at 30, EigenLabs/Qwen3.8-27B-4bit-mtp did, and Open WebUI showed no error.Raise max_tokens, set it back to Default, or choose a model that does not think first.
A 403 with no model namedIf your balance is too low, Darkbloom answers 403 (Darkbloom docs: insufficient balance), and every request fails the same way. We did not reproduce it, so we do not know the text that Open WebUI shows for it.Add credits in the console under Billing.
In docker logs open-webui: Missing bearer authentication in headerThe OpenAI connection that Open WebUI starts with is still on and has no key, so Open WebUI asks OpenAI for its model list, and OpenAI answers with this text. The request is a model list, not a chat.Edit that connection as in step 5, or switch it off.
In docker logs open-webui: Cannot connect to host host.docker.internal:11434Open WebUI also starts with an Ollama connection, and no Ollama is running on your machine.Ignore it. It does not affect Darkbloom.

Is Darkbloom private, and is it ready for production?

Not yet for sensitive work. Darkbloom’s quickstart calls the service “an experimental research prototype” and says not to use it in production applications, and its console labels it Public alpha. Darkbloom says prompts are encrypted to a verified provider Mac. Its security overview says the coordinator re-encrypts each request for the chosen provider and runs in a confidential VM. An independent review by Wavect (September 2026) reads Darkbloom’s technical documentation as saying that both the coordinator and the provider handle your prompt as plaintext inside protected boundaries.

Open WebUI sends the text of your message and the earlier messages of the chat to Darkbloom, together with its built-in tool definitions. The first message and the reply go again, in the background requests that make the chat title, the follow-up suggestions and the tags. Do not send secrets, customer data or code you are not allowed to share.

Open WebUI keeps a copy of your chats for itself. In our test the text of every chat was readable in webui.db, next to the key. Protect that data volume and its backups like the prompts themselves.

Open WebUI’s account screen says it makes no external connections. In our runs it also contacted GitHub (a check for a newer version), Hugging Face (a check for its local embedding model when it starts) and, until we edited the OpenAI connection, OpenAI (a model list, without a key). These calls do not need your chats, but we did not capture all of Open WebUI’s traffic. By default it does not send your name or email to Darkbloom: ENABLE_FORWARD_USER_INFO_HEADERS is off (Open WebUI docs), and a test server showed no such headers. The docs say OFFLINE_MODE switches off the update check and the model downloads and keeps connections like Darkbloom working.

How this guide was checked

About this guide

BloomGauge is a free Mac app for people who run Darkbloom providers, so we benefit when Darkbloom has more paying demand. We are independent of Darkbloom and not endorsed by it. Our Darkbloom sign-in links carry our referral code, BLOOMGAUGE. If you sign in to Darkbloom after opening one, Darkbloom attaches the code to your account and pays us a share of your eligible token spend. Darkbloom funds that reward, so it does not change your price.

Sources

Found something out of date? Tell us in #bloomgauge on the Darkbloom Slack or at Support.