The values to copy
Anyone looking for the mimo api base url needs three values, and everything else is a detail of the tool you are configuring.
| Setting | Value |
|---|---|
| Base URL | https://api.mimoapi.top/v1 |
| Model ID | uncensored |
| Auth header | Authorization: Bearer YOUR_KEY |
| Chat endpoint | POST /v1/chat/completions |
| Model list | GET /v1/models |
The service is OpenAI-compatible, so any client that lets you change the OpenAI base URL and key will work. It is a hosted text API running one open-weight model from an independent provider; it is not the official API of any model vendor. Text only: there is no image, audio or video generation, no embeddings and no fine-tuning, so clients that expect those endpoints will not find them. If you do not have a key yet, the key page takes a minute.
Base URL versus full endpoint
The most common confusion is between the base URL and the endpoint URL. The base URL stops at /v1. The endpoint is the base plus a path. Official OpenAI SDKs, and most tools built on them, join the two for you.
- Base URL:
https://api.mimoapi.top/v1 - Chat endpoint:
https://api.mimoapi.top/v1/chat/completions - Models endpoint:
https://api.mimoapi.top/v1/models
When a settings screen asks for a "base URL", "API base", "endpoint" or "host", read its placeholder. If the placeholder ends in /v1, paste the base URL. If it ends in /chat/completions, paste the full chat endpoint. Pasting the full endpoint into a field that expects a base produces /chat/completions/chat/completions, which does not exist. Pasting only the bare domain into a field that expects a base produces /chat/completions without /v1, which fails the same way.
Note the host as well. The API lives on the api subdomain. The plain site domain serves the web pages, so a request to it with an API path will not reach the model.
Python and Node
With the official SDKs you set the base URL once when you create the client. Install with pip install openai or npm install openai.
from openai import OpenAI
client = OpenAI(
base_url="https://api.mimoapi.top/v1",
api_key="YOUR_KEY",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Name three uses for a base URL."}],
max_tokens=150,
)
print(resp.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.mimoapi.top/v1",
apiKey: process.env.LLM_API_KEY,
});
const resp = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Name three uses for a base URL." }],
max_tokens: 150,
});
console.log(resp.choices[0].message.content);
The Python and Node OpenAI SDKs also read the environment variables OPENAI_BASE_URL and OPENAI_API_KEY when you do not pass values in code. That makes it possible to repoint an existing script without editing it: export the two variables, and the script talks to this API. Check that the script does not hard-code a model such as a GPT name; replace it with uncensored.
curl for a quick test
A plain HTTP call removes every other variable, so it is the best first check. The first command lists models and confirms the key. The second sends a chat request.
export LLM_API_KEY="YOUR_KEY"
curl -s https://api.mimoapi.top/v1/models \
-H "Authorization: Bearer $LLM_API_KEY"
curl -s https://api.mimoapi.top/v1/chat/completions \
-H "Authorization: Bearer $LLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"uncensored","messages":[{"role":"user","content":"ping"}],"max_tokens":20}' -i
The -i flag prints response headers. Look for X-Request-Id (quote it if you contact support), X-Balance-USD (your remaining credit) and the two rate limit headers, X-RateLimit-Limit-Requests and X-RateLimit-Limit-Concurrency. For streaming, add "stream": true to the body and -N to curl so output is not buffered. The five minute quickstart walks through streaming and tool calling after this.
LangChain, chat frontends and other tools
Third-party tools use their own labels, but all of them need the same three values. Some patterns you will see:
- LangChain (Python):
ChatOpenAI(model="uncensored", base_url="https://api.mimoapi.top/v1", api_key="YOUR_KEY"). The same class works for any OpenAI-compatible server. - SillyTavern and similar roleplay frontends: choose a custom or generic OpenAI-compatible chat source, paste the base URL, add the key, and type
uncensoredas the model name if the list does not fill itself. - Open WebUI and other self-hosted chat UIs: add an OpenAI-compatible connection in the settings, using the same base URL and key.
- Editor plugins and scripts: look for "custom OpenAI endpoint" or "override base URL" in the plugin settings.
Each tool's menu names change between versions, so rely on the field's purpose rather than the exact label. If a tool insists on checking the key against a fixed provider, it is not compatible with custom endpoints, and a different tool is the fix.
When a tool offers a model dropdown, it usually fills it by calling GET /v1/models. If the dropdown stays empty, type the model ID by hand. If the tool refuses unknown model names, look for an option labelled "custom model".
Fixing the usual configuration errors
When a request fails, the status code and the exact URL narrow the cause quickly. Work down this list.
- Authentication error. The key is missing, truncated or has a space or a newline at the end. Paste it again, and make sure the header reads
Bearer, a space, then the key. - Not found. The path is wrong. Print the final URL your client builds. It should be exactly
https://api.mimoapi.top/v1/chat/completions. Look for a missing/v1, a doubled path or the wrong host. - Unknown model. A leftover model name from another provider. Set the model to
uncensored. - HTTP 429 with
rate_limitedorconcurrency. You are over 300 requests per minute or 8 at once (60 and 2 on a trial key). Slow down or queue requests. A 429 with aRetry-After: 5header means temporary overload; wait five seconds and retry. - Request too large. The body limit is 8 MB, and the context window is 100,000 tokens for prompt plus completion. Trim the history.
- Works in curl, fails in the browser. Calling the API directly from front-end JavaScript exposes your key to every visitor. Route calls through your own server.
Never put the key in a public repository or a client-side bundle. Store it in an environment variable, and and keep it out of screenshots and support tickets.
Next steps after the first successful call
Once the base URL works, a few settings are worth knowing. Streaming over SSE is switched on with stream: true. Tool calling uses tools and tool_choice, with results sent back as role: "tool" messages. JSON mode is response_format: {"type": "json_object"}. Sampling controls such as temperature, top_p, stop, seed and the penalties are passed through.
On the money side, you pay $0.15 per 1M input tokens and $0.50 per 1M output tokens from prepaid credit; the pricing page lists top-up sizes and bonuses. The model is tuned to answer without content refusals for lawful adult use, and sexual content involving minors is never allowed. Prompts are not used for training.
