Eucian API
Use Eucian's models from your own apps, scripts and servers: Calen for chat, Iven for images and Vexo for video. Chat speaks the standard chat-completions format, so most AI libraries work by changing two settings.
Quick start
/chat/completions for chat, /images/generations for pictures, /videos/generations for video. All under https://eucian.com/api/v1.curl https://eucian.com/api/v1/chat/completions \
-H "Authorization: Bearer $EUCIAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "calen-1.0-max",
"messages": [
{"role": "system", "content": "You are a blunt, helpful editor."},
{"role": "user", "content": "Tighten this: We are very excited to announce that we have launched."}
]
}'
curl https://eucian.com/api/v1/images/generations \
-H "Authorization: Bearer $EUCIAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "iven-1.0-max",
"prompt": "A lighthouse at dusk, film photo",
"size": "1344x768"
}'
# 1. start the video (it takes a few minutes)
curl https://eucian.com/api/v1/videos/generations \
-H "Authorization: Bearer $EUCIAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "vexo-1.0-max",
"prompt": "Waves on a black sand beach at sunset, the sound of surf",
"seconds": 5
}'
# 2. ask for it with the id you got back, until the MP4 arrives
curl "https://eucian.com/api/v1/videos?id=YOUR_ID" \
-H "Authorization: Bearer $EUCIAN_API_KEY" -o clip.mp4
API keys
Keys start with euc_. Create up to ten in Settings, Billing, Developer API, and give each one a name so you can tell them apart. Eucian keeps only a scrambled copy, so a lost key can't be shown again; create a new one and revoke the old one. Revoking takes effect immediately.
Keep keys on your server. Never put a key in a website's code or a mobile app, where anyone can read it and spend your credits.
Authentication
Send your key in the Authorization header on every request:
Authorization: Bearer euc_your_key_here
Chat completions
POST https://eucian.com/api/v1/chat/completions
Request body
| Field | Type | What it does |
|---|---|---|
messages | array, required | The conversation so far. Each item has a role (system, user or assistant) and content (text). At least one user message. The last 60 messages are used. |
model | string | calen-1.0-max (default) or calen-1.0-lite. |
stream | boolean | Send the answer piece by piece as it's written. See Streaming. |
System messages set how the model behaves. Eucian may search the web on its own when a question needs current facts.
Response
{
"id": "chatcmpl-8f3c…",
"object": "chat.completion",
"created": 1791648000,
"model": "calen-1.0-max",
"choices": [
{ "index": 0, "message": { "role": "assistant", "content": "We've launched." }, "finish_reason": "stop" }
],
"usage": { "prompt_tokens": 31, "completion_tokens": 4, "total_tokens": 35 }
}
Token counts are estimates (about four characters a token), given for your own tracking. You're charged by time, not tokens; see Pricing.
Streaming
With "stream": true the response is a stream of server-sent events. Each event is a line starting with data: holding a chunk; the stream ends with data: [DONE].
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"We've"},"finish_reason":null}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":" launched."},"finish_reason":null}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{…}}
data: [DONE]
Images
POST https://eucian.com/api/v1/images/generations makes one picture with Iven and returns it as base64.
| Field | Type | What it does |
|---|---|---|
prompt | string, required | What to draw, up to 700 characters. |
model | string | iven-1.0-max (default) or iven-1.0-lite. |
size | string | 1024x1024 (default), 768x1344 (tall) or 1344x768 (wide). square, portrait and landscape work too. Lite pictures are about three-quarters of these sizes. |
curl https://eucian.com/api/v1/images/generations \
-H "Authorization: Bearer $EUCIAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "iven-1.0-max", "prompt": "A lighthouse at dusk, film photo", "size": "1344x768"}'
{
"created": 1791648000,
"model": "iven-1.0-max",
"data": [ { "b64_json": "/9j/4AAQ…", "width": 1344, "height": 768 } ],
"usage": { "cost_usd": 0.06 }
}
The picture is a JPEG. A picture held back by the content policy returns 400 and isn't charged. Pictures can take up to a minute when the model has been idle.
Videos
Videos take a few minutes, so they run as a job: start one, then ask for it until it's ready.
1. Start a video
POST https://eucian.com/api/v1/videos/generations
| Field | Type | What it does |
|---|---|---|
prompt | string, required | Subject, action, setting, camera and sound, up to 1,500 characters. Videos come with sound. |
model | string | vexo-1.0-max (default) or vexo-1.0-lite. |
seconds | number | 5 (default), 10 or 15 on Max. Lite clips are always 5 seconds. |
size | string | landscape (default, 16:9), portrait (9:16) or square. |
curl https://eucian.com/api/v1/videos/generations \
-H "Authorization: Bearer $EUCIAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "vexo-1.0-max", "prompt": "Waves on a black sand beach at sunset, the sound of surf", "seconds": 5}'
{ "id": "fc-01JABC…", "object": "video", "status": "in_progress", "model": "vexo-1.0-max", "seconds": 5, "width": 960, "height": 544, "usage": { "cost_usd": 1.86 } }
2. Get the video
GET https://eucian.com/api/v1/videos?id=YOUR_ID returns {"status": "in_progress"} while it's being made, then the MP4 file itself. Ask every 10 to 15 seconds. Add &format=json to get the MP4 as base64 inside JSON instead. If a video fails or is held back, the status is failed and the charge is refunded.
curl "https://eucian.com/api/v1/videos?id=fc-01JABC…" \
-H "Authorization: Bearer $EUCIAN_API_KEY" -o clip.mp4
Models
Eucian makes three model families: Calen for chat and writing, Iven for images and Vexo for video. Each comes as Max and Lite.
| Model | Model id | Best for | Price |
|---|---|---|---|
| Calen 1.0 Max | calen-1.0-max | Our smartest model, for complex work and everyday tasks. | About 10.5¢ a minute |
| Calen 1.0 Lite | calen-1.0-lite | The same model as Max, set up for shorter, quicker answers. | About 7¢ a minute |
| Iven 1.0 Max | iven-1.0-max | Our highest-quality images, with fine detail and accurate text. | 6¢ a picture |
| Iven 1.0 Lite | iven-1.0-lite | Fast drafts and variations. | 3¢ a picture |
| Vexo 1.0 Max | vexo-1.0-max | Cinematic video with smooth motion and longer clips, with sound. | $1.86 for 5s, $3.21 for 10s, $4.56 for 15s |
| Vexo 1.0 Lite | vexo-1.0-lite | Quick 5 second clips and previews. | 75¢ a clip |
GET https://eucian.com/api/v1/models lists every model with its price. The older ids eucian-1.0-max and eucian-1.0-lite still work for chat.
Libraries
Any library for the common chat-completions format works. Point its base URL at https://eucian.com/api/v1 and use your Eucian key.
# pip install openai
from openai import OpenAI
client = OpenAI(base_url="https://eucian.com/api/v1", api_key="euc_your_key_here")
reply = client.chat.completions.create(
model="calen-1.0-max",
messages=[{"role": "user", "content": "Write a two-line poem about rain."}],
)
print(reply.choices[0].message.content)
# streaming
for chunk in client.chat.completions.create(model="calen-1.0-max", stream=True,
messages=[{"role": "user", "content": "Count to five."}]):
print(chunk.choices[0].delta.content or "", end="", flush=True)
// npm install openai
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://eucian.com/api/v1", apiKey: process.env.EUCIAN_API_KEY });
const reply = await client.chat.completions.create({
model: "calen-1.0-max",
messages: [{ role: "user", content: "Write a two-line poem about rain." }],
});
console.log(reply.choices[0].message.content);
// streaming
const stream = await client.chat.completions.create({ model: "calen-1.0-max", stream: true, messages: [{ role: "user", content: "Count to five." }] });
for await (const chunk of stream) process.stdout.write(chunk.choices[0]?.delta?.content || "");
const r = await fetch("https://eucian.com/api/v1/chat/completions", {
method: "POST",
headers: { "Authorization": "Bearer " + process.env.EUCIAN_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ model: "calen-1.0-max", messages: [{ role: "user", content: "Hello" }] }),
});
const data = await r.json();
console.log(data.choices[0].message.content);
Pricing and credits
The API is prepaid with Eucian credits. Credits are dollars: $25 of credits is $25 to spend on requests. Add them in Settings, Billing; the bigger packs come with a discount, so the credits go further than what you pay.
| Credit pack | You pay | Credits you get |
|---|---|---|
| $25 pack | $22.50 | $25.00 (10% off) |
| $50 pack | $40.00 | $50.00 (20% off) |
| $100 pack | $70.00 | $100.00 (30% off) |
What a request costs
You pay for the seconds the model spends answering, starting from its first word, so a model waking up is never billed. Each request is rounded up to the nearest cent, and costs at least 1 cent.
| Model | Per second | Per minute | Short answer about 5 s | Typical answer about 15 s | Long answer about 60 s |
|---|---|---|---|---|---|
calen-1.0-max | $0.00176 | $0.105 | 1¢ | 3¢ | 11¢ |
calen-1.0-lite | $0.00117 | $0.07 | 1¢ | 2¢ | 7¢ |
Pictures and videos
| Model | Price |
|---|---|
iven-1.0-max | 6¢ a picture |
iven-1.0-lite | 3¢ a picture |
vexo-1.0-max | $1.86 for 5 seconds, $3.21 for 10, $4.56 for 15 |
vexo-1.0-lite | 75¢ for a 5 second clip |
Pictures and videos are charged only when they're made: anything held back or failed costs nothing.
So $25 of credits is roughly 800 typical answers on Max, or well over 1,200 on Lite, whose answers are shorter. Prices are also returned by GET /api/v1/models as price_per_second_usd.
Your API dashboard (Settings, Billing, Open API dashboard) shows your credit left, spend by day, requests and cost per model and per key, and your recent requests. Your balance is shown there and under Developer API in Billing, and every response includes usage to help you track what you send. When credits run out, requests return 402 until you add more. Credits never expire, there's no monthly fee, and the same credits also keep your own Eucian chats going past your plan's allowance.
Limits
| Limit | Value |
|---|---|
| Requests | 60 a minute per account |
| Messages per request | The last 60 are used |
| Message length | About 60,000 characters each |
| Request timeout | About 4.5 minutes |
| Pictures | One per request |
| Videos | 5, 10 or 15 seconds, with sound |
| Keys | Up to 10 per account |
If the model has been idle it may take a few seconds to wake; a 503 then means retry shortly.
Errors
Errors come back as JSON: {"error": {"message": "…", "type": "…"}}.
| Status | Type | Meaning |
|---|---|---|
| 400 | invalid_request_error | The request is missing something, such as a user message. |
| 401 | authentication_error | No key, a malformed key, or a revoked one. |
| 402 | insufficient_quota | Your credits are used up. Add more in Billing. |
| 429 | rate_limit_error | More than 60 requests in a minute. Wait and retry. |
| 503 | server_error | The model is waking up or busy. Retry after a few seconds. |
Content policy
Eucian is uncensored, with three hard lines that apply to the API exactly as they do in the app: nothing sexual involving anyone under 18, no sexual content about real, named people, and no deepfakes. You're responsible for how your app uses the output and for following the laws where you and your users are. Full details are in the Terms.
Help
Questions, higher limits or something not working? Email support@eucian.com.