Get Started

Connect your editor, agent, or CLI to the live Kourier.sh model through OpenAI-compatible APIs.

kourier.sh serves DeepSeek V4 Flash behind OpenAI-compatible and Anthropic-compatible endpoints. If a tool lets you set a custom base URL and API key, it talks to kourier.sh with no new SDK to learn.

kourier.sh is currently in alpha. API access is controlled through the Omega early-access entitlement.

Get an API key

  1. Sign up at app.kourier.sh/signup. New accounts start on Free with dashboard access.
  2. Redeem an Omega activation code on the Dashboard, or ask an administrator to assign Omega.
  3. Open Dashboard → API Keys and generate a key. It's shown once — copy it immediately.

Quick start

Point any OpenAI-compatible client at kourier.sh with two environment variables:

export OPENAI_API_KEY="sk-bf-..."
export OPENAI_BASE_URL="https://api.kourier.sh/v1"

That's enough for any tool that reads the standard OPENAI_API_KEY / OPENAI_BASE_URL (or an equivalent "custom OpenAI-compatible provider") setting.

Compatible clients

These tools accept a custom OpenAI-compatible base URL and key — some read the env vars above directly (Aider, raw SDK/curl), others take the same base URL and key through their own settings UI or config file:

ToolWhere to set it
CursorSettings → Models → add an OpenAI API key, override the base URL
Zedsettings.jsonlanguage_models.openai.api_url
OpenCodeProvider config → add an OpenAI-compatible provider
Cline (VS Code)Provider dropdown → "OpenAI Compatible"
Continue (VS Code / JetBrains)config.json → provider "openai" with a custom apiBase
Aider--openai-api-base flag, or the env vars above
Any OpenAI SDK (Python, Node, curl, etc.)base_url / OPENAI_BASE_URL constructor option

Codex CLI

Codex removed the legacy chat wire format, so it must be pinned to wire_api = "responses" — which kourier.sh serves natively (streaming and tool calls included). Add a custom provider to ~/.codex/config.toml:

[model_providers.kourier]
name = "Kourier"
base_url = "https://api.kourier.sh/v1"
env_key = "KOURIER_API_KEY"
wire_api = "responses"

[profiles.kourier]
model_provider = "kourier"
model = "DSV4-Flash-0731"

Export your key and run Codex against the profile:

export KOURIER_API_KEY="sk-bf-..."
codex --profile kourier

model must be one your key is granted, or the first request is rejected. The dashboard's Connect your tools panel shows the exact model string for your account.

Claude Code

Claude Code speaks Anthropic's Messages API. Point it at the endpoint's Anthropic surface (https://api.kourier.sh/anthropic — Claude Code appends /v1/messages itself) and pin both model variables to your granted model:

export ANTHROPIC_BASE_URL="https://api.kourier.sh/anthropic"
export ANTHROPIC_AUTH_TOKEN="sk-bf-..."
export ANTHROPIC_MODEL="DSV4-Flash-0731"
export ANTHROPIC_SMALL_FAST_MODEL="DSV4-Flash-0731"

ANTHROPIC_SMALL_FAST_MODEL is required: left unset, Claude Code routes background tasks to a Haiku model your key isn't granted, and those calls fail. Use ANTHROPIC_AUTH_TOKEN (not ANTHROPIC_API_KEY) so the key is sent as Authorization: Bearer — though the endpoint accepts either header. Set both models to whatever your key is granted (shown in the dashboard's Connect your tools panel).

Manual configuration

SettingValue
Base URLhttps://api.kourier.sh/v1
Chat completions endpointhttps://api.kourier.sh/v1/chat/completions
Auth headerAuthorization: Bearer <your API key>
Live model stringDSV4-Flash-0731
Supported input contextUp to 262,144 tokens
Maximum context length278,528 tokens (272K)

API reference

kourier.sh implements the OpenAI Chat Completions API, including streaming.

curl https://api.kourier.sh/v1/chat/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "DSV4-Flash-0731",
    "messages": [
      {"role": "user", "content": "Refactor this function to async/await."}
    ],
    "stream": true
  }'
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://api.kourier.sh/v1",
    api_key=os.environ["OPENAI_API_KEY"],
)

stream = client.chat.completions.create(
    model="DSV4-Flash-0731",
    messages=[{"role": "user", "content": "Explain this stack trace."}],
    stream=True,
)

for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

See Models for the current model identifier and routing details.

On this page