REST API · v1

Run every VidiPrompt workflow from your terminal.

Create Short and Long-form videos, upload and dub or caption a Video Remix, follow every worker lifecycle, and download private MP4s with one Bearer API.

API is currently enabled.

Start here

Four things to know before you send a request.

  1. 1

    API access is included with Creator ($9.99/month) and Pro ($14.99/month). Free and Basic plans do not include API access.

  2. 2

    Your account has one active key. It is displayed once, expires after 365 days, and regeneration immediately revokes the previous key.

  3. 3

    Store the key only in the server-side VIDIPROMPT_API_KEY environment variable. Never expose it in browser code, a URL, cookie, log, screenshot, or AI prompt.

  4. 4

    Dashboard and API work share three independent server-enforced meters: Short videos, Long-form videos, and Remix minutes. Check GET /usage before creating work.

Base URL
https://vidiprompt.com/api/v1
Server environment
export VIDIPROMPT_API_KEY='paste-the-one-time-key-here'
Authentication
Authorization: Bearer $VIDIPROMPT_API_KEY
Generate or regenerate your key

Quickstart

Start with Short, then choose any workflow.

Choose your language and run the complete server-side example. cURL uses only Bash, Python's standard library, and cURL; no VidiPrompt CLI is required.

  1. 1. Save your API key

    Store the one-time key only in the VIDIPROMPT_API_KEY server environment variable.

  2. 2. Check capabilities and usage

    Read all three independent meters and current workflow controls before creating work.

  3. 3. Choose a workflow

    Create a Short job, a Long-form job, or a private resumable Remix upload.

  4. 4. Save the resource URL

    Keep the returned ID and links.self; every worker lifecycle is asynchronous.

  5. 5. Poll and retry safely

    Honor Retry-After, upload offsets, project revisions, and idempotency replay headers.

  6. 6. Download the MP4

    Use the same Bearer key with the shared private download endpoint after completion.

#!/usr/bin/env bash
set -euo pipefail

: "${VIDIPROMPT_API_KEY:?Set VIDIPROMPT_API_KEY before running this script}"
BASE_URL="https://vidiprompt.com/api/v1"
IDEMPOTENCY_KEY="$(python3 -c 'import uuid; print(uuid.uuid4())')"

curl --fail-with-body --silent --show-error \
  --request POST "$BASE_URL/videos" \
  --header "Authorization: Bearer $VIDIPROMPT_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --data @- \
  --dump-header response.headers \
  --output video.json <<'JSON'
{
  "topic": "The emperor who erased his own brother from history",
  "video_mode": "darkHistory",
  "style_pack": "documentary",
  "voice": "warm-storyteller",
  "language": "en",
  "captions": {
    "style": "tiktok",
    "position": "center"
  }
}
JSON

VIDEO_ID="$(python3 -c 'import json; print(json.load(open("video.json"))["id"])')"
VIDEO_URL="$(python3 -c 'import json; print(json.load(open("video.json"))["links"]["self"])')"
printf 'Created video %s\n' "$VIDEO_ID"

while true; do
  curl --fail-with-body --silent --show-error \
    --header "Authorization: Bearer $VIDIPROMPT_API_KEY" \
    --dump-header response.headers \
    --output video.json \
    "$VIDEO_URL"

  STATUS="$(python3 -c 'import json; print(json.load(open("video.json"))["status"])')"
  printf 'Status: %s\n' "$STATUS"

  case "$STATUS" in
    completed) break ;;
    queued|processing)
      RETRY_AFTER="$(python3 -c 'import re; data=open("response.headers").read(); match=re.search(r"(?im)^Retry-After:\s*(\d+)", data); print(match.group(1) if match else 5)')"
      sleep "$RETRY_AFTER"
      ;;
    *)
      printf 'Video ended with status %s. See video.json for details.\n' "$STATUS" >&2
      exit 1
      ;;
  esac
done

DOWNLOAD_URL="$(python3 -c 'import json; print(json.load(open("video.json"))["links"]["download"])')"
curl --fail-with-body --location --continue-at - \
  --header "Authorization: Bearer $VIDIPROMPT_API_KEY" \
  --output "$VIDEO_ID.mp4" \
  "$DOWNLOAD_URL"

printf 'Saved %s.mp4\n' "$VIDEO_ID"

Short

videos
POST /api/v1/videos

Topic-to-vertical video with narration and synced captions. Use an Idempotency-Key.

Long-form

videos
POST /api/v1/long-form/videos

Authorized 3,000–60,000 character script to an 11–15 minute horizontal video.

Video Remix

minutes
POST /api/v1/remix/uploads

Resumable private upload, captions-only or optional TTS, original-audio controls, then export.

The canonical Markdown contains complete terminal-ready Short, Long-form, and resumable Remix scripts. The OpenAPI contract contains every request schema, mutation, status, and error.

1. Save the accepted job

202 Accepted · Retry-After: 5
{
  "id": "123e4567-e89b-42d3-a456-426614174000",
  "object": "video",
  "workflow": "short",
  "status": "queued",
  "created_at": "2026-08-13T18:00:00.000Z",
  "queue": {
    "position": 2
  },
  "settings": {
    "video_mode": "darkHistory",
    "style_pack": "documentary",
    "voice": "warm-storyteller",
    "language": "en",
    "captions": {
      "style": "tiktok",
      "position": "center"
    }
  },
  "usage": {
    "used": 3,
    "reserved": 1,
    "remaining": 11,
    "limit": 15
  },
  "links": {
    "self": "https://vidiprompt.com/api/v1/videos/123e4567-e89b-42d3-a456-426614174000",
    "download": null
  }
}

Keep id and links.self. The usage object reflects the shared allowance after this job is reserved.

2. Download after completion

status: completed
{
  "id": "123e4567-e89b-42d3-a456-426614174000",
  "object": "video",
  "workflow": "short",
  "status": "completed",
  "source": "api",
  "created_at": "2026-08-13T18:00:00.000Z",
  "updated_at": "2026-08-13T18:04:00.000Z",
  "expires_at": "2026-08-20T18:00:00.000Z",
  "settings": {
    "video_mode": "darkHistory",
    "style_pack": "documentary",
    "voice": "warm-storyteller",
    "language": "en",
    "captions": {
      "style": "tiktok",
      "position": "center"
    }
  },
  "progress": {
    "percent": 100,
    "stage": "completed",
    "detail": "Complete!"
  },
  "output": {
    "duration_seconds": 42.5
  },
  "links": {
    "self": "https://vidiprompt.com/api/v1/videos/123e4567-e89b-42d3-a456-426614174000",
    "download": "https://vidiprompt.com/api/v1/videos/123e4567-e89b-42d3-a456-426614174000/download"
  }
}

Fetch links.download with the same Bearer header before expires_at. Completed outputs are retained for 7 days.

Job lifecycle

Create or upload once, then follow the resource.

All three workflows are asynchronous. Creation or upload completion returns an owner-scoped resource to poll and the same protected final-download contract.

  1. Create or upload

    Choose workflow
  2. Waiting

    queued
  3. Worker lifecycle

    processing
  4. Ready

    completed
  5. MP4

    Authenticated download
Other terminal states: failed, cancelled, and expired do not produce a downloadable file. Stop polling and handle the final status. Long-form and Remix also expose safe cancellation operations.

API reference

All three workflows, one predictable API.

All paths below are relative to https://vidiprompt.com/api/v1. Send the API key as a Bearer token on every request.

POST/videos

Create Short

Idempotently reserve one Short video and queue generation.

Input
JSON topic/settings plus Idempotency-Key.
Success
202 Accepted · Short resource, usage reservation, Location, and Retry-After.
POST/long-form/videos

Create Long-form

Idempotently reserve the independent Long-form meter and queue an 11–15 minute video.

Input
3,000–60,000 character source script, rights attestation, output settings, and Idempotency-Key.
Success
202 Accepted · Long-form resource, phase, allowance, Location, and Retry-After.
GET/long-form/videos/{video_id}

Poll Long-form

Read phase, progress, safe settings, output, and links.

Input
Bearer auth and owner-scoped video UUID.
Success
200 OK · Retry-After until terminal.
POST/long-form/videos/{video_id}/cancel

Cancel Long-form

Cancel queued work or request cancellation from the active Long-form worker.

Input
No body.
Success
200 OK · Idempotent cancellation state; unfinished quota is released.
POST/remix/uploads

Start Remix upload

Create a private resumable upload after paid-plan and remaining-minute checks.

Input
Filename, MIME type, and exact byte length.
Success
201 Created · Upload/video IDs, 8 MiB chunk size, durable offset, and 24-hour expiry.
HEAD|PUT|DELETE/remix/uploads/{upload_id}

Resume or abort upload

Read the server offset, append one exact chunk, or abandon and clean staging data.

Input
PUT uses application/octet-stream, Content-Length, and Upload-Offset.
Success
200 / 204 · Durable Upload-Offset/Length/Expires headers; mismatches return 409.
POST/remix/uploads/{upload_id}/complete

Complete Remix upload

Publish the source privately, probe trusted duration/media, meter ceil minutes, and queue analysis.

Input
Optional complete initial settings object.
Success
202 Accepted · Analysis state; concurrent exact completion is replay-safe.
GET|PATCH/remix/projects/{video_id}

Read or configure Remix

Control framing, aspect, captions, original audio, optional TTS replace/mix, volumes, and ducking.

Input
PATCH sends the complete settings snapshot and current revision.
Success
200 OK · Incremented revision and private API media links.
PUT/remix/projects/{video_id}/captions

Replace captions

Atomically install non-overlapping custom caption cues.

Input
Current revision and bounded millisecond cues.
Success
200 OK · Updated project with incremented revision.
POST/remix/projects/{video_id}/audio-preview

Prepare optional TTS

Generate or reuse TTS and final audio mixing before export.

Input
Current project revision.
Success
200 OK · Private mix URL. First successful TTS is included; changed uncached TTS consumes source minutes again.
POST/remix/projects/{video_id}/voiceover-draft

Draft voiceover

Create a voiceover script from the private source transcript.

Input
Current project revision.
Success
200 OK · Updated project; no provider output or secrets are exposed.
POST/remix/projects/{video_id}/translate-captions

Translate captions

Translate analyzed captions while preserving timings.

Input
Current revision and targetLanguage.
Success
200 OK · Custom translated cues and incremented revision.
POST/remix/projects/{video_id}/export

Export Remix

Freeze the exact project revision and queue the existing Remix worker.

Input
Current project revision.
Success
202 Accepted · Queued resource and Remix-minute state; concurrent replay does not double-charge.
POST/remix/projects/{video_id}/cancel

Cancel Remix

Cancel upload, analysis, draft, or queued/in-progress export safely.

Input
No body.
Success
200 OK · Idempotent cancelled state; consumed source minutes are not refunded.
GET|HEAD/remix/projects/{video_id}/media/{asset}

Read private Remix media

Stream owner-scoped source, thumbnail, voiceover, or mix media with bounded byte ranges.

Input
Asset name and optional Range.
Success
200 / 206 · Private no-store media; foreign and malformed resources are indistinguishable.
GET/videos

List all workflows

List Short, Long-form, and Remix resources with signed cursor pagination.

Input
Optional limit, cursor, and exact public status.
Success
200 OK · Stable workflow-aware resources and next_cursor.
GET/videos/{video_id}

Retrieve a video

Read the current public status for any owned workflow.

Input
Owner-scoped video UUID.
Success
200 OK · Safe workflow settings and links; no storage paths or provider errors.
GET|HEAD/videos/{video_id}/download

Download final MP4

Download a completed output from any workflow using trusted private storage resolution.

Input
Optional Range and If-None-Match.
Success
200 / 206 · Private no-store MP4, ETag, HEAD, resume, and 416 support.
GET/usage

Retrieve three meters

Read independent Short videos, Long-form videos, and Remix minutes.

Input
Bearer auth.
Success
200 OK · Units, used/reserved/remaining/limit, exact window, and legacy Short fields.
GET/capabilities

Retrieve capabilities

Discover all current catalogs, workflow controls, sizes, durations, and plan limits.

Input
Bearer auth.
Success
200 OK · Account-aware source of truth; do not hardcode values.

Create body

Unknown fields are rejected. The complete JSON body must be no larger than 32 KiB.

topicstring
Required.Short subject, 1–3,000 Unicode characters after trimming.
video_modestring
Short narrative format from GET /capabilities.
style_packstring
Short visual style from GET /capabilities.
voicestring
Narration voice from GET /capabilities.
languagestring
Narration/output language.
captionsobject
Caption style and position.

Use live capabilities

Fetch GET /capabilities instead of hardcoding modes, styles, voices, languages, caption options, or defaults. Use the OpenAPI contract for exhaustive schemas.

{
  "topic": "The emperor who erased his own brother from history",
  "video_mode": "darkHistory",
  "style_pack": "documentary",
  "voice": "warm-storyteller",
  "language": "en",
  "captions": {
    "style": "tiktok",
    "position": "center"
  }
}

Errors and retries

Every important error has a next action.

Errors use an RFC 9457 application/problem+json body. Branch on the stable code, keep request_id for support, and use bounded backoff only when retrying is appropriate.

Example problem response

{
  "type": "https://vidiprompt.com/problems/quota-exceeded",
  "title": "Video allowance exhausted",
  "status": 403,
  "code": "quota_exceeded",
  "detail": "Your current video allowance is exhausted.",
  "instance": "/api/v1/videos",
  "request_id": "00000000-0000-4000-8000-000000000001"
}

Honor Retry-After on polling, 429, and retryable 503 responses. Do not blindly retry validation, permission, quota, conflict, or not-found errors.

CodeHTTPWhat to do
invalid_api_key401Use the current Bearer key; cookies and alternate key headers are never accepted.
api_access_required403API access requires a current Creator or Pro entitlement.
quota_exceeded403The independent Short allowance is exhausted.
long_form_quota_exceeded409Wait for the billing reset or upgrade; do not change the Short or Remix meter.
remix_quota_exceeded403Not enough Remix minutes remain for the trusted source duration or changed TTS.
offset_mismatch409HEAD the upload, then resume exactly at Upload-Offset.
revision_conflict409GET the project and retry intentionally with its current full settings snapshot.
operation_in_progress409Wait and retry; provider-operation leasing prevents duplicate paid work.
idempotency_required400Send a 16–128 visible ASCII Idempotency-Key for Short and Long-form creates.
idempotency_conflict409The key was used with different normalized input; use a new key.
rate_limited429Wait for Retry-After and retry the same safe operation.
video_not_ready409Poll until completed before downloading.
video_not_found404Malformed, missing, expired, and cross-tenant IDs share this response.
service_unavailable503Retry with bounded backoff and reuse the same idempotency key/input.

Limits and security

The API uses your existing plan safely.

There is no separate API allowance. Short videos, Long-form videos, and Remix minutes are independent server-authoritative meters shared across dashboard and API.

Short

Free 1/7d · Basic 7 · Creator 15 · Pro 35

Videos; dashboard and API share one server-authoritative meter.

Long-form

0 · 2 · 5 · 8

Videos per billing period; one outstanding Long-form job at a time.

Remix

0 · 30 · 60 · 120

Minutes per billing period; trusted duration rounds up, 10 minute maximum.

API eligibility

Creator and Pro

The three plan meters are shared with the dashboard; API is not a separate allowance.

Upload

300 MB · 8 MiB chunks

MP4, MOV, or WebM; resumable for 24 hours.

Retention

7 days

Download private completed MP4 files before expires_at.

Idempotency

24 hours

Exact Short/Long creates replay; Remix completion/export/TTS are state-idempotent.

Active keys

1 per account

Regeneration immediately revokes the previous key.

Key lifetime

365 days

Generate a replacement before expiry.

Keep the key on your server

Send it only as Authorization: Bearer $VIDIPROMPT_API_KEY. Never expose it in browser code, URLs, query strings, cookies, screenshots, logs, or AI prompts. VidiPrompt stores only a one-way hash, and regenerating the account's one active key immediately revokes the previous key.

AI integration

Give an AI the exact contract.

The Copy for an LLM action copies the same canonical Markdown served publicly, without your key, email, usage, or account identifiers. The integration prompt gives an AI a safe ten-step workflow.

Paste the copied material into your AI assistant, then provide your application requirements separately. Never paste the API key itself.