For developers
Models as REST endpoints.
Video, image and audio jobs plus chat compatible with the OpenAI and Anthropic SDKs. Signed webhooks, an MCP server for agents, a price per unit in every response.
curl https://kadraris.com/v1/generate?wait=60 \
-H "Authorization: Bearer $KADRARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"input": {
"prompt": "Tracking shot of a cyclist riding through an empty city street at dawn, long shadows, light fog, film look",
"aspect_ratio": "adaptive",
"resolution": "720p",
"duration": 5
}
}'import os, time, requests
API = "https://kadraris.com/v1"
H = {"Authorization": f"Bearer {os.environ['KADRARIS_API_KEY']}"}
task = requests.post(f"{API}/generate", headers=H, json={
"model": "seedance-2.5",
"input": {
"prompt": "Tracking shot of a cyclist riding through an empty city street at dawn, long shadows, light fog, film look",
"aspect_ratio": "adaptive",
"resolution": "720p",
"duration": 5
}
}).json()
while task["status"] in ("queued", "running"):
time.sleep(3)
task = requests.get(f"{API}/tasks/{task['id']}", headers=H).json()
print(task["status"], task["cost"], [o["url"] for o in task["output"]])const API = "https://kadraris.com/v1";
const headers = { Authorization: `Bearer ${process.env.KADRARIS_API_KEY}`, "Content-Type": "application/json" };
let task = await (await fetch(`${API}/generate`, {
method: "POST",
headers,
body: JSON.stringify({
"model": "seedance-2.5",
"input": {
"prompt": "Tracking shot of a cyclist riding through an empty city street at dawn, long shadows, light fog, film look",
"aspect_ratio": "adaptive",
"resolution": "720p",
"duration": 5
}
}),
})).json();
while (task.status === "queued" || task.status === "running") {
await new Promise((r) => setTimeout(r, 3000));
task = await (await fetch(`${API}/tasks/${task.id}`, { headers })).json();
}
console.log(task.status, task.cost, task.output.map((o) => o.url));
Swap the base URL, keep your SDK
The OpenAI and Anthropic SDKs, Claude Code, Cursor and Cline talk to /v1 without code changes.
Media jobs run in the background
POST /v1/generate gives you a task id. Poll it, block for up to 120 s with ?wait=, or take a signed webhook.
Known cost up front
The response carries estimated_cost. That amount is held, you pay the actual cost, and a failed task releases the full hold.
Backup routes
Some models have more than one route. When one fails before the job starts, the next one takes it.
Keys for each project
Create several keys, give each a monthly limit and see spend per model in the dashboard.
One balance across types
Chat, images, video and audio draw from the same prepaid balance.
Chat models in the tools you already use
If a tool accepts an OpenAI or Anthropic base URL, it works here: Claude Code, Cursor, Cline, Continue, LangChain, n8n or Make.
Claude Code →from openai import OpenAI
client = OpenAI(base_url="https://kadraris.com/v1", api_key="sk-kd-...")
resp = client.chat.completions.create(
model="claude-opus-5.5",
messages=[{"role": "user", "content": "Suggest three opening shots for a short film about a cafe."}],
)
print(resp.choices[0].message.content)curl https://kadraris.com/v1/chat/completions \
-H "Authorization: Bearer $KADRARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "claude-opus-5.5", "messages": [{"role": "user", "content": "Suggest three opening shots for a short film about a cafe."}]}'import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://kadraris.com/v1", apiKey: process.env.KADRARIS_API_KEY });
const resp = await client.chat.completions.create({
model: "claude-opus-5.5",
messages: [{ role: "user", content: "Suggest three opening shots for a short film about a cafe." }],
});
console.log(resp.choices[0].message.content);export ANTHROPIC_BASE_URL=https://kadraris.com
export ANTHROPIC_AUTH_TOKEN=sk-kd-...
export ANTHROPIC_MODEL=claude-opus-5.5
claude























