Playground
Send a real request and watch how it was routed, which models ran, and where the time went.
Request
Response
No response yet
Send a request and the answer, the routing decision and a timing breakdown all land here.
Pipeline
Nothing to trace yet
Once a request completes you'll see which route ARI picked, which models Axion ran, and how long each stage took.
Overview
Traffic, spend and keys across your account.
Your plan
Recent requests
Sign in to see your requests
Analytics
Request volume and latency for the last seven days.
Requests per day
Sign in to see analytics
Usage
Where you stand against your plan's limits this cycle.
Monthly allowance
Resets on the 1st of each month
Today's limit
Daily request limit, resets at midnight UTC
API keys
Keys authenticate your requests. A key is shown in full once, when you create it.
Sign in to manage keys
Billing & plans
Pick the plan that fits your workload. Changes take effect immediately.
Prices in USD. This console is the front end — connect a payment provider and enforce limits server-side before going live.
Need something custom? or email sales.
Docs
Everything you need for your first call. The API is OpenAI-compatible, so existing clients work unchanged.
Quickstart
Authenticate with a key from , then POST a list of messages to get a model response back.
Base URL
https://cylinkdev.vercel.app/api/cylink-api
Your first request
curl https://cylinkdev.vercel.app/api/cylink-api \
-H "Authorization: Bearer cyk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"model": "cyanix-core",
"messages": [{ "role": "user", "content": "Hello!" }]
}'
Authentication
Every request needs your API key as a bearer token. Keys start with cyk_ and are shown in full only once, so store it somewhere safe as soon as you create it.
Authorization: Bearer cyk_your_key_here
Rotate or revoke keys from . Revoking takes effect immediately.
Models
| Model | Best for |
|---|---|
| cyanix-quick | Fastest responses — low-latency or lightweight tasks. |
| cyanix-vista | Balanced speed and reasoning, large context window. |
| cyanix-apex | Complex, multi-step reasoning, large context window. |
| cyanix-core | General purpose. Used when model is omitted. |
Request body
| Field | Type | Description |
|---|---|---|
| messages | array | Required. OpenAI-style [{ role, content }] turns, where role is system, user or assistant. |
| system_prompt | string | Your own system prompt. Replaces the default Cyanix persona entirely. Takes precedence over system turns in messages, which are used if this is omitted. Max 8,000 characters. |
| message / query | string | Shorthand for a single user turn. Used only when messages is omitted. |
| model | string | One of the aliases above. Defaults to cyanix-core. |
| max_tokens | number | Defaults to 2048, capped at 8192. |
| stream | boolean | Defaults to false. See Streaming. |
Your own system prompt
By default the assistant answers as Cyanix Intelligence. Send system_prompt — or a system turn in messages — and your instructions take that slot instead, so the assistant is yours.
curl https://cylinkdev.vercel.app/api/cylink-api \
-H "Authorization: Bearer cyk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"system_prompt": "You are Otter, a terse assistant for a plumbing supply store. Never discuss anything else.",
"messages": [{ "role": "user", "content": "Do you stock 15mm compression elbows?" }]
}'
Three things change when you supply one. Tool use, grounding and citations still work — those are mechanics, not personality — but the assistant loses access to the Cyanix knowledge base and Devit, keeping only web search, YouTube search, image search and page reading. Stored user memories are not injected, so nothing personal leaks into your app's replies. And responses aren't scored against Cyanix's own principles, since they aren't Cyanix's responses.
The response reports cylink.system_prompt_used so you can confirm yours was applied.
JavaScript
const res = await fetch("https://cylinkdev.vercel.app/api/cylink-api", {
method: "POST",
headers: {
"Authorization": "Bearer cyk_your_key_here",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "cyanix-core",
messages: [{ role: "user", content: "Hello!" }]
})
});
const data = await res.json();
console.log(data.choices[0].message.content);
Python
import requests
res = requests.post(
"https://cylinkdev.vercel.app/api/cylink-api",
headers={"Authorization": "Bearer cyk_your_key_here"},
json={
"model": "cyanix-core",
"messages": [{"role": "user", "content": "Hello!"}],
},
)
print(res.json()["choices"][0]["message"]["content"])
OpenAI SDK recommended
Point baseURL at Cylink and the official SDKs work as-is — there's no Cylink client to install.
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "cyk_your_key_here",
baseURL: "https://cylinkdev.vercel.app/api/v1"
});
const res = await client.chat.completions.create({
model: "cyanix-core",
messages: [{ role: "user", content: "Hello!" }]
});
console.log(res.choices[0].message.content);
Streaming
Set "stream": true for a text/event-stream response: data: {...} chunks ending in data: [DONE], the same shape other OpenAI-compatible APIs use.
const res = await fetch(BASE_URL, {
method: "POST",
headers: { "Authorization": `Bearer ${apiKey}`, "Content-Type": "application/json" },
body: JSON.stringify({ messages, stream: true })
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
let buf = "";
while (true) {
const { value, done } = await reader.read();
if (done) break;
buf += decoder.decode(value, { stream: true });
// split buf on newlines, parse each "data: {...}" line as JSON
}
Errors
| Status | Code | What to do |
|---|---|---|
| 401 | MISSING_AUTH | Add an Authorization: Bearer header. |
| 401 | UNAUTHORIZED | The key is invalid, revoked or expired. Create a new one. |
| 429 | RATE_LIMITED | You're over your per-minute or daily limit. Check /usage for what's left. |
| 400 | BAD_REQUEST | Malformed body, or no messages / message / query. |
| 405 | METHOD_NOT_ALLOWED | Use POST. |
| 502 | MODEL_ERROR | The upstream model failed. Read the detail field and retry. |
| 500 | SERVER_MISCONFIGURED | Server-side configuration issue. Contact support. |
Errors carry a machine-readable code, a short message, and a details string naming the specific cause.
{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication failed.",
"details": "This API key has been revoked and can no longer be used."
}
}
Other endpoints
These take the same Authorization: Bearer cyk_your_key_here header and return errors in the same shape. They also accept your dashboard session token, which is how the Playground calls them — you don't need a key for that.
/axion — grounded chat recommended
One call that routes the query, pulls the knowledge base plus live web search, and answers — with the full trace attached. Free keys get a single grounded model; paid keys get the ensemble.
curl https://cylinkdev.vercel.app/api/axion \
-H "Authorization: Bearer cyk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "query": "What is the latest news about Groq?" }'
Returns selected_route, confidence, trace_events and response with the final answer.
/axion — run one route
Skips the routing decision and executes the route you name, for example one you got back from ARI.
curl https://cylinkdev.vercel.app/api/axion \
-H "Authorization: Bearer cyk_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "query": "Reverse a string in Rust", "route": "code_execution" }'
Returns { model, response }. An optional context string is injected into the system prompt.
/usage — quota and spend
Live usage for the calling key. A key can only read its own stats.
curl https://cylinkdev.vercel.app/api/usage \ -H "Authorization: Bearer cyk_your_key_here"
Returns { key_name, requests, cost_usd, limits, last_used_at }.