Documentation

Connect your tools to MeshPool

One personal API key. The same models, budgets, and audit trail as company chat. Point Claude Code, Cursor, Android Studio, OpenCode, OpenWork, Open WebUI, Continue, aider, or any OpenAI-compatible SDK at the MeshPool gateway — no frontier keys on laptops.

Overview

MeshPool exposes an OpenAI-compatible HTTP API (and an Anthropic Messages path for Claude Code). Your editor or script sends a request to the MeshPool gateway. MeshPool authenticates the key, applies your workspace budget and model policy, then returns a completion. Usage lands on the same seat and invoice as chat.

Get a key

Create keys in MeshPool chat. That is the primary path. You do not need administrator rights. Every employee with a seat can mint a key for their own tools.

In chat (recommended)

  1. Sign in to MeshPool chat.
  2. In the left rail, click the key icon. Alternatively open the Account menu and choose API keys.
  3. Give the key a name that says where it will live, for example Claude Code — work laptop or CI — release pipeline. That name is what you will see when you revoke it later.
  4. Create the key and copy it immediately. The secret is shown exactly once. MeshPool stores only the last four characters, so nobody — including support — can recover it.

In the console

You can also create keys at Account → API keys in the company console. The console lists every alias your workspace can call and includes Cursor, Android Studio, OpenCode, OpenWork, and Open WebUI walkthroughs.

Connection details

Substitute the live values below into your tool. Auth is always Authorization: Bearer sk-…. Keys start with sk- followed by an opaque string.

SettingValue
OpenAI base URLhttps://llm.stg.meshpool.ai/v1
Anthropic base URLhttps://llm.stg.meshpool.ai — Claude Code only; no /v1
AuthAuthorization: Bearer sk-…

Supported endpoints:

EndpointPurpose
POST /v1/chat/completionsThe path nearly every tool uses. Streaming is supported.
POST /v1/completionsLegacy text completion.
POST /v1/messagesAnthropic Messages API — Claude Code.
POST /v1/messages/count_tokensToken counting for the Anthropic path.
POST /v1/responsesOpenAI Responses API.
POST /v1/embeddingsEmbeddings.
POST /v1/rerankReranking.
GET /v1/modelsLists exactly the models your key may call.

Other paths return 404. That is intentional: only inference endpoints are public.

Claude Code

Claude Code talks to the Anthropic Messages API. Point it at the base URL without /v1, and use ANTHROPIC_AUTH_TOKEN — not ANTHROPIC_API_KEY, which triggers a different auth path.

  1. Create a personal key in chat (see Get a key) and copy the sk-… secret.
  2. Export the environment variables below in the shell where you run claude. To make them permanent, add the same lines to ~/.zshrc or ~/.bashrc. To scope them to one project, put them in a .envrc and use direnv.
  3. Set ANTHROPIC_MODEL to a MeshPool alias. Start with meshpool-max for hard reasoning, or a named alias your workspace has enabled.
  4. Point the small, fast background model at meshpool-fast so summarising and similar work does not burn the expensive tier.
  5. Optionally set CLAUDE_CODE_MAX_CONTEXT_TOKENS. Claude Code does not recognise MeshPool alias names, so it prints an unrecognized_model notice and assumes a 200k-token window. Everything still works; this variable stops auto-compact from triggering earlier than it needs to when the underlying model is larger.
Shell
export ANTHROPIC_BASE_URL="https://llm.stg.meshpool.ai"
export ANTHROPIC_AUTH_TOKEN="sk-…"
export ANTHROPIC_MODEL="meshpool-max"
export ANTHROPIC_SMALL_FAST_MODEL="meshpool-fast"
export CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000

claude

Verify the connection:

Shell
claude -p "reply with exactly: connected"

If that hangs or errors, run the curl check first. It isolates whether the problem is the key or the Claude Code config.

Cursor

Cursor talks OpenAI Chat Completions. Use the /v1 URL and add each MeshPool alias you want in the picker. Cursor does not import /v1/models into its dropdown — if you skip this step, the alias will not appear.

  1. Open Cursor Settings with ⌘⇧J (macOS) or Ctrl+Shift+J (Windows / Linux), then go to Models.
  2. Paste your MeshPool key into OpenAI API Key and turn that toggle on. Leave Cursor's Anthropic and Google keys empty for MeshPool traffic — Claude and Gemini on MeshPool are served on the OpenAI-compatible path.
  3. Enable Override OpenAI Base URL and set it to https://llm.stg.meshpool.ai/v1. Keep /v1. Do not append /chat/completions.
  4. In Add or search model, type a MeshPool alias exactly and click Add Custom Model, then toggle it on. Repeat for every model you want. Start with the modes — they never collide with Cursor's built-in list — then add the named aliases. Copy the full chat list:
    Aliases
    meshpool-fast
    meshpool-balanced
    meshpool-max
    deepseek-v4-flash-0731
    kimi-k3
    glm-5.2
    kimi-k2.7-code
    minimax-m3
    qwen3.7-plus
    deepseek-v4-pro
    kimi-k2.6
    minimax-m2.7
    qwen3.7-max
    qwen3.6-plus
    gemma-4-26b-a4b-it
    gemma-4-31b-it
    glm-5.1
    qwen3.5-397b-a17b
    kimi-k2.5
    deepseek-v3.2
    gpt-4o
    gpt-4o-mini
    gpt-4.1
    gpt-4.1-mini
    gpt-4.1-nano
    gpt-5
    gpt-5-mini
    gpt-5-nano
    gpt-5.1
    gpt-5.2
    gpt-5.4
    gpt-5.4-mini
    gpt-5.4-nano
    gpt-5.5
    gpt-5.6-sol
    o1
    o3
    o3-mini
    o4-mini
    grok-4.3
    claude-opus-5
    claude-opus-5-fast
    claude-fable-5
    claude-opus-4.8
    claude-opus-4-8-fast
    claude-opus-4.7
    claude-opus-4-7-fast
    claude-opus-4.6
    claude-opus-4.5
    claude-sonnet-5
    claude-sonnet-4.6
    claude-sonnet-4.5
    claude-haiku-4.5
    gpt-5.6-terra
    gpt-5.6-luna
    gpt-5.5-pro
    gpt-5.4-pro
    gpt-5.3-codex
    gpt-5.2-codex
    gpt-oss-120b
    gemini-3.7-flash
    gemini-3.6-flash
    gemini-3.1-pro
    gemini-3.1-pro-preview
    gemini-3.1-flash-lite
    gemini-3-5-flash
    gemini-3-flash-preview
    google/gemini-3.5-flash-lite
    gemini-2.5-flash
    glm-5.3
    glm-5
    glm-4.7
    glm-4.6
    glm-4.5
    glm-4.5-air
    qwen-3-8-max
    qwen3.6-27b
    qwen3-5-35b-a3b
    qwen3-6-35b-a3b
    deepseek-v4-flash
    deepseek-v4-pro-0813
    grok-4.5
    aion-labs.aion-2-0
    muse-spark-1.2
    stealth/ox-alpha
  5. Press Verify. In Chat, pick the alias from the model dropdown. Avoid Auto — that stays on Cursor's own router.

Image aliases such as nano-banana, gpt-image-2, and grok-imagine cannot be used in Cursor Chat — see Image models.

Android Studio

Gemini in Android Studio can call MeshPool as a third-party remote provider. It talks OpenAI Chat Completions, so use the /v1 URL and your MeshPool sk-… key. Unlike Cursor, Android Studio does import GET /v1/models after you click Refresh — you do not type aliases by hand.

  1. Create a personal key in chat (see Get a key) and copy the sk-… secret.
  2. Open Android Studio settings: Android Studio → Settings on macOS, or File → Settings on Windows / Linux. Expand Tools → AI and select Model Providers.
  3. Click Add and choose Third-Party Remote Provider. If that menu is missing, update Android Studio to a current release that includes Tools → AI → Model Providers.
  4. Fill in the provider:
    • Description — any label, for example MeshPool.
    • URLhttps://llm.stg.meshpool.ai/v1. Keep /v1. Do not append /chat/completions, and do not use the Anthropic host (that path is for Claude Code only).
    • API key — paste your MeshPool secret.
    If the form asks for a URL schema or API type, choose OpenAI-compatible.
  5. Click Refresh so Android Studio loads the aliases this key may call. Enable the ones you want — start with meshpool-fast, meshpool-balanced, and meshpool-max — then OK.
  6. Open the AI chat or Agent panel and pick a MeshPool alias from the model picker. Leave Google's built-in Gemini selected only for features that third-party models do not cover.

OpenCode

OpenCode talks OpenAI Chat Completions. Use the /v1 URL and paste the config below. Like Cursor, OpenCode does not import /v1/models — every chat alias is listed in opencode.json. Your key can only call models the workspace has enabled; extra names in the file return 403.

  1. Create a personal key in chat (see Get a key) and copy the sk-… secret.
  2. In OpenCode, run /connect, choose Other, set the provider id to meshpool, and paste the key. That stores the credential only — you still need the config file next.
  3. Create or update ~/.config/opencode/opencode.json (global) or opencode.json in the project root. The provider id must match meshpool exactly. Keep /v1 on the base URL. Do not append /chat/completions.
  4. Restart OpenCode, run /models, and pick a MeshPool alias (for example meshpool/meshpool-max or meshpool/claude-opus-5).
JSON
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "meshpool": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "MeshPool",
      "options": {
        "baseURL": "https://llm.stg.meshpool.ai/v1"
      },
      "models": {
        "meshpool-fast": { "name": "MeshPool Fast" },
        "meshpool-balanced": { "name": "MeshPool Balanced" },
        "meshpool-max": { "name": "MeshPool Max" },
        "deepseek-v4-flash-0731": { "name": "DeepSeek-V4-Flash-0731" },
        "kimi-k3": { "name": "Kimi K3" },
        "glm-5.2": { "name": "GLM 5.2" },
        "kimi-k2.7-code": { "name": "Kimi K2.7 Code" },
        "minimax-m3": { "name": "MiniMax M3" },
        "qwen3.7-plus": { "name": "Qwen3.7 Plus" },
        "deepseek-v4-pro": { "name": "DeepSeek-V4-Pro" },
        "kimi-k2.6": { "name": "Kimi K2.6" },
        "minimax-m2.7": { "name": "MiniMax M2.7" },
        "qwen3.7-max": { "name": "Qwen3.7 Max" },
        "qwen3.6-plus": { "name": "Qwen3.6 Plus" },
        "gemma-4-26b-a4b-it": { "name": "Gemma 4 26B A4B IT" },
        "gemma-4-31b-it": { "name": "Gemma 4 31B IT" },
        "glm-5.1": { "name": "GLM 5.1" },
        "qwen3.5-397b-a17b": { "name": "Qwen3.5 397B A17B" },
        "kimi-k2.5": { "name": "Kimi K2.5" },
        "deepseek-v3.2": { "name": "DeepSeek V3.2" },
        "gpt-4o": { "name": "GPT-4o" },
        "gpt-4o-mini": { "name": "GPT-4o mini" },
        "gpt-4.1": { "name": "GPT-4.1" },
        "gpt-4.1-mini": { "name": "GPT-4.1 mini" },
        "gpt-4.1-nano": { "name": "GPT-4.1 nano" },
        "gpt-5": { "name": "GPT-5" },
        "gpt-5-mini": { "name": "GPT-5 mini" },
        "gpt-5-nano": { "name": "GPT-5 nano" },
        "gpt-5.1": { "name": "GPT-5.1" },
        "gpt-5.2": { "name": "GPT-5.2" },
        "gpt-5.4": { "name": "GPT-5.4" },
        "gpt-5.4-mini": { "name": "GPT-5.4 mini" },
        "gpt-5.4-nano": { "name": "GPT-5.4 nano" },
        "gpt-5.5": { "name": "GPT-5.5" },
        "gpt-5.6-sol": { "name": "GPT-5.6 Sol" },
        "o1": { "name": "o1" },
        "o3": { "name": "o3" },
        "o3-mini": { "name": "o3-mini" },
        "o4-mini": { "name": "o4-mini" },
        "grok-4.3": { "name": "Grok 4.3" },
        "claude-opus-5": { "name": "Claude Opus 5" },
        "claude-opus-5-fast": { "name": "Claude Opus 5 Fast" },
        "claude-fable-5": { "name": "Claude Fable 5" },
        "claude-opus-4.8": { "name": "Claude Opus 4.8" },
        "claude-opus-4-8-fast": { "name": "Claude Opus 4.8 Fast" },
        "claude-opus-4.7": { "name": "Claude Opus 4.7" },
        "claude-opus-4-7-fast": { "name": "Claude Opus 4.7 Fast" },
        "claude-opus-4.6": { "name": "Claude Opus 4.6" },
        "claude-opus-4.5": { "name": "Claude Opus 4.5" },
        "claude-sonnet-5": { "name": "Claude Sonnet 5" },
        "claude-sonnet-4.6": { "name": "Claude Sonnet 4.6" },
        "claude-sonnet-4.5": { "name": "Claude Sonnet 4.5" },
        "claude-haiku-4.5": { "name": "Claude Haiku 4.5" },
        "gpt-5.6-terra": { "name": "GPT-5.6 Terra" },
        "gpt-5.6-luna": { "name": "GPT-5.6 Luna" },
        "gpt-5.5-pro": { "name": "GPT-5.5 Pro" },
        "gpt-5.4-pro": { "name": "GPT-5.4 Pro" },
        "gpt-5.3-codex": { "name": "GPT-5.3 Codex" },
        "gpt-5.2-codex": { "name": "GPT-5.2 Codex" },
        "gpt-oss-120b": { "name": "GPT-OSS 120B" },
        "gemini-3.7-flash": { "name": "Gemini 3.7 Flash" },
        "gemini-3.6-flash": { "name": "Gemini 3.6 Flash" },
        "gemini-3.1-pro": { "name": "Gemini 3.1 Pro" },
        "gemini-3.1-pro-preview": { "name": "Gemini 3.1 Pro Preview" },
        "gemini-3.1-flash-lite": { "name": "Gemini 3.1 Flash Lite" },
        "gemini-3-5-flash": { "name": "Gemini 3.5 Flash" },
        "gemini-3-flash-preview": { "name": "Gemini 3 Flash Preview" },
        "google/gemini-3.5-flash-lite": { "name": "Gemini 3.5 Flash Lite" },
        "gemini-2.5-flash": { "name": "Gemini 2.5 Flash" },
        "glm-5.3": { "name": "GLM 5.3" },
        "glm-5": { "name": "GLM 5" },
        "glm-4.7": { "name": "GLM 4.7" },
        "glm-4.6": { "name": "GLM 4.6" },
        "glm-4.5": { "name": "GLM 4.5" },
        "glm-4.5-air": { "name": "GLM 4.5 Air" },
        "qwen-3-8-max": { "name": "Qwen 3.8 Max" },
        "qwen3.6-27b": { "name": "Qwen3.6 27B" },
        "qwen3-5-35b-a3b": { "name": "Qwen3.5 35B A3B" },
        "qwen3-6-35b-a3b": { "name": "Qwen3.6 35B A3B" },
        "deepseek-v4-flash": { "name": "DeepSeek-V4-Flash" },
        "deepseek-v4-pro-0813": { "name": "DeepSeek-V4-Pro-0813" },
        "grok-4.5": { "name": "Grok 4.5" },
        "aion-labs.aion-2-0": { "name": "Aion 2.0" },
        "muse-spark-1.2": { "name": "Muse Spark 1.2" },
        "stealth/ox-alpha": { "name": "Stealth OX Alpha" }
      }
    }
  }
}

Official custom-provider steps: OpenCode providers.

OpenWork

OpenWork is an open-source desktop agent built on OpenCode primitives. Use the /v1 URL and a personal sk-… key. Like OpenCode, it does not import /v1/models — you name the aliases when you connect the provider.

Install from the project README or the official downloads page:

From the app

  1. Create a personal key (see Get a key) and copy the sk-… secret.
  2. Open Settings → AI → Connect provider.
  3. Choose Add custom provider at the bottom of the list.
  4. Set Name to MeshPool, ID to meshpool, and Base URL to https://llm.stg.meshpool.ai/v1. Keep /v1; do not append /chat/completions. Paste the MeshPool key as API key. For Model IDs, start with meshpool-fast, meshpool-balanced, and meshpool-max. Add named aliases from the OpenCode models map if you want them in the picker.
  5. Click Add provider. OpenWork writes the workspace opencode.jsonc and the aliases appear in the model picker.

From the config file

OpenWork prefers a workspace-local file over the global OpenCode config: <workspace>/.config/opencode/opencode.json. Paste the same MeshPool provider block as OpenCode. The provider id must be meshpool.

JSON
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "meshpool": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "MeshPool",
      "options": {
        "baseURL": "https://llm.stg.meshpool.ai/v1"
      },
      "models": {
        "meshpool-fast": { "name": "MeshPool Fast" },
        "meshpool-balanced": { "name": "MeshPool Balanced" },
        "meshpool-max": { "name": "MeshPool Max" },
        "deepseek-v4-flash-0731": { "name": "DeepSeek-V4-Flash-0731" },
        "kimi-k3": { "name": "Kimi K3" },
        "glm-5.2": { "name": "GLM 5.2" },
        "kimi-k2.7-code": { "name": "Kimi K2.7 Code" },
        "minimax-m3": { "name": "MiniMax M3" },
        "qwen3.7-plus": { "name": "Qwen3.7 Plus" },
        "deepseek-v4-pro": { "name": "DeepSeek-V4-Pro" },
        "kimi-k2.6": { "name": "Kimi K2.6" },
        "minimax-m2.7": { "name": "MiniMax M2.7" },
        "qwen3.7-max": { "name": "Qwen3.7 Max" },
        "qwen3.6-plus": { "name": "Qwen3.6 Plus" },
        "gemma-4-26b-a4b-it": { "name": "Gemma 4 26B A4B IT" },
        "gemma-4-31b-it": { "name": "Gemma 4 31B IT" },
        "glm-5.1": { "name": "GLM 5.1" },
        "qwen3.5-397b-a17b": { "name": "Qwen3.5 397B A17B" },
        "kimi-k2.5": { "name": "Kimi K2.5" },
        "deepseek-v3.2": { "name": "DeepSeek V3.2" },
        "gpt-4o": { "name": "GPT-4o" },
        "gpt-4o-mini": { "name": "GPT-4o mini" },
        "gpt-4.1": { "name": "GPT-4.1" },
        "gpt-4.1-mini": { "name": "GPT-4.1 mini" },
        "gpt-4.1-nano": { "name": "GPT-4.1 nano" },
        "gpt-5": { "name": "GPT-5" },
        "gpt-5-mini": { "name": "GPT-5 mini" },
        "gpt-5-nano": { "name": "GPT-5 nano" },
        "gpt-5.1": { "name": "GPT-5.1" },
        "gpt-5.2": { "name": "GPT-5.2" },
        "gpt-5.4": { "name": "GPT-5.4" },
        "gpt-5.4-mini": { "name": "GPT-5.4 mini" },
        "gpt-5.4-nano": { "name": "GPT-5.4 nano" },
        "gpt-5.5": { "name": "GPT-5.5" },
        "gpt-5.6-sol": { "name": "GPT-5.6 Sol" },
        "o1": { "name": "o1" },
        "o3": { "name": "o3" },
        "o3-mini": { "name": "o3-mini" },
        "o4-mini": { "name": "o4-mini" },
        "grok-4.3": { "name": "Grok 4.3" },
        "claude-opus-5": { "name": "Claude Opus 5" },
        "claude-opus-5-fast": { "name": "Claude Opus 5 Fast" },
        "claude-fable-5": { "name": "Claude Fable 5" },
        "claude-opus-4.8": { "name": "Claude Opus 4.8" },
        "claude-opus-4-8-fast": { "name": "Claude Opus 4.8 Fast" },
        "claude-opus-4.7": { "name": "Claude Opus 4.7" },
        "claude-opus-4-7-fast": { "name": "Claude Opus 4.7 Fast" },
        "claude-opus-4.6": { "name": "Claude Opus 4.6" },
        "claude-opus-4.5": { "name": "Claude Opus 4.5" },
        "claude-sonnet-5": { "name": "Claude Sonnet 5" },
        "claude-sonnet-4.6": { "name": "Claude Sonnet 4.6" },
        "claude-sonnet-4.5": { "name": "Claude Sonnet 4.5" },
        "claude-haiku-4.5": { "name": "Claude Haiku 4.5" },
        "gpt-5.6-terra": { "name": "GPT-5.6 Terra" },
        "gpt-5.6-luna": { "name": "GPT-5.6 Luna" },
        "gpt-5.5-pro": { "name": "GPT-5.5 Pro" },
        "gpt-5.4-pro": { "name": "GPT-5.4 Pro" },
        "gpt-5.3-codex": { "name": "GPT-5.3 Codex" },
        "gpt-5.2-codex": { "name": "GPT-5.2 Codex" },
        "gpt-oss-120b": { "name": "GPT-OSS 120B" },
        "gemini-3.7-flash": { "name": "Gemini 3.7 Flash" },
        "gemini-3.6-flash": { "name": "Gemini 3.6 Flash" },
        "gemini-3.1-pro": { "name": "Gemini 3.1 Pro" },
        "gemini-3.1-pro-preview": { "name": "Gemini 3.1 Pro Preview" },
        "gemini-3.1-flash-lite": { "name": "Gemini 3.1 Flash Lite" },
        "gemini-3-5-flash": { "name": "Gemini 3.5 Flash" },
        "gemini-3-flash-preview": { "name": "Gemini 3 Flash Preview" },
        "google/gemini-3.5-flash-lite": { "name": "Gemini 3.5 Flash Lite" },
        "gemini-2.5-flash": { "name": "Gemini 2.5 Flash" },
        "glm-5.3": { "name": "GLM 5.3" },
        "glm-5": { "name": "GLM 5" },
        "glm-4.7": { "name": "GLM 4.7" },
        "glm-4.6": { "name": "GLM 4.6" },
        "glm-4.5": { "name": "GLM 4.5" },
        "glm-4.5-air": { "name": "GLM 4.5 Air" },
        "qwen-3-8-max": { "name": "Qwen 3.8 Max" },
        "qwen3.6-27b": { "name": "Qwen3.6 27B" },
        "qwen3-5-35b-a3b": { "name": "Qwen3.5 35B A3B" },
        "qwen3-6-35b-a3b": { "name": "Qwen3.6 35B A3B" },
        "deepseek-v4-flash": { "name": "DeepSeek-V4-Flash" },
        "deepseek-v4-pro-0813": { "name": "DeepSeek-V4-Pro-0813" },
        "grok-4.5": { "name": "Grok 4.5" },
        "aion-labs.aion-2-0": { "name": "Aion 2.0" },
        "muse-spark-1.2": { "name": "Muse Spark 1.2" },
        "stealth/ox-alpha": { "name": "Stealth OX Alpha" }
      }
    }
  }
}

Open WebUI

Open WebUI is a self-hosted chat UI that talks OpenAI Chat Completions. Use the /v1 URL and a personal sk-… key. Unlike Cursor, it does import GET /v1/models — the picker fills from whatever this key may call. You do not need a local model runner.

Install from the project README or the official getting-started guide:

Docker

OpenAI-compatible API only. After it starts, open http://localhost:3000. Keep /v1 on the base URL.

Shell
docker run -d -p 3000:8080 \
  -e OPENAI_API_BASE_URL="https://llm.stg.meshpool.ai/v1" \
  -e OPENAI_API_KEY="sk-…" \
  -v open-webui:/app/backend/data \
  --name open-webui --restart always \
  ghcr.io/open-webui/open-webui:main

pip

Requires Python 3.11. Serves http://localhost:8080.

Shell
pip install open-webui
OPENAI_API_BASE_URL="https://llm.stg.meshpool.ai/v1" \
OPENAI_API_KEY="sk-…" \
open-webui serve

Already running

  1. Create a personal key (see Get a key) and copy the sk-… secret.
  2. Sign in as the first Open WebUI account — that user is the admin.
  3. Open Admin Panel → Settings → Connections.
  4. Enable the OpenAI connection. Set API Base URL to https://llm.stg.meshpool.ai/v1. Keep /v1; do not append /chat/completions. Paste the MeshPool key as API Key.
  5. Save, refresh the model list, and pick a MeshPool alias (meshpool-fast, meshpool-balanced, meshpool-max, or a named alias).

Continue

Continue is an OpenAI-compatible client. Paste the model list into ~/.continue/config.json (or your project config) with the /v1 base URL. The snippet includes every chat alias; delete rows you do not want. Image models are omitted.

  1. Create a personal key and copy the sk-… secret.
  2. Open ~/.continue/config.json.
  3. Add a model entry with provider set to openai, apiBase set to https://llm.stg.meshpool.ai/v1, and model set to a MeshPool alias — not openai/….
JSON
{
  "models": [
    { "title": "MeshPool Fast", "provider": "openai", "model": "meshpool-fast", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "MeshPool Balanced", "provider": "openai", "model": "meshpool-balanced", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "MeshPool Max", "provider": "openai", "model": "meshpool-max", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "DeepSeek-V4-Flash-0731", "provider": "openai", "model": "deepseek-v4-flash-0731", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Kimi K3", "provider": "openai", "model": "kimi-k3", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GLM 5.2", "provider": "openai", "model": "glm-5.2", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Kimi K2.7 Code", "provider": "openai", "model": "kimi-k2.7-code", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "MiniMax M3", "provider": "openai", "model": "minimax-m3", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Qwen3.7 Plus", "provider": "openai", "model": "qwen3.7-plus", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "DeepSeek-V4-Pro", "provider": "openai", "model": "deepseek-v4-pro", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Kimi K2.6", "provider": "openai", "model": "kimi-k2.6", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "MiniMax M2.7", "provider": "openai", "model": "minimax-m2.7", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Qwen3.7 Max", "provider": "openai", "model": "qwen3.7-max", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Qwen3.6 Plus", "provider": "openai", "model": "qwen3.6-plus", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemma 4 26B A4B IT", "provider": "openai", "model": "gemma-4-26b-a4b-it", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemma 4 31B IT", "provider": "openai", "model": "gemma-4-31b-it", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GLM 5.1", "provider": "openai", "model": "glm-5.1", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Qwen3.5 397B A17B", "provider": "openai", "model": "qwen3.5-397b-a17b", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Kimi K2.5", "provider": "openai", "model": "kimi-k2.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "DeepSeek V3.2", "provider": "openai", "model": "deepseek-v3.2", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-4o", "provider": "openai", "model": "gpt-4o", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-4o mini", "provider": "openai", "model": "gpt-4o-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-4.1", "provider": "openai", "model": "gpt-4.1", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-4.1 mini", "provider": "openai", "model": "gpt-4.1-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-4.1 nano", "provider": "openai", "model": "gpt-4.1-nano", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5", "provider": "openai", "model": "gpt-5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5 mini", "provider": "openai", "model": "gpt-5-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5 nano", "provider": "openai", "model": "gpt-5-nano", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.1", "provider": "openai", "model": "gpt-5.1", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.2", "provider": "openai", "model": "gpt-5.2", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.4", "provider": "openai", "model": "gpt-5.4", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.4 mini", "provider": "openai", "model": "gpt-5.4-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.4 nano", "provider": "openai", "model": "gpt-5.4-nano", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.5", "provider": "openai", "model": "gpt-5.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.6 Sol", "provider": "openai", "model": "gpt-5.6-sol", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "o1", "provider": "openai", "model": "o1", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "o3", "provider": "openai", "model": "o3", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "o3-mini", "provider": "openai", "model": "o3-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "o4-mini", "provider": "openai", "model": "o4-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Grok 4.3", "provider": "openai", "model": "grok-4.3", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Opus 5", "provider": "openai", "model": "claude-opus-5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Opus 5 Fast", "provider": "openai", "model": "claude-opus-5-fast", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Fable 5", "provider": "openai", "model": "claude-fable-5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Opus 4.8", "provider": "openai", "model": "claude-opus-4.8", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Opus 4.8 Fast", "provider": "openai", "model": "claude-opus-4-8-fast", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Opus 4.7", "provider": "openai", "model": "claude-opus-4.7", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Opus 4.7 Fast", "provider": "openai", "model": "claude-opus-4-7-fast", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Opus 4.6", "provider": "openai", "model": "claude-opus-4.6", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Opus 4.5", "provider": "openai", "model": "claude-opus-4.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Sonnet 5", "provider": "openai", "model": "claude-sonnet-5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Sonnet 4.6", "provider": "openai", "model": "claude-sonnet-4.6", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Sonnet 4.5", "provider": "openai", "model": "claude-sonnet-4.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Claude Haiku 4.5", "provider": "openai", "model": "claude-haiku-4.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.6 Terra", "provider": "openai", "model": "gpt-5.6-terra", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.6 Luna", "provider": "openai", "model": "gpt-5.6-luna", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.5 Pro", "provider": "openai", "model": "gpt-5.5-pro", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.4 Pro", "provider": "openai", "model": "gpt-5.4-pro", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.3 Codex", "provider": "openai", "model": "gpt-5.3-codex", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-5.2 Codex", "provider": "openai", "model": "gpt-5.2-codex", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GPT-OSS 120B", "provider": "openai", "model": "gpt-oss-120b", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemini 3.7 Flash", "provider": "openai", "model": "gemini-3.7-flash", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemini 3.6 Flash", "provider": "openai", "model": "gemini-3.6-flash", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemini 3.1 Pro", "provider": "openai", "model": "gemini-3.1-pro", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemini 3.1 Pro Preview", "provider": "openai", "model": "gemini-3.1-pro-preview", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemini 3.1 Flash Lite", "provider": "openai", "model": "gemini-3.1-flash-lite", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemini 3.5 Flash", "provider": "openai", "model": "gemini-3-5-flash", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemini 3 Flash Preview", "provider": "openai", "model": "gemini-3-flash-preview", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemini 3.5 Flash Lite", "provider": "openai", "model": "google/gemini-3.5-flash-lite", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Gemini 2.5 Flash", "provider": "openai", "model": "gemini-2.5-flash", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GLM 5.3", "provider": "openai", "model": "glm-5.3", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GLM 5", "provider": "openai", "model": "glm-5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GLM 4.7", "provider": "openai", "model": "glm-4.7", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GLM 4.6", "provider": "openai", "model": "glm-4.6", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GLM 4.5", "provider": "openai", "model": "glm-4.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "GLM 4.5 Air", "provider": "openai", "model": "glm-4.5-air", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Qwen 3.8 Max", "provider": "openai", "model": "qwen-3-8-max", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Qwen3.6 27B", "provider": "openai", "model": "qwen3.6-27b", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Qwen3.5 35B A3B", "provider": "openai", "model": "qwen3-5-35b-a3b", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Qwen3.6 35B A3B", "provider": "openai", "model": "qwen3-6-35b-a3b", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "DeepSeek-V4-Flash", "provider": "openai", "model": "deepseek-v4-flash", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "DeepSeek-V4-Pro-0813", "provider": "openai", "model": "deepseek-v4-pro-0813", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Grok 4.5", "provider": "openai", "model": "grok-4.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Aion 2.0", "provider": "openai", "model": "aion-labs.aion-2-0", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Muse Spark 1.2", "provider": "openai", "model": "muse-spark-1.2", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
    { "title": "Stealth OX Alpha", "provider": "openai", "model": "stealth/ox-alpha", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" }
  ]
}

aider

aider uses the OpenAI-compatible path. Export the base URL and key, then prefix the MeshPool alias with openai/ so aider knows which protocol to speak.

  1. Export the two variables below in the shell where you run aider.
  2. Launch aider with --model openai/meshpool-max or a named alias such as --model openai/claude-opus-5. The openai/ prefix is aider's driver name, not part of the MeshPool alias.
Shell
export OPENAI_API_BASE="https://llm.stg.meshpool.ai/v1"
export OPENAI_API_KEY="sk-…"

aider --model openai/meshpool-max

OpenAI SDKs

Both official SDKs take a base_url / baseURL. Nothing else changes. Streaming, tool calling, and JSON mode work as they do against OpenAI, subject to what the underlying model supports.

Python

Python
from openai import OpenAI

client = OpenAI(
    api_key="sk-…",  # or os.environ["MESHPOOL_API_KEY"]
    base_url="https://llm.stg.meshpool.ai/v1",
)

response = client.chat.completions.create(
    model="meshpool-balanced",
    messages=[{"role": "user", "content": "Say hello"}],
)
print(response.choices[0].message.content)

Node / TypeScript

TypeScript
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.MESHPOOL_API_KEY,
  baseURL: "https://llm.stg.meshpool.ai/v1",
});

const response = await client.chat.completions.create({
  model: "meshpool-balanced",
  messages: [{ role: "user", content: "Say hello" }],
});
console.log(response.choices[0].message.content);

LangChain, LlamaIndex, and similar libraries follow the same pattern: set the OpenAI base URL to https://llm.stg.meshpool.ai/v1, paste the key where the library asks for an OpenAI API key, and pass a MeshPool alias as model.

curl

Use this as a first check whenever a tool misbehaves. A 200 here means the key, URL, and alias are fine — look at the client config next.

Shell
curl -sS https://llm.stg.meshpool.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-…" \
  -H "Content-Type: application/json" \
  -d '{"model":"meshpool-fast","messages":[{"role":"user","content":"say ok"}]}'

List every alias this key is allowed to call:

Shell
curl -s https://llm.stg.meshpool.ai/v1/models \
  -H "Authorization: Bearer sk-…" | jq -r '.data[].id' | sort

Modes and named aliases

The model field must be a MeshPool alias, not a raw vendor model id. Your key can only call aliases your administrator has enabled. A 403 with key_model_access_denied means the name is real but not on the workspace allowlist. Enabling it under Model policy takes effect on existing keys — you do not need to mint a new one.

Three aliases route by intent rather than naming a specific model, so you keep working when MeshPool updates the default behind the tier:

AliasUse for
meshpool-fastHigh-volume, latency-sensitive work. Cheap. A good default for background tasks.
meshpool-balancedGeneral coding and reasoning. Everyday work.
meshpool-maxHard problems where quality matters more than cost.

Named chat aliases are in the OpenCode, OpenWork, Continue, and Cursor snippets above. Open WebUI loads the same list from /v1/models. Use a named model when you care about that model's behaviour; use a mode when you want MeshPool to pick the current default for that tier. Image aliases are listed separately under Image models.

Ask the key what it can reach — that list is always authoritative:

Shell
curl -s https://llm.stg.meshpool.ai/v1/models \
  -H "Authorization: Bearer sk-…" | jq -r '.data[].id' | sort

Image models

Aliases such as nano-banana, gpt-image-2, and grok-imagine are image generation, not chat. They speak POST /v1/images/generations. They will not work as the model in Cursor Chat, Agent, Composer, Android Studio Chat or Agent, OpenCode, OpenWork, Open WebUI chat, Continue, aider, or /v1/chat/completions.

Budgets, limits, and revoke

Requests made with an API key are treated like chat requests:

  • They count against your seat budget. Chat and API usage share one monthly cap. Spending it in Claude Code means you cannot spend it in chat.
  • Minting more keys does not raise your budget. Ten keys share one allowance.
  • Your rate limits apply. Requests-per-minute and tokens-per-minute ceilings on your seat apply to API traffic too.
  • Usage is attributed to you. It appears in workspace usage reports and invoices under your name, alongside chat.
  • Workspace model policy applies. A key can only call models your administrator has enabled.
  • Guardrails and residency apply the same way they do in chat.

When you exhaust your budget the gateway returns 429. That is not a bug in your client — top up, or ask an administrator to raise your seat cap.

Rotating and revoking

Revoke a key from the chat API keys dialog or from Account → API keys. It stops working immediately, everywhere.

Rotate by creating the replacement first, updating your tool, then revoking the old key. There is no overlap penalty — both are valid until you revoke. Revoke immediately if a key was committed to a repository, pasted into a chat or ticket, or lived on a machine you no longer control. Revoking an API key does not sign you out of chat; they are separate credentials by design.

Troubleshooting

Start here. This single command distinguishes a bad key from a bad client config:

Shell
curl -sS https://llm.stg.meshpool.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-…" \
  -H "Content-Type: application/json" \
  -d '{"model":"meshpool-fast","messages":[{"role":"user","content":"say ok"}]}'
SymptomCauseFix
401 UnauthorizedKey is wrong, revoked, or has stray whitespace.Re-copy it. Check you did not paste a trailing newline.
400 naming the model, or 403 key_model_access_deniedThe alias is missing or not on your key's allowlist.Run the /v1/models call above and use a name from it, or ask an admin to enable the alias.
429 with a budget messageSeat budget exhausted.Top up, or ask an admin to raise your cap.
429 without a budget messageRPM/TPM ceiling hit.Back off and retry; ask an admin if it is persistent.
404 on an unexpected pathThat endpoint is not exposed on the public gateway.Use one of the supported endpoints.
Claude Code 404s on every turnANTHROPIC_BASE_URL has a trailing /v1, so requests go to /v1/v1/messages.Drop the /v1; Claude Code appends its own path.
Cursor Verify hangsHTTP/2 compatibility with the custom base URL.Set Network → HTTP Compatibility Mode to HTTP/1.1.
Cursor picker missing a modelCursor does not import /v1/models.Add the alias with Add Custom Model. Prefer meshpool-fast / meshpool-balanced / meshpool-max first.
Android Studio Refresh is emptyWrong URL, missing /v1, or the key cannot list models.Use https://llm.stg.meshpool.ai/v1, re-paste the key, then Refresh again. Confirm the curl models call returns aliases.
No Model Providers menuThis Android Studio build does not include remote providers.Update to a current Android Studio with Tools → AI → Model Providers.
OpenCode picker missing MeshPoolCustom providers do not import /v1/models, or the provider id does not match.List every chat alias under models in opencode.json (the snippet on this page). The /connect provider id must be meshpool.
OpenWork picker missing MeshPoolThe custom provider was not added, the base URL is missing /v1, or the provider id does not match.Use Settings → AI → Connect provider → Add custom provider with id meshpool and base URL https://llm.stg.meshpool.ai/v1, or paste the OpenCode models map into <workspace>/.config/opencode/opencode.json.
Open WebUI model list is emptyMissing /v1, key cannot list models, or the connection still points at the default OpenAI host.Set OPENAI_API_BASE_URL / API Base URL to https://llm.stg.meshpool.ai/v1, re-paste the key, then refresh models.
Connection refused or DNS failureThe gateway host does not resolve from your network.Confirm you can reach https://llm.stg.meshpool.ai. If it fails from the company network, write support@meshpool.ai.

Still stuck? Email support@meshpool.ai, or get a demo.

API documentation · MeshPool