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.

  1. Create an account and copy your API key from the dashboard.
  2. Send your first task with the request below.
  3. Open the result.url when the task finishes.
first-task.sh
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.

FieldTypeDescription
modelstringModel ID, e.g. veo-3.1. See Model IDs.
inputobjectModel-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_urlstringOptional public https URL. We POST the finished task here.
metadataobjectOptional. Returned unchanged, useful for your own IDs.
response · 202
{
  "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.

succeeded
{
  "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.

chat.js
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 IDTypeEndpointPrice

Errors

StatusCodeWhat to do
401invalid_api_keyCheck the key and that it hasn't been revoked.
402insufficient_creditsTop up in the dashboard, or raise the key's spend cap.
404model_not_foundUse an ID from the Model IDs table.
422invalid_inputThe message names the field that failed.
429rate_limitedWait for the Retry-After seconds, then resend.
5xxupstream_errorSafe 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.