The vidBoard API
Make avatar videos, add AI subtitles, remove backgrounds and cut long videos into shorts, from your own app. The same engines as vidBoard, one HTTP call at a time.
Quick start
- Sign in to vidBoard, open your Profile and click Create API key in the vidBoard API card. Copy the key: it is shown once.
- Start a video. It answers at once with an
id. - Ask for that video every 15–30 seconds until
statusisdone, then downloadvideoUrl.
curl -X POST https://www.vidboard.ai/tool/api/v1/avatar_video/ \
-H "X-API-Key: vb_live_your_key" \
-H "Content-Type: application/json" \
-d '{"text": "Solar panels turn sunlight into electricity. Each panel is made of cells...", "slides": 4, "shape": "portrait"}'curl https://www.vidboard.ai/tool/api/v1/avatar_video/5be8f425-c48f-45c1-9e2d-c2fa885125a3/ \
-H "X-API-Key: vb_live_your_key"
{"id": "5be8f425-c48f-45c1-9e2d-c2fa885125a3", "status": "done", "stage": "Ready",
"createdAt": "2026-11-02T17:39:34.643178Z",
"videoUrl": "https://video.vidboard.ai/API_video_5be8f425-2026-11-02_17-44-16.mp4"}import time, requests
BASE = "https://www.vidboard.ai/tool/api/v1"
HEADERS = {"X-API-Key": "vb_live_your_key"}
job = requests.post(f"{BASE}/avatar_video/", headers=HEADERS, json={
"text": "Solar panels turn sunlight into electricity. Each panel is made of cells...",
"slides": 4,
}).json()
while job["status"] not in ("done", "failed"):
time.sleep(20)
job = requests.get(f"{BASE}/avatar_video/{job['id']}/", headers=HEADERS).json()
print(job.get("videoUrl") or job.get("error"))const BASE = "https://www.vidboard.ai/tool/api/v1";
const headers = { "X-API-Key": "vb_live_your_key", "Content-Type": "application/json" };
let job = await (await fetch(`${BASE}/avatar_video/`, {
method: "POST", headers,
body: JSON.stringify({ text: "Solar panels turn sunlight into electricity. Each panel is made of cells...", slides: 4 }),
})).json();
while (!["done", "failed"].includes(job.status)) {
await new Promise((r) => setTimeout(r, 20000));
job = await (await fetch(`${BASE}/avatar_video/${job.id}/`, { headers })).json();
}
console.log(job.videoUrl || job.error);Keep your key on your server. Anyone with it can make videos on your plan. If it leaks, click Replace key on your Profile: the old one stops working at once.
Keys and requests
- Every address starts with
https://www.vidboard.ai/tool/api/v1/and ends with a/. Without the last slash you get404 Unknown endpoint. - Send your key in the
X-API-Keyheader on every request. NotAuthorization. - Send JSON bodies with
Content-Type: application/jsonand snake_case field names (job_id,style_id). Files go asmultipart/form-data. - Answers come back as JSON with camelCase names (
jobId,videoUrl,downloadUrl). - Everything you make through the API belongs to your vidBoard account. Avatar videos also appear in your projects, where you can open and edit them.
Limits and errors
Each plan includes a number of API videos a month for each tool, separate from your in-app credits. Your Profile shows how many you have used this month. Only the call that makes the video counts (marked uses one API video below). Uploads, progress checks and downloads are free. A video that fails on our side is not counted.
Each key can make 30 requests a minute. Progress checks count too, so check every 5 seconds or slower (15–30 seconds is plenty for avatar videos).
| Code | Meaning | What to do |
|---|---|---|
400 | Bad request | A field is missing or wrong. The answer says which, in detail or error. |
401 | Bad key | The key is missing, mistyped or replaced. {"detail": "Invalid API key."} |
403 | Not in your plan | {"error": "Your plan does not include API access to …"} |
404 | Not found | Wrong address (check the last /), or a job id that is not yours or has expired. |
409 | Busy | This job is already working. Wait for it to finish. |
429 | Too many | With error and used/limit: this month's API videos are used up. With detail: more than 30 requests a minute, wait and retry. |
5xx | Our side | Something failed here. Nothing is counted. Try again in a minute. |
Text to video
Send a script or an article. The AI writes the slides and the narration, finds pictures, and the avatar presents it, the way the app's Document tool does.
POSTavatar_video/ USES ONE API VIDEO
| Field | Required / default | What it does |
|---|---|---|
text | required | Your script or article, 40 to 20,000 characters. |
curl -X POST https://www.vidboard.ai/tool/api/v1/avatar_video/ \
-H "X-API-Key: vb_live_your_key" -H "Content-Type: application/json" \
-d '{"text": "Solar panels turn sunlight into electricity...", "slides": 4}'Add any of the video settings, and follow it with GET avatar_video/{id}/.
Link to video
Send a web page: a blog post, a news story, a product page. It is read and turned into a presenter video.
POSTavatar_video/ USES ONE API VIDEO
| Field | Required / default | What it does |
|---|---|---|
url | required | A full https:// link to a public page. |
curl -X POST https://www.vidboard.ai/tool/api/v1/avatar_video/ \
-H "X-API-Key: vb_live_your_key" -H "Content-Type: application/json" \
-d '{"url": "https://example.com/blog/solar-power", "slides": 5, "shape": "portrait"}'A page behind a login or a paywall cannot be read.
PDF & Word to video
Send a document. Its text is read and made into a presenter video, the same way as Text to video.
POSTavatar_video/ USES ONE API VIDEO
A multipart/form-data request: the file as file, any settings next to it. Let your HTTP library set the Content-Type header.
| Field | Required / default | What it does |
|---|---|---|
file | required | A .pdf (10 pages at most) or .docx, up to 20 MB. |
curl -X POST https://www.vidboard.ai/tool/api/v1/avatar_video/ \
-H "X-API-Key: vb_live_your_key" \
-F "file=@report.pdf" -F "slides=5" -F "shape=portrait"A scanned page is a picture, so it has no text to read: the request is refused with a 400 and nothing is counted. Word tables are read too.
PowerPoint to video
Send a deck. Each slide becomes a scene exactly as you designed it, narrated from its speaker notes, the way the app's PowerPoint tool does.
POSTavatar_video/ USES ONE API VIDEO
A multipart/form-data request, as for PDF & Word.
| Field | Required / default | What it does |
|---|---|---|
file | required | A .pptx, up to 50 MB. |
slides | 10 | How many of its first slides to use, 1 to 10. |
avatar | none | An avatar id from options/ puts the presenter on every slide. |
curl -X POST https://www.vidboard.ai/tool/api/v1/avatar_video/ \
-H "X-API-Key: vb_live_your_key" \
-F "file=@pitch.pptx" -F "avatar=avatar_74"- Only the speaker notes are spoken, never the text on the slide. A slide without notes is shown for 5 seconds in silence.
- The slides are used as they are, so
templateandlanguagedo not apply (sending them is a400).
Video settings and progress
All four tools above are one endpoint, avatar_video/, so they share these settings and the way you follow a video. Send exactly one of text, url or file. Tool name in your plan: avatar_video.
| Field | Required / default | What it does |
|---|---|---|
slides | 6 | 1 to 20 (PowerPoint: 1 to 10, default 10). |
shape | landscape | landscape, portrait or square. |
template | our first theme | A template id from options/. Not for PowerPoint. |
avatar | our standard presenter (PowerPoint: none) | An avatar id from options/, or "none" for no presenter. |
language | the text's own | A language id from options/. The video is written and spoken in it. Not for PowerPoint. |
voice | matched to language and avatar | A voice name, for example en-US-AvaMultilingualNeural. |
name | API video, or the file name | Shown in your vidBoard projects and videos (80 characters). |
The start answers 202 with {"id", "status": "queued"}.
GETavatar_video/{id}/
status moves through these steps:
| Status | Meaning | |
|---|---|---|
queued | Waiting its turn. position = videos ahead of it. | |
building | Writing slides, finding pictures, making the voice. stage says which. | |
rendering | Drawing the video. progress = {"stage", "done", "total"}. | |
done | videoUrl is the finished MP4. | |
failed | error says why. It was not counted. |
{"id": "5be8f425-…", "status": "rendering", "stage": "Rendering",
"createdAt": "2026-11-02T17:39:34.643178Z",
"progress": {"stage": "assembling", "done": 5, "total": 8}}GETavatar_video/options/
Lists what you can choose: avatars (id, name, gender, image), templates, languages and shapes.
Videos are made one at a time. A 2-minute video usually takes a few minutes, longer when many are waiting.
AI Subtitles
Upload a video, we transcribe it, you pick a caption style, and you get the MP4 back with animated captions burned in. The video keeps its own size. Tool name in your plan: captions.
POST captions/upload/with the video →jobIdPOST captions/transcribe/{jobId}/→ pollprogress/untiltranscribedPOST captions/generate/→ pollprogress/untildoneGET captions/download/{jobId}/→ the MP4
POSTcaptions/upload/
Multipart, field file. MP4, MOV or WebM, up to 1 GB and 15 minutes. Answers {"jobId", "videoInfo": {"width", "height", "duration", "fps", "codec"}}.
curl -X POST https://www.vidboard.ai/tool/api/v1/captions/upload/ -H "X-API-Key: vb_live_your_key" -F "file=@talk.mp4"POSTcaptions/transcribe/{jobId}/
No body. Add ?language=en (a two-letter code) to skip language detection. Answers 202 {"jobId", "status": "queued"}.
GETcaptions/progress/{jobId}/
Always has jobId, status, stage, percent and position (videos ahead of yours, while waiting).
| Status | Meaning | |
|---|---|---|
uploaded | Uploaded, not transcribed yet. | |
transcribing | Being transcribed. | |
transcribed | Ready to style. Also returns words ([{"word", "start", "end"}], in seconds) and detectedLanguage. | |
generating | Making the video. percent counts up while captions are drawn. | |
done | Download it from captions/download/{jobId}/. | |
error | error says why. A failed video is not counted. |
POSTcaptions/generate/ USES ONE API VIDEO
JSON body. Answers 202 {"jobId", "status": "queued"}. Sending it again while the video is being made does not start or count a second one.
| Field | Required / default | What it does |
|---|---|---|
job_id | required | From upload. |
style_id | hormozi_1 | A caption style id from GET captions/styles/. |
vertical | bottom | top, middle or bottom. |
horizontal | center | left, center or right. |
words_per_chunk | 3 | How many words show at once. |
font_size_multiplier | 1.0 | Bigger or smaller captions, for example 1.2. |
words | the transcript | Your own [{"word", "start", "end"}], to fix spelling or use a translation. |
overrides | Colours and font over the style: color, highlightColor, backgroundColor (or "transparent"), textTransform (uppercase, lowercase, none). Keys inside it are camelCase. | |
ai_edit | false | true: an automatic edit as well. Pauses cut, a hook, music, zooms and emojis. The video gets shorter. This call then takes longer to answer. |
curl -X POST https://www.vidboard.ai/tool/api/v1/captions/generate/ \
-H "X-API-Key: vb_live_your_key" -H "Content-Type: application/json" \
-d '{"job_id": "JOB_ID", "style_id": "hormozi_1", "vertical": "bottom"}'GETcaptions/download/{jobId}/
The MP4 itself (not JSON). Use curl -o out.mp4. Jobs and their videos are deleted after 3 days, so download promptly.
GETcaptions/styles/
{"styles": [{"id", "name", "premium", "spec"}]}. Use the id as style_id.
POSTcaptions/translate-transcript/
Optional, free. JSON {"words": [...], "target_language": "es"} → {"words": [...]} in the new language with the same timings. Pass them to generate/ as words for translated captions.
Background removal
Replace the background behind a person in a video with a colour, a picture or another video. No green screen needed. Tool name in your plan: bg_removal.
POSTbg_removal/upload/
Multipart, field file. Up to 200 MB and 5 minutes. Answers {"jobId", "videoInfo": {"width", "height", "fps", "frameCount", "duration"}}.
POSTbg_removal/upload-bg/
Only for a picture or video background. Multipart, fields job_id and file. The file must be sent with an image or video type, for example -F "file=@beach.mp4;type=video/mp4". Answers {"jobId", "bgType"}. A video background loops.
POSTbg_removal/start/ USES ONE API VIDEO PER JOB
JSON body. Answers {"status": "processing"}. It can take up to a minute to answer while our video machine starts. Starting the same job again after a failure is not counted twice.
| Field | Required / default | What it does |
|---|---|---|
job_id | required | From upload. |
bg_type | color | color, image or video (upload it first with upload-bg/). |
bg_color | #00FF00 | Hex such as #1E293B, or green, blue, red, white, black. |
fit | cover | How a picture or video background fills the frame: cover, contain or stretch. |
GETbg_removal/progress/{jobId}/
{"jobId", "status", "progress"}, where status is processing (progress 0–99), done or error (with error; not counted).
GETbg_removal/download/{jobId}/
The MP4 itself. Call it at https://www.vidboard.ai/tool/api/v1/bg_removal/download/{jobId}/ (the downloadUrl in progress is the app's own address). Files are temporary, so download promptly.
Repurpose and reframe
Turn a long video into captioned shorts of its best moments, or reframe the whole video to vertical or square, following the speaker. Tool name in your plan: repurpose. Each uploaded video uses one API video, however many shorts you make from it.
POSTrepurpose/upload/
Multipart, field video. MP4, MOV, WebM or MKV, up to 1 GB and 2 hours. Optional second file bottom: a video to stack under the speaker when reframing. Answers {"jobId", "videoInfo"}.
POSTrepurpose/analyze/{jobId}/ USES ONE API VIDEO PER JOB
Finds the best moments. JSON body, all optional. Answers {"jobId", "status": "transcribing"}.
| Field | Required / default | What it does |
|---|---|---|
clip_count | 5 | Up to how many shorts, 1 to 10. |
clip_duration | 30 | About how long each short is, in seconds (15 to 600). |
language | detected | A two-letter code such as en. |
genre | What the video is, for example podcast (40 characters). | |
instruction | What to look for, for example "moments about pricing" (400 characters). | |
source_start / source_end | whole video | Only look at this part, in seconds. |
GETrepurpose/progress/{jobId}/
Finished when status is ready; failed when it is error (with error; not counted). Always check status, not only whether the lists below are filled.
- After analyze:
clips=[{"id": "clip-1", "title", "start", "end", "reason", "overallScore", "thumbnail", …}]andfaces= the people on screen (face-1…).clipscan be empty when the video has no speech. - After render:
outputs={"clip-1": "https://…/clip-1.mp4", …}. - After reframe:
reframedUrl.
POSTrepurpose/render/{jobId}/
Makes the MP4s for the clips you choose. Free once the job is paid. JSON body. Answers {"jobId", "status": "generating", "clipIds"}.
| Field | Required / default | What it does |
|---|---|---|
clip_ids | required | For example ["clip-1", "clip-3"], up to 10. |
aspect | 9:16 | 9:16, 1:1 or 16:9. |
anchor_id | auto | Who to keep in frame: auto, a face id such as face-1, or both. |
captions | true | Burn in captions. |
style_id | hormozi_1 | A caption style id from GET captions/styles/. |
vertical / horizontal | bottom / center | Where the captions sit. |
words_per_chunk | 3 | 1 to 8. |
font_scale | 1.0 | 0.6 to 1.8. |
headline | false | Show the clip's title at the top. |
zoom | false | Gentle automatic zooms. |
word_overrides | {"clip-1": [{"word", "start", "end"}]} to fix caption spelling. |
POSTrepurpose/reframe/{jobId}/ USES ONE API VIDEO PER JOB
The whole video, reframed. JSON {"aspect": "9:16"} (9:16, 1:1 or 16:9), plus optional source_start/source_end. Answers {"jobId", "status": "generating"}; the result is reframedUrl in progress.
GETrepurpose/jobs/ · DELETErepurpose/jobs/{id}/
Your past jobs with their clips (?limit= 1–100), and deleting one with all its files. The id here is the job's id from this list, not its jobId.
Finished shorts are public links: anyone with the link can download them. They stay until you delete the job.
Coming soon
Excel to video
A data story with real charts, from your spreadsheet.
MCP
Make vidBoard videos from AI assistants such as Claude and ChatGPT.
Questions or a use case we should support? Write to admin@vidboard.ai.