{"openapi":"3.1.0","info":{"title":"StoryShort API","version":"1.0.0","summary":"Create AI faceless short videos from a topic and poll them to completion.","description":"Authenticate every request with an API key: `Authorization: Bearer sk_live_...` (create one in the dashboard). Rendering is asynchronous: POST /api/v1/videos/generate returns a video id with status PENDING; poll GET /api/v1/videos/{id} every 20-30 seconds until status is COMPLETED or FAILED. Each render costs credits; a short balance is refused up front with 402 INSUFFICIENT_CREDITS. Nothing here buys credits. No video events are delivered to URLs (there are no webhooks): poll. The same capabilities are available over MCP at https://storyshort.app/api/mcp (OAuth 2.1 or API key). Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Error bodies look like {\"error\": \"...\", \"code\": \"...\"}. Not covered by this document: API key management (needs a signed-in dashboard session) and the webhook endpoints (no events are delivered).","termsOfService":"https://storyshort.app/en/terms","contact":{"name":"StoryShort support","url":"https://storyshort.app/en/support"}},"servers":[{"url":"https://storyshort.app"}],"externalDocs":{"description":"Developer portal","url":"https://storyshort.app/en/developers"},"security":[{"bearerAuth":[]}],"tags":[{"name":"Videos","description":"Create and read videos."},{"name":"Account","description":"Credits, usage and plan."},{"name":"Catalog","description":"Valid option values."}],"paths":{"/api/v1/videos/generate":{"post":{"operationId":"createVideo","tags":["Videos"],"summary":"Create (enqueue) a video from a topic","description":"Returns immediately with status PENDING; the render runs asynchronously. Costs credits (see estimatedCredits in the response; the price is checked against the balance before anything is created). The topic is moderation-checked: a refused prompt gets 422 PROMPT_BLOCKED and nothing is charged. Requires the \"video:create\" API key scope.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoRequest"}}}},"responses":{"201":{"description":"Video queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoResponse"}}}},"400":{"description":"Invalid field: INVALID_TOPIC, TOPIC_TOO_LONG, INVALID_NICHE, INVALID_DURATION, INVALID_QUALITY, INVALID_ART_STYLE, INVALID_MOTION_SCENES or INVALID_JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"INSUFFICIENT_CREDITS. details: creditsAvailable, creditsNeeded, costBreakdown, topUpUrl.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"VIDEO_LIMIT_REACHED (no videos left on the plan and no credits), QUALITY_NOT_IN_PLAN, a motion refusal (MOTION_PLAN_REQUIRED, MOTION_TRIAL_LIMIT or MOTION_CLIPS_DISABLED, with details), INSUFFICIENT_SCOPE (details.manageKeysUrl), or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"USER_NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"PROMPT_BLOCKED: the topic (or a motion request) was refused by content moderation; nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"423":{"description":"CONTENT_HOLD: the account is on a content-safety hold (motion requests).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"CONTENT_CHECK_UNAVAILABLE: the moderation check could not run, so the request fails closed. Nothing was charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/videos":{"get":{"operationId":"listVideos","tags":["Videos"],"summary":"List your videos, newest first","description":"Paginated; optionally filtered by status. Never charges credits. Requires the \"video:read\" API key scope.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"description":"Max videos to return."},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0},"description":"Videos to skip."},{"name":"status","in":"query","schema":{"type":"string","enum":["PENDING","GENERATING_SCRIPT","GENERATING_VOICE","FETCHING_MEDIA","RENDERING","COMPLETED","FAILED"]},"description":"Optional status filter (case-insensitive)."}],"responses":{"200":{"description":"A page of videos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListVideosResponse"}}}},"400":{"description":"INVALID_STATUS.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/videos/{id}":{"get":{"operationId":"getVideo","tags":["Videos"],"summary":"Get the status and details of one video","description":"While rendering, estimatedCompletionTime (seconds) may be present. COMPLETED adds videoUrl, thumbnailUrl, duration and script. FAILED adds error; a failure for lack of credits also adds blockedReason INSUFFICIENT_CREDITS, creditsNeeded, creditsAvailable and topUpUrl (it is not retried: top up and create the video again). Never charges credits. Requires the \"video:read\" API key scope.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Video id returned by POST /api/v1/videos/generate or GET /api/v1/videos.","schema":{"type":"string"}}],"responses":{"200":{"description":"The video.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDetail"}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"VIDEO_NOT_FOUND (also returned for a video owned by someone else).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteVideo","tags":["Videos"],"summary":"Permanently delete one of your videos","description":"Irreversible. Does not refund credits. Requires the \"video:delete\" API key scope. The default key scopes do not include it.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Video id returned by POST /api/v1/videos/generate or GET /api/v1/videos.","schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","required":["message","id"],"properties":{"message":{"type":"string"},"id":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"VIDEO_NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/scripts/niches":{"get":{"operationId":"listOptions","tags":["Catalog"],"summary":"List niches, art styles, qualities and durations the generate endpoint accepts","description":"Use it to pick valid niche / artStyle values. Never charges credits. Requires the \"video:read\" API key scope.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Option lists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptionsResponse"}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/credits/balance":{"get":{"operationId":"getCreditBalance","tags":["Account"],"summary":"Current credit balance and plan","description":"Check it before creating a video. Never charges credits. Requires the \"credits:read\" API key scope.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Balance.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditBalance"}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"USER_NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/usage/stats":{"get":{"operationId":"getUsageStats","tags":["Account"],"summary":"Credit balance, API call counts and the last 20 credit transactions","description":"Read-only. Requires the \"usage:read\" API key scope.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Usage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageStats"}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/billing/subscription":{"get":{"operationId":"getSubscription","tags":["Account"],"summary":"Plan, subscription status and credit allocation","description":"Read-only. Requires the \"billing:read\" API key scope.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"USER_NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/motion-clips/quote":{"post":{"operationId":"quoteMotionVideo","tags":["Videos"],"summary":"Exact credit price of a video with AI motion clips, before making it","description":"Read-only: nothing is created, reserved or charged and no prompt is accepted or checked. Returns the total credits, whether this account may make it (code + reason when not) and whether the balance covers it. Pass the same motionScenes to POST /api/v1/videos/generate. Requires the \"video:read\" API key scope.","security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MotionQuoteRequest"}}}},"responses":{"200":{"description":"The quote.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MotionQuote"}}}},"400":{"description":"INVALID_JSON, INVALID_MOTION_SCENES or INVALID_LANGUAGE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"USER_NOT_FOUND.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/motion-clips":{"post":{"operationId":"createMotionClip","tags":["Videos"],"summary":"Make ONE silent AI video clip from your own prompt, sent as written","description":"Spends credits (held when the clip is accepted, returned in full if no clip comes back). The prompt goes to Seedance exactly as written plus a short documented server suffix (echoed back as promptSent): no script, no still images, no voice. Poll GET /api/v1/videos/{id} until COMPLETED (videoUrl) or FAILED (errorCode, creditsRefunded). Price it first with POST /api/v1/motion-clips/clip-quote. Pass idempotencyKey (or an Idempotency-Key header) so a retry never charges twice. Returns 404 NOT_AVAILABLE while the server has the feature switched off. Refusals (PLAN_UPGRADE_REQUIRED, MOTION_TRIAL_LIMIT, MOTION_CLIPS_IN_FLIGHT, DAILY_CAP_REACHED, CONTENT_POLICY, CONTENT_HOLD, INSUFFICIENT_CREDITS) never charge anything. Requires the \"video:create\" API key scope.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MotionClipRequest"}}}},"responses":{"201":{"description":"Accepted: videoId, creditsCharged, quote, seed, promptSent, pollAfterSeconds.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"INVALID_INPUT (field, expected, got) or CONTENT_POLICY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"INSUFFICIENT_CREDITS (creditsNeeded, creditsAvailable, topUpUrl).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"NOT_AVAILABLE: the feature is switched off on this server.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"423":{"description":"CONTENT_HOLD: the account is on a safety hold.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/motion-clips/clip-quote":{"post":{"operationId":"quoteMotionClip","tags":["Videos"],"summary":"Exact credit price of ONE motion clip, and whether this account may start it now","description":"Read-only: nothing is created, reserved or charged and no prompt is checked. Returns credits, the balance, canAfford, canStart and, when it cannot start, blockedBy (code + message) and a nextAction. Requires the \"video:read\" API key scope.","security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"duration":{"type":"integer","minimum":4,"maximum":12,"default":5},"aspect_ratio":{"type":"string","enum":["9:16","1:1","16:9"],"default":"9:16"}}}}}},"responses":{"200":{"description":"The quote.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"INVALID_JSON or INVALID_INPUT.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key (code UNAUTHORIZED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"NOT_AVAILABLE: the feature is switched off on this server.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API key (sk_live_...)","description":"StoryShort API key. Create one in the dashboard; pick the scopes the endpoints below ask for."}},"schemas":{"Error":{"type":"object","required":["error","code"],"properties":{"error":{"type":"string","description":"Human-readable message."},"code":{"type":"string","description":"Stable machine-readable code, e.g. INSUFFICIENT_CREDITS."},"details":{"type":"object","additionalProperties":true}}},"CreateVideoRequest":{"type":"object","required":["topic"],"properties":{"topic":{"type":"string","maxLength":500,"description":"What the video is about. The script is AI-generated from it."},"niche":{"type":"string","enum":["MOTIVATIONAL","SCARY_STORIES","AI_FACTS","HISTORY_FACTS","REDDIT_STORIES","LIFE_HACKS","CRYPTO_FINANCE","PSYCHOLOGY_FACTS","PERSONAL_FINANCE","FUNNY_STORIES","LOVE_STORIES","AI_MUSIC_COVERS","BRAINROT","ANIME","UGC_ADS","DOCUMENTARY","ASMR","POV","MOVIE_MAKER","MUSIC_VIDEO"],"description":"Content niche (default MOTIVATIONAL; the enum is every value the server parses). GET /api/v1/scripts/niches lists the ones currently offered."},"duration":{"type":"integer","enum":[30,60,90],"default":30,"description":"Target length in seconds."},"artStyle":{"type":"string","enum":["AUTOSHORTS","LEGO","COMIC_BOOK","DISNEY_TOON","STUDIO_GHIBLI","PIXEL_ART","WATERCOLOR","OIL_PAINTING","CYBERPUNK","FANTASY","ANIME","STICKMAN"],"default":"AUTOSHORTS"},"language":{"type":"string","description":"BCP-47 code such as \"en\", \"vi\". Default \"en\"."},"quality":{"type":"string","enum":["HD_720","FULL_HD_1080"],"description":"Optional. Must equal what the plan renders at, otherwise 403 QUALITY_NOT_IN_PLAN. Omit to use the plan resolution."},"motionScenes":{"oneOf":[{"type":"integer","minimum":0,"maximum":3},{"type":"boolean"}],"description":"Optional paid add-on: animate the first N scenes (0-3; true = 1) as AI clips. Quote first with POST /api/v1/motion-clips/quote. Needs a paid plan or the trial."},"webhookUrl":{"type":"string","deprecated":true,"description":"Accepted for backward compatibility only; no event is ever sent (the response carries a warning)."},"metadata":{"type":"object","additionalProperties":true,"description":"Free-form data stored with the video."}}},"CreateVideoResponse":{"type":"object","required":["id","status","statusUrl","estimatedCredits"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["PENDING","GENERATING_SCRIPT","GENERATING_VOICE","FETCHING_MEDIA","RENDERING","COMPLETED","FAILED"]},"topic":{"type":"string"},"niche":{"type":["string","null"]},"duration":{"type":"integer"},"artStyle":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"estimatedCompletionTime":{"type":"integer","description":"Seconds."},"estimatedCredits":{"type":"integer","description":"Credits this render costs."},"motionScenes":{"type":"integer"},"motionCredits":{"type":"integer"},"statusUrl":{"type":"string","description":"Path to poll."},"warnings":{"type":"array","items":{"type":"string"}}}},"VideoSummary":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"slug":{"type":["string","null"]},"status":{"type":"string","enum":["PENDING","GENERATING_SCRIPT","GENERATING_VOICE","FETCHING_MEDIA","RENDERING","COMPLETED","FAILED"]},"videoUrl":{"type":["string","null"]},"thumbnailUrl":{"type":["string","null"]},"duration":{"type":["number","null"]},"targetDuration":{"type":["number","null"]},"language":{"type":["string","null"]},"artStyle":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"ListVideosResponse":{"type":"object","properties":{"videos":{"type":"array","items":{"$ref":"#/components/schemas/VideoSummary"}},"pagination":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"hasMore":{"type":"boolean"}}}}},"VideoDetail":{"type":"object","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["PENDING","GENERATING_SCRIPT","GENERATING_VOICE","FETCHING_MEDIA","RENDERING","COMPLETED","FAILED"]},"title":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"language":{"type":"string"},"artStyle":{"type":"string"},"targetDuration":{"type":["integer","null"]},"duration":{"type":"number"},"videoUrl":{"type":"string"},"thumbnailUrl":{"type":"string"},"script":{"type":"string"},"estimatedCompletionTime":{"type":"integer","description":"Seconds; only while PENDING / GENERATING_SCRIPT."},"error":{"type":"string","description":"Only when FAILED."},"blockedReason":{"type":"string","enum":["INSUFFICIENT_CREDITS"]},"blockedMessage":{"type":"string"},"creditsNeeded":{"type":"integer"},"creditsAvailable":{"type":"integer"},"topUpUrl":{"type":"string"}}},"OptionsResponse":{"type":"object","properties":{"niches":{"type":"array","items":{"$ref":"#/components/schemas/LabeledValue"}},"artStyles":{"type":"array","items":{"$ref":"#/components/schemas/LabeledValue"}},"videoQualities":{"type":"array","items":{"$ref":"#/components/schemas/LabeledValue"}},"durations":{"type":"array","items":{"type":"integer"}}}},"LabeledValue":{"type":"object","properties":{"value":{"type":"string"},"label":{"type":"string"}}},"CreditBalance":{"type":"object","properties":{"balance":{"type":"integer"},"monthlyAllocation":{"type":"integer"},"bonusCredits":{"type":"integer"},"plan":{"type":"string"}}},"UsageStats":{"type":"object","properties":{"credits":{"type":"object","properties":{"balance":{"type":"integer"},"monthlyAllocation":{"type":"integer"}}},"apiCalls":{"type":"object","properties":{"today":{"type":"integer"},"total":{"type":"integer"}}},"recentTransactions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"amount":{"type":"integer"},"balance":{"type":"integer"},"feature":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}}}}},"Subscription":{"type":"object","properties":{"plan":{"type":"string"},"hasActiveSubscription":{"type":"boolean"},"videosUsed":{"type":"integer"},"videosLimit":{"type":"integer"},"credits":{"type":"object","properties":{"balance":{"type":"integer"},"monthlyAllocation":{"type":"integer"},"lastResetAt":{"type":["string","null"],"format":"date-time"}}}}},"MotionClipRequest":{"type":"object","required":["prompt"],"additionalProperties":false,"properties":{"prompt":{"type":"string","minLength":8,"maxLength":2000,"description":"The text-to-video prompt, sent as written (never shortened or rewritten)."},"duration":{"type":"integer","minimum":4,"maximum":12,"default":5,"description":"Whole seconds. 480p, silent. Accounts that have never paid: one clip of at most 5 s."},"aspect_ratio":{"type":"string","enum":["9:16","1:1","16:9"],"default":"9:16"},"seed":{"type":"integer","minimum":0,"maximum":4294967295,"description":"Optional; the answer always returns the seed used."},"idempotencyKey":{"type":"string","minLength":8,"maxLength":200,"description":"A repeat with the same key returns the first answer (replayed: true) and charges nothing."}}},"MotionQuoteRequest":{"type":"object","properties":{"motionScenes":{"oneOf":[{"type":"integer","minimum":0,"maximum":3},{"type":"boolean"}],"description":"Default 1 when omitted."},"language":{"type":"string","description":"Affects the base price for languages only ElevenLabs speaks."}}},"MotionQuote":{"type":"object","properties":{"motionScenes":{"type":"integer"},"secondsPerScene":{"type":"integer"},"enabled":{"type":"boolean"},"allowed":{"type":"boolean"},"code":{"type":["string","null"],"description":"MOTION_PLAN_REQUIRED, MOTION_TRIAL_LIMIT or MOTION_CLIPS_DISABLED when not allowed."},"reason":{"type":["string","null"]},"maxMotionScenes":{"type":"integer"},"creditsPerMotionScene":{"type":"integer"},"motionCredits":{"type":"integer"},"baseCredits":{"type":"integer"},"totalCredits":{"type":"integer"},"balance":{"type":"integer"},"affordable":{"type":"boolean"},"plan":{"type":"string"},"trial":{"type":"object","properties":{"limited":{"type":"boolean"},"used":{"type":"integer"},"limit":{"type":"integer"}}},"fallback":{"type":"string"}}}}}}