The studio, Vibe Direct, the MCP server and the API, in plain words.
API
The REST API makes and fetches videos from your own code. It uses the same studios, prices and credits as the app. Base URL: https://clickpop.ai/api/v1. Requests and responses are JSON.
Authentication
Create a key on the API keys page. The full key is shown once; we keep only a hash, so a lost key can be revoked and replaced but not recovered. Keep it on your server and send it on every request:
Authorization: Bearer YOUR_API_KEY
Calls that spend credits need a plan on the account.
How a render works
Add "dry_run": true to see the price without rendering or spending anything.
Without it, the call holds the credits and answers 202 with a video whose status is processing.
Poll GET /videos/{id} every few seconds. When status is succeeded, download url. On failed, the credits are already returned and error says why.
POST /videos takes prompt (required), seconds (default 5), resolution (480p, 720p or 1080p; default 480p), model (default auto) and an optional character_id.
Quickstart
# 1. Price it first: nothing renders, nothing is charged
curl -X POST https://clickpop.ai/api/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt":"A barista slides a latte across the counter, slow motion","seconds":5,"dry_run":true}'
# 2. Start it: 202 with a video in "processing"
curl -X POST https://clickpop.ai/api/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt":"A barista slides a latte across the counter, slow motion","seconds":5}'
# 3. Poll until status is "succeeded", then download url
curl https://clickpop.ai/api/v1/videos/VIDEO_ID -H "Authorization: Bearer YOUR_API_KEY"
Endpoints
All paths are under https://clickpop.ai/api/v1.
Account and models
GET/me
Your account: plan and credit balance.
GET/models
The models your key can use, with prices.
Videos
POST/videos
Make a video from a prompt. Returns 202; add dry_run for the price.
GET/videos
Your videos, newest first.
GET/videos/{id}
One video: status, progress and the file url when it is ready.
POST/videos/{id}/brand
Add your brand card to a finished video.
POST/promo
A Vibe Direct promo (montage, kinetic, directed and the other modes). Poll it with GET /videos/{id}.
Film Studio
GET / POST/storyboard
List storyboards or start one from a brief.
GET / PATCH/storyboard/{id}
Read or edit a storyboard.
PATCH/storyboard/{id}/shots/{shotId}
Edit one shot.
POST/storyboard/{id}/shots/{shotId}/regenerate
Redo one shot.
POST/storyboard/{id}/render
Render the cut.
GET/storyboard/shot-library
Camera moves and shot types you can ask for.
Lip sync and recast
GET / POST/lipsync
List lip-sync models, or start a job. Needs consent: true.
GET / POST/recast
List recast models, or start a job. Needs consent: true.
GET/jobs/{id}
Follow a lip-sync or recast job.
Characters and products
GET / POST/characters
List or create characters.
GET / PATCH/characters/{id}
Read or edit one character.
GET/products
Products saved in your studio.
GET/affiliates
Affiliate products saved in your studio.
Socials and automations
GET / POST/social/accounts
Connected accounts, or a sign-in link to connect one.
GET / POST/social/posts
Your posts, or post or schedule a video.
GET / POST/automations
List or create an automation.
PATCH / DELETE/automations/{id}
Change or remove an automation.
Text
POST/chat/completions
OpenAI-compatible chat for scripts and captions. Model deepseek-v4-pro, no streaming.
Errors
Errors come back as JSON with an error field that says what went wrong.
Status
Meaning
400
A field is missing or out of range.
401
Missing, invalid or revoked API key.
402
The account needs a plan, or more credits for this job.
403
The account has to finish sign-up (date of birth) first.
404
No such item on your account.
5xx
Something failed on our side. You were not charged; try again.