SesLab is now on the App Store! Download the app and spin the free wheel every day for a chance to win credits.Spin the free wheel for a chance to win credits.

Download on the App StoreGet it
REST API

API documentation

Video generation, speech synthesis, image generation and voice cloning. One API key, one base URL: https://seslab.com.tr/api/v1

Getting started (3 steps)

1
Get your API key

Open an account and create a new key from the “My keys” page in the panel. Your key starts with sk_ (e.g. sk_a1b2c3…) and is shown only once — copy it and store it safely.

2
Send your first request

Add the Authorization: Bearer sk_… header to every request and send the data as JSON. The easiest first request: GET /me — it returns your account and balance.

3
Collect the result

Images and video can take a while: you first get an id, then ask for the status with that id. Credits are charged on success and refunded automatically on failure.

Authentication

Add the Authorization: Bearer sk_… header to every request. You create the key in the panel; an invalid or missing key returns 401, and too many failed attempts return 429. There is no per-minute request limit on a valid key.

curl https://seslab.com.tr/api/v1/me \
  -H "Authorization: Bearer sk_YOUR_API_KEY"

Desktop app token

Rule: sk_ is used only for the exchange; it is never stored permanently inside the desktop app. The desktop app uses the sk_ API key only on the first exchange request. Store the dsk_ token from the POST /api/desktop/auth/token response securely in the macOS Keychain or Windows Credential Manager. Only a hash of that token is kept in the SesLab database.

curl -X POST https://seslab.com.tr/api/desktop/auth/token \
  -H "Authorization: Bearer sk_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"device_label":"Ufuk Mac M4","app_version":"1.0.0"}'

# Response: { "desktop_token": "dsk_...", "expires_in": 2592000 }

Endpoints

POST
/videoStart a video generation (async, 202 + id)by tier
GET
/video?id=IDQuery a video’s status / resultfree
POST
/ttsTurn text into speech (sync if ready in ≤45 s, otherwise 202 + id)1.0 cr/char · v3: 1.5 cr/char
GET
/tts?id=IDQuery a TTS job’s status / audiofree
POST
/api/image-generateStart an image generation (async, 202 + id)by model
GET
/api/image-generate/status?id=IDQuery a long-running image jobfree
GET
/voicesAvailable voice cataloguefree
POST
/voice-cloneCreate a voice clone (multipart/form-data)free
GET
/voice-cloneList your voice clones and their voice_idsfree
DELETE
/voice-clone?voice_id=IDDelete a voice clonefree
GET
/meAccount details and balancefree
GET
/creditsCredit balancefree
GET
/statusSystem status (no auth required)free
POST
/desktop/auth/tokenExchange an sk_ key for a short-lived dsk_ token for the desktop appfree

Video generation

POST /video

Returns 202 (async). Poll the result with GET /video?id=. Credits are refunded automatically on failed jobs.

FieldTypeStateDescription
promptstring (10–1000)
required
Describe what you want to see in the video. English prompts usually give better results.
modelstring
opt. · def. standard-video
Video package: standard-video (Fast) or hd-video (Premium). Leave it empty and standard-video is used. Old package names have been removed; if you send one you get a clear error telling you what to use instead.
resolutionstring
opt. · def. 720p
Resolution: 720p (default) or 1080p. 1080p costs more credits within the same package.
aspect_ratiostring
opt. · def. 16:9
Only 16:9 landscape video is supported.
durationnumber
opt. · def. 8
The duration is fixed: every video package produces 8 s, and the value you send is ignored.

Quality tiers and credits

Tiermodel =CreditsNotes
Fast
default
standard-video19,50016:9 · 720p · 8 s
Fast (1080p)standard-video29,25016:9 · 1080p · 8 s · send resolution=1080p
Premiumhd-video25,50016:9 · 720p · 8 s
Premium (1080p)hd-video38,25016:9 · 1080p · 8 s · send resolution=1080p

Note: the video endpoint currently supports 16:9 landscape only. If aspect_ratio is left empty, 16:9 is used.

Speech synthesis (TTS)

POST /tts

If it is ready within 45 seconds you get a synchronous audio_url. Long texts return 202 + id; poll with GET /tts?id=. For ElevenLabs send one of the voice-natural packages, or voice-economy as the budget option.

FieldTypeStateDescription
textstring (1–31000)
required
The text to turn into speech.
voice_idstring
required
Which voice reads it. Fetch the voice list with GET /voices and put the id from there here.
voice_packagestring
opt. · def. voice-natural
ElevenLabs: voice-natural, voice-natural-fast, voice-natural-live or voice-natural-latest. Budget option: voice-economy.
languagestring
optional
Language of the text, e.g. tr (Turkish). Only valid for voice-natural and voice-fast.
voice_settingsobject
optional
Fine tuning (voice-natural only): stability 0–100, similarity_boost 0–100, speed 0.7–1.2, style 0–100, use_speaker_boost: true/false.

Image generation

POST /api/image-generate

A SesLab-compatible endpoint. Only the verified active image model is open right now. Returns 202 + id; poll the result with the status endpoint. Credits are refunded automatically on failure.

FieldTypeStateDescription
promptstring (1–20000)
required
What should be in the image? Describe it freely (Turkish works too).
modelstring
required
Model ID: only nano-banana-2-lite is active right now. image-standard is accepted as a legacy alias.
aspect_ratiostring
optional
Aspect-ratio choice for the active model.
resolutionstring
disabled
The active model runs natively at 1K; extra resolution choices are disabled.
modestring
disabled
Image services that are not active are disabled.
qualitystring
disabled
Image services that are not active are disabled.
image_inputstring[]
optional
Reference images: base64 data URI or http(s) URL. Alias: reference_images. Up to 4 on the active model.
negative_promptstring
optional
Things to avoid.

Image models

nano-banana-2-liteNano Banana 2 Lite2,000 crverified active model · 1K · 4 references
default

GET /api/image-generate/status?id=ID

Returns the status, image_url, image_urls and error fields for long-running image jobs.

Voice cloning

POST /voice-clone — multipart/form-data

Free. Returns a voice_id — use it in TTS calls.

FieldTypeStateDescription
filefile
required
The voice sample to clone — MP3/M4A/WAV/OGG/FLAC, max 10 MB (10 seconds to 5 minutes of clean audio).
voice_namestring (≤100)
required
The name you give the clone (visible to you).
language_tagstring
opt. · def. Turkish
Language of the voice, e.g. Turkish.
gender_tagstring
opt. · def. female
Gender of the voice: female or male.

GET /voice-clone

Lists every voice clone on your account, newest first, with their voice_id fields. Takes no parameters.

{
  "success": true,
  "voices": [
    {
      "id": "b7c1e0a2-4f10-4a91-9c2e-1d5b7a0e33af",
      "voice_id": "2630054",
      "cloned_voice_id": "2630054",
      "name": "My voice",
      "created_at": "2026-08-12T09:14:22.000Z"
    }
  ]
}

Speaking with a clone: send the voice_id (or id) you get here as voice_id in your POST /tts call — no package/model field is needed, and it is ignored for clone voices. The text limit is 5,000 characters.

DELETE /voice-clone?voice_id=ID

Deletes the clone. The voice_id query parameter is required; if the clone is not found you get a 404.

Code samples

# Basic auth check
curl https://seslab.com.tr/api/v1/me \
  -H "Authorization: Bearer sk_YOUR_API_KEY"

# Start a video — packages: standard-video (Fast) / hd-video (Premium), 16:9, 720p|1080p, 8 s
curl -X POST https://seslab.com.tr/api/v1/video \
  -H "Authorization: Bearer sk_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Cinematic product showcase, smooth camera move",
    "aspect_ratio": "16:9",
    "model": "standard-video",
    "resolution": "720p"
  }'

# Query the video status (free, poll repeatedly)
curl "https://seslab.com.tr/api/v1/video?id=VIDEO_ID" \
  -H "Authorization: Bearer sk_YOUR_API_KEY"

# Turn text into speech
curl -X POST https://seslab.com.tr/api/v1/tts \
  -H "Authorization: Bearer sk_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Hello, this voice was generated with Seslab.",
    "voice_id": "VOICE_ID",
    "voice_package": "voice-natural",
    "language": "en"
  }'

# Generate an image — returns 202 + id, poll the result from the status endpoint
curl -X POST https://seslab.com.tr/api/image-generate \
  -H "Authorization: Bearer sk_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Premium product photo with blue lighting on a dark background",
    "aspect_ratio": "1:1",
    "model": "nano-banana-2-lite"
  }'

Error codes

401UnauthorizedThe Authorization header is missing or the key is wrong.
402Insufficient CreditsNot enough credits. Top up from the panel.
422Validation ErrorMalformed request body or unsupported value.
429Too Many Attempts10+ failed authentication attempts in a minute.
404Not FoundThe requested generation (id) was not found.
503Service Not ReadyThe generation service is not active right now.
500Server ErrorUnexpected error — try again; credits are refunded on a failed job.

Ready to start?

Open an account, create your API key and send your first request within minutes.

WhatsApp support
Don't forget to follow the channel for announcements and updates
Announcement Channel