Quickstart
The API lives at https://api.easytoken.si/v1. Every model uses the same key. Video, image and audio models run as tasks: you create one, then receive the result by webhook or by polling. Chat models answer in the same request.
- Create an account and copy your API key from the dashboard.
- Send your first task with the request below.
- Open the
result.urlwhen the task finishes.
curl https://api.easytoken.si/v1/tasks \ -H "Authorization: Bearer $EASYTOKEN_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2.5", "input": { "prompt": "Product spin on a marble table" } }'
Authentication
Send your key as a bearer token in the Authorization header. Keys start with et_live_. Keep them on your server; never ship them in a browser or mobile app.
You can create several keys, each with its own daily spend cap, from Dashboard → API keys.
Media tasks
POST /v1/tasks creates a video, image or audio job and returns at once with a task ID.
| Field | Type | Description |
|---|---|---|
model | string | Model ID, e.g. veo-3.1. See Model IDs. |
input | object | Model-specific input. Every model accepts prompt (ElevenLabs also takes text and voice). Video and image models accept aspect_ratio and image_urls (https links) for image-to-video or editing. Suno accepts style, lyrics, title and instrumental. |
callback_url | string | Optional public https URL. We POST the finished task here. |
metadata | object | Optional. Returned unchanged, useful for your own IDs. |
{
"id": "task_8f2kq1x",
"model": "seedance-2.5",
"status": "queued",
"cost_usd": 1.95,
"created_at": "2026-10-07T12:00:00Z"
}Get a task
GET /v1/tasks/{id} returns the current state. Output links stay valid for 14 days, so copy files you want to keep. status moves through queued → running → succeeded or failed. Poll every 5 to 10 seconds, or use a webhook instead.
{
"id": "task_8f2kq1x",
"status": "succeeded",
"result": { "url": "https://…/output.mp4", "urls": ["https://…/output.mp4"], "type": "video" },
"cost_usd": 1.95
}Chat completions
POST /v1/chat/completions follows the OpenAI format, including streaming, tools and JSON mode. Point any OpenAI SDK at our base URL.
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://api.easytoken.si/v1", apiKey: process.env.EASYTOKEN_KEY, }); const res = await client.chat.completions.create({ model: "claude-opus-5-5", messages: [{ role: "user", content: "Summarise this brief in 3 bullets" }], });
Webhooks
When you pass callback_url, we send the same body as Get a task once the task finishes. Each request carries an X-EasyToken-Signature header: an HMAC-SHA256 of the raw body with your webhook secret. Reply with any 2xx within 10 seconds; we retry up to 5 times with backoff.
Model IDs
GET /v1/models returns this list as JSON with prices; GET /v1/balance returns your credit balance.
| Model ID | Type | Endpoint | Price |
|---|
Errors
| Status | Code | What to do |
|---|---|---|
| 401 | invalid_api_key | Check the key and that it hasn't been revoked. |
| 402 | insufficient_credits | Top up in the dashboard, or raise the key's spend cap. |
| 404 | model_not_found | Use an ID from the Model IDs table. |
| 422 | invalid_input | The message names the field that failed. |
| 429 | rate_limited | Wait for the Retry-After seconds, then resend. |
| 5xx | upstream_error | Safe to retry. Failed tasks are never billed. |
Rate limits
New accounts can run 10 media tasks at once per model and 60 chat requests per minute. Limits rise automatically with usage; contact support if you need more for a launch.
Billing
Usage is paid from prepaid credits. Each task's price is fixed when it is created and shown in cost_usd. Tasks that fail, time out or are blocked by a safety filter are refunded automatically.