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 path | Purpose |
|---|---|
GET/me | Plan, balance and token prices |
POST/clips | Submit a clip |
GET/clips | Liste 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}/file | Download 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.
| Field | Values | Default |
|---|---|---|
url | Link to a Twitch or Kick clip | required |
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, faceSplit | true or false | false |
speakerFocus, channelOverlay | true or false, depending on your plan | false |
context | Short description of the clip, at most 300 characters | empty |
introText | Spoken intro, at most 200 characters, costs 10 extra tokens | empty |
hookTitle | Hook title at the top of the video, at most 80 characters, emojis allowed | empty (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
| Value | Meaning |
|---|---|
queued | Waiting in the queue, queuePosition tells you how many clips go first |
processing | Being processed, progress in percent |
done | Finished, downloadUrl is set |
failed | Failed, the tokens were refunded automatically |
expired | Was 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
- 120 requests per minute per account
- 30 new clips per 10 minutes per account
- If the queue is full you get
queue_full. Wait for the seconds given in theRetry-Afterheader. - Higher plans go first in the queue, and waiting clips move up automatically over time.
Errors
Errors always have the same shape:
{ "error": { "code": "insufficient_tokens", "message": "Not enough tokens (10 needed, 0 left). ..." } }
| Code | HTTP | Meaning |
|---|---|---|
missing_api_key | 401 | No key in the header |
invalid_api_key | 401 | Key unknown or revoked |
not_available | 403 | The API is not enabled for your account yet (testing phase) |
plan_required | 403 | Your plan does not include API access |
account_disabled | 403 | Account disabled |
not_in_plan | 403 | A requested feature is not in your plan |
invalid_request | 400 | Request incomplete or invalid, for example a wrong clip link |
insufficient_tokens | 402 | Not enough tokens |
not_found | 404 | Clip or endpoint does not exist in your account |
rate_limited | 429 | Too many requests, see Retry-After |
queue_full | 429 | Queue full, see Retry-After |
server_error | 500 | An 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