Docs
One address compatible with OpenAI and Anthropic. Add your address and key, and use the tools you already know.
Getting started
https://api.wiozen.comAuthorization: Bearer sk-gw-…or x-api-keyCreate your key on the Keys page. Only published model names are accepted. Any other name returns 400.
Setup
# If Claude Code is not installed npm install -g @anthropic-ai/claude-code export ANTHROPIC_BASE_URL="https://api.wiozen.com" export ANTHROPIC_AUTH_TOKEN="sk-gw-..." export ANTHROPIC_MODEL="wiozen-anthropic" claude
Claude Code currently runs on the wiozen-anthropic model. You can use Claude and Gemini models with the tools on the other tabs.
Add it to the chat.languageModels array in settings.json. VS Code asks for the key in secure input.
// OpenAI API Key sk-gw-... // Override OpenAI Base URL https://api.wiozen.com/v1 // Add to the model list and select it wiozen-anthropic
from openai import OpenAI client = OpenAI(base_url="https://api.wiozen.com/v1", api_key="sk-gw-...") response = client.chat.completions.create( model="wiozen-anthropic", messages=[{"role": "user", "content": "Hello!"}], max_tokens=16000, ) print(response.choices[0].message.content)
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://api.wiozen.com/v1", apiKey: "sk-gw-..." }); const res = await client.chat.completions.create({ model: "wiozen-anthropic", messages: [{ role: "user", content: "Hello!" }], max_tokens: 16000, }); console.log(res.choices[0].message.content);
curl https://api.wiozen.com/v1/messages \ -H "x-api-key: $API_KEY" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "wiozen-anthropic", "max_tokens": 4096, "messages": [{"role": "user", "content": "Hello!"}] }'
curl https://api.wiozen.com/v1/chat/completions \ -H "Authorization: Bearer $API_KEY" \ -H "content-type: application/json" \ -d '{ "model": "wiozen-anthropic", "max_tokens": 4096, "messages": [{"role": "user", "content": "Hello!"}] }'
Key Tool
Connects Claude Desktop and Claude Code without writing environment variables: open the tool, enter your sk-gw-… key, and click Apply.
Endpoints
| Path | Format | Description | |
|---|---|---|---|
| POST | /v1/messages | Anthropic | Claude Code, Cursor, VS Code and the Anthropic SDK |
| POST | /v1/messages/count_tokens | Anthropic | Token counting; free of charge |
| POST | /v1/chat/completions | OpenAI | OpenAI SDK and OpenAI-compatible tools |
| POST | /v1/responses | OpenAI Responses | Codex and Responses API clients |
| POST | /v1/images/generations | Image | Image generation from text and reference images |
| POST | /v1/embeddings | Vector | Text embeddings |
| POST | /v1/audio/speech | Audio | Text to speech |
| POST | /v1/audio/transcriptions | Audio | Speech to text |
| POST | /v1/search | Web | Web search |
| POST | /v1/web/fetch | Web | Fetch page content as Markdown |
| GET | /v1/models | OpenAI | List of available models |
Image generation
/v1/images/generations generates images from text. If you pass a reference image in the image field, generation starts from that image: editing, changing the background, or showing the same product in a different scene. The image comes back as base64 in data[0].b64_json in the response.
curl https://api.wiozen.com/v1/images/generations \ -H "Authorization: Bearer $API_KEY" \ -H "content-type: application/json" \ -d '{ "model": "gemini-3.1-flash-image", "prompt": "A red apple on a white table, studio photo" }'
import base64, requests ref = base64.b64encode(open("urun.png", "rb").read()).decode() r = requests.post( "https://api.wiozen.com/v1/images/generations", headers={"Authorization": "Bearer sk-gw-..."}, json={ "model": "gemini-3.1-flash-image", "prompt": "Keep the same product, make the background light blue", "image": "data:image/png;base64," + ref, }, ) open("sonuc.jpg", "wb").write(base64.b64decode(r.json()["data"][0]["b64_json"]))
The reference image must be a data URI or plain base64; URLs are not accepted. One reference image is used per request.
Response format
{
"id": "msg_01XyZ987654321",
"type": "message",
"role": "assistant",
"content": [{ "type": "text", "text": "Hello!" }],
"model": "wiozen-anthropic",
"stop_reason": "end_turn",
"usage": { "input_tokens": 14, "output_tokens": 11 }
}event: message_start
data: {"type":"message_start","message":{"id":"msg_01X...","role":"assistant"}}
event: content_block_delta
data: {"type":"content_block_delta","delta":{"type":"text_delta","text":"Hello"}}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":11}}
data: [DONE]Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
model | string | Yes | Published model name. An empty or unrecognized name returns 400. |
messages | array | Yes | Message array: [{"role": "user", "content": "..."}] |
max_tokens | integer | No | Maximum tokens to generate (up to 64,000). The model thinks first on hard questions, and thinking counts against this budget; if the budget runs out, the response can end empty with stop_reason: "max_tokens". 16,000 or more is recommended. |
stream | boolean | No | When true, the response streams as Server-Sent Events. |
tools | array | No | Tool calling is supported in both formats. |
Billing
- Dollar balance. The amount you add becomes your balance and does not expire; each request deducts the price of the tokens it uses. Current prices are on the Models page.
- Four separate prices. Input, cached input read, cached input write, and output are priced separately. A cache read costs one tenth of the input price; in long-context agent use, this makes up most of the cost.
- Reservation. When a request starts, its estimated cost is held from your balance, then adjusted to the actual cost when the response ends. Setting
max_tokenshigher than you need increases this held amount. - Failed requests are not charged.
/v1/messages/count_tokensis free too. - Key limit. You can set a spend cap on a key; when it is reached, only that key stops.
- You can see the request breakdown on the Usage page.
Errors
| Status | Meaning | What to do |
|---|---|---|
400 | Invalid request or unrecognized model | Check the model name and request body. The error message lists the available models. |
401 | Key missing or invalid | Check your sk-gw-… key and header. |
403 | Account suspended | Contact us through Support. |
429 Quota exhausted | Insufficient balance | Top up your balance. |
429 API key spend limit reached | Key's spend limit reached | Raise or remove the limit on the Keys page. |
502 / 504 | Upstream provider could not respond | The request is not charged. Try again shortly. |