We expose the standard OpenAI surface (/v1/chat/completions and /v1/models), so any client that supports a "custom OpenAI provider" — Cherry Studio, Cursor, ChatBox, LobeChat, NextChat — connects with a single API key and gets every model (GPT-5.5, Claude, Gemini, GLM, …). Usually a one-minute setup. Image, video and audio models use their own task endpoints (see the respective docs pages) with the same key.
| Base URL / API host | https://api.apimodels.app/v1 |
| API Key | your sk_… key (create in console) |
| Model id | gpt-5.6-sol · gpt-5-5 · claude-opus-4-8 · gemini-3-pro-preview · gpt-image-2 |
No key yet? Open Console → Chaves de API and create an sk_… string.
https://api.apimodels.app/v1/Settings → Model Providers → Add, type OpenAI. The host must end with a slash.
https://api.apimodels.app/v1Settings → Models → enable "Override OpenAI Base URL" with the host above, paste your sk_… key, then add a custom model name (e.g. gpt-5-5).
https://api.apimodels.app/v1Settings → pick "OpenAI API Compatible", set the API host above, paste your sk_… key, model gpt-5-5.
https://api.apimodels.app/v1Settings → Language Model → OpenAI, fill API Key and the API proxy address above, model gpt-5-5.
https://apimodels.appSettings → Custom Endpoint, set the endpoint to https://apimodels.app (it appends /v1 itself), API Key your sk_… key, model gpt-5-5.
https://api.apimodels.app/v1Set base_url to the host above, api_key to your sk_… key, model to gpt-5-5. OpenAI SDK example below.
The setup above covers chat only. Image, video and speech models have their own task endpoints rather than /v1/chat/completions, so a base URL alone will not reach them. To use them inside a conversation, install our MCP server — one npx command, works in Claude Desktop, Cursor and Cherry Studio, same key. The assistant then writes the prompt, generates, looks at the result and regenerates until it matches.
These tools read and write files on your machine and run commands, so pick a model that supports function calling (tools) — with one that does not, the agent stalls at the read step without erroring. Each row below states which wire protocol it uses: the three differ, and so do their base URLs, so do not copy the host from the chat-client section.
https://api.apimodels.appSet three env vars: ANTHROPIC_BASE_URL, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_MODEL. Note the host is the bare domain with no path — Claude Code appends /v1/messages itself.
https://api.apimodels.app/v1Add a model_provider in ~/.codex/config.toml with wire_api = "responses" (not chat). These two models are only served on the Responses API.
https://api.apimodels.app/v1Pick "OpenAI Compatible" as the API Provider, fill in the Base URL and API Key, type the Model ID by hand. Choose a tool-capable model — these extensions edit files through function calls, and a model without tools will stall at the read step.
https://api.apimodels.appSet GOOGLE_GEMINI_BASE_URL (bare domain, no path) and GEMINI_API_KEY; on first launch pick “Use Gemini API key” as the auth method, not Google account login.
https://api.apimodels.app/v1Add a custom provider under models.providers in ~/.openclaw/openclaw.json (api: "openai-completions"); every model you want must be listed in the models array or you get “model not allowed”.
https://api.apimodels.app/v1Add an entry under `models` in config.json: provider "openai", apiBase as on the left, apiKey your sk_… key, model the model ID.
https://api.apimodels.app/v1Set OPENAI_API_BASE and OPENAI_API_KEY, then start with `aider --model openai/claude-opus-4-8`. Keep the `openai/` prefix — that is how aider picks the protocol.
Any project using the OpenAI SDK only needs base_url and api_key changed to point here — no other code changes.
from openai import OpenAI
client = OpenAI(
base_url="https://api.apimodels.app/v1",
api_key="sk_your_key_here",
)
resp = client.chat.completions.create(
model="gpt-5-5",
messages=[{"role": "user", "content": "Reply with exactly: ok"}],
)
print(resp.choices[0].message.content)import OpenAI from "openai"
const client = new OpenAI({
baseURL: "https://api.apimodels.app/v1",
apiKey: "sk_your_key_here",
})
const resp = await client.chat.completions.create({
model: "gpt-5-5",
messages: [{ role: "user", content: "Reply with exactly: ok" }],
})
console.log(resp.choices[0].message.content)If a client won't connect, confirm the key + endpoint with curl first — this is exactly what clients hit on "check connection":
# confirm the endpoint + your key work (this is what a client hits on "check connection"):
curl -s https://api.apimodels.app/v1/models \
-H "Authorization: Bearer $APIMODELS_API_KEY" | head -c 300| Sintoma | Causa / correção |
|---|---|
| Connection check fails / no models | Host became …/api/v1/v1/…. Clients like Cherry Studio need the trailing slash (…/api/v1/); clients that append /v1 themselves (e.g. NextChat) take just https://apimodels.app. |
| HTTP 401 | Wrong or disabled key. Mint a fresh sk_… in the console and paste it again. |
| Picked a model but nothing / 400 Unknown model | Model id typo — use the dash form, e.g. gpt-5-5, claude-opus-4-8. Full list at /v1/models. |
| Insufficient balance / 402 | You're only charged for successful requests; top up in the console. |