Everything you need to integrate with AI Gateway by IsekaiDimension.ID.
OpenAI-compatible gateway for chat, embeddings, and agent harness integrations. All client requests use the same base URL and sk-ixdm- API key.
{
"status": "ok",
"database": "up"
}Get started in three steps:
https://ai.ixdm.co.id/v1.
from openai import OpenAI client = OpenAI( base_url="https://ai.ixdm.co.id/v1", api_key="sk-ixdm-xxxx" ) response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": "Hello!"}] ) print(response.choices[0].message.content)
Every request must include a valid API key in the Authorization header:
Authorization: Bearer sk-ixdm-xxxx
API keys are generated from the user dashboard or assigned by an admin. Keys begin with the sk-ixdm- prefix.
/v1/chat/completions
Send a chat completion request. The router selects the appropriate provider and upstream key based on the model and your client configuration.
| Parameter | Type | Required | Description |
|---|---|---|---|
model | string | Yes | Model alias (e.g. deepseek-chat, gpt-4o) |
messages | array | Yes | Array of message objects with role and content |
stream | boolean | No | Enable SSE streaming (default: false) |
temperature | number | No | Sampling temperature (0-2) |
max_tokens | integer | No | Maximum tokens to generate |
reasoning_effort | string | No | Reasoning level: low, medium, high |
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"model": "deepseek-chat",
"choices": [{
"index": 0,
"message": {"role": "assistant", "content": "Hello! How can I help?"},
"finish_reason": "stop"
}],
"usage": {"prompt_tokens": 10, "completion_tokens": 8, "total_tokens": 18}
}Set "stream": true in your request to receive Server-Sent Events (SSE). Each chunk is delivered as a data: line.
from openai import OpenAI client = OpenAI( base_url="https://ai.ixdm.co.id/v1", api_key="sk-ixdm-xxxx" ) stream = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": "Hello!"}], stream=True ) for chunk in stream: delta = chunk.choices[0].delta if delta.content: print(delta.content, end="", flush=True)
data: [DONE]. Thinking models may also emit reasoning_content deltas in the stream (see Reasoning)./v1/embeddings
Generate vector embeddings for text input. Uses the same authentication and model routing as chat completions.
| Parameter | Type | Required | Description |
|---|---|---|---|
model | string | Yes | Embedding model alias assigned to your key |
input | string or array | Yes | Text to embed (single string or array of strings) |
curl https://ai.ixdm.co.id/v1/embeddings \ -H "Authorization: Bearer sk-ixdm-xxxx" \ -H "Content-Type: application/json" \ -d '{ "model": "text-embedding-3-small", "input": "The food was delicious." }'
Agent harnesses (Cursor, OpenCode, Hermes) rely on OpenAI-style function calling. Send tools in the request; the model may respond with tool_calls that your client executes and reports back via role: "tool" messages.
| Field | Description |
|---|---|
tools | Array of function definitions (type: "function", function.name, function.parameters) |
tool_choice | "auto", "none", or a specific tool |
messages[].tool_calls | Assistant message requesting tool execution |
messages[].tool_call_id | On role: "tool" messages — links result to the call |
When the model invokes a tool, finish_reason is "tool_calls":
{
"choices": [{
"message": {
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_abc123",
"type": "function",
"function": {
"name": "read_file",
"arguments": "{\"path\": \"main.go\"}"
}
}]
},
"finish_reason": "tool_calls"
}]
}Use model aliases configured by the operator. What you see in GET /v1/models depends on your key type:
owned_by field is ixdm-credit.
Admin-assigned keys return ALB names and/or model routes from provider bindings.
Browse accessible models and pricing at /user/models.
Common alias examples:
| Alias | Provider | Notes |
|---|---|---|
deepseek-chat | DeepSeek | Default model |
gpt-4o | OpenAI | GPT-4o |
claude-sonnet-4 | Anthropic | Claude Sonnet 4 |
gemini-2.0-flash | Gemini 2.0 Flash | |
llama-3.3-70b | Groq | Llama 3.3 70B |
/v1/models
Returns only models your client is authorized to use.
Some models support extended thinking via the reasoning_effort parameter:
| Value | Description |
|---|---|
low | Minimal reasoning, fastest response |
medium | Balanced reasoning depth |
high | Maximum reasoning depth, longer output |
When reasoning_effort is set, the model allocates a portion of its output budget to internal reasoning before producing the final response.
reasoning_content in SSE deltas. OpenCode and other native clients map this to internal reasoning parts automatically.
Connect AI coding agents and editors using your sk-ixdm- API key and the OpenAI-compatible base URL. All integrations below use the same credentials.
deepseek-chat).https://ai.ixdm.co.id/v1 in your harness config.AI code editor — custom OpenAI-compatible model
https://ai.ixdm.co.id/v1, your API key, and model name (your assigned slug).Alternative: add via ~/.cursor/models.json:
{
"models": [{
"name": "IXDM DeepSeek",
"apiKey": "sk-ixdm-xxxx",
"baseURL": "https://ai.ixdm.co.id/v1",
"model": "deepseek-chat"
}]
}CLI + VS Code extension — @ai-sdk/openai-compatible provider
Edit ~/.config/opencode/opencode.json and store credentials in ~/.local/share/opencode/auth.json:
{
"$schema": "https://opencode.ai",
"provider": {
"ixdm": {
"npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "https://ai.ixdm.co.id/v1",
"name": "ixdm"
},
"models": {
"deepseek-chat": {
"id": "deepseek-chat",
"max_tokens": 4096,
"name": "DeepSeek Chat"
}
}
}
},
"model": "ixdm/deepseek-chat"
}reasoning_content deltas — OpenCode maps these to internal reasoning parts automatically.Autonomous coding agent by NousResearch
~/.hermes/config.yaml with your API key and base URL.hermes from your project directory.model: provider: openrouter model: deepseek-chat api_base: https://ai.ixdm.co.id/v1 api_key: sk-ixdm-xxxx
Alternatively, set the key via CLI:
hermes config set api_key "sk-ixdm-xxxx"
x-api-key, POST /v1/messages) require an inbound Anthropic-compatible API surface that is not yet available on this gateway. Today, use the OpenAI-compatible integrations above (Cursor, OpenCode, Hermes). Inbound /v1/messages support is planned for a future release.
User accounts use a credit balance denominated in USD to access models. Each model is sold as a credit alias — you must be assigned an alias before you can call its slug.
| Concept | Description |
|---|---|
| Currency | Balances and per-model rates are in USD |
| Balance | Visible at /user/credits in the user portal |
| Model access | Assigned credit aliases determine which slugs appear in GET /v1/models |
| Pricing | Each request deducts USD credits based on per-model input/output pricing (per 1M tokens) |
| Free tier | New users receive the operator-configured default free alias on signup |
| Top-up | Contact your operator for balance top-ups (no self-serve payment in v1) |
When your balance is too low for a request, the API returns 402 Payment Required:
{
"type": "insufficient_credits",
"message": "insufficient credits. Please top up your balance and try again.",
"code": "insufficient_credits"
}Per-key request rate limits are applied in addition to credit billing. For credit balance and model access, see Credits & billing above.
| Limit | Scope | Reset |
|---|---|---|
| Request rate (RPM) | Per minute | Rolling window |
| Concurrency | Per key | On request completion |
| Daily token quota | Legacy non-user keys | Resets at midnight UTC |
429 Too Many Requests with a JSON error body indicating the limit type.Errors return a JSON envelope:
{
"type": "invalid_request_error",
"message": "Missing required parameter: model",
"request_id": "req-abc123"
}| Code | Meaning |
|---|---|
400 | Invalid request (missing parameters, bad JSON) |
401 | Invalid or missing API key |
402 | Insufficient credits — top up balance to continue |
403 | Key not authorized for this model |
404 | Model or endpoint not found |
429 | Rate limit or quota exceeded |
500 | Internal server error |
502 | Upstream provider error |
503 | Provider temporarily unavailable (cooldown) |