Send a link in, get finished vertical shorts back. Three endpoints, one key, no SDK required.
You do not need the API to use ViggeClips. The website does everything. The API is for people who want clips without opening a browser — a stream ends, a script sends the VOD link, and the shorts are waiting in the morning. Typical users: a Discord bot for your community, an agency running fifty channels, a Zapier/Make automation, or your own dashboard.
Five steps, no coding experience needed to follow along:
vc_live_… with your key
and the URL with your video. Press Enter. You get back an id.status says done, the response lists every clip with a
download link. That is it.Anything you can do here you can also do by clicking on the website — the API just lets a machine do the clicking.
Create a key under Account → API. Send it with every request:
Authorization: Bearer vc_live_… User-Agent: YourApp/1.0
Keys are shown once and stored hashed. Revoking a key kills it instantly. Rate limit: 60 requests/minute per key.
urllib is the one people hit — and the refusal comes from the edge,
so you get its page instead of our error. Naming your app in one header avoids it
entirely. curl, requests, Go and Node are unaffected.
POST https://vigge.pro/api/v1/jobs
Content-Type: application/json
{
"url": "https://www.youtube.com/watch?v=…",
"language": "auto", // default. or an ISO code: en sv de es pt fr it nl pl
// tr ru uk ar hi id vi th ja ko zh … or "sv+en" (mixed)
"clipLength": "auto", // auto | snappy 8-20s | short 15-30s | standard 25-45s
// | long 40-75s | extended 60-120s | talk 90-240s
"kinds": ["laugh","kill"], // optional. laugh kill story teach scenery hype
// — omit for no preference
"webhookUrl": "https://your-server.example/hook" // optional
}
→ 202 { "id": "…", "status": "fetching" }
YouTube, Twitch and Kick links are supported. The job draws from the same minute balance as the web app — a job that fails is never charged.
auto is the default everywhere. language detection reads the
actual speech; clipLength: "auto" gives each moment the length its own
type deserves (a kill stays tight, a story gets room). kinds favours the
moment types you name without excluding the rest. The number of shorts follows the
length of the recording — roughly one for every four minutes, up to your plan's
limit — and the engine sets its own bar (an old qualityPct is accepted
and ignored).
GET https://vigge.pro/api/v1/jobs/{id}
→ { "status": "fetching" | "queued" | "running" | "done" | "failed",
"progress": 0–100,
"error": "…", // only when failed — always says why
"clips": [ // only when done
{ "idx": 1, "title": "…", "seconds": 27,
"url": "https://…", // signed, valid for hours — download promptly
"thumbUrl": "https://…" }
] }
Poll every 30 seconds. Short videos come back in minutes; long streams run several
times faster than real time (a 10-hour stream took 91 minutes). If you set webhookUrl we POST
{ id, status, clips } once when the job ends — but polling is
the source of truth; treat the webhook as a doorbell, not a delivery.
GET https://vigge.pro/api/v1/me
→ { "minutes": 87 }