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
| Item | Value |
|---|---|
| Base URL | https://api.darkbloom.dev/v1 |
| Key | Created 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. |
| Billing | Prepaid credits, charged per token, with a minimum of $0.0001 per request. Minimum deposit $0.50 (Darkbloom docs). |
| Model in Open WebUI | Chosen in the model picker, which lists Darkbloom’s models by name, for example Gemma 4 26B (ID gemma-4-26b) |
| Tested with | Open WebUI 0.12.3 on October 23, 2026 |
| Darkbloom status | Public alpha (Darkbloom console) |
| Where to set it | Settings, 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.
- 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.
- 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 ofyour-secret-key. Then openhttp://localhost:3000in 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.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 - 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!.
- 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.
- 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.https://api.darkbloom.dev/v1YOUR_DARKBLOOM_API_KEY - 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.
- 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. - 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.
| Setting | What to enter, and what it does |
|---|---|
| Connection: URL | https://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 Key | Leave 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 Type | Chat 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 IDs | Empty 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 Tags | Left 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 Generation | On 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 Model | Current 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 Search | Off 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 Tools | 36 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_tokens | Default 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 API | On 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 ID | Context window, tokens | Input, $ per million tokens | Output, $ per million tokens | Features Darkbloom lists |
|---|---|---|---|---|
gpt-oss-20b | 131,072 | $0.018 | $0.09 | none listed |
nvidia-nemotron-3.5-lightning | 262,144 | $0.025 | $0.12 | tools, reasoning |
EigenLabs/Ternary-Bonsai-2-9B-MLX-2bit | 262,144 | $0.08 | $0.13 | tools, reasoning |
Qwen3.5-9B | 262,144 | $0.08 | $0.13 | tools, image input |
glm-5.3-flash | 262,144 | $0.065 | $0.18 | tools, reasoning, image input |
gemma-4-26b | 131,072 | $0.042 | $0.22 | tools, reasoning, json mode, image input |
mimo-v2.6-flash-mopd | 1,048,576 | $0.10 | $0.28 | tools, reasoning |
nvidia-nemotron-3.5-super | 262,144 | $0.075 | $0.35 | tools, reasoning, json mode, image input |
ternary-bonsai-2-27b | 262,144 | $0.075 | $0.50 | tools, reasoning, image input |
qwen3.6-35b-a3b-vl-mtp-mxfp8 | 262,144 | $0.05 | $0.70 | tools, image input |
qwen3.5-35b-a3b | 262,144 | $0.065 | $0.75 | tools, image input |
EigenLabs/Qwen3.8-27B-4bit-mtp | 262,144 | $0.035 | $2.20 | tools, 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 WebUI | Model ID |
|---|---|
| GPT-OSS 20B | gpt-oss-20b |
| Nemotron 3.5 Lightning | nvidia-nemotron-3.5-lightning |
| Ternary Bonsai 2 9B | EigenLabs/Ternary-Bonsai-2-9B-MLX-2bit |
| Qwen 3.5 9B | Qwen3.5-9B |
| Z.ai: GLM-5.3-Flash | glm-5.3-flash |
| Gemma 4 26B | gemma-4-26b |
| Xiaomi: MiMo-V2.6-Flash | mimo-v2.6-flash-mopd |
| NVIDIA: Nemotron 3.5 Super | nvidia-nemotron-3.5-super |
| PrismML Bonsai 2 27B | ternary-bonsai-2-27b |
| Qwen 3.6 35B A3B | qwen3.6-35b-a3b-vl-mtp-mxfp8 |
| Qwen3.5 35B A3B | qwen3.5-35b-a3b |
| Qwen 3.8 27B | EigenLabs/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.
| Feature | What we saw | Notes |
|---|---|---|
| Chat with streaming | Worked 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 tags | Worked. Each is its own request. A tags request that Darkbloom answered with 429 was skipped without any message. | See the cost section. |
| Built-in tools | Worked 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 Responses | Worked 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 files | Not 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 interpreter | Not 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:
| Request | Tokens in and out | Billed by Darkbloom |
|---|---|---|
| Your message, with 36 built-in tool definitions | 5,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 four | 6,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 does | What it costs you | How to reduce it |
|---|---|---|
| Sends its built-in tool definitions with every chat message | 36 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 message | A 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 with | With 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 message | The longer the chat, the more tokens in on each request. | Start a new chat for a new topic. |
| Sends no answer length limit | Open 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.
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:mainStarted 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.
| Place | What we saw |
|---|---|
webui.db, in the config table | The key is stored as plain text. Chats are stored as plain JSON in the same file. |
| The Edit Connection window | Dots, and the eye icon beside them shows the text. Any admin can do this. |
Open WebUI’s admin interface, GET /openai/config | An admin gets the key back. |
docker inspect, if you use OPENAI_API_KEY | The key is listed in the container’s environment. |
| The container’s log | The key did not appear. |
| Passwords of Open WebUI accounts | Stored 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 see | Cause | Fix |
|---|---|---|
| OpenAI: invalid API key when you test the connection | Darkbloom 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 connection | Open 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 selected | Open 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 seconds | Darkbloom 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 3s | Darkbloom’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 shows | A 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 named | If 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 header | The 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:11434 | Open 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
- A paid request from Open WebUI to api.darkbloom.dev worked on October 23, 2026. We ran the steps on this page again as written, from a clean state. Open WebUI 0.12.3 in Docker, with an empty data volume, answered
Say hello in five words.withgemma-4-26bselected. Darkbloom’s usage log shows the requests that this made billed $0.0001 for the title, $0.000244 for the answer and $0.0001 for the follow-ups, with no row for the tags request. - The setup steps were compared with Open WebUI’s own docs (linked under Sources) on October 23, 2026. Where the docs and the program differ, this page follows what we saw: the docs tell you to click the + beside Manage OpenAI API Connections, and this page edits the OpenAI connection that is already there (adding a connection with the + also worked, and leaves the OpenAI row on, which then asks OpenAI for a model list without a key); and the docs call the test a Verify Connection button, which in 0.12.3 is an unlabeled icon of two circular arrows beside the URL.
- We ran Open WebUI 0.12.3 (the
ghcr.io/open-webui/open-webui:mainimage of October 16, 2026, the same version as the latest release on PyPI that day) in Docker, with the command in Open WebUI’s docs and these changes for our machine: the host network with its own port, and our network’s proxy and certificate file. We used a browser from a fresh start, with an empty data volume: the account screen, the connection as on this page, chats withgemma-4-26bandEigenLabs/Qwen3.8-27B-4bit-mtp, a built-in tool call, a second message in the same chat, the Model IDs list, and the switches in the cost section. To see what Open WebUI sends, we also ran it through a local forwarder that passed each request to Darkbloom unchanged and logged its path, size and settings. - In the run that the first line describes, we followed the steps in the order of this page: the admin account, the edit of the OpenAI connection (the test said Server connection verified), and the message. The follow-ups request had 47 tokens out, one more than in our earlier runs. The usage log has no row for the tags request, and we did not see why: in our earlier runs, a tags request that Darkbloom answered with 429 left no row either.
- The error rows were seen with Open WebUI against Darkbloom, except the “invalid API key” row and the output tokens banner, which used a test server that returns Darkbloom’s real reply for a wrong key and for that 429, and the empty-balance row, because that needs an empty balance. The draining row happened once, on a real request. The causes of the 429 rows come from Darkbloom’s API contract in its source repository (linked under Sources). Darkbloom’s 404 for
/v1/embeddingscomes from calling it directly, not from Open WebUI. - The request sizes and amounts in the cost section come from Darkbloom’s usage log. For the runs through the forwarder we matched each request to its row by the job ID that Darkbloom returns, and for the clean run by its time and token counts. We compared 410 rows of the usage log that we captured while testing with Darkbloom’s pricing reference, which says each part of a bill is rounded down and that cached prompt tokens are billed at the cached price: 404 rows matched to the micro-dollar, 5 of them with cached tokens listed. The other 6 are the chat requests billed exactly $0.0002. They list no cached tokens, so we do not know why they were billed less.
- On the key and chat storage, we looked in
webui.db, in the container’s log and indocker inspect, and asked the admin interface for the connection settings. That Open WebUI sends no name or email headers was checked with a local test server that prints the headers it receives. The environment variable route was checked on a new data volume with a test server (the first values applied, a second start with other values kept the first ones, andENABLE_PERSISTENT_CONFIG=Falsemade the new values win) and on a new volume against Darkbloom, where it listed the models. We did not chat through it. - That Darkbloom lists
POST /v1/responsescomes from Darkbloom’s console, which names it in its API console page, and from the README of its source code; its docs site documents only chat completions. We called it with Open WebUI and it worked for the chat and the three background requests. - The model list, names, context windows, features and prices come from
GET /v1/modelson October 23, 2026 (it needs a key). The key steps in the console come from the console’s own page text. We tested with a key that already existed, so we did not click through key creation ourselves. - Our test machine adds that key to requests to Darkbloom on their way out, so in the runs against Darkbloom the connection held this page’s placeholder. That Open WebUI sends the key it is given was checked separately, with a local test server that prints the
Authorizationheader it receives: it gotBearerand the key we had entered. - Not run: the pip, Kubernetes and desktop installs, Windows, a second user account, Direct Connections, the Auth choices other than Bearer, the Provider choices other than Default, image attachments, file uploads and knowledge bases, voice, image generation, web search, the code interpreter, the built-in tools other than the time tool, other Open WebUI versions, and an empty balance.
- Our Darkbloom link was opened in a clean browser profile on October 22, 2026. It saved the referral code and the page said the code “is saved and will be applied after you sign in”. We did not create an account to test the sign-in step itself.
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
- Open WebUI docs: quick start
- Open WebUI docs: OpenAI-compatible providers
- Open WebUI docs: environment variables
- Darkbloom console: API console (endpoint list)
- Darkbloom source code: README (API surface)
- Darkbloom source code: API contracts (429 causes)
- Darkbloom source code: pricing model (cached tokens, rounding)
- Darkbloom docs: quickstart
- Darkbloom docs: chat completions
- Darkbloom docs: authentication and API keys
- Darkbloom docs: add credits
- Darkbloom docs: usage history
- Darkbloom live prices (GET /v1/pricing)
Found something out of date? Tell us in #bloomgauge on the Darkbloom Slack or at Support.