Start typing to search the documentation.

Console navigation

Inference API

Console inference serves OpenAI, Anthropic, and Gemini-compatible APIs from https://opencode.ai/inference. Send a JSON POST request to the endpoint that matches the model’s API family.

curl -X POST "https://opencode.ai/inference/openai/v1/chat/completions" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kimi-k3",
    "messages": [{ "role": "user", "content": "Say hi" }]
  }'

Authentication

Replace <token> with a personal API key or a service account key created in the Console. Paid models require the header. Free-tier chat models are only available from within OpenCode; other clients receive HTTP 403, even with an API key. Use paid models or a Go subscription from other clients.

Authorization: Bearer <token>

Endpoints

APIPath
OpenAI Chat Completions/inference/openai/v1/chat/completions
OpenAI Responses/inference/openai/v1/responses
Anthropic Messages/inference/anthropic/v1/messages
Gemini/inference/google/v1beta/models/<model>:generateContent

Each model is served by one API family. See the model endpoints table, or fetch the live list:

curl https://opencode.ai/inference/v1/models

OpenAI Chat Completions

Open models such as kimi-k3, glm-5.3, minimax-m3, and the free models use the Chat Completions API.

curl -X POST "https://opencode.ai/inference/openai/v1/chat/completions" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "glm-5.3",
    "messages": [{ "role": "user", "content": "Say hi" }]
  }'

OpenAI Responses

GPT models use the Responses API.

curl -X POST "https://opencode.ai/inference/openai/v1/responses" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6.1-sol",
    "input": "Say hi"
  }'

Anthropic Messages

Claude and Qwen models use the Messages API. max_tokens is required.

curl -X POST "https://opencode.ai/inference/anthropic/v1/messages" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-5-5",
    "max_tokens": 1024,
    "messages": [{ "role": "user", "content": "Say hi" }]
  }'

Gemini

Gemini models take the model and method in the path. Replace :generateContent with :streamGenerateContent to stream the response.

curl -X POST "https://opencode.ai/inference/google/v1beta/models/gemini-4-argon:generateContent" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{ "parts": [{ "text": "Say hi" }] }]
  }'

Cost

Every response reports what the request cost you, beside the usage its API already returns: in usage for OpenAI and Anthropic, and in usageMetadata for Gemini. Streams report it on the event that carries the final usage: the final usage chunk for Chat Completions with stream_options.include_usage, response.completed for Responses, message_delta for Messages, and the last chunk for Gemini.

"usage": {
  "prompt_tokens": 1200,
  "completion_tokens": 300,
  "cost": 0.00412,
  "opencode": {
    "billing_source": "balance",
    "list_cost": 0.00412,
    "tokens": { "input": 1200, "output": 300, "reasoning": 120, "cache_read": 8000, "cache_write_5m": 0, "cache_write_1h": 0 }
  }
}
FieldMeaning
costUS dollars charged to your balance. 0 for free models and for Go usage within its limits. With your own provider key, an estimate of what your provider charges, unless it reports its own; absent when the model has no price.
opencode.billing_sourcefree, balance, go, go-plus, or byok (your own provider key).
opencode.list_costUS dollars at the model’s price, including peak hours and long-context pricing.
opencode.estimatedtrue when cost is an estimate at the model’s price rather than an amount OpenCode charged. Only set with your own provider key.
opencode.allowanceGo only: how much the request counted toward your usage limits, in dollars of the plan’s monthly limit.
opencode.tokensThe tokens you were billed for. input excludes cache reads and writes; output includes reasoning.

Image generation reports the same fields on the response, and on each completed image of a stream with the cost so far. The cost is known when the response ends, before your balance or Go usage is updated. If your balance or Go limits run out during a request, you may be charged less than reported, never more.