Quickstart
Send a video. Get back ranked clips.
Send one long video to POST /v1/clips. You get up to 20 short clips back, best first, each scored 0 to 100, cropped to 9:16 and captioned.
POSTapi.clipsdk.com/v1/clips
curl https://api.clipsdk.com/v1/clips \
-H "Authorization: Bearer $CLIPSDK_KEY" \
-H "Content-Type: application/json" \
-d '{"video_url":"https://cdn.example.com/off-script-112.mp4"}'job_q8w2e4r6t1y3u5i7o9p0succeeded in 3 min 46 s
- 960:42

rank 1
We were three weeks from shutting down
- 910:37

rank 2
The pricing mistake that cost us a year
- 880:51

rank 3
Why I stopped reading resumes
- Base URL
https://api.clipsdk.com- Authentication
Authorization: Bearer csdk_live_...- Pricing
- $0.03 per source minute, first $1 free
- For tools and LLMs
- /openapi.json/llms.txt
1Get an API key
Sign up to get a key. Keys start with csdk_live_, and your first $1 of usage is free: about 33 minutes of source video.
Then export it, so the examples on this page can read it:
export CLIPSDK_KEY="csdk_live_..."Keep the key on your server
2Make your first request
Send a direct link to the video file: MP4, MOV, WebM or MKV, up to 3 hours and 5 GB. We download it, so the URL has to be reachable from the internet. YouTube and other page links don't work: they point at a web page, not a file.
POSTapi.clipsdk.com/v1/clips
curl https://api.clipsdk.com/v1/clips \
-H "Authorization: Bearer $CLIPSDK_KEY" \
-H "Content-Type: application/json" \
-d '{
"video_url": "https://cdn.example.com/off-script-112.mp4",
"clips": 6,
"aspect": "9:16",
"captions": "bold",
"webhook_url": "https://example.com/hooks/clipsdk"
}'Only video_url is required. This example also asks for 6 clips with bold captions and a webhook. Create clips lists every field.
The call waits up to 60 seconds. If the job is done by then, you get 200 with the finished job. If not, you get 202 with the job so far, and step 4 takes it from there.
3Upload a local file
No public URL? Upload the file first. POST /v1/uploads returns a signed upload_url. PUT the file to it within 1 hour, then send the video_url it gave you to POST /v1/clips, as in step 2.
POSTapi.clipsdk.com/v1/uploads
# 1. Ask for an upload URL
curl https://api.clipsdk.com/v1/uploads \
-H "Authorization: Bearer $CLIPSDK_KEY" \
-H "Content-Type: application/json" \
-d '{"filename": "episode-112.mp4", "size": 1834201117}'
# 2. PUT the file to the upload_url it returns
curl -X PUT "$UPLOAD_URL" --upload-file episode-112.mp4Skip this step if your video already has a URL. Upload a file has the details.
4Get the results
A job runs through 4 stages: fetching, transcribing, ranking and rendering, so a longer video takes longer. Pick how you want the result:
Fetching a job by id looks like this. It waits up to 60 seconds for the job to finish:
GETapi.clipsdk.com/v1/jobs/{id}
curl "https://api.clipsdk.com/v1/jobs/job_q8w2e4r6t1y3u5i7o9p0?wait=60" \
-H "Authorization: Bearer $CLIPSDK_KEY"Waiting is the simplest for scripts and tests. In production, webhooks save you the polling.
Read the response
A finished job looks like this. It's the same object whether it comes from the create call, a GET or a webhook.
{ "job": { "id": "job_q8w2e4r6t1y3u5i7o9p0", "op": "clips", "status": "succeeded", "stage": null, "created_at": "2026-10-26T09:14:02Z", "finished_at": "2026-10-26T09:17:48Z", "result": { "source": { "duration_s": 3486.2, "language": "en", "speakers": null }, "clips": [ { "rank": 1, "score": 96, "title": "We were three weeks from shutting down", "reason": "Opens on the stakes, tells the whole story and lands the turn", "start_s": 1713.4, "end_s": 1755.9, "duration_s": 42.5, "transcript": "Honestly? We were three weeks from shutting the whole thing down. Payroll was due Friday, the bank had said no twice, and then one cold email changed everything.", "post_caption": "Three weeks from shutting down. Then one cold email changed everything. #startups #founders", "video": "https://api.clipsdk.com/f/out/job_q8w2e4r6t1y3u5i7o9p0/clip-1.mp4", "poster": "https://api.clipsdk.com/f/out/job_q8w2e4r6t1y3u5i7o9p0/clip-1.jpg", "srt": "https://api.clipsdk.com/f/out/job_q8w2e4r6t1y3u5i7o9p0/clip-1.srt", "vtt": "https://api.clipsdk.com/f/out/job_q8w2e4r6t1y3u5i7o9p0/clip-1.vtt" } ] }, "usage": { "source_minutes": 58.1, "clips": 6, "output_seconds": 240 }, "error": null, "poll_url": "https://api.clipsdk.com/v1/jobs/job_q8w2e4r6t1y3u5i7o9p0" }}- 1
statusisqueued,running,succeededorfailed. Only a succeeded job has aresult. - 2
result.sourceis what we found in the video: its length in seconds and the spoken language. - 3
scorerates the moment from 0 to 100, andreasonsays why. Clips come best first, sorank1 is the top pick. - 4
videois the finished MP4.posteris a JPG frame,srtandvttare the captions. Links work for 7 days. - 5
usageis what the job used. You pay per source minute, and only when a job succeeds: 58.1 minutes here cost ~$1.74. - 6
poll_urlfetches this job again at any time.