API docs

With the API, your own scripts, bots or tools like n8n can submit clips, check their status and download finished clips. Everything the API does also works in the app, and each clip costs the same tokens.

Who can use the API

The API is in testing right now and only enabled for selected testers. Without access it answers with not_available.

From the Premium plan and while you have token pack balance. This is checked on every request: if you move to a smaller plan without pack balance, the API answers with plan_required until one of the conditions is met again.

Key

You create your key in the settings under "API access". It is shown exactly once, after that we only keep a one-way hash. A new key immediately invalidates the old one.

Treat the key like a password. Never put it in browser code, public repositories, screenshots or chats. The API deliberately does not allow calls from a browser. If you think someone knows your key, revoke it right away in the settings. The key can only process clips, never change your account, payments or security settings.

Authentication

Send the key in the header with every request. All URLs start with https://lazyclipper.com/api/v1.

Authorization: Bearer ct_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Endpoints

Method and pathPurpose
GET/mePlan, balance and token prices
POST/clipsSubmit a clip
GET/clipsListe deiner fertigen Clips, solange sie gespeichert sind (je nach Tarif 7 bis 60 Tage, das Feld retentionDays nennt den Wert)
GET/clips/{id}Status of a clip
GET/clips/{id}/fileDownload a finished clip as MP4

Submit a clip

Send JSON. Only url is required. Values your plan does not include or that are unknown fall back to the default, just like in the app.

FieldValuesDefault
urlLink to a Twitch or Kick cliprequired
targetDuration"15", "30", "45", "full""full"
sfxIntensity"none", "low", "medium", "high""medium"
captionStyle"classic", "hormozi", "comic", "none" (no captions), "box", "karaoke", "single", "tiktok", "neon", "pop", "popyellow", "popwhite", "clean", "bold""classic"
speed"normal", "schneller", "viel-schneller""normal"
pitch"normal", "hoeher", "viel-hoeher""normal"
silenceCut, faceZoom, faceSplittrue or falsefalse
speakerFocus, channelOverlaytrue or false, depending on your planfalse
contextShort description of the clip, at most 300 charactersempty
introTextSpoken intro, at most 200 characters, costs 10 extra tokensempty
hookTitleHook title at the top of the video, at most 80 characters, emojis allowedempty (off)
hookStyle"outline" (white with outline), "box" (black on a white box), "viral", "comment", "bar", "wucht""outline"
hookDuration"3", "5" (seconds in the finished clip), "full" (whole clip)"3"

The response comes with status 202 as soon as the clip is in the queue:

{
  "id": "590ad858-8e71-4fac-ac88-d86fbf4cc7c5",
  "status": "queued",
  "queuePosition": 2,
  "tokensCharged": 10,
  "tokensRemaining": 2490,
  "statusUrl": "/api/v1/clips/590ad858-8e71-4fac-ac88-d86fbf4cc7c5"
}

Example: the full flow

# 1. Submit a clip
curl -X POST https://lazyclipper.com/api/v1/clips \
  -H "Authorization: Bearer $LAZYCLIPPER_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: my-clip-001" \
  -d '{"url":"https://www.twitch.tv/channel/clip/ClipSlug","targetDuration":"30"}'

# 2. Poll the status until it is "done" or "failed" (at most every 5 seconds)
curl https://lazyclipper.com/api/v1/clips/CLIP_ID \
  -H "Authorization: Bearer $LAZYCLIPPER_KEY"

# 3. Download the finished clip
curl -L -o clip.mp4 https://lazyclipper.com/api/v1/clips/CLIP_ID/file \
  -H "Authorization: Bearer $LAZYCLIPPER_KEY"

Status

ValueMeaning
queuedWaiting in the queue, queuePosition tells you how many clips go first
processingBeing processed, progress in percent
doneFinished, downloadUrl is set
failedFailed, the tokens were refunded automatically
expiredWas finished, deleted after the storage period

Avoiding duplicate orders

Send your own POST /clips with Idempotency-Key , for example an ID from your system. If the same request arrives again within 24 hours, say because your script retries after a network error, you get the first response back and nothing is charged twice. The response then carries the header Idempotent-Replayed: true.

Limits

Errors

Errors always have the same shape:

{ "error": { "code": "insufficient_tokens", "message": "Not enough tokens (10 needed, 0 left). ..." } }
CodeHTTPMeaning
missing_api_key401No key in the header
invalid_api_key401Key unknown or revoked
not_available403The API is not enabled for your account yet (testing phase)
plan_required403Your plan does not include API access
account_disabled403Account disabled
not_in_plan403A requested feature is not in your plan
invalid_request400Request incomplete or invalid, for example a wrong clip link
insufficient_tokens402Not enough tokens
not_found404Clip or endpoint does not exist in your account
rate_limited429Too many requests, see Retry-After
queue_full429Queue full, see Retry-After
server_error500An error on our side, please try again later

Versions

Version 1 stays stable. New fields may be added, existing ones keep their meaning. Anything that would break existing scripts only comes as a new version with advance notice.

Using the API is also subject to the Terms of Service, especially §5d.

← Back