POST /api/v1/demos/local-upload
Uploads a locally-recorded MP4 or WebM file and publishes it as a ready demo using the same share, embed, and media URLs as generated demos.

Authentication

Bearer Token API Key (cookie: better-auth.session_token)

Query Parameters

project_id string required query
prompt string required query
title string optional query
duration_ms integer | null optional query
format string optional query

Request Body

video/mp4

Responses

201 Local demo uploaded
application/json
id string REQUIRED
status string REQUIRED
Enum: ready
jobId string REQUIRED
shareUrl string REQUIRED
embedUrl string REQUIRED
videoUrl string REQUIRED
400 Validation error
401 Unauthorized
403 Publishable keys cannot upload, or plan does not allow this format
404 Project not found
411 Content-Length required
413 Upload too large
415 Unsupported media type or body is not a valid video file
429 Rate limit or quota exceeded
curl -X POST 'https://littledemo.com/api/v1/demos/local-upload?project_id=string&prompt=string' \  -H 'Authorization: Bearer YOUR_API_TOKEN' \  -H 'Content-Type: application/json' \  -d '"string"'
const response = await fetch('https://littledemo.com/api/v1/demos/local-upload?project_id=string&prompt=string', {  method: 'POST',  headers: {      "Authorization": "Bearer YOUR_API_TOKEN",      "Content-Type": "application/json"  },  body: JSON.stringify("string")});const data = await response.json();console.log(data);
import requestsheaders = {    'Authorization': 'Bearer YOUR_API_TOKEN'}response = requests.post('https://littledemo.com/api/v1/demos/local-upload?project_id=string&prompt=string', headers=headers, json="string")print(response.json())
201 Response
{  "id": "<string>",  "status": "ready",  "jobId": "<string>",  "shareUrl": "<string>",  "embedUrl": "<string>",  "videoUrl": "<string>"}
Ask a question... ⌘I