For developers and companies
One API. Every model.
REST API for chat, image, video and audio models. OpenAI and Anthropic compatible, async tasks with signed webhooks, transparent unit prices.
curl https://jantaris.com/v1/generate?wait=60 \
-H "Authorization: Bearer $JANTARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"input": {
"prompt": "A slow dolly shot through a neon-lit night market in the rain, reflections on wet asphalt, cinematic",
"aspect_ratio": "adaptive",
"resolution": "720p",
"duration": 5
}
}'import os, time, requests
API = "https://jantaris.com/v1"
H = {"Authorization": f"Bearer {os.environ['JANTARIS_API_KEY']}"}
task = requests.post(f"{API}/generate", headers=H, json={
"model": "seedance-2.5",
"input": {
"prompt": "A slow dolly shot through a neon-lit night market in the rain, reflections on wet asphalt, cinematic",
"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://jantaris.com/v1";
const headers = { Authorization: `Bearer ${process.env.JANTARIS_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": "A slow dolly shot through a neon-lit night market in the rain, reflections on wet asphalt, cinematic",
"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));
One key for everything
Chat, image, video and audio from one balance and one API key, with per-key monthly limits.
OpenAI & Anthropic compatible
Point the OpenAI SDK, Anthropic SDK, Claude Code, Cursor or Cline at our base URL.
Async tasks and webhooks
POST /v1/generate returns a task. Poll it, wait with ?wait=60, or get a signed webhook.
Price before you run
Every task has estimated_cost. We hold it, charge the real cost, and refund failed runs in full.
Automatic failover
Some models run on more than one route. If one fails before starting, we try the next.
Built for teams
Multiple keys, spend limits, usage by model, full balance ledger, invoices.
Chat that plugs into your tools
Claude Code, Cursor, Cline, Continue, LangChain, n8n, Make: anything that speaks OpenAI or Anthropic works after a base URL change.
Claude Code →from openai import OpenAI
client = OpenAI(base_url="https://jantaris.com/v1", api_key="sk-jt-...")
resp = client.chat.completions.create(
model="claude-opus-5.5",
messages=[{"role": "user", "content": "Write a haiku about Baltic amber."}],
)
print(resp.choices[0].message.content)curl https://jantaris.com/v1/chat/completions \
-H "Authorization: Bearer $JANTARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "claude-opus-5.5", "messages": [{"role": "user", "content": "Write a haiku about Baltic amber."}]}'import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://jantaris.com/v1", apiKey: process.env.JANTARIS_API_KEY });
const resp = await client.chat.completions.create({
model: "claude-opus-5.5",
messages: [{ role: "user", content: "Write a haiku about Baltic amber." }],
});
console.log(resp.choices[0].message.content);export ANTHROPIC_BASE_URL=https://jantaris.com
export ANTHROPIC_AUTH_TOKEN=sk-jt-...
export ANTHROPIC_MODEL=claude-opus-5.5
claude









