{"openapi":"3.1.0","info":{"title":"VidBudget API","version":"2026-11-03","description":"Supplier-independent asynchronous video and media uploads. GET /v1/models for live capabilities."},"servers":[{"url":"https://vidbudget.com"}],"security":[{"bearerAuth":[]}],"paths":{"/v1/models":{"get":{"security":[],"summary":"Models, prices and live capabilities","responses":{"200":{"description":"Model catalogue","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/balance":{"get":{"summary":"Balance","responses":{"200":{"description":"Balance","content":{"application/json":{"schema":{"type":"object","properties":{"balance_usd":{"type":"number"},"credits":{"type":"number"},"billing_mode":{"type":"string","enum":["wallet","admin"]}}}}}}}}},"/v1/tasks":{"get":{"summary":"Latest 100 owned tasks","responses":{"200":{"description":"Tasks","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Task"}}}}}}}}}},"/v1/videos/generations":{"post":{"summary":"Submit an asynchronous video job","parameters":[{"in":"header","name":"Idempotency-Key","schema":{"type":"string","maxLength":128},"description":"Reuse with identical body after an uncertain response"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["model","prompt"],"properties":{"model":{"type":"string","enum":["seedance-2.5","seedance-2.5-30s","seedance-2.0","seedance-2.0-fast"]},"prompt":{"type":"string","minLength":1},"duration":{"type":"integer","minimum":4,"maximum":30},"resolution":{"type":"string","default":"720P"},"aspect_ratio":{"type":"string","default":"16:9"},"images":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":30},"video_references":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":10},"audio_references":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":10}}}}}},"responses":{"202":{"description":"Task; query until terminal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}},"401":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}},"402":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}},"409":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}},"503":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}}}}},"/v1/uploads":{"post":{"summary":"Upload one image, video or audio file","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"202":{"description":"Task; query until terminal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"413":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}},"415":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}},"429":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}}}}},"/v1/uploads/presign":{"post":{"summary":"Presign a PUT for a file larger than 90 MB","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["content_type","size"],"properties":{"content_type":{"type":"string"},"size":{"type":"integer","minimum":90000001,"maximum":1000000000}}}}}},"responses":{"200":{"description":"upload_id, upload_url, headers, expires_in","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}}}}},"/v1/tasks/{id}":{"get":{"summary":"Query owned task","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Task; query until terminal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"404":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}}}}},"/v1/videos/jobs/{id}":{"get":{"summary":"Query owned task","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Task; query until terminal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"404":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}}}}},"/v1/uploads/{id}/complete":{"post":{"summary":"Validate a direct upload","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Task; query until terminal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"404":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}},"410":{"description":"Error code","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"}}}}}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"Task":{"type":"object","required":["id","status","data"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["video","upload","topup"]},"status":{"type":"string","enum":["queued","processing","succeeded","failed"]},"error":{"type":["string","null"]},"data":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"}}}}}}}}}