UnlimitedModel API
UnlimitedModel is an OpenAI-compatible inference API available under a flat-rate subscription. Point any OpenAI-compatible client or SDK at our base URL, use a model ID from the live catalog, and you are ready to go.
Base URL
Every request goes to the same base URL. It is static and never changes per key or per model.
https://api.unlimitedmodel.com/v1What you get
| Endpoint | Method | Purpose |
|---|---|---|
/v1/models | GET | List the model IDs currently enabled for your account. |
/v1/chat/completions | POST | Send chat messages and receive a completion, streamed or not. |
/v1/messages | POST | Anthropic-compatible chat endpoint for clients that speak the Messages API. |
Start here
GET /v1/models instead of hardcoding names.
Browse models →
Errors
Status codes, error bodies, rate-limit headers and what to do about each one.
See error reference →
Use UnlimitedModel with your favorite AI tools
UnlimitedModel exposes an OpenAI-compatible endpoint, so most coding agents and chat clients work without a plugin. These guides show exactly what to paste.
opencode.json.
Open guide →
Continue
VS Code / JetBrains AI coding with a custom config.yaml model entry.
Open guide →
Aider
AI pair programming in your terminal with two environment variables and one flag.
Open guide →
Open WebUI
Use UnlimitedModel through a self-hosted web chat interface.
Open guide →
Generic OpenAI-Compatible
Connect any compatible SDK or application: base URL, auth header, models, chat.
Open guide →
What's next
- Follow the Quick Start to send your first request.
- Read Streaming if you want tokens as they are generated.
- Check Errors and Troubleshooting when something fails.
- Ask other users in the UnlimitedModel Discord.
Make your first request in 2 minutes
Four steps: create a key, export it, list the models, send a chat request. Everything uses the same static base URL: https://api.unlimitedmodel.com/v1.
Create an API key
Open your dashboard and create a key on the API Keys page. The full key is shown once, so copy it immediately.
Open API KeysSet your environment variable
Every example below reads UNLIMITEDMODEL_API_KEY from your environment. Never paste a key into source code.
export UNLIMITEDMODEL_API_KEY="YOUR_KEY"$env:UNLIMITEDMODEL_API_KEY="YOUR_KEY"List available models
The catalog changes over time, so always read the current IDs instead of hardcoding one.
curl https://api.unlimitedmodel.com/v1/models \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY"curl.exe https://api.unlimitedmodel.com/v1/models `
-H "Authorization: Bearer $env:UNLIMITEDMODEL_API_KEY"Send a chat request
Replace <MODEL_ID> with an ID from step 3.
curl https://api.unlimitedmodel.com/v1/chat/completions \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "<MODEL_ID>",
"messages": [
{
"role": "user",
"content": "Hello!"
}
]
}'from openai import OpenAI
client = OpenAI(
base_url="https://api.unlimitedmodel.com/v1",
api_key=os.environ["UNLIMITEDMODEL_API_KEY"],
)
response = client.chat.completions.create(
model="<MODEL_ID>",
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.unlimitedmodel.com/v1",
apiKey: process.env.UNLIMITEDMODEL_API_KEY,
});
const response = await client.chat.completions.create({
model: "<MODEL_ID>",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(response.choices[0].message.content);import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.unlimitedmodel.com/v1",
apiKey: process.env.UNLIMITEDMODEL_API_KEY,
});
const response = await client.chat.completions.create({
model: "<MODEL_ID>",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(response.choices[0].message.content);Choose from live models
This list comes from GET /v1/models. Pick an ID to copy it, then use it as the model value in your request.
Fetching the current model IDs from GET /v1/models…
The catalog can change
Model IDs are managed dynamically. If a request returns 404 for a model, refresh GET /v1/models and retry with a current ID.
What's next
- Stream responses token by token with
"stream": true. - Connect OpenCode, Continue, Aider or Open WebUI.
- Read the error reference before you ship.
Authentication
Every request authenticates with an API key sent as a Bearer token. Keys are created in your dashboard and scoped to your account.
Create an API key
- Sign in and open your dashboard.
- Open the API Keys tab and choose Create Key.
- Give the key a name, then copy the full key. It is shown once and never again.
- Revoke keys you no longer use from the same table.
Keys are prefixed with um_live_ so they are recognizable in logs and secret scanners.
Send the key
Pass the key in the Authorization header on every request:
Authorization: Bearer YOUR_API_KEYexport UNLIMITEDMODEL_API_KEY="YOUR_KEY"
curl https://api.unlimitedmodel.com/v1/models \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY"import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.unlimitedmodel.com/v1",
api_key=os.environ["UNLIMITEDMODEL_API_KEY"],
)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.unlimitedmodel.com/v1",
apiKey: process.env.UNLIMITEDMODEL_API_KEY,
});Authentication failures
| Status | Meaning | Fix |
|---|---|---|
401 | The key is missing, malformed or revoked. | Check the header value and create a new key if needed. |
403 | The key is valid but your subscription does not cover the request. | Check your plan and the model tier; see Errors. |
Keep keys out of source control
Load keys from environment variables or a secret manager. If a key leaks, revoke it in the dashboard immediately; revocation is effective on the next request.
Model Catalog
The catalog of available models is managed dynamically. Always read the current IDs from GET /v1/models and pass one of those IDs as the model value in your requests.
List the catalog
curl https://api.unlimitedmodel.com/v1/models \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY"Each entry carries an id. That ID is the value you send as model:
{
"object": "list",
"data": [
{
"id": "<MODEL_ID>",
"object": "model",
"created": 1730000000,
"owned_by": "unlimitedmodel"
}
]
}Live catalog
This list is fetched from GET /v1/models for your current session. Copy an ID and use it directly.
Fetching the current model IDs from GET /v1/models…
Things to know
- IDs change. When a model is retired, requests with the old ID return
404. Refresh the list instead of caching IDs forever. - Tiers. Some models belong to tiers that specific plans do not include; requesting one returns
403with an explanation. - Context windows. Context limits are model-specific. Keep requests within the limits of the model you pick.
Base URL
All API endpoints live under one static base URL. It is the same for every account, key and model.
https://api.unlimitedmodel.com/v1Endpoints
| Endpoint | Method | Description |
|---|---|---|
/v1/models | GET | List the model IDs enabled for your account. |
/v1/chat/completions | POST | Create a chat completion. Supports stream: true. |
/v1/messages | POST | Anthropic-compatible Messages endpoint for clients built for that API shape. |
Required headers
| Header | Value | When |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Every request. |
Content-Type | application/json | Every request with a JSON body (POST). |
Response headers
Responses include your current limit state so clients can back off before hitting a limit:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Your configured request limit for the window. |
X-RateLimit-Remaining | Requests remaining in the current window. |
X-RateLimit-Reset | Unix timestamp when the window resets. |
X-Concurrency-Limit | How many requests your key may run at the same time. |
Limits are per API key and defined by your plan. See Errors for what a 429 looks like and plan limits for what each plan includes.
OpenAI compatibility
Request and response shapes follow the OpenAI Chat Completions API, so existing SDKs and tools work by changing the base URL and API key. See the generic OpenAI-compatible guide for a checklist you can apply to any client.
GET /v1/models
Returns the model IDs currently enabled for your account. Use this endpoint to discover the value for the model field in chat requests.
Request
curl https://api.unlimitedmodel.com/v1/models \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY"import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.unlimitedmodel.com/v1",
api_key=os.environ["UNLIMITEDMODEL_API_KEY"],
)
models = client.models.list()
for model in models.data:
print(model.id)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.unlimitedmodel.com/v1",
apiKey: process.env.UNLIMITEDMODEL_API_KEY,
});
const models = await client.models.list();
models.data.forEach((model) => console.log(model.id));import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.unlimitedmodel.com/v1",
apiKey: process.env.UNLIMITEDMODEL_API_KEY,
});
const models = await client.models.list();
for (const model of models.data) {
console.log(model.id);
}Response
{
"object": "list",
"data": [
{
"id": "<MODEL_ID>",
"object": "model",
"created": 1730000000,
"owned_by": "unlimitedmodel"
}
]
}| Field | Type | Description |
|---|---|---|
id | string | The model ID to send in the model field of chat requests. |
object | string | Always model. |
created | number | Unix timestamp when the entry was published. |
owned_by | string | Catalog owner identifier. |
Try it against the live catalog
Fetching the current model IDs from GET /v1/models…
Errors
401— missing or invalid API key.403— your subscription does not include API access.429— too many requests; back off and retry.
POST /v1/chat/completions
Creates a chat completion from a list of messages. The request and response follow the OpenAI Chat Completions shape, including streaming.
Request body
| Field | Type | Description |
|---|---|---|
model | string | Required. A model ID from GET /v1/models. |
messages | array | Required. Conversation messages with role and content (system, user, assistant). |
stream | boolean | Return server-sent events instead of a single JSON response. See Streaming. |
temperature | number | Sampling temperature. |
top_p | number | Nucleus sampling probability mass. |
max_tokens | number | Maximum tokens to generate. |
stop | string | array | Stop sequence(s). |
tools | array | Tool definitions for models and routes that support tool calling. |
Examples
curl https://api.unlimitedmodel.com/v1/chat/completions \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "<MODEL_ID>",
"messages": [
{ "role": "system", "content": "You are a concise assistant." },
{ "role": "user", "content": "Explain what an API gateway does." }
],
"temperature": 0.7
}'import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.unlimitedmodel.com/v1",
api_key=os.environ["UNLIMITEDMODEL_API_KEY"],
)
response = client.chat.completions.create(
model="<MODEL_ID>",
messages=[
{"role": "system", "content": "You are a concise assistant."},
{"role": "user", "content": "Explain what an API gateway does."},
],
temperature=0.7,
)
print(response.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.unlimitedmodel.com/v1",
apiKey: process.env.UNLIMITEDMODEL_API_KEY,
});
const response = await client.chat.completions.create({
model: "<MODEL_ID>",
messages: [
{ role: "system", content: "You are a concise assistant." },
{ role: "user", content: "Explain what an API gateway does." },
],
temperature: 0.7,
});
console.log(response.choices[0].message.content);import OpenAI from "openai";
import type { ChatCompletion } from "openai/resources/chat/completions";
const client = new OpenAI({
baseURL: "https://api.unlimitedmodel.com/v1",
apiKey: process.env.UNLIMITEDMODEL_API_KEY,
});
const response: ChatCompletion = await client.chat.completions.create({
model: "<MODEL_ID>",
messages: [{ role: "user", content: "Explain what an API gateway does." }],
});
console.log(response.choices[0]?.message?.content);Response
{
"id": "chatcmpl-...",
"object": "chat.completion",
"created": 1730000000,
"model": "<MODEL_ID>",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "An API gateway sits between clients and backend services..."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 24,
"completion_tokens": 96,
"total_tokens": 120
}
}Notes
- Model routing and provider selection happen behind the gateway; you only ever send the public model ID.
- When a model is unavailable, the request fails fast with
404rather than a partial answer. See Errors. - Tool calling depends on the selected model and route. If a model cannot use tools, the request returns an error instead of silently ignoring them.
Streaming
Set "stream": true to receive tokens as they are generated. The response is a stream of server-sent events, each carrying a chunk in the same shape as a chat completion.
How chunks arrive
- Each event is a line starting with
data:followed by a JSON chunk. - Chunks carry
choices[0].deltawith the incremental content. - The stream ends with
data: [DONE]. - Usage totals arrive on the final chunk when the provider reports them.
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant","content":"An"}}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":" API"}}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":" gateway"}}]}
data: [DONE]cURL
Use -N to disable buffering so chunks print as they arrive.
curl -N https://api.unlimitedmodel.com/v1/chat/completions \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "<MODEL_ID>",
"stream": true,
"messages": [
{ "role": "user", "content": "Write a short haiku about streaming." }
]
}'Python
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.unlimitedmodel.com/v1",
api_key=os.environ["UNLIMITEDMODEL_API_KEY"],
)
stream = client.chat.completions.create(
model="<MODEL_ID>",
stream=True,
messages=[{"role": "user", "content": "Write a short haiku about streaming."}],
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)JavaScript / TypeScript
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.unlimitedmodel.com/v1",
apiKey: process.env.UNLIMITEDMODEL_API_KEY,
});
const stream = await client.chat.completions.create({
model: "<MODEL_ID>",
stream: true,
messages: [{ role: "user", content: "Write a short haiku about streaming." }],
});
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content;
if (delta) process.stdout.write(delta);
}Handle errors before the stream starts
Authentication, model and entitlement errors are returned as normal JSON responses with an HTTP error status, before any events are sent. Check the status code first, then stream.
Errors
Failures return a JSON body with a type and a human-readable message, plus the usual HTTP status code. This page documents the statuses and error types the API actually returns.
Error response shape
{
"type": "error",
"error": {
"type": "model_not_found",
"message": "The requested customer-facing model is not available. Refresh /v1/models and try again."
}
}Status codes
| Status | Error type | Meaning | What to do |
|---|---|---|---|
400 | invalid_request | The request is malformed or a required field is missing (model, messages). | Fix the body; check the field names against the API reference. |
401 | auth error | The API key is missing, malformed, revoked or not recognized. | Check Authorization: Bearer ... and create a new key if needed. |
403 | model_not_entitled, model_tier_not_allowed, safety_blocked | The key works, but your subscription does not include this model or tier, or the request was blocked by the safety policy. | Pick a model your plan includes, upgrade, or adjust the request content. |
404 | model_not_found | The model ID is not in the current catalog, or no route is currently available for it. | Refresh GET /v1/models and use an exact current ID. |
422 | capability_mismatch | The request asks for a capability the selected model does not provide (for example tools). | Drop the unsupported field or choose a model that supports it. |
429 | rate limit | You hit a per-key limit: requests per minute, tokens per minute, or concurrency. | Back off and retry after the reset; see below. |
5xx | upstream error | A temporary platform or upstream provider problem. The gateway fails over between routes before surfacing this. | Retry with backoff. If it persists, contact support with the request ID. |
Rate limits and throttling
Limits are per API key and come from your plan. Every response carries your current state:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Configured limit for the current window. |
X-RateLimit-Remaining | Requests left in the window. |
X-RateLimit-Reset | Unix timestamp when the window resets. |
X-Concurrency-Limit | Simultaneous in-flight requests allowed for the key. |
- Requests per minute (RPM) counts each request, per key, over a sliding window.
- Tokens per minute (TPM) counts actual tokens used, per key.
- Concurrency limits how many requests run at once; excess requests wait or receive
429. - When a
429includes a retry hint, honor it. Otherwise wait forX-RateLimit-Reset.
Limits, fair use and usage
- Plan limits and fair-use terms — what each subscription includes.
- Usage dashboard — your token and request consumption.
- Troubleshooting — common causes and fixes.
cURL
The fastest way to test the API. Export your key once, then send requests against the static base URL.
Set your key
export UNLIMITEDMODEL_API_KEY="YOUR_KEY"$env:UNLIMITEDMODEL_API_KEY="YOUR_KEY"List models
curl https://api.unlimitedmodel.com/v1/models \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY"Chat completion
curl https://api.unlimitedmodel.com/v1/chat/completions \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "<MODEL_ID>",
"messages": [
{ "role": "user", "content": "Hello!" }
]
}'Streaming
curl -N https://api.unlimitedmodel.com/v1/chat/completions \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "model": "<MODEL_ID>", "stream": true, "messages": [{ "role": "user", "content": "Hello!" }] }'PowerShell tip
In PowerShell, curl is an alias for Invoke-WebRequest. Call curl.exe to use real curl, and reference the key as $env:UNLIMITEDMODEL_API_KEY.
Python
Use the official OpenAI Python SDK and change only the base URL and key. No proprietary SDK is required.
Install
pip install openaiClient setup
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.unlimitedmodel.com/v1",
api_key=os.environ["UNLIMITEDMODEL_API_KEY"],
)Chat completion
response = client.chat.completions.create(
model="<MODEL_ID>",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Summarize what a flat-rate API means."},
],
)
print(response.choices[0].message.content)Streaming
stream = client.chat.completions.create(
model="<MODEL_ID>",
stream=True,
messages=[{"role": "user", "content": "Count from 1 to 5."}],
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)List models
for model in client.models.list().data:
print(model.id)JavaScript / TypeScript
Use the official OpenAI JavaScript SDK in Node.js, Bun or Deno. Change the base URL and key, keep the rest of your code.
Install
npm install openaiClient setup
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.unlimitedmodel.com/v1",
apiKey: process.env.UNLIMITEDMODEL_API_KEY,
});Chat completion
const response = await client.chat.completions.create({
model: "<MODEL_ID>",
messages: [
{ role: "system", content: "You are a helpful assistant." },
{ role: "user", content: "Summarize what a flat-rate API means." },
],
});
console.log(response.choices[0]?.message?.content);Streaming
const stream = await client.chat.completions.create({
model: "<MODEL_ID>",
stream: true,
messages: [{ role: "user", content: "Count from 1 to 5." }],
});
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content;
if (delta) process.stdout.write(delta);
}List models
const models = await client.models.list();
models.data.forEach((model) => console.log(model.id));Use UnlimitedModel with OpenCode
OpenCode supports custom OpenAI-compatible providers through the @ai-sdk/openai-compatible package. Add one provider block, set an environment variable, and pick a model.
Setup
- Create an UnlimitedModel API key in your dashboard.
- Store it as an environment variable (below).
- Add UnlimitedModel as an OpenAI-compatible provider in
opencode.json. - Add a model ID from
GET /v1/modelsto the provider'smodelsmap. - Run OpenCode, open
/models, and select the provider and model.
1. Environment variable
export UNLIMITEDMODEL_API_KEY="YOUR_KEY"$env:UNLIMITEDMODEL_API_KEY="YOUR_KEY"2. opencode.json
Put this in your project's opencode.json (or the global OpenCode config). The {env:...} syntax reads the key from your environment at startup.
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"unlimitedmodel": {
"npm": "@ai-sdk/openai-compatible",
"name": "UnlimitedModel",
"options": {
"baseURL": "https://api.unlimitedmodel.com/v1",
"apiKey": "{env:UNLIMITEDMODEL_API_KEY}"
},
"models": {
"<MODEL_ID>": {
"name": "<MODEL_ID>"
}
}
}
}
}3. Get model IDs
curl https://api.unlimitedmodel.com/v1/models \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY"Copy an id from the response into the models map above. The key in that map and the name value can be the same ID.
4. Select it in OpenCode
- Open OpenCode in your project.
- Run
/models. - Select UnlimitedModel as the provider.
- Select the model you configured.
If you prefer storing the key with OpenCode instead of an environment variable, run /connect, choose Other, enter unlimitedmodel as the provider ID, and paste your key. The provider ID must match the key in your opencode.json.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
401 Unauthorized | API key missing or incorrect. | Check UNLIMITEDMODEL_API_KEY is set in the shell that launches OpenCode, and that the key is still active. |
404 model not found | The configured model ID no longer exists. | Refresh GET /v1/models and use an exact current ID. |
| Provider does not appear | Provider ID mismatch, wrong npm package, or invalid JSON. | Use @ai-sdk/openai-compatible, make sure the provider ID matches your config, verify the JSON parses, and restart OpenCode. |
| Tools do not work | The selected model or routing path does not support the requested tool behavior. | Try a different model from the catalog, or run the task without tools. |
OpenCode also has opencode auth list to confirm which credentials it has stored.
Use UnlimitedModel with Continue
Continue (VS Code and JetBrains) supports custom OpenAI-compatible API bases. Point the built-in openai provider at UnlimitedModel and set useResponsesApi: false so requests use /chat/completions.
Setup
- Create an UnlimitedModel API key in your dashboard.
- Open Continue's configuration file:
config.yaml(the config file is opened with the gear icon in the Continue panel). - Add the model entry below.
- Save; Continue reloads the configuration automatically.
- Select UnlimitedModel in the model dropdown.
config.yaml
name: UnlimitedModel
version: 1.0.0
schema: v1
models:
- name: UnlimitedModel
provider: openai
model: <MODEL_ID>
apiBase: https://api.unlimitedmodel.com/v1
apiKey: <YOUR_UNLIMITEDMODEL_API_KEY>
useResponsesApi: false
roles:
- chat
- edit
- applyWhy useResponsesApi: false
Continue defaults to OpenAI's /responses endpoint for some model families. UnlimitedModel serves chat through /v1/chat/completions, so set useResponsesApi: false to force the Chat Completions path.
Get model IDs
curl https://api.unlimitedmodel.com/v1/models \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY"The model value must exactly match an ID returned by that endpoint.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
401 in the Continue logs | The API key is wrong or has been revoked. | Re-copy the key from the dashboard and update apiKey. |
| Model never responds | Requests are going to /responses. | Add useResponsesApi: false and reload the config. |
404 model not found | The model ID is stale. | Refresh GET /v1/models and update model. |
| Agent mode unavailable | Continue needs tool support from the model. | Add capabilities: [tool_use] only if the model you selected supports tools; otherwise use Chat/Edit mode. |
Use UnlimitedModel with Aider
Aider connects to any OpenAI-compatible endpoint. Point its OpenAI client at UnlimitedModel with two environment variables and prefix the model name with openai/.
Install Aider
python -m pip install aider-install
aider-installSet the endpoint and key
export OPENAI_API_BASE="https://api.unlimitedmodel.com/v1"
export OPENAI_API_KEY="$UNLIMITEDMODEL_API_KEY"$env:OPENAI_API_BASE="https://api.unlimitedmodel.com/v1"
$env:OPENAI_API_KEY=$env:UNLIMITEDMODEL_API_KEYRun Aider
cd /to/your/project
aider --model openai/<MODEL_ID><MODEL_ID> must exactly match an ID returned by GET /v1/models:
curl https://api.unlimitedmodel.com/v1/models \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY"Model warnings are expected
Aider warns when it does not recognize a model name. That warning does not block the session; Aider still sends your requests to the configured endpoint.
Troubleshooting
401:OPENAI_API_KEYis empty or wrong. Print it withecho $OPENAI_API_KEY(or$env:OPENAI_API_KEY) to confirm.404: the model ID is stale; refreshGET /v1/models.- Requests still going to OpenAI: make sure
OPENAI_API_BASEis exported in the same shell that runsaider.
Use UnlimitedModel with Open WebUI
Open WebUI connects to any server that implements the OpenAI Chat Completions API. Add UnlimitedModel as a connection and its models appear in the picker.
Add the connection
- Open Open WebUI and go to Settings → Admin → Connections.
- In the Manage OpenAI API Connections list, click Add Connection (the plus button).
- Enter the URL:
https://api.unlimitedmodel.com/v1 - Enter your API key in the API Key field.
- Click Verify Connection. UnlimitedModel serves
/v1/models, so verification and model auto-discovery both work. - Click Save.
| Setting | Value |
|---|---|
| URL | https://api.unlimitedmodel.com/v1 |
| API Key | YOUR_UNLIMITEDMODEL_API_KEY |
| Model IDs | Auto-detected from /v1/models; optionally allowlist specific IDs. |
Start chatting
- Open the model selector at the top of the chat.
- Pick the UnlimitedModel connection and a model ID from the catalog.
- Send a message.
If verification fails anyway
Some deployments restrict outbound requests or use a proxy. When verification cannot reach /v1/models, add your model IDs manually under Model IDs and save; chat requests will still work.
Notes
- Use the URL exactly as shown, without a trailing slash.
- If Open WebUI runs in Docker and you proxy the API through your host, replace
localhostwithhost.docker.internalin your own proxy URL. - RAG features that need embeddings require an embeddings endpoint, which UnlimitedModel does not expose. Point Open WebUI's embedding engine at a provider that does.
Generic OpenAI-Compatible Client
If your tool is not listed here, use this page. Any client that supports a custom OpenAI base URL works with UnlimitedModel by changing three things: base URL, API key and model ID.
Configuration
| Setting | Value |
|---|---|
| Base URL | https://api.unlimitedmodel.com/v1 |
| Authentication | Authorization: Bearer YOUR_API_KEY |
| Models | GET /v1/models |
| Chat | POST /v1/chat/completions |
| Streaming | "stream": true (server-sent events) |
Verify from the terminal
curl https://api.unlimitedmodel.com/v1/chat/completions \
-H "Authorization: Bearer $UNLIMITEDMODEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "model": "<MODEL_ID>", "messages": [{ "role": "user", "content": "Hello!" }] }'Checklist for any client
- Set the base URL to
https://api.unlimitedmodel.com/v1. Many clients append/chat/completionsautomatically; do not include it in the base. - Paste an UnlimitedModel API key as the API key. If the client asks for an "OpenAI key", this is the value to use.
- Fetch or paste a model ID from
GET /v1/models. Do not hardcode a model that may be retired. - If the client offers a choice between the Responses API and Chat Completions, choose Chat Completions.
- Send one message and confirm you receive a completion. Then enable streaming if you want it.
Unsupported endpoints
UnlimitedModel implements chat completions and model listing. Endpoints such as embeddings, audio, images or moderation are not part of the API; clients that require them need a separate provider for those features.
Quick troubleshooting
| Symptom | Fix |
|---|---|
401 | Key missing, wrong, or revoked. Re-copy it from the dashboard. |
403 | The plan does not include the model or API access. Check plan limits. |
404 | Stale model ID. Refresh GET /v1/models. |
| Timeouts | Confirm the client points at https://api.unlimitedmodel.com/v1 and that outbound HTTPS is allowed. |
| Empty streamed replies | Check that your client parses choices[0].delta.content from each event and stops at data: [DONE]. |
Troubleshooting
Start with the status code. Each section below maps a symptom to the most likely cause and the fix.
401 Unauthorized
- The
Authorizationheader is missing or malformed. It must beAuthorization: Bearer YOUR_KEY. - The key was revoked or belongs to another account.
- Your client is sending the key to the wrong host. Confirm the base URL is
https://api.unlimitedmodel.com/v1.
403 Forbidden
- Your subscription does not include the requested model or tier. Check plan limits or choose a different model.
- The request was blocked by the safety policy.
404 Model not found
- The model ID is outdated. Refresh
GET /v1/modelsand use an exact current ID. - The model exists in the catalog but has no available route at the moment; retrying usually resolves it.
429 Too many requests
- You hit the per-key RPM, TPM or concurrency limit. Read
X-RateLimit-RemainingandX-RateLimit-Resetand retry after the window. - Reduce parallel requests if concurrency is the limit (
X-Concurrency-Limit).
Streaming problems
- No output until the end: your HTTP client is buffering. With cURL, add
-N. - Partial text: parse
choices[0].delta.contentper event and stop atdata: [DONE]. - Errors: authentication and model errors arrive as normal JSON responses with an error status, before any stream events.
Client-specific issues
- OpenCode: provider not appearing usually means the provider ID in your config does not match, the JSON is invalid, or the wrong
npmpackage is set. See the OpenCode guide. - Continue: hanging requests usually mean the client is using the Responses API. Set
useResponsesApi: false. See the Continue guide. - Aider: confirm
OPENAI_API_BASEis exported in the same shell that runs Aider, and prefix the model withopenai/. See the Aider guide. - Open WebUI: if connection verification fails, add model IDs manually; chat still works. See the Open WebUI guide.
Still stuck?
Ask other UnlimitedModel users in the community Discord, or open a support ticket from your dashboard for account-specific issues.
Join our Discord ↗FAQ
Short answers to the questions developers ask most.
https://api.unlimitedmodel.com/v1 — the same URL for every endpoint, key and model.
Create one from the API Keys page in your dashboard. The full key is shown once; store it in an environment variable or secret manager.
Whatever GET /v1/models returns for your account right now. The catalog is managed dynamically, so IDs can change over time.
Yes for chat completions, model listing and streaming. Embeddings, audio, image and moderation endpoints are not part of the API.
Yes. Send "stream": true and read server-sent events; the stream ends with data: [DONE]. See Streaming.
You receive 429 with rate-limit headers that tell you when to retry. Limits are per key and come from your plan; see Errors and plan limits.
Yes. Start with the generic OpenAI-compatible guide, or use a tested recipe for OpenCode, Continue, Aider or Open WebUI.
Join the community Discord for setup help and integration tips, or open a support ticket from your dashboard for account-specific issues.