For a fixed duration, estimated_cost.amount is the exact charge. For adaptive (duration: -1, the default), estimated_cost.adaptive is true and the price is a range: amount_min–amount_max, where amount equals amount_max (the credits held up front). You are charged for the delivered length and refunded the difference. Same validation as POST /v1/videos, but without side effects — no character synthesis, no reference materialization. A cast (subjects[]) is validated identically to POST /v1/videos — cast characters are existence/readiness-checked — and does not change the price.
reference_video_url/reference_audio_url (a file_<ulid> from POST /v1/files or an HTTPS URL) are validated for shape and parameter-combination compatibility, identically to POST /v1/videos. A file_<ulid> additionally gets the same read-only checks the create call performs — it must exist, belong to your team (404 otherwise), and have been uploaded with the matching purpose (400 reference_media_invalid otherwise). The media bytes are never fetched at estimate time — the estimate never touches the network — so byte-level validation (format, duration, resolution) and HTTPS-URL fetching only happen on the actual create call. A reference-to-video request is never charged for enhance_prompt, even when enhance_prompt: true — the system composes the prompt around the reference and never invokes the enhancer, so the flat enhance adder never applies.
Because the reference clip is never fetched, its real duration is unknown at estimate time, so a reference (video_task: reference) or extend request is priced at the 15-second input ceiling — an upper bound. The actual charge is typically lower: the create hold prices against the real clip length. As with the image estimate, this is a deliberate, conservative divergence on that path — a BYO-reference request is never charged more than this estimate.
Auto-matching is not run here, and the quote can miss in EITHER direction. This endpoint prices exactly the request body you sent. Every structural validation rule is identical to POST /v1/videos, but model MATCHING is a create-time decision: if you omit video_lora_id and a video model then matches at create (from your prompt, or — when a first_frame_url is attached — from the image), the generation dispatches as a video-input generation and is priced accordingly. Which way the charge moves depends on what YOU pinned, because a matched model supplies default_duration, default_resolution AND default_ratio for whatever you left out, and all three are priced:
You omitted duration/resolution (the usual shape for a bare first_frame_url request): with no model, this endpoint has to price adaptive duration (the 15-second ceiling) at 1080p, and the matched model then brings a shorter, smaller default. The quote is an upper bound that can substantially OVER-state — measured on the first-frame path: amount 827.26 against an actual settled charge of 279.91. On these (adaptive) requests, amount_min/amount_max is the honest range to plan against; amount is only the ceiling that gets held.
You sent duration and resolution explicitly: your values win over the model defaults, so a match can only ADD the motion-reference input leg to the price. On that shape the charge genuinely exceeds this quote.
Pin video_lora_id whenever you need the quote to be exact — that is the only value that removes matching from the create path entirely. video_lora_id: null opts out of IMAGE-based matching only, so on a request without a first_frame_url it does NOT make this quote exact; and on a request WITH one it also declines the model defaults, so an otherwise-bare request prices (and charges) the adaptive-15s/1080p fallback. This is inherent to auto-matching and is not specific to first frames.
Video and image rates are both DB-driven. Video is priced from the live per-model rate table — see GET /v1/models for the current per-model credit rates — NOT frozen in the Aurous-Version rate card. Image pricing works the same way: the pixel-tiered rate card behind POST /v1/images/estimate is also read live from the registry and MAY change without an Aurous-Version bump — the same pricing asymmetry the LLM chat/embeddings surfaces use (spec §6.4). Pin an Aurous-Version for stable request/response shapes; call the matching estimate endpoint for an authoritative current-price quote immediately before you generate.
Text prompt describing the video. Optional when the request carries another content source: a first_frame_url (image-to-video), a reference_video_url (reference-to-video), or a pinned video_lora_id (the video model supplies the motion and, when nothing else is sent, generates its own subject). Subject-driven generation (subjects[], character_id, or reference_image_urls) still requires a prompt describing the action unless a video model is pinned or a reference video is attached. A request with none of the four sources returns 400 missing_field.
Example:
"A golden sunset over the ocean with gentle waves"
Optional, and TRI-STATE. An id (or slug, where one is set) from GET /v1/video_loras pins a specific video model. A pinned model is also a complete request on its own: send just video_lora_id — no prompt — and the model generates its own subject and motion; add subjects[] (or the legacy character_id/reference_image_urls) to cast specific people, still with no prompt required. Only a pinned id substitutes for a prompt — null never does, and an empty string is treated as omitted. A pin cannot combine with reference_video_url (400 parameter_invalid_combination): both supply the motion. If OMITTED, the platform picks a suitable model for you: matching reads your prompt, or — when first_frame_url is attached — what the IMAGE shows. If none matches, your request is generated as plain video, plain image-to-video, or (with a subject attached) a subject-driven video; matching never fails the request. Send NULL to opt out of IMAGE-based matching — meaningful only when first_frame_url is attached, where it guarantees plain image-to-video. WITHOUT a first frame, null behaves exactly like omitting the field and your prompt is still auto-matched; pin an id if you need a specific model. A first frame plus a pinned or matched model reports inference_type: "r2v" and starts NEAR your image rather than exactly on it. PRICING: a pinned or matched model also supplies default_resolution and default_ratio alongside default_duration for whatever you left out (anything you send explicitly wins), and all three are priced — so null on an otherwise-bare first-frame request falls back to adaptive duration at 1080p and costs ~2.8x the same still with a model pinned. Send duration and resolution alongside null if you want the exact-frame guarantee at a predictable price.
Drive the video from a saved character (reference-to-video). Must be status: ready — otherwise 400 character_not_ready. Cross-team ids 404 (existence never leaked). Mutually exclusive with reference_image_urls (→ 400 mutually_exclusive_input) and with first_frame_url/last_frame_url (→ 400 parameter_invalid_combination). Omit both a subject and a frame for plain text-to-video. Superseded by subjects[] (which also supports multi-person casts); fully supported — successful responses carry an advisory Deprecation: true header when this field is used.
Up to 6 subject reference images — each a file_<ulid> (POST /v1/files) or an https:// URL (SSRF-pinned server-side fetch). Image files only: a file_<ulid> uploaded with purpose reference_video/reference_audio is rejected (400 invalid_format). The subject is anchored across the video. Mutually exclusive with character_id and with first_frame_url/last_frame_url. Superseded by subjects[] (which also supports multi-person casts); fully supported — successful responses carry an advisory Deprecation: true header when this field is used.
Ordered cast for a multi-person video. Up to 2 subjects per generation (current engine limit — may increase; exceeding it returns 400 parameter_invalid_combination). Each subject is a saved character or its own group of 1–4 reference images; character and reference subjects can be mixed. Supersedes the single-subject character_id/reference_image_urls fields — sending both shapes returns 400 mutually_exclusive_input. A cast may accompany reference_video_url (the clip supplies motion, the cast supplies identity) but not video_task: "extend" and not first_frame_url/last_frame_url. Duplicate characters or a reference image reused across subjects return 400. Empty array is treated as omitted.
First frame for image-to-video / first+last frame interpolation. Either an opaque file_<ulid> ID returned by POST /v1/files, or an https:// URL pointing at a public host (max 2048 chars). Image files only — a file_<ulid> uploaded with purpose reference_video/reference_audio is rejected (400 invalid_format). URLs are server-side fetched through an SSRF-pinned client (rejects private IPs / cloud metadata). MINIMUM SIZE — when a video model is pinned or left to auto-match, this frame is upscaled into a short seed clip, so it must be at least 64 px on its shortest side AND at least 6,400 px in total (80x80 is the smallest square accepted; at a 64 px short side the long side needs 100). A file_<ulid> below that returns 400 first_frame_too_small before any credit hold (dimensions were measured at upload); an https:// URL is accepted and settles at status: failed with error_code: "first_frame_too_small" and a full refund, because validation never fetches the bytes. The check runs on the POSSIBILITY of a model, not on one actually being used — an un-pinned frame is rejected even if no model would have matched your image. No minimum applies with video_lora_id: null, nor when a last_frame_url rides alongside — a first+last pair never auto-matches and builds no seed clip either, so no first_frame_too_small ever fires on an interpolation request.
Last frame for first+last frame interpolation. Same rules as first_frame_url. Requires first_frame_url — sending last_frame_url alone returns 400 with code parameter_invalid_combination.
Video length in seconds. Pass -1 for ADAPTIVE (default): the model selects the optimal whole-second length within its supported range (currently 4–15 s) and you are billed for the delivered length — a VARIABLE price. Call POST /v1/videos/estimate to see the min–max range before submitting. Pass a whole number 4–15 to pin a fixed length (fixed price). Omitting uses the video model's default length when your request pins or is matched to one; otherwise adaptive (-1). Adaptive holds the 15 s ceiling from your balance until it settles.
Whether the generated video includes synchronized audio. Defaults to the selected video model's audio setting (currently true for all models unless noted on the model).
Whether to enhance the prompt with AI. A no-op on requests without a prompt (model-driven and reference-driven bodies): nothing to enhance, nothing charged.
Your reference video — the motion source for a reference-mode generation, or the clip to continue when video_task is extend. Either an opaque file_<ulid> returned by POST /v1/files (uploaded with purpose: reference_video — format/duration/resolution were already validated at upload), or an HTTPS URL. Requirements: MP4 or MOV (H.264/H.265), 2–15 seconds, up to 50 MB, frame area of at least 409,600 px (≈640×640). Clips above 2,073,600 px (1920×1080, ≈1080p) are downscaled to fit before use, preserving aspect ratio, duration and audio. That downscale runs while this request is open, so a large clip adds seconds before the 201 — allow a client timeout of at least 120 s and send an Idempotency-Key — and uploading it once via POST /v1/files moves that cost off the create call. URLs must be publicly fetchable or pre-signed, serve HTTPS directly (redirects are refused — pass the final URL), and respond within the fetch budget. Cannot be combined with first_frame_url/last_frame_url. While the reference is prepared the generation stays in processing — see the endpoint description for timing.
An audio reference (voice, music, or ambience) to guide the generated soundtrack — either a file_<ulid> from POST /v1/files (purpose: reference_audio) or an HTTPS URL. WAV or MP3, 2–15 seconds, up to 15 MB. Needs a companion — a reference video, a subject (subjects[] or the legacy fields), or a pinned video_lora_id — and requires audio output (generate_audio must not be false). Same URL rules as reference_video_url (public or signed HTTPS, no redirects).
What to do with reference_video_url. reference (default): generate a new scene that borrows the clip's motion. extend: continue the clip itself in extend_direction; extend takes the clip as-is, so it cannot be combined with video_lora_id. Only valid when reference_video_url is present.
Non-fatal request adjustments the real create would also report (e.g. a retired style pin that generates without a style, or a parameter with no effect on this generation path). Same shape and codes as the warnings on the POST /v1/images 201 body — the estimate warns exactly when the create would. Omitted when empty. Codes are an OPEN set: ignore unknown codes.
Show child attributes
Example:
[ { "code": "parameter_ignored", "param": "seed", "message": "`seed` has no effect on this generation and was ignored." } ]
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Aurous Labs","colors":{"primary":"#7C3AED","light":"#A78BFA","dark":"#5B21B6"},"logo":{"light":"https://mintcdn.com/mayatech/yW79tCRlCpJDDgoM/logo-light.png?fit=max\u0026auto=format\u0026n=yW79tCRlCpJDDgoM\u0026q=85\u0026s=f3dfa1506dde2b022b4496c2c2f55104","dark":"https://mintcdn.com/mayatech/yW79tCRlCpJDDgoM/logo-dark.png?fit=max\u0026auto=format\u0026n=yW79tCRlCpJDDgoM\u0026q=85\u0026s=fb6dc85c1a2cb23d84e6d8efccdde751"},"favicon":"https://mintcdn.com/mayatech/yW79tCRlCpJDDgoM/favicon.png?fit=max\u0026auto=format\u0026n=yW79tCRlCpJDDgoM\u0026q=85\u0026s=374677cfa3da0cfdc4461950d5e6ec73","api":{"openapi":"api-reference/openapi.json"},"navbar":{"links":[{"href":"https://app.aurous-labs.com/dashboard","label":"Dashboard"}],"primary":{"type":"button","label":"Get an API key","href":"https://app.aurous-labs.com/auth/register"}},"footer":{"socials":{"twitter":"https://twitter.com/aurouslabs"}},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"mayatech","hasAudioNarration":false,"actualSubdomain":"mayatech","customDomains":["docs.aurous-labs.com"],"gitSource":{"type":"github","owner":"mayatech88","repo":"onlygold","deployBranch":"main","contentDirectory":"apps/docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adafc5af4b49ade1f1e2d25","collectionId":"0680f6e9-0a65-4ffe-bb73-02062bd8fd63","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adafc5af4b49ade1f1e2d25"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adafc5af4b49ade1f1e2d25","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"API Reference","count":82},{"language":"default","tag":"Characters","count":17},{"language":"default","tag":"Chat completions","count":13},{"language":"default","tag":"Embeddings","count":10},{"language":"default","tag":"Webhooks","count":8},{"language":"default","tag":"Images","count":7},{"language":"default","tag":"Seedance (raw)","count":7},{"language":"default","tag":"Guides","count":6},{"language":"default","tag":"Usage analytics","count":5},{"language":"default","tag":"Concepts","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation","slug":"/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation","pageMetadata":{"title":"Estimate the credit cost of a video generation","description":"For a fixed duration, `estimated_cost.amount` is the exact charge. For adaptive (`duration: -1`, the default), `estimated_cost.adaptive` is `true` and the price is a range: `amount_min`–`amount_max`, where `amount` equals `amount_max` (the credits held up front). You are charged for the delivered length and refunded the difference. Same validation as POST /v1/videos, but without side effects — no character synthesis, no reference materialization. A cast (`subjects[]`) is validated identically to POST /v1/videos — cast characters are existence/readiness-checked — and does not change the price.\n\n`reference_video_url`/`reference_audio_url` (a `file_\u003culid>` from POST /v1/files or an HTTPS URL) are validated for shape and parameter-combination compatibility, identically to `POST /v1/videos`. A `file_\u003culid>` additionally gets the same read-only checks the create call performs — it must exist, belong to your team (404 otherwise), and have been uploaded with the matching purpose (400 `reference_media_invalid` otherwise). The media **bytes** are never fetched at estimate time — the estimate never touches the network — so byte-level validation (format, duration, resolution) and HTTPS-URL fetching only happen on the actual create call. A reference-to-video request is never charged for `enhance_prompt`, even when `enhance_prompt: true` — the system composes the prompt around the reference and never invokes the enhancer, so the flat enhance adder never applies.\n\nBecause the reference clip is never fetched, its real duration is unknown at estimate time, so a reference (`video_task: reference`) or extend request is priced at the 15-second input ceiling — an **upper bound**. The actual charge is typically lower: the create hold prices against the real clip length. As with the image estimate, this is a deliberate, conservative divergence on that path — a BYO-reference request is never charged more than this estimate.\n\n**Auto-matching is not run here, and the quote can miss in EITHER direction.** This endpoint prices exactly the request body you sent. Every *structural* validation rule is identical to POST /v1/videos, but model MATCHING is a create-time decision: if you omit `video_lora_id` and a video model then matches at create (from your prompt, or — when a `first_frame_url` is attached — from the image), the generation dispatches as a **video-input** generation and is priced accordingly. Which way the charge moves depends on what YOU pinned, because a matched model supplies `default_duration`, `default_resolution` AND `default_ratio` for whatever you left out, and all three are priced:\n\n- **You omitted `duration`/`resolution`** (the usual shape for a bare `first_frame_url` request): with no model, this endpoint has to price adaptive duration (the 15-second ceiling) at 1080p, and the matched model then brings a *shorter, smaller* default. The quote is an **upper bound that can substantially OVER-state** — measured on the first-frame path: `amount` 827.26 against an actual settled charge of 279.91. On these (adaptive) requests, `amount_min`/`amount_max` is the honest range to plan against; `amount` is only the ceiling that gets held.\n- **You sent `duration` and `resolution` explicitly**: your values win over the model defaults, so a match can only ADD the motion-reference input leg to the price. On that shape the charge genuinely **exceeds** this quote.\n\n**Pin `video_lora_id` whenever you need the quote to be exact** — that is the only value that removes matching from the create path entirely. `video_lora_id: null` opts out of IMAGE-based matching only, so on a request without a `first_frame_url` it does NOT make this quote exact; and on a request WITH one it also declines the model defaults, so an otherwise-bare request prices (and charges) the adaptive-15s/1080p fallback. This is inherent to auto-matching and is not specific to first frames.\n\n**Video and image rates are both DB-driven.** Video is priced from the live per-model rate table — see `GET /v1/models` for the current per-model credit rates — NOT frozen in the `Aurous-Version` rate card. Image pricing works the same way: the pixel-tiered rate card behind `POST /v1/images/estimate` is also read live from the registry and MAY change without an `Aurous-Version` bump — the same pricing asymmetry the LLM chat/embeddings surfaces use (spec §6.4). Pin an `Aurous-Version` for stable request/response **shapes**; call the matching estimate endpoint for an authoritative current-price quote immediately before you generate.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/videos/estimate","href":"/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n em: \"em\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"For a fixed duration, \", _jsx(_components.code, {\n children: \"estimated_cost.amount\"\n }), \" is the exact charge. For adaptive (\", _jsx(_components.code, {\n children: \"duration: -1\"\n }), \", the default), \", _jsx(_components.code, {\n children: \"estimated_cost.adaptive\"\n }), \" is \", _jsx(_components.code, {\n children: \"true\"\n }), \" and the price is a range: \", _jsx(_components.code, {\n children: \"amount_min\"\n }), \"–\", _jsx(_components.code, {\n children: \"amount_max\"\n }), \", where \", _jsx(_components.code, {\n children: \"amount\"\n }), \" equals \", _jsx(_components.code, {\n children: \"amount_max\"\n }), \" (the credits held up front). You are charged for the delivered length and refunded the difference. Same validation as POST /v1/videos, but without side effects — no character synthesis, no reference materialization. A cast (\", _jsx(_components.code, {\n children: \"subjects[]\"\n }), \") is validated identically to POST /v1/videos — cast characters are existence/readiness-checked — and does not change the price.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"reference_video_url\"\n }), \"/\", _jsx(_components.code, {\n children: \"reference_audio_url\"\n }), \" (a \", _jsx(_components.code, {\n children: \"file_\u003culid>\"\n }), \" from POST /v1/files or an HTTPS URL) are validated for shape and parameter-combination compatibility, identically to \", _jsx(_components.code, {\n children: \"POST /v1/videos\"\n }), \". A \", _jsx(_components.code, {\n children: \"file_\u003culid>\"\n }), \" additionally gets the same read-only checks the create call performs — it must exist, belong to your team (404 otherwise), and have been uploaded with the matching purpose (400 \", _jsx(_components.code, {\n children: \"reference_media_invalid\"\n }), \" otherwise). The media \", _jsx(_components.strong, {\n children: \"bytes\"\n }), \" are never fetched at estimate time — the estimate never touches the network — so byte-level validation (format, duration, resolution) and HTTPS-URL fetching only happen on the actual create call. A reference-to-video request is never charged for \", _jsx(_components.code, {\n children: \"enhance_prompt\"\n }), \", even when \", _jsx(_components.code, {\n children: \"enhance_prompt: true\"\n }), \" — the system composes the prompt around the reference and never invokes the enhancer, so the flat enhance adder never applies.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Because the reference clip is never fetched, its real duration is unknown at estimate time, so a reference (\", _jsx(_components.code, {\n children: \"video_task: reference\"\n }), \") or extend request is priced at the 15-second input ceiling — an \", _jsx(_components.strong, {\n children: \"upper bound\"\n }), \". The actual charge is typically lower: the create hold prices against the real clip length. As with the image estimate, this is a deliberate, conservative divergence on that path — a BYO-reference request is never charged more than this estimate.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Auto-matching is not run here, and the quote can miss in EITHER direction.\"\n }), \" This endpoint prices exactly the request body you sent. Every \", _jsx(_components.em, {\n children: \"structural\"\n }), \" validation rule is identical to POST /v1/videos, but model MATCHING is a create-time decision: if you omit \", _jsx(_components.code, {\n children: \"video_lora_id\"\n }), \" and a video model then matches at create (from your prompt, or — when a \", _jsx(_components.code, {\n children: \"first_frame_url\"\n }), \" is attached — from the image), the generation dispatches as a \", _jsx(_components.strong, {\n children: \"video-input\"\n }), \" generation and is priced accordingly. Which way the charge moves depends on what YOU pinned, because a matched model supplies \", _jsx(_components.code, {\n children: \"default_duration\"\n }), \", \", _jsx(_components.code, {\n children: \"default_resolution\"\n }), \" AND \", _jsx(_components.code, {\n children: \"default_ratio\"\n }), \" for whatever you left out, and all three are priced:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsxs(_components.strong, {\n children: [\"You omitted \", _jsx(_components.code, {\n children: \"duration\"\n }), \"/\", _jsx(_components.code, {\n children: \"resolution\"\n })]\n }), \" (the usual shape for a bare \", _jsx(_components.code, {\n children: \"first_frame_url\"\n }), \" request): with no model, this endpoint has to price adaptive duration (the 15-second ceiling) at 1080p, and the matched model then brings a \", _jsx(_components.em, {\n children: \"shorter, smaller\"\n }), \" default. The quote is an \", _jsx(_components.strong, {\n children: \"upper bound that can substantially OVER-state\"\n }), \" — measured on the first-frame path: \", _jsx(_components.code, {\n children: \"amount\"\n }), \" 827.26 against an actual settled charge of 279.91. On these (adaptive) requests, \", _jsx(_components.code, {\n children: \"amount_min\"\n }), \"/\", _jsx(_components.code, {\n children: \"amount_max\"\n }), \" is the honest range to plan against; \", _jsx(_components.code, {\n children: \"amount\"\n }), \" is only the ceiling that gets held.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsxs(_components.strong, {\n children: [\"You sent \", _jsx(_components.code, {\n children: \"duration\"\n }), \" and \", _jsx(_components.code, {\n children: \"resolution\"\n }), \" explicitly\"]\n }), \": your values win over the model defaults, so a match can only ADD the motion-reference input leg to the price. On that shape the charge genuinely \", _jsx(_components.strong, {\n children: \"exceeds\"\n }), \" this quote.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsxs(_components.strong, {\n children: [\"Pin \", _jsx(_components.code, {\n children: \"video_lora_id\"\n }), \" whenever you need the quote to be exact\"]\n }), \" — that is the only value that removes matching from the create path entirely. \", _jsx(_components.code, {\n children: \"video_lora_id: null\"\n }), \" opts out of IMAGE-based matching only, so on a request without a \", _jsx(_components.code, {\n children: \"first_frame_url\"\n }), \" it does NOT make this quote exact; and on a request WITH one it also declines the model defaults, so an otherwise-bare request prices (and charges) the adaptive-15s/1080p fallback. This is inherent to auto-matching and is not specific to first frames.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Video and image rates are both DB-driven.\"\n }), \" Video is priced from the live per-model rate table — see \", _jsx(_components.code, {\n children: \"GET /v1/models\"\n }), \" for the current per-model credit rates — NOT frozen in the \", _jsx(_components.code, {\n children: \"Aurous-Version\"\n }), \" rate card. Image pricing works the same way: the pixel-tiered rate card behind \", _jsx(_components.code, {\n children: \"POST /v1/images/estimate\"\n }), \" is also read live from the registry and MAY change without an \", _jsx(_components.code, {\n children: \"Aurous-Version\"\n }), \" bump — the same pricing asymmetry the LLM chat/embeddings surfaces use (spec §6.4). Pin an \", _jsx(_components.code, {\n children: \"Aurous-Version\"\n }), \" for stable request/response \", _jsx(_components.strong, {\n children: \"shapes\"\n }), \"; call the matching estimate endpoint for an authoritative current-price quote immediately before you generate.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Estimate the credit cost of a video generation","description":"For a fixed duration, `estimated_cost.amount` is the exact charge. For adaptive (`duration: -1`, the default), `estimated_cost.adaptive` is `true` and the price is a range: `amount_min`–`amount_max`, where `amount` equals `amount_max` (the credits held up front). You are charged for the delivered length and refunded the difference. Same validation as POST /v1/videos, but without side effects — no character synthesis, no reference materialization. A cast (`subjects[]`) is validated identically to POST /v1/videos — cast characters are existence/readiness-checked — and does not change the price.\n\n`reference_video_url`/`reference_audio_url` (a `file_\u003culid>` from POST /v1/files or an HTTPS URL) are validated for shape and parameter-combination compatibility, identically to `POST /v1/videos`. A `file_\u003culid>` additionally gets the same read-only checks the create call performs — it must exist, belong to your team (404 otherwise), and have been uploaded with the matching purpose (400 `reference_media_invalid` otherwise). The media **bytes** are never fetched at estimate time — the estimate never touches the network — so byte-level validation (format, duration, resolution) and HTTPS-URL fetching only happen on the actual create call. A reference-to-video request is never charged for `enhance_prompt`, even when `enhance_prompt: true` — the system composes the prompt around the reference and never invokes the enhancer, so the flat enhance adder never applies.\n\nBecause the reference clip is never fetched, its real duration is unknown at estimate time, so a reference (`video_task: reference`) or extend request is priced at the 15-second input ceiling — an **upper bound**. The actual charge is typically lower: the create hold prices against the real clip length. As with the image estimate, this is a deliberate, conservative divergence on that path — a BYO-reference request is never charged more than this estimate.\n\n**Auto-matching is not run here, and the quote can miss in EITHER direction.** This endpoint prices exactly the request body you sent. Every *structural* validation rule is identical to POST /v1/videos, but model MATCHING is a create-time decision: if you omit `video_lora_id` and a video model then matches at create (from your prompt, or — when a `first_frame_url` is attached — from the image), the generation dispatches as a **video-input** generation and is priced accordingly. Which way the charge moves depends on what YOU pinned, because a matched model supplies `default_duration`, `default_resolution` AND `default_ratio` for whatever you left out, and all three are priced:\n\n- **You omitted `duration`/`resolution`** (the usual shape for a bare `first_frame_url` request): with no model, this endpoint has to price adaptive duration (the 15-second ceiling) at 1080p, and the matched model then brings a *shorter, smaller* default. The quote is an **upper bound that can substantially OVER-state** — measured on the first-frame path: `amount` 827.26 against an actual settled charge of 279.91. On these (adaptive) requests, `amount_min`/`amount_max` is the honest range to plan against; `amount` is only the ceiling that gets held.\n- **You sent `duration` and `resolution` explicitly**: your values win over the model defaults, so a match can only ADD the motion-reference input leg to the price. On that shape the charge genuinely **exceeds** this quote.\n\n**Pin `video_lora_id` whenever you need the quote to be exact** — that is the only value that removes matching from the create path entirely. `video_lora_id: null` opts out of IMAGE-based matching only, so on a request without a `first_frame_url` it does NOT make this quote exact; and on a request WITH one it also declines the model defaults, so an otherwise-bare request prices (and charges) the adaptive-15s/1080p fallback. This is inherent to auto-matching and is not specific to first frames.\n\n**Video and image rates are both DB-driven.** Video is priced from the live per-model rate table — see `GET /v1/models` for the current per-model credit rates — NOT frozen in the `Aurous-Version` rate card. Image pricing works the same way: the pixel-tiered rate card behind `POST /v1/images/estimate` is also read live from the registry and MAY change without an `Aurous-Version` bump — the same pricing asymmetry the LLM chat/embeddings surfaces use (spec §6.4). Pin an `Aurous-Version` for stable request/response **shapes**; call the matching estimate endpoint for an authoritative current-price quote immediately before you generate.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/videos/estimate","href":"/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"For a fixed duration, `estimated_cost.amount` is the exact charge. For adaptive (`duration: -1`, the default), `estimated_cost.adaptive` is `true` and the price is a range: `amount_min`–`amount_max`, where `amount` equals `amount_max` (the credits held up front). You are charged for the delivered length and refunded the difference. Same validation as POST /v1/videos, but without side effects — no character synthesis, no reference materialization. A cast (`subjects[]`) is validated identically to POST /v1/videos — cast characters are existence/readiness-checked — and does not change the price.\n\n`reference_video_url`/`reference_audio_url` (a `file_\u003culid>` from POST /v1/files or an HTTPS URL) are validated for shape and parameter-combination compatibility, identically to `POST /v1/videos`. A `file_\u003culid>` additionally gets the same read-only checks the create call performs — it must exist, belong to your team (404 otherwise), and have been uploaded with the matching purpose (400 `reference_media_invalid` otherwise). The media **bytes** are never fetched at estimate time — the estimate never touches the network — so byte-level validation (format, duration, resolution) and HTTPS-URL fetching only happen on the actual create call. A reference-to-video request is never charged for `enhance_prompt`, even when `enhance_prompt: true` — the system composes the prompt around the reference and never invokes the enhancer, so the flat enhance adder never applies.\n\nBecause the reference clip is never fetched, its real duration is unknown at estimate time, so a reference (`video_task: reference`) or extend request is priced at the 15-second input ceiling — an **upper bound**. The actual charge is typically lower: the create hold prices against the real clip length. As with the image estimate, this is a deliberate, conservative divergence on that path — a BYO-reference request is never charged more than this estimate.\n\n**Auto-matching is not run here, and the quote can miss in EITHER direction.** This endpoint prices exactly the request body you sent. Every *structural* validation rule is identical to POST /v1/videos, but model MATCHING is a create-time decision: if you omit `video_lora_id` and a video model then matches at create (from your prompt, or — when a `first_frame_url` is attached — from the image), the generation dispatches as a **video-input** generation and is priced accordingly. Which way the charge moves depends on what YOU pinned, because a matched model supplies `default_duration`, `default_resolution` AND `default_ratio` for whatever you left out, and all three are priced:\n\n- **You omitted `duration`/`resolution`** (the usual shape for a bare `first_frame_url` request): with no model, this endpoint has to price adaptive duration (the 15-second ceiling) at 1080p, and the matched model then brings a *shorter, smaller* default. The quote is an **upper bound that can substantially OVER-state** — measured on the first-frame path: `amount` 827.26 against an actual settled charge of 279.91. On these (adaptive) requests, `amount_min`/`amount_max` is the honest range to plan against; `amount` is only the ceiling that gets held.\n- **You sent `duration` and `resolution` explicitly**: your values win over the model defaults, so a match can only ADD the motion-reference input leg to the price. On that shape the charge genuinely **exceeds** this quote.\n\n**Pin `video_lora_id` whenever you need the quote to be exact** — that is the only value that removes matching from the create path entirely. `video_lora_id: null` opts out of IMAGE-based matching only, so on a request without a `first_frame_url` it does NOT make this quote exact; and on a request WITH one it also declines the model defaults, so an otherwise-bare request prices (and charges) the adaptive-15s/1080p fallback. This is inherent to auto-matching and is not specific to first frames.\n\n**Video and image rates are both DB-driven.** Video is priced from the live per-model rate table — see `GET /v1/models` for the current per-model credit rates — NOT frozen in the `Aurous-Version` rate card. Image pricing works the same way: the pixel-tiered rate card behind `POST /v1/images/estimate` is also read live from the registry and MAY change without an `Aurous-Version` bump — the same pricing asymmetry the LLM chat/embeddings surfaces use (spec §6.4). Pin an `Aurous-Version` for stable request/response **shapes**; call the matching estimate endpoint for an authoritative current-price quote immediately before you generate.","operationId":"V1EstimateController_estimateVideo","parameters":["274a11a0-14e2-4843-945b-0e6f0cd1611e"],"requestBody":"89cdab75-4958-44ca-857d-a33c05801508","responses":{"200":"ce6c69d7-5805-4b3d-a98f-7937235c4115","400":"d4168034-749d-4fb3-a814-122a8cd667b9","401":"5892f71c-ac51-445d-8983-854f595b7d9f","403":"2c7df2e4-c45e-4eef-a08b-f406254c34a9","404":"84ee00b3-2c09-4819-adf4-8118916b205a","429":"244e87bc-664e-4724-bcfe-9244f98d5f26","503":"2b77e6b5-32b1-41e5-a9f4-bf3d4780eddc"},"security":["c222d6f7-efbf-47f4-83d6-034ba2647fec"],"summary":"Estimate the credit cost of a video generation","tags":["Public API (v1)"],"method":"post","type":"path","servers":["3c5b35fe-5556-4c2f-b6fe-ccd0ce11e7d4","06ffff55-b13c-4345-afa1-017ab3f24f1d"],"path":"/v1/videos/estimate","baseUrlOptions":["https://api.aurous-labs.com","https://api.preprod.aurous-labs.com"],"title":"Estimate the credit cost of a video generation","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"274a11a0-14e2-4843-945b-0e6f0cd1611e":{"name":"Aurous-Version","in":"header","required":false,"description":"Optional API version pin (YYYY-MM-DD). Omit the header to receive the platform default, currently `2026-08-26`.","schema":{"type":"string","example":"2026-08-26","pattern":"^\\d{4}-\\d{2}-\\d{2}$","isRequired":false,"description":"Optional API version pin (YYYY-MM-DD). Omit the header to receive the platform default, currently `2026-08-26`.","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"Text prompt describing the video. Optional when the request carries another content source: a `first_frame_url` (image-to-video), a `reference_video_url` (reference-to-video), or a pinned `video_lora_id` (the video model supplies the motion and, when nothing else is sent, generates its own subject). Subject-driven generation (`subjects[]`, `character_id`, or `reference_image_urls`) still requires a prompt describing the action unless a video model is pinned or a reference video is attached. A request with none of the four sources returns 400 `missing_field`.","example":"A golden sunset over the ocean with gentle waves","uniqueKey":"prompt","typeLabel":"string"},"video_lora_id":{"oneOf":[{"type":"string","description":"Optional, and TRI-STATE. An id (or slug, where one is set) from GET /v1/video_loras pins a specific video model. A pinned model is also a complete request on its own: send just `video_lora_id` — no prompt — and the model generates its own subject and motion; add `subjects[]` (or the legacy `character_id`/`reference_image_urls`) to cast specific people, still with no prompt required. Only a pinned id substitutes for a prompt — `null` never does, and an empty string is treated as omitted. A pin cannot combine with `reference_video_url` (400 `parameter_invalid_combination`): both supply the motion. If OMITTED, the platform picks a suitable model for you: matching reads your prompt, or — when `first_frame_url` is attached — what the IMAGE shows. If none matches, your request is generated as plain video, plain image-to-video, or (with a subject attached) a subject-driven video; matching never fails the request. Send NULL to opt out of IMAGE-based matching — meaningful only when `first_frame_url` is attached, where it guarantees plain image-to-video. WITHOUT a first frame, `null` behaves exactly like omitting the field and your prompt is still auto-matched; pin an id if you need a specific model. A first frame plus a pinned or matched model reports `inference_type: \"r2v\"` and starts NEAR your image rather than exactly on it. PRICING: a pinned or matched model also supplies `default_resolution` and `default_ratio` alongside `default_duration` for whatever you left out (anything you send explicitly wins), and all three are priced — so `null` on an otherwise-bare first-frame request falls back to adaptive duration at 1080p and costs ~2.8x the same still with a model pinned. Send `duration` and `resolution` alongside `null` if you want the exact-frame guarantee at a predictable price.","example":"action_01HXMQ7Z3K8Y2VNABCDEFGHJKM","uniqueKey":"video_lora_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional, and TRI-STATE. An id (or slug, where one is set) from GET /v1/video_loras pins a specific video model. A pinned model is also a complete request on its own: send just `video_lora_id` — no prompt — and the model generates its own subject and motion; add `subjects[]` (or the legacy `character_id`/`reference_image_urls`) to cast specific people, still with no prompt required. Only a pinned id substitutes for a prompt — `null` never does, and an empty string is treated as omitted. A pin cannot combine with `reference_video_url` (400 `parameter_invalid_combination`): both supply the motion. If OMITTED, the platform picks a suitable model for you: matching reads your prompt, or — when `first_frame_url` is attached — what the IMAGE shows. If none matches, your request is generated as plain video, plain image-to-video, or (with a subject attached) a subject-driven video; matching never fails the request. Send NULL to opt out of IMAGE-based matching — meaningful only when `first_frame_url` is attached, where it guarantees plain image-to-video. WITHOUT a first frame, `null` behaves exactly like omitting the field and your prompt is still auto-matched; pin an id if you need a specific model. A first frame plus a pinned or matched model reports `inference_type: \"r2v\"` and starts NEAR your image rather than exactly on it. PRICING: a pinned or matched model also supplies `default_resolution` and `default_ratio` alongside `default_duration` for whatever you left out (anything you send explicitly wins), and all three are priced — so `null` on an otherwise-bare first-frame request falls back to adaptive duration at 1080p and costs ~2.8x the same still with a model pinned. Send `duration` and `resolution` alongside `null` if you want the exact-frame guarantee at a predictable price.","example":"action_01HXMQ7Z3K8Y2VNABCDEFGHJKM","uniqueKey":"video_lora_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_lora_id","typeLabel":"string | null"},"character_id":{"type":"string","description":"Drive the video from a saved character (reference-to-video). Must be `status: ready` — otherwise 400 `character_not_ready`. Cross-team ids 404 (existence never leaked). Mutually exclusive with `reference_image_urls` (→ 400 `mutually_exclusive_input`) and with `first_frame_url`/`last_frame_url` (→ 400 `parameter_invalid_combination`). Omit both a subject and a frame for plain text-to-video. Superseded by `subjects[]` (which also supports multi-person casts); fully supported — successful responses carry an advisory `Deprecation: true` header when this field is used.","example":"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM","deprecated":true,"uniqueKey":"character_id","typeLabel":"string"},"reference_image_urls":{"description":"Up to 6 subject reference images — each a `file_\u003culid>` (POST /v1/files) or an `https://` URL (SSRF-pinned server-side fetch). Image files only: a `file_\u003culid>` uploaded with purpose `reference_video`/`reference_audio` is rejected (400 `invalid_format`). The subject is anchored across the video. Mutually exclusive with `character_id` and with `first_frame_url`/`last_frame_url`. Superseded by `subjects[]` (which also supports multi-person casts); fully supported — successful responses carry an advisory `Deprecation: true` header when this field is used.","example":["file_01HXMQ7Z3K8Y2NABCDEFGHJKMN","https://example.com/ref2.jpg"],"minItems":0,"maxItems":6,"deprecated":true,"type":"array","items":{"type":"string","uniqueKey":"reference_image_urls.items.[INDEX]","typeLabel":"string"},"uniqueKey":"reference_image_urls","typeLabel":"string[]"},"subjects":{"maxItems":2,"description":"Ordered cast for a multi-person video. Up to 2 subjects per generation (current engine limit — may increase; exceeding it returns 400 parameter_invalid_combination). Each subject is a saved character or its own group of 1–4 reference images; character and reference subjects can be mixed. Supersedes the single-subject `character_id`/`reference_image_urls` fields — sending both shapes returns 400 mutually_exclusive_input. A cast may accompany `reference_video_url` (the clip supplies motion, the cast supplies identity) but not `video_task: \"extend\"` and not `first_frame_url`/`last_frame_url`. Duplicate characters or a reference image reused across subjects return 400. Empty array is treated as omitted.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["character","reference"],"example":"character","description":"Subject kind.","isRequired":true,"uniqueKey":"subjects.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"character_id":{"type":"string","example":"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM","description":"Required for `character` subjects (and must be omitted for `reference` subjects — 400 `parameter_invalid_combination`). `char_\u003culid>` or legacy UUID; must be a ready character your team owns.","uniqueKey":"subjects.items.[INDEX].character_id","typeLabel":"string"},"image_urls":{"minItems":1,"maxItems":4,"example":["file_01HXMQ7Z3K8Y2NABCDEFGHJKMN"],"description":"Required for `reference` subjects (and must be omitted for `character` subjects — 400 `parameter_invalid_combination`). 1–4 `file_\u003culid>` IDs (POST /v1/files) or https URLs. Image files only: a `file_\u003culid>` uploaded with purpose `reference_video`/`reference_audio` is rejected (400 `invalid_format`). The clearest full-body and portrait views are selected automatically to anchor this person across the video.","type":"array","items":{"type":"string","uniqueKey":"subjects.items.[INDEX].image_urls.items.[INDEX]","typeLabel":"string"},"uniqueKey":"subjects.items.[INDEX].image_urls","typeLabel":"string[]"}},"required":["type"],"uniqueKey":"subjects.items.[INDEX]","typeLabel":"object"},"uniqueKey":"subjects","typeLabel":"object[]"},"first_frame_url":{"type":"string","description":"First frame for image-to-video / first+last frame interpolation. Either an opaque `file_\u003culid>` ID returned by POST /v1/files, or an `https://` URL pointing at a public host (max 2048 chars). Image files only — a `file_\u003culid>` uploaded with purpose `reference_video`/`reference_audio` is rejected (400 `invalid_format`). URLs are server-side fetched through an SSRF-pinned client (rejects private IPs / cloud metadata). MINIMUM SIZE — when a video model is pinned or left to auto-match, this frame is upscaled into a short seed clip, so it must be at least 64 px on its shortest side AND at least 6,400 px in total (80x80 is the smallest square accepted; at a 64 px short side the long side needs 100). A `file_\u003culid>` below that returns 400 `first_frame_too_small` before any credit hold (dimensions were measured at upload); an `https://` URL is accepted and settles at `status: failed` with `error_code: \"first_frame_too_small\"` and a full refund, because validation never fetches the bytes. The check runs on the POSSIBILITY of a model, not on one actually being used — an un-pinned frame is rejected even if no model would have matched your image. No minimum applies with `video_lora_id: null`, nor when a `last_frame_url` rides alongside — a first+last pair never auto-matches and builds no seed clip either, so no `first_frame_too_small` ever fires on an interpolation request.","example":"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN","maxLength":2048,"uniqueKey":"first_frame_url","typeLabel":"string"},"last_frame_url":{"type":"string","description":"Last frame for first+last frame interpolation. Same rules as first_frame_url. Requires `first_frame_url` — sending `last_frame_url` alone returns 400 with code `parameter_invalid_combination`.","example":"https://example.com/last.jpg","maxLength":2048,"uniqueKey":"last_frame_url","typeLabel":"string"},"resolution":{"type":"string","description":"Output video resolution","enum":["480p","720p","1080p"],"uniqueKey":"resolution","typeLabel":"enum\u003cstring>"},"ratio":{"type":"string","description":"Output video aspect ratio","enum":["16:9","4:3","1:1","3:4","9:16","21:9","adaptive"],"uniqueKey":"ratio","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Video length in seconds. Pass -1 for ADAPTIVE (default): the model selects the optimal whole-second length within its supported range (currently 4–15 s) and you are billed for the delivered length — a VARIABLE price. Call POST /v1/videos/estimate to see the min–max range before submitting. Pass a whole number 4–15 to pin a fixed length (fixed price). Omitting uses the video model's default length when your request pins or is matched to one; otherwise adaptive (-1). Adaptive holds the 15 s ceiling from your balance until it settles.","enum":[-1,4,5,6,7,8,9,10,11,12,13,14,15],"example":5,"uniqueKey":"duration","typeLabel":"enum\u003cnumber>"},"generate_audio":{"type":"boolean","description":"Whether the generated video includes synchronized audio. Defaults to the selected video model's audio setting (currently true for all models unless noted on the model).","uniqueKey":"generate_audio","typeLabel":"boolean"},"watermark":{"type":"boolean","description":"Whether to add watermark","uniqueKey":"watermark","typeLabel":"boolean"},"enhance_prompt":{"type":"boolean","description":"Whether to enhance the prompt with AI. A no-op on requests without a prompt (model-driven and reference-driven bodies): nothing to enhance, nothing charged.","uniqueKey":"enhance_prompt","typeLabel":"boolean"},"reference_video_url":{"type":"string","description":"Your reference video — the motion source for a reference-mode generation, or the clip to continue when `video_task` is `extend`. Either an opaque `file_\u003culid>` returned by POST /v1/files (uploaded with `purpose: reference_video` — format/duration/resolution were already validated at upload), or an HTTPS URL. Requirements: MP4 or MOV (H.264/H.265), 2–15 seconds, up to 50 MB, frame area of at least 409,600 px (≈640×640). Clips above 2,073,600 px (1920×1080, ≈1080p) are downscaled to fit before use, preserving aspect ratio, duration and audio. That downscale runs while this request is open, so a large clip adds seconds before the `201` — allow a client timeout of at least 120 s and send an `Idempotency-Key` — and uploading it once via POST /v1/files moves that cost off the create call. URLs must be publicly fetchable or pre-signed, serve HTTPS directly (redirects are refused — pass the final URL), and respond within the fetch budget. Cannot be combined with `first_frame_url`/`last_frame_url`. While the reference is prepared the generation stays in `processing` — see the endpoint description for timing.","example":"https://cdn.example.com/clips/dance-loop.mp4","maxLength":2048,"uniqueKey":"reference_video_url","typeLabel":"string"},"reference_audio_url":{"type":"string","description":"An audio reference (voice, music, or ambience) to guide the generated soundtrack — either a `file_\u003culid>` from POST /v1/files (`purpose: reference_audio`) or an HTTPS URL. WAV or MP3, 2–15 seconds, up to 15 MB. Needs a companion — a reference video, a subject (`subjects[]` or the legacy fields), or a pinned `video_lora_id` — and requires audio output (`generate_audio` must not be false). Same URL rules as `reference_video_url` (public or signed HTTPS, no redirects).","example":"https://cdn.example.com/audio/voiceover.mp3","maxLength":2048,"uniqueKey":"reference_audio_url","typeLabel":"string"},"video_task":{"type":"string","description":"What to do with `reference_video_url`. `reference` (default): generate a new scene that borrows the clip's motion. `extend`: continue the clip itself in `extend_direction`; extend takes the clip as-is, so it cannot be combined with `video_lora_id`. Only valid when `reference_video_url` is present.","enum":["reference","extend"],"default":"reference","uniqueKey":"video_task","typeLabel":"enum\u003cstring>"},"extend_direction":{"type":"string","description":"Direction to continue the clip when `video_task` is `extend`. Defaults to `forward`. Only valid with `video_task: \"extend\"`.","enum":["forward","backward"],"default":"forward","uniqueKey":"extend_direction","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"prompt":"A golden sunset over the ocean with gentle waves","video_lora_id":"action_01HXMQ7Z3K8Y2VNABCDEFGHJKM","character_id":"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM","reference_image_urls":["file_01HXMQ7Z3K8Y2NABCDEFGHJKMN","https://example.com/ref2.jpg"],"subjects":[{"type":"character","character_id":"char_01HXMQ7Z3K8Y2VNABCDEFGHJKM","image_urls":["file_01HXMQ7Z3K8Y2NABCDEFGHJKMN"]}],"first_frame_url":"file_01HXMQ7Z3K8Y2NABCDEFGHJKMN","last_frame_url":"https://example.com/last.jpg","duration":5,"generate_audio":true,"watermark":true,"enhance_prompt":true,"reference_video_url":"https://cdn.example.com/clips/dance-loop.mp4","reference_audio_url":"https://cdn.example.com/audio/voiceover.mp3","video_task":"reference","extend_direction":"forward"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"ce6c69d7-5805-4b3d-a98f-7937235c4115":{"description":"Cost estimate","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","description":"Discriminator","example":"estimate","enum":["estimate"],"isRequired":true,"uniqueKey":"object","typeLabel":"enum\u003cstring>"},"estimated_cost":{"type":"object","description":"Cost breakdown for this would-be generation.","required":["amount","breakdown"],"properties":{"amount":{"type":"number","description":"Total credit cost. For images, the price depends on the output size tier — see the `size_tier` line in `breakdown` (`standard` or `large`). `amount` equals the sum of the numeric line items in `breakdown` other than `discount_factor` (a multiplier, not a credit amount). For videos the price is token-based (per-model rate table): `breakdown` carries the token input (`tokens_max`, plus optional `enhance_flat_credits`/`discount_factor`), NOT additive line items — do not sum it, trust `amount`. For an adaptive video (`adaptive: true`) this equals `amount_max` — the ceiling reserved up front; you are billed for the delivered length and refunded the difference. In all cases trust `amount` as the authoritative figure held/charged — it matches the live hold to 4 decimals.","example":2,"isRequired":true,"uniqueKey":"estimated_cost.amount","typeLabel":"number"},"breakdown":{"type":"object","description":"Cost inputs, keyed by source. Image estimates carry `base` (credits, always present, summable) and `size_tier` (a STRING — `standard` for output \u003c= 2.36 MP, `large` above; never summable, skip it when reproducing `amount`). Reference images are free and do not add line items. When the team has a negotiated discount, an additional `discount_factor` line is present — it is a multiplier (e.g. `0.9` for 10% off), not a credit amount; `amount` is the post-discount total. Video estimates carry token-model inputs: `tokens_max` (the ceiling token count used for pricing), plus optional `enhance_flat_credits` and `discount_factor` lines. Video estimate breakdowns are NOT additive — `amount` is the authoritative figure. For adaptive video estimates (`duration: -1`), also check the top-level `amount_min`/`amount_max` range. Example image breakdown: `{ \"base\": 6.5, \"size_tier\": \"standard\" }`; example video estimate breakdown: `{ \"tokens_max\": 108000, \"enhance_flat_credits\": 0.5 }`. Values are typed `number | string | boolean` — image estimates already mix a numeric `base` with the string `size_tier`, and the field set is OPEN and shares its contract with the settled generation `cost.breakdown` (which can additionally carry boolean metadata, e.g. on video) — so read by name and tolerate non-numeric values on unknown keys.","example":{"base":6.5,"size_tier":"standard"},"isRequired":true,"uniqueKey":"estimated_cost.breakdown","typeLabel":"object"},"adaptive":{"type":"boolean","description":"True only for an adaptive (variable-length) video estimate (`duration: -1`, the default — see POST /v1/videos). When true the price is a range: render `amount_min`–`amount_max`. When false (every image estimate, and any video estimate with a fixed duration), `amount` is exact.","example":false,"uniqueKey":"estimated_cost.adaptive","typeLabel":"boolean"},"amount_min":{"type":"number","description":"Adaptive video estimates only: the minimum charge (shortest supported length, currently 4 s).","example":10,"uniqueKey":"estimated_cost.amount_min","typeLabel":"number"},"amount_max":{"type":"number","description":"Adaptive video estimates only: the maximum charge (longest supported length, currently 15 s) — equals `amount`.","example":37.5,"uniqueKey":"estimated_cost.amount_max","typeLabel":"number"}},"isRequired":true,"uniqueKey":"estimated_cost","typeLabel":"object"},"currency":{"type":"string","description":"Currency unit. All amounts in this response are in `credit`.","example":"credit","enum":["credit"],"isRequired":true,"uniqueKey":"currency","typeLabel":"enum\u003cstring>"},"warnings":{"description":"Non-fatal request adjustments the real create would also report (e.g. a retired style pin that generates without a style, or a parameter with no effect on this generation path). Same shape and codes as the `warnings` on the `POST /v1/images` 201 body — the estimate warns exactly when the create would. Omitted when empty. Codes are an OPEN set: ignore unknown codes.","example":[{"code":"parameter_ignored","param":"seed","message":"`seed` has no effect on this generation and was ignored."}],"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable warning code. Current values: `parameter_ignored` (a parameter you sent has no effect on this generation path and was ignored) and `style_retired_plain` (the pinned `lora_id` is retired — the generation proceeded without a style). This is an OPEN set: new codes may be added without a version bump, so ignore unknown codes rather than failing on them.","example":"style_retired_plain","isRequired":true,"uniqueKey":"warnings.items.[INDEX].code","typeLabel":"string"},"param":{"type":"string","description":"Machine-readable name of the request field the warning is about (e.g. `lora_id`, `seed`).","example":"lora_id","isRequired":true,"uniqueKey":"warnings.items.[INDEX].param","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation. Wording may change; branch on `code`/`param`, not on this text.","example":"Style lora_06AAAAAAAAAAAAAAAAAAAAAAAA is retired and no longer applies a style — this request generates without one.","isRequired":true,"uniqueKey":"warnings.items.[INDEX].message","typeLabel":"string"}},"required":["code","param","message"],"uniqueKey":"warnings.items.[INDEX]","typeLabel":"object"},"uniqueKey":"warnings","typeLabel":"object[]"}},"required":["object","estimated_cost","currency"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"object":"estimate","estimated_cost":{"amount":2,"breakdown":{"base":6.5,"size_tier":"standard"},"adaptive":false,"amount_min":10,"amount_max":37.5},"currency":"credit","warnings":[{"code":"parameter_ignored","param":"seed","message":"`seed` has no effect on this generation and was ignored."}]}}},"exampleType":"generated"}},"headers":{"Aurous-Request-Id":{"description":"Server-minted request id. Quote this in support tickets.","schema":{"type":"string","example":"req_01HXMQ7Z3K8Y2NABCDEFGHJKMP"}},"Aurous-Version":{"description":"API version pin applied to this response (YYYY-MM-DD).","schema":{"type":"string","example":"2026-08-26"}},"X-RateLimit-Limit":{"description":"Bucket capacity (max tokens) for this endpoint class.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Tokens remaining after this request.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Epoch seconds when the bucket would be full again, assuming no further requests.","schema":{"type":"integer","example":1700000060}},"Deprecation":{"description":"Present (always the literal string `true`) on a 2xx response in two cases: (1) POST /v1/images, /v1/images/estimate, /v1/videos or /v1/videos/estimate when the request body used the legacy `character_id` or `reference_image_urls` field instead of `subjects[]`; (2) every 2xx of POST /v1/characters/{id}/refs/regenerate, whose whole body form is superseded by POST /v1/characters/{id}/refs/{view}/regenerate. Absent otherwise — in particular the per-view route never carries it. No removal date is set in either case — see the linked page.","schema":{"type":"string","enum":["true"],"example":"true"}},"Link":{"description":"Paired with `Deprecation` — an RFC 8288 link to what replaces the deprecated thing. `rel=\"deprecation\"` pointing at the subjects[] migration guide for the legacy identity FIELDS; `rel=\"successor-version\"` pointing at the per-view regenerate page for the deprecated regenerate ROUTE. Same presence rule as `Deprecation`.","schema":{"type":"string","example":"\u003chttps://docs.aurous-labs.com/guides/subjects>; rel=\"deprecation\"; type=\"text/html\""}}},"exampleType":"generated"},"d4168034-749d-4fb3-a814-122a8cd667b9":{"description":"Validation failed, character_id and reference_image_urls are both present (code: mutually_exclusive_input), a cast character is not ready (code: character_not_ready), the parameter combination is invalid (code: parameter_invalid_combination — e.g. more than 2 subjects, a subject element carrying both character_id and image_urls, a duplicate character across subjects, or last_frame_url combined with a pinned video_lora_id), a malformed id was sent (code: invalid_format), or a reference media file id was uploaded under a different purpose (code: reference_media_invalid).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","description":"Error payload","required":["type","code","message","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad error category","example":"invalid_request","enum":["invalid_request","authentication","not_found","rate_limit","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable error code (programmatic discriminator). Closed-beta gate emits one of `account_pending`, `account_rejected`, `account_suspended` on 403.","example":"balance_too_low","enum":["invalid_request","missing_field","invalid_format","value_out_of_range","unsupported_lora_for_mode","generation_not_cancellable","prompt_blocked","reference_blocked","output_moderation_rejected","unknown_version","mutually_exclusive_input","character_not_ready","parameter_invalid_combination","character_status_invalid","character_busy","nudity_not_allowed","reference_unfit","reference_uploaded","build_requires_identity","style_retired","parameter_invalid","too_many_reference_images","action_not_available","upload_invalid","balance_too_low","idempotency_key_in_use","api_key_not_found","payload_too_large","missing_api_key","invalid_api_key","revoked_api_key","resource_not_found","forbidden_resource","account_pending","account_rejected","account_suspended","already_approved","already_rejected","already_suspended","invalid_reinstate_target","invalid_suspend_target","payment_not_reviewable","page_out_of_date","trial_already_used","cannot_moderate_admin","too_many_requests","concurrency_limit_exceeded","tpm_rate_limit_exceeded","internal_error","provider_unavailable","reference_check_unavailable","provider_timeout","provider_not_configured","invalid_time_range","invalid_bucket_width","too_many_buckets","too_many_group_by","invalid_filter","invalid_page_token","export_too_large","user_already_exists","self_invite_forbidden","invite_link_failed","invite_rate_limited","model_not_found","model_disabled","model_wrong_kind","max_tokens_exceeds_hard_cap","chat_model_misconfigured","embeddings_input_too_large","embeddings_unsupported_dimensions","pricing_frozen","provider_rate_limited","chat_provider_request_invalid","chat_provider_auth_failed","chat_provider_unavailable","max_input_tokens_exceeded","chat_provider_unknown_error","embeddings_provider_unknown_error","embeddings_batch_not_supported","embeddings_input_too_many_items","embeddings_video_unsupported","encoding_format_unsupported","missing_max_tokens_no_model_default","chat_cancel_target_not_found","chat_completion_not_found","chat_cancel_target_already_terminal","chat_cancel_target_not_cancellable","tool_choice_required_unsupported","response_format_too_large","response_format_too_deep","invalid_cursor","invalid_cursor_for_endpoint","model_slug_exists","output_expired","output_not_available","content_filtered","image_generation_failed","reference_media_invalid","reference_media_cap_reached","reference_fetch_failed","unsupported_auth_method","insufficient_scope","uploads_expired","character_resynthesize_in_progress","provider_unknown_error","first_frame_too_small"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable message","example":"Team available balance is 1.5 credits, generation requires 2.0.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","description":"Documentation link for this error code","example":"https://docs.aurous-labs.com/errors#balance_too_low","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string"},"request_id":{"type":"string","description":"Echoes Aurous-Request-Id — quote in support tickets","example":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"param":{"oneOf":[{"type":"object","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.0","typeLabel":"object"},{"type":"null","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.param","typeLabel":"object | null"},"reason":{"oneOf":[{"type":"string","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring> | null"},"detected_view":{"oneOf":[{"type":"string","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.detected_view","typeLabel":"enum\u003cstring> | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"balance_too_low","message":"Team available balance is 1.5 credits, generation requires 2.0.","doc_url":"https://docs.aurous-labs.com/errors#balance_too_low","request_id":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","param":"prompt","reason":"wrong_view","detected_view":"full_left"}}}},"exampleType":"generated"}},"headers":{"Aurous-Request-Id":{"description":"Server-minted request id. Quote this in support tickets.","schema":{"type":"string","example":"req_01HXMQ7Z3K8Y2NABCDEFGHJKMP"}},"Aurous-Version":{"description":"API version pin applied to this response (YYYY-MM-DD).","schema":{"type":"string","example":"2026-08-26"}},"X-RateLimit-Limit":{"description":"Bucket capacity (max tokens) for this endpoint class.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Tokens remaining after this request.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Epoch seconds when the bucket would be full again, assuming no further requests.","schema":{"type":"integer","example":1700000060}}},"exampleType":"generated"},"5892f71c-ac51-445d-8983-854f595b7d9f":{"description":"Unauthorized — missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","description":"Error payload","required":["type","code","message","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad error category","example":"invalid_request","enum":["invalid_request","authentication","not_found","rate_limit","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable error code (programmatic discriminator). Closed-beta gate emits one of `account_pending`, `account_rejected`, `account_suspended` on 403.","example":"balance_too_low","enum":["invalid_request","missing_field","invalid_format","value_out_of_range","unsupported_lora_for_mode","generation_not_cancellable","prompt_blocked","reference_blocked","output_moderation_rejected","unknown_version","mutually_exclusive_input","character_not_ready","parameter_invalid_combination","character_status_invalid","character_busy","nudity_not_allowed","reference_unfit","reference_uploaded","build_requires_identity","style_retired","parameter_invalid","too_many_reference_images","action_not_available","upload_invalid","balance_too_low","idempotency_key_in_use","api_key_not_found","payload_too_large","missing_api_key","invalid_api_key","revoked_api_key","resource_not_found","forbidden_resource","account_pending","account_rejected","account_suspended","already_approved","already_rejected","already_suspended","invalid_reinstate_target","invalid_suspend_target","payment_not_reviewable","page_out_of_date","trial_already_used","cannot_moderate_admin","too_many_requests","concurrency_limit_exceeded","tpm_rate_limit_exceeded","internal_error","provider_unavailable","reference_check_unavailable","provider_timeout","provider_not_configured","invalid_time_range","invalid_bucket_width","too_many_buckets","too_many_group_by","invalid_filter","invalid_page_token","export_too_large","user_already_exists","self_invite_forbidden","invite_link_failed","invite_rate_limited","model_not_found","model_disabled","model_wrong_kind","max_tokens_exceeds_hard_cap","chat_model_misconfigured","embeddings_input_too_large","embeddings_unsupported_dimensions","pricing_frozen","provider_rate_limited","chat_provider_request_invalid","chat_provider_auth_failed","chat_provider_unavailable","max_input_tokens_exceeded","chat_provider_unknown_error","embeddings_provider_unknown_error","embeddings_batch_not_supported","embeddings_input_too_many_items","embeddings_video_unsupported","encoding_format_unsupported","missing_max_tokens_no_model_default","chat_cancel_target_not_found","chat_completion_not_found","chat_cancel_target_already_terminal","chat_cancel_target_not_cancellable","tool_choice_required_unsupported","response_format_too_large","response_format_too_deep","invalid_cursor","invalid_cursor_for_endpoint","model_slug_exists","output_expired","output_not_available","content_filtered","image_generation_failed","reference_media_invalid","reference_media_cap_reached","reference_fetch_failed","unsupported_auth_method","insufficient_scope","uploads_expired","character_resynthesize_in_progress","provider_unknown_error","first_frame_too_small"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable message","example":"Team available balance is 1.5 credits, generation requires 2.0.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","description":"Documentation link for this error code","example":"https://docs.aurous-labs.com/errors#balance_too_low","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string"},"request_id":{"type":"string","description":"Echoes Aurous-Request-Id — quote in support tickets","example":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"param":{"oneOf":[{"type":"object","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.0","typeLabel":"object"},{"type":"null","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.param","typeLabel":"object | null"},"reason":{"oneOf":[{"type":"string","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring> | null"},"detected_view":{"oneOf":[{"type":"string","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.detected_view","typeLabel":"enum\u003cstring> | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"balance_too_low","message":"Team available balance is 1.5 credits, generation requires 2.0.","doc_url":"https://docs.aurous-labs.com/errors#balance_too_low","request_id":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","param":"prompt","reason":"wrong_view","detected_view":"full_left"}}}},"exampleType":"generated"}},"headers":{"Aurous-Request-Id":{"description":"Server-minted request id. Quote this in support tickets.","schema":{"type":"string","example":"req_01HXMQ7Z3K8Y2NABCDEFGHJKMP"}},"Aurous-Version":{"description":"API version pin applied to this response (YYYY-MM-DD).","schema":{"type":"string","example":"2026-08-26"}},"X-RateLimit-Limit":{"description":"Bucket capacity (max tokens) for this endpoint class.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Tokens remaining after this request.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Epoch seconds when the bucket would be full again, assuming no further requests.","schema":{"type":"integer","example":1700000060}}},"exampleType":"generated"},"2c7df2e4-c45e-4eef-a08b-f406254c34a9":{"description":"Account not approved for closed beta. error.code is one of `account_pending`, `account_rejected`, `account_suspended`. There is no retry — contact support to be approved.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","description":"Error payload","required":["type","code","message","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad error category","example":"invalid_request","enum":["invalid_request","authentication","not_found","rate_limit","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable error code (programmatic discriminator). Closed-beta gate emits one of `account_pending`, `account_rejected`, `account_suspended` on 403.","example":"balance_too_low","enum":["invalid_request","missing_field","invalid_format","value_out_of_range","unsupported_lora_for_mode","generation_not_cancellable","prompt_blocked","reference_blocked","output_moderation_rejected","unknown_version","mutually_exclusive_input","character_not_ready","parameter_invalid_combination","character_status_invalid","character_busy","nudity_not_allowed","reference_unfit","reference_uploaded","build_requires_identity","style_retired","parameter_invalid","too_many_reference_images","action_not_available","upload_invalid","balance_too_low","idempotency_key_in_use","api_key_not_found","payload_too_large","missing_api_key","invalid_api_key","revoked_api_key","resource_not_found","forbidden_resource","account_pending","account_rejected","account_suspended","already_approved","already_rejected","already_suspended","invalid_reinstate_target","invalid_suspend_target","payment_not_reviewable","page_out_of_date","trial_already_used","cannot_moderate_admin","too_many_requests","concurrency_limit_exceeded","tpm_rate_limit_exceeded","internal_error","provider_unavailable","reference_check_unavailable","provider_timeout","provider_not_configured","invalid_time_range","invalid_bucket_width","too_many_buckets","too_many_group_by","invalid_filter","invalid_page_token","export_too_large","user_already_exists","self_invite_forbidden","invite_link_failed","invite_rate_limited","model_not_found","model_disabled","model_wrong_kind","max_tokens_exceeds_hard_cap","chat_model_misconfigured","embeddings_input_too_large","embeddings_unsupported_dimensions","pricing_frozen","provider_rate_limited","chat_provider_request_invalid","chat_provider_auth_failed","chat_provider_unavailable","max_input_tokens_exceeded","chat_provider_unknown_error","embeddings_provider_unknown_error","embeddings_batch_not_supported","embeddings_input_too_many_items","embeddings_video_unsupported","encoding_format_unsupported","missing_max_tokens_no_model_default","chat_cancel_target_not_found","chat_completion_not_found","chat_cancel_target_already_terminal","chat_cancel_target_not_cancellable","tool_choice_required_unsupported","response_format_too_large","response_format_too_deep","invalid_cursor","invalid_cursor_for_endpoint","model_slug_exists","output_expired","output_not_available","content_filtered","image_generation_failed","reference_media_invalid","reference_media_cap_reached","reference_fetch_failed","unsupported_auth_method","insufficient_scope","uploads_expired","character_resynthesize_in_progress","provider_unknown_error","first_frame_too_small"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable message","example":"Team available balance is 1.5 credits, generation requires 2.0.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","description":"Documentation link for this error code","example":"https://docs.aurous-labs.com/errors#balance_too_low","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string"},"request_id":{"type":"string","description":"Echoes Aurous-Request-Id — quote in support tickets","example":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"param":{"oneOf":[{"type":"object","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.0","typeLabel":"object"},{"type":"null","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.param","typeLabel":"object | null"},"reason":{"oneOf":[{"type":"string","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring> | null"},"detected_view":{"oneOf":[{"type":"string","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.detected_view","typeLabel":"enum\u003cstring> | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"balance_too_low","message":"Team available balance is 1.5 credits, generation requires 2.0.","doc_url":"https://docs.aurous-labs.com/errors#balance_too_low","request_id":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","param":"prompt","reason":"wrong_view","detected_view":"full_left"}}}},"exampleType":"generated"}},"headers":{"Aurous-Request-Id":{"description":"Server-minted request id. Quote this in support tickets.","schema":{"type":"string","example":"req_01HXMQ7Z3K8Y2NABCDEFGHJKMP"}},"Aurous-Version":{"description":"API version pin applied to this response (YYYY-MM-DD).","schema":{"type":"string","example":"2026-08-26"}},"X-RateLimit-Limit":{"description":"Bucket capacity (max tokens) for this endpoint class.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Tokens remaining after this request.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Epoch seconds when the bucket would be full again, assuming no further requests.","schema":{"type":"integer","example":1700000060}}},"exampleType":"generated"},"84ee00b3-2c09-4819-adf4-8118916b205a":{"description":"Video model, character, reference image, or reference media file not found / inaccessible","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","description":"Error payload","required":["type","code","message","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad error category","example":"invalid_request","enum":["invalid_request","authentication","not_found","rate_limit","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable error code (programmatic discriminator). Closed-beta gate emits one of `account_pending`, `account_rejected`, `account_suspended` on 403.","example":"balance_too_low","enum":["invalid_request","missing_field","invalid_format","value_out_of_range","unsupported_lora_for_mode","generation_not_cancellable","prompt_blocked","reference_blocked","output_moderation_rejected","unknown_version","mutually_exclusive_input","character_not_ready","parameter_invalid_combination","character_status_invalid","character_busy","nudity_not_allowed","reference_unfit","reference_uploaded","build_requires_identity","style_retired","parameter_invalid","too_many_reference_images","action_not_available","upload_invalid","balance_too_low","idempotency_key_in_use","api_key_not_found","payload_too_large","missing_api_key","invalid_api_key","revoked_api_key","resource_not_found","forbidden_resource","account_pending","account_rejected","account_suspended","already_approved","already_rejected","already_suspended","invalid_reinstate_target","invalid_suspend_target","payment_not_reviewable","page_out_of_date","trial_already_used","cannot_moderate_admin","too_many_requests","concurrency_limit_exceeded","tpm_rate_limit_exceeded","internal_error","provider_unavailable","reference_check_unavailable","provider_timeout","provider_not_configured","invalid_time_range","invalid_bucket_width","too_many_buckets","too_many_group_by","invalid_filter","invalid_page_token","export_too_large","user_already_exists","self_invite_forbidden","invite_link_failed","invite_rate_limited","model_not_found","model_disabled","model_wrong_kind","max_tokens_exceeds_hard_cap","chat_model_misconfigured","embeddings_input_too_large","embeddings_unsupported_dimensions","pricing_frozen","provider_rate_limited","chat_provider_request_invalid","chat_provider_auth_failed","chat_provider_unavailable","max_input_tokens_exceeded","chat_provider_unknown_error","embeddings_provider_unknown_error","embeddings_batch_not_supported","embeddings_input_too_many_items","embeddings_video_unsupported","encoding_format_unsupported","missing_max_tokens_no_model_default","chat_cancel_target_not_found","chat_completion_not_found","chat_cancel_target_already_terminal","chat_cancel_target_not_cancellable","tool_choice_required_unsupported","response_format_too_large","response_format_too_deep","invalid_cursor","invalid_cursor_for_endpoint","model_slug_exists","output_expired","output_not_available","content_filtered","image_generation_failed","reference_media_invalid","reference_media_cap_reached","reference_fetch_failed","unsupported_auth_method","insufficient_scope","uploads_expired","character_resynthesize_in_progress","provider_unknown_error","first_frame_too_small"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable message","example":"Team available balance is 1.5 credits, generation requires 2.0.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","description":"Documentation link for this error code","example":"https://docs.aurous-labs.com/errors#balance_too_low","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string"},"request_id":{"type":"string","description":"Echoes Aurous-Request-Id — quote in support tickets","example":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"param":{"oneOf":[{"type":"object","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.0","typeLabel":"object"},{"type":"null","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.param","typeLabel":"object | null"},"reason":{"oneOf":[{"type":"string","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring> | null"},"detected_view":{"oneOf":[{"type":"string","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.detected_view","typeLabel":"enum\u003cstring> | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"balance_too_low","message":"Team available balance is 1.5 credits, generation requires 2.0.","doc_url":"https://docs.aurous-labs.com/errors#balance_too_low","request_id":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","param":"prompt","reason":"wrong_view","detected_view":"full_left"}}}},"exampleType":"generated"}},"headers":{"Aurous-Request-Id":{"description":"Server-minted request id. Quote this in support tickets.","schema":{"type":"string","example":"req_01HXMQ7Z3K8Y2NABCDEFGHJKMP"}},"Aurous-Version":{"description":"API version pin applied to this response (YYYY-MM-DD).","schema":{"type":"string","example":"2026-08-26"}},"X-RateLimit-Limit":{"description":"Bucket capacity (max tokens) for this endpoint class.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Tokens remaining after this request.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Epoch seconds when the bucket would be full again, assuming no further requests.","schema":{"type":"integer","example":1700000060}}},"exampleType":"generated"},"244e87bc-664e-4724-bcfe-9244f98d5f26":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","description":"Error payload","required":["type","code","message","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad error category","example":"invalid_request","enum":["invalid_request","authentication","not_found","rate_limit","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable error code (programmatic discriminator). Closed-beta gate emits one of `account_pending`, `account_rejected`, `account_suspended` on 403.","example":"balance_too_low","enum":["invalid_request","missing_field","invalid_format","value_out_of_range","unsupported_lora_for_mode","generation_not_cancellable","prompt_blocked","reference_blocked","output_moderation_rejected","unknown_version","mutually_exclusive_input","character_not_ready","parameter_invalid_combination","character_status_invalid","character_busy","nudity_not_allowed","reference_unfit","reference_uploaded","build_requires_identity","style_retired","parameter_invalid","too_many_reference_images","action_not_available","upload_invalid","balance_too_low","idempotency_key_in_use","api_key_not_found","payload_too_large","missing_api_key","invalid_api_key","revoked_api_key","resource_not_found","forbidden_resource","account_pending","account_rejected","account_suspended","already_approved","already_rejected","already_suspended","invalid_reinstate_target","invalid_suspend_target","payment_not_reviewable","page_out_of_date","trial_already_used","cannot_moderate_admin","too_many_requests","concurrency_limit_exceeded","tpm_rate_limit_exceeded","internal_error","provider_unavailable","reference_check_unavailable","provider_timeout","provider_not_configured","invalid_time_range","invalid_bucket_width","too_many_buckets","too_many_group_by","invalid_filter","invalid_page_token","export_too_large","user_already_exists","self_invite_forbidden","invite_link_failed","invite_rate_limited","model_not_found","model_disabled","model_wrong_kind","max_tokens_exceeds_hard_cap","chat_model_misconfigured","embeddings_input_too_large","embeddings_unsupported_dimensions","pricing_frozen","provider_rate_limited","chat_provider_request_invalid","chat_provider_auth_failed","chat_provider_unavailable","max_input_tokens_exceeded","chat_provider_unknown_error","embeddings_provider_unknown_error","embeddings_batch_not_supported","embeddings_input_too_many_items","embeddings_video_unsupported","encoding_format_unsupported","missing_max_tokens_no_model_default","chat_cancel_target_not_found","chat_completion_not_found","chat_cancel_target_already_terminal","chat_cancel_target_not_cancellable","tool_choice_required_unsupported","response_format_too_large","response_format_too_deep","invalid_cursor","invalid_cursor_for_endpoint","model_slug_exists","output_expired","output_not_available","content_filtered","image_generation_failed","reference_media_invalid","reference_media_cap_reached","reference_fetch_failed","unsupported_auth_method","insufficient_scope","uploads_expired","character_resynthesize_in_progress","provider_unknown_error","first_frame_too_small"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable message","example":"Team available balance is 1.5 credits, generation requires 2.0.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","description":"Documentation link for this error code","example":"https://docs.aurous-labs.com/errors#balance_too_low","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string"},"request_id":{"type":"string","description":"Echoes Aurous-Request-Id — quote in support tickets","example":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"param":{"oneOf":[{"type":"object","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.0","typeLabel":"object"},{"type":"null","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.param","typeLabel":"object | null"},"reason":{"oneOf":[{"type":"string","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring> | null"},"detected_view":{"oneOf":[{"type":"string","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.detected_view","typeLabel":"enum\u003cstring> | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"balance_too_low","message":"Team available balance is 1.5 credits, generation requires 2.0.","doc_url":"https://docs.aurous-labs.com/errors#balance_too_low","request_id":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","param":"prompt","reason":"wrong_view","detected_view":"full_left"}}}},"exampleType":"generated"}},"headers":{"Aurous-Request-Id":{"description":"Server-minted request id. Quote this in support tickets.","schema":{"type":"string","example":"req_01HXMQ7Z3K8Y2NABCDEFGHJKMP"}},"Aurous-Version":{"description":"API version pin applied to this response (YYYY-MM-DD).","schema":{"type":"string","example":"2026-08-26"}},"X-RateLimit-Limit":{"description":"Bucket capacity (max tokens) for this endpoint class.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Tokens remaining after this request.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Epoch seconds when the bucket would be full again, assuming no further requests.","schema":{"type":"integer","example":1700000060}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 (rate limit), on 503 provider_unavailable, and on 409 character_busy. Prefer this over computing X-RateLimit-Reset − now.","schema":{"type":"integer","example":12}}},"exampleType":"generated"},"2b77e6b5-32b1-41e5-a9f4-bf3d4780eddc":{"description":"Character generation is temporarily unavailable, or the platform could not verify your account/billing state or prepare the request (for example, reference images) before dispatch — error.code is `provider_unavailable` in every case. Retry after the number of seconds in the `Retry-After` header.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","description":"Error payload","required":["type","code","message","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad error category","example":"invalid_request","enum":["invalid_request","authentication","not_found","rate_limit","server_error"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable error code (programmatic discriminator). Closed-beta gate emits one of `account_pending`, `account_rejected`, `account_suspended` on 403.","example":"balance_too_low","enum":["invalid_request","missing_field","invalid_format","value_out_of_range","unsupported_lora_for_mode","generation_not_cancellable","prompt_blocked","reference_blocked","output_moderation_rejected","unknown_version","mutually_exclusive_input","character_not_ready","parameter_invalid_combination","character_status_invalid","character_busy","nudity_not_allowed","reference_unfit","reference_uploaded","build_requires_identity","style_retired","parameter_invalid","too_many_reference_images","action_not_available","upload_invalid","balance_too_low","idempotency_key_in_use","api_key_not_found","payload_too_large","missing_api_key","invalid_api_key","revoked_api_key","resource_not_found","forbidden_resource","account_pending","account_rejected","account_suspended","already_approved","already_rejected","already_suspended","invalid_reinstate_target","invalid_suspend_target","payment_not_reviewable","page_out_of_date","trial_already_used","cannot_moderate_admin","too_many_requests","concurrency_limit_exceeded","tpm_rate_limit_exceeded","internal_error","provider_unavailable","reference_check_unavailable","provider_timeout","provider_not_configured","invalid_time_range","invalid_bucket_width","too_many_buckets","too_many_group_by","invalid_filter","invalid_page_token","export_too_large","user_already_exists","self_invite_forbidden","invite_link_failed","invite_rate_limited","model_not_found","model_disabled","model_wrong_kind","max_tokens_exceeds_hard_cap","chat_model_misconfigured","embeddings_input_too_large","embeddings_unsupported_dimensions","pricing_frozen","provider_rate_limited","chat_provider_request_invalid","chat_provider_auth_failed","chat_provider_unavailable","max_input_tokens_exceeded","chat_provider_unknown_error","embeddings_provider_unknown_error","embeddings_batch_not_supported","embeddings_input_too_many_items","embeddings_video_unsupported","encoding_format_unsupported","missing_max_tokens_no_model_default","chat_cancel_target_not_found","chat_completion_not_found","chat_cancel_target_already_terminal","chat_cancel_target_not_cancellable","tool_choice_required_unsupported","response_format_too_large","response_format_too_deep","invalid_cursor","invalid_cursor_for_endpoint","model_slug_exists","output_expired","output_not_available","content_filtered","image_generation_failed","reference_media_invalid","reference_media_cap_reached","reference_fetch_failed","unsupported_auth_method","insufficient_scope","uploads_expired","character_resynthesize_in_progress","provider_unknown_error","first_frame_too_small"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable message","example":"Team available balance is 1.5 credits, generation requires 2.0.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","description":"Documentation link for this error code","example":"https://docs.aurous-labs.com/errors#balance_too_low","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string"},"request_id":{"type":"string","description":"Echoes Aurous-Request-Id — quote in support tickets","example":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"param":{"oneOf":[{"type":"object","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.0","typeLabel":"object"},{"type":"null","description":"Field name when the error is parameter-scoped","example":"prompt","uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.param","typeLabel":"object | null"},"reason":{"oneOf":[{"type":"string","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Sub-code refining `code`, for codes that document one. Present today only on `reference_unfit`; `null` otherwise. Branch on `code` first and treat an unrecognized `reason` as a generic failure of that code.","enum":["too_small","extreme_aspect","no_person","multiple_people","no_face","wrong_view","nudity_mismatch"],"example":"wrong_view","uniqueKey":"error.reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.reason","typeLabel":"enum\u003cstring> | null"},"detected_view":{"oneOf":[{"type":"string","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Present only on `reference_unfit` with `reason: \"wrong_view\"`: the view the rejected image actually depicts. Offer the customer that view instead of asking for a new photo — the same upload can be re-sent to it.","enum":["head_front","upper_front","lower_front","upper_back","lower_back","full_left","full_front","full_right","other"],"example":"full_left","uniqueKey":"error.detected_view.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.detected_view","typeLabel":"enum\u003cstring> | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"type":"invalid_request","code":"balance_too_low","message":"Team available balance is 1.5 credits, generation requires 2.0.","doc_url":"https://docs.aurous-labs.com/errors#balance_too_low","request_id":"req_01HXMQ7Z3K8Y2VNABCDEFGHJKM","param":"prompt","reason":"wrong_view","detected_view":"full_left"}}}},"exampleType":"generated"}},"headers":{"Aurous-Request-Id":{"description":"Server-minted request id. Quote this in support tickets.","schema":{"type":"string","example":"req_01HXMQ7Z3K8Y2NABCDEFGHJKMP"}},"Aurous-Version":{"description":"API version pin applied to this response (YYYY-MM-DD).","schema":{"type":"string","example":"2026-08-26"}},"X-RateLimit-Limit":{"description":"Bucket capacity (max tokens) for this endpoint class.","schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"description":"Tokens remaining after this request.","schema":{"type":"integer","example":119}},"X-RateLimit-Reset":{"description":"Epoch seconds when the bucket would be full again, assuming no further requests.","schema":{"type":"integer","example":1700000060}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 (rate limit), on 503 provider_unavailable, and on 409 character_busy. Prefer this over computing X-RateLimit-Reset − now.","schema":{"type":"integer","example":12}}},"exampleType":"generated"}},"security":{"c222d6f7-efbf-47f4-83d6-034ba2647fec":{"api-key":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Your team API key (starts with `al_live_`).","scopes":[],"schemeName":"api-key"}}},"servers":{"3c5b35fe-5556-4c2f-b6fe-ccd0ce11e7d4":{"url":"https://api.aurous-labs.com","description":"Production"},"06ffff55-b13c-4345-afa1-017ab3f24f1d":{"url":"https://api.preprod.aurous-labs.com","description":"Preprod (staging)"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Your team API key (starts with `al_live_`).","scopes":[],"schemeName":"api-key"},"schema":{"title":"X-Api-Key","type":"string","description":"Your team API key (starts with `al_live_`).","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"api-key","name":"X-Api-Key"}],"title":"api-key"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"mayatech","siteName":"Aurous Labs","title":"Estimate the credit cost of a video generation - Aurous Labs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-23T06:19:12.623Z","originalFileLocation":"api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"For a fixed duration, estimated_cost.amount is the exact charge. For adaptive (duration: -1, the default), estimated_cost.adaptive is true and the price is a range: amount_min–amount_max, where amount equals amount_max (the credits held up front). You are charged for the delivered length and refunded the difference. Same validation as POST /v1/videos, but without side effects — no character synthesis, no reference materialization. A cast (subjects[]) is validated identically to POST /v1/videos — cast characters are existence/readiness-checked — and does not change the price. reference_video_url/reference_audio_url (a file_ from POST /v1/files or an HTTPS URL) are validated for shape and parameter-combination compatibility, identically to POST /v1/videos. A file_ additionally gets the same read-only checks the create call performs — it must exist, belong to your team (404 otherwise), and have been uploaded with the matching purpose (400 reference_media_invalid otherwise). The media bytes are never fetched at estimate time — the estimate never touches the network — so byte-level validation (format, duration, resolution) and HTTPS-URL fetching only happen on the actual create call. A reference-to-video request is never charged for enhance_prompt, even when enhance_prompt: true — the system composes the prompt around the reference and never invokes the enhancer, so the flat enhance adder never applies. Because the reference clip is never fetched, its real duration is unknown at estimate time, so a reference (video_task: reference) or extend request is priced at the 15-second input ceiling — an upper bound. The actual charge is typically lower: the create hold prices against the real clip length. As with the image estimate, this is a deliberate, conservative divergence on that path — a BYO-reference request is never charged more than this estimate. Auto-matching is not run here, and the quote can miss in EITHER direction. This endpoint prices exactly the request body you sent. Every structural validation rule is identical to POST /v1/videos, but model MATCHING is a create-time decision: if you omit video_lora_id and a video model then matches at create (from your prompt, or — when a first_frame_url is attached — from the image), the generation dispatches as a video-input generation and is priced accordingly. Which way the charge moves depends on what YOU pinned, because a matched model supplies default_duration, default_resolution AND default_ratio for whatever you left out, and all three are priced: - You omitted duration/resolution (the usual shape for a bare first_frame_url request): with no model, this endpoint has to price adaptive duration (the 15-second ceiling) at 1080p, and the matched model then brings a shorter, smaller default. The quote is an upper bound that can substantially OVER-state — measured on the first-frame path: amount 827.26 against an actual settled charge of 279.91. On these (adaptive) requests, amount_min/amount_max is the honest range to plan against; amount is only the ceiling that gets held. - You sent duration and resolution explicitly: your values win over the model defaults, so a match can only ADD the motion-reference input leg to the price. On that shape the charge genuinely exceeds this quote. Pin video_lora_id whenever you need the quote to be exact — that is the only value that removes matching from the create path entirely. video_lora_id: null opts out of IMAGE-based matching only, so on a request without a first_frame_url it does NOT make this quote exact; and on a request WITH one it also declines the model defaults, so an otherwise-bare request prices (and charges) the adaptive-15s/1080p fallback. This is inherent to auto-matching and is not specific to first frames. Video and image rates are both DB-driven. Video is priced from the live per-model rate table — see GET /v1/models for the current per-model credit rates — NOT frozen in the Aurous-Version rate card. Image pricing works the same way: the pixel-tiered rate card behind POST /v1/images/estimate is also read live from the registry and MAY change without an Aurous-Version bump — the same pricing asymmetry the LLM chat/embeddings surfaces use (spec §6.4). Pin an Aurous-Version for stable request/response shapes; call the matching estimate endpoint for an authoritative current-price quote immediately before you generate.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Aurous Labs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/mayatech/EexJ-zapST-7nua7/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/mayatech/EexJ-zapST-7nua7/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/mayatech/EexJ-zapST-7nua7/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/mayatech/EexJ-zapST-7nua7/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/mayatech/EexJ-zapST-7nua7/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/mayatech/EexJ-zapST-7nua7/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/mayatech/EexJ-zapST-7nua7/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/mayatech/EexJ-zapST-7nua7/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/mayatech/EexJ-zapST-7nua7/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Estimate the credit cost of a video generation - Aurous Labs\">\u003cmeta data-mint-head property=\"og:description\" content=\"For a fixed duration, estimated_cost.amount is the exact charge. For adaptive (duration: -1, the default), estimated_cost.adaptive is true and the price is a range: amount_min–amount_max, where amount equals amount_max (the credits held up front). You are charged for the delivered length and refunded the difference. Same validation as POST /v1/videos, but without side effects — no character synthesis, no reference materialization. A cast (subjects[]) is validated identically to POST /v1/videos — cast characters are existence/readiness-checked — and does not change the price. reference_video_url/reference_audio_url (a file_ from POST /v1/files or an HTTPS URL) are validated for shape and parameter-combination compatibility, identically to POST /v1/videos. A file_ additionally gets the same read-only checks the create call performs — it must exist, belong to your team (404 otherwise), and have been uploaded with the matching purpose (400 reference_media_invalid otherwise). The media bytes are never fetched at estimate time — the estimate never touches the network — so byte-level validation (format, duration, resolution) and HTTPS-URL fetching only happen on the actual create call. A reference-to-video request is never charged for enhance_prompt, even when enhance_prompt: true — the system composes the prompt around the reference and never invokes the enhancer, so the flat enhance adder never applies. Because the reference clip is never fetched, its real duration is unknown at estimate time, so a reference (video_task: reference) or extend request is priced at the 15-second input ceiling — an upper bound. The actual charge is typically lower: the create hold prices against the real clip length. As with the image estimate, this is a deliberate, conservative divergence on that path — a BYO-reference request is never charged more than this estimate. Auto-matching is not run here, and the quote can miss in EITHER direction. This endpoint prices exactly the request body you sent. Every structural validation rule is identical to POST /v1/videos, but model MATCHING is a create-time decision: if you omit video_lora_id and a video model then matches at create (from your prompt, or — when a first_frame_url is attached — from the image), the generation dispatches as a video-input generation and is priced accordingly. Which way the charge moves depends on what YOU pinned, because a matched model supplies default_duration, default_resolution AND default_ratio for whatever you left out, and all three are priced: - You omitted duration/resolution (the usual shape for a bare first_frame_url request): with no model, this endpoint has to price adaptive duration (the 15-second ceiling) at 1080p, and the matched model then brings a shorter, smaller default. The quote is an upper bound that can substantially OVER-state — measured on the first-frame path: amount 827.26 against an actual settled charge of 279.91. On these (adaptive) requests, amount_min/amount_max is the honest range to plan against; amount is only the ceiling that gets held. - You sent duration and resolution explicitly: your values win over the model defaults, so a match can only ADD the motion-reference input leg to the price. On that shape the charge genuinely exceeds this quote. Pin video_lora_id whenever you need the quote to be exact — that is the only value that removes matching from the create path entirely. video_lora_id: null opts out of IMAGE-based matching only, so on a request without a first_frame_url it does NOT make this quote exact; and on a request WITH one it also declines the model defaults, so an otherwise-bare request prices (and charges) the adaptive-15s/1080p fallback. This is inherent to auto-matching and is not specific to first frames. Video and image rates are both DB-driven. Video is priced from the live per-model rate table — see GET /v1/models for the current per-model credit rates — NOT frozen in the Aurous-Version rate card. Image pricing works the same way: the pixel-tiered rate card behind POST /v1/images/estimate is also read live from the registry and MAY change without an Aurous-Version bump — the same pricing asymmetry the LLM chat/embeddings surfaces use (spec §6.4). Pin an Aurous-Version for stable request/response shapes; call the matching estimate endpoint for an authoritative current-price quote immediately before you generate.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Aurous Labs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.aurous-labs.com/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://mayatech.mintlify.app/_mintlify/api/og/v2?division=Videos\u0026amp;title=Estimate+the+credit+cost+of+a+video+generation\u0026amp;description=For+a+fixed+duration%2C+%60estimated_cost.amount%60+is+the+exact+charge.+For+adaptive+%28%60duration%3A+-1%60%2C+the+default%29%2C+%60estimated_cost.adaptive%60+is+%60true%60+and+the+price\u0026amp;theme=a84e348be4cda03ca3be04c0\u0026amp;signature=cf2f1f88841e5e5a2b14355b684b3565c912f1597d64e2d1da0cab3993fd4229\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Estimate the credit cost of a video generation - Aurous Labs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"For a fixed duration, estimated_cost.amount is the exact charge. For adaptive (duration: -1, the default), estimated_cost.adaptive is true and the price is a range: amount_min–amount_max, where amount equals amount_max (the credits held up front). You are charged for the delivered length and refunded the difference. Same validation as POST /v1/videos, but without side effects — no character synthesis, no reference materialization. A cast (subjects[]) is validated identically to POST /v1/videos — cast characters are existence/readiness-checked — and does not change the price. reference_video_url/reference_audio_url (a file_ from POST /v1/files or an HTTPS URL) are validated for shape and parameter-combination compatibility, identically to POST /v1/videos. A file_ additionally gets the same read-only checks the create call performs — it must exist, belong to your team (404 otherwise), and have been uploaded with the matching purpose (400 reference_media_invalid otherwise). The media bytes are never fetched at estimate time — the estimate never touches the network — so byte-level validation (format, duration, resolution) and HTTPS-URL fetching only happen on the actual create call. A reference-to-video request is never charged for enhance_prompt, even when enhance_prompt: true — the system composes the prompt around the reference and never invokes the enhancer, so the flat enhance adder never applies. Because the reference clip is never fetched, its real duration is unknown at estimate time, so a reference (video_task: reference) or extend request is priced at the 15-second input ceiling — an upper bound. The actual charge is typically lower: the create hold prices against the real clip length. As with the image estimate, this is a deliberate, conservative divergence on that path — a BYO-reference request is never charged more than this estimate. Auto-matching is not run here, and the quote can miss in EITHER direction. This endpoint prices exactly the request body you sent. Every structural validation rule is identical to POST /v1/videos, but model MATCHING is a create-time decision: if you omit video_lora_id and a video model then matches at create (from your prompt, or — when a first_frame_url is attached — from the image), the generation dispatches as a video-input generation and is priced accordingly. Which way the charge moves depends on what YOU pinned, because a matched model supplies default_duration, default_resolution AND default_ratio for whatever you left out, and all three are priced: - You omitted duration/resolution (the usual shape for a bare first_frame_url request): with no model, this endpoint has to price adaptive duration (the 15-second ceiling) at 1080p, and the matched model then brings a shorter, smaller default. The quote is an upper bound that can substantially OVER-state — measured on the first-frame path: amount 827.26 against an actual settled charge of 279.91. On these (adaptive) requests, amount_min/amount_max is the honest range to plan against; amount is only the ceiling that gets held. - You sent duration and resolution explicitly: your values win over the model defaults, so a match can only ADD the motion-reference input leg to the price. On that shape the charge genuinely exceeds this quote. Pin video_lora_id whenever you need the quote to be exact — that is the only value that removes matching from the create path entirely. video_lora_id: null opts out of IMAGE-based matching only, so on a request without a first_frame_url it does NOT make this quote exact; and on a request WITH one it also declines the model defaults, so an otherwise-bare request prices (and charges) the adaptive-15s/1080p fallback. This is inherent to auto-matching and is not specific to first frames. Video and image rates are both DB-driven. Video is priced from the live per-model rate table — see GET /v1/models for the current per-model credit rates — NOT frozen in the Aurous-Version rate card. Image pricing works the same way: the pixel-tiered rate card behind POST /v1/images/estimate is also read live from the registry and MAY change without an Aurous-Version bump — the same pricing asymmetry the LLM chat/embeddings surfaces use (spec §6.4). Pin an Aurous-Version for stable request/response shapes; call the matching estimate endpoint for an authoritative current-price quote immediately before you generate.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://mayatech.mintlify.app/_mintlify/api/og/v2?division=Videos\u0026amp;title=Estimate+the+credit+cost+of+a+video+generation\u0026amp;description=For+a+fixed+duration%2C+%60estimated_cost.amount%60+is+the+exact+charge.+For+adaptive+%28%60duration%3A+-1%60%2C+the+default%29%2C+%60estimated_cost.adaptive%60+is+%60true%60+and+the+price\u0026amp;theme=a84e348be4cda03ca3be04c0\u0026amp;signature=cf2f1f88841e5e5a2b14355b684b3565c912f1597d64e2d1da0cab3993fd4229\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/mayatech/EexJ-zapST-7nua7/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Aurous Labs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#7C3AED\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.aurous-labs.com/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.aurous-labs.com/#organization\",\"name\":\"Aurous Labs\",\"url\":\"https://docs.aurous-labs.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/mayatech/yW79tCRlCpJDDgoM/logo-light.png?fit=max\u0026auto=format\u0026n=yW79tCRlCpJDDgoM\u0026q=85\u0026s=f3dfa1506dde2b022b4496c2c2f55104\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.aurous-labs.com#website\",\"name\":\"Aurous Labs\",\"url\":\"https://docs.aurous-labs.com\",\"publisher\":{\"@id\":\"https://docs.aurous-labs.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.aurous-labs.com/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation#webpage\",\"url\":\"https://docs.aurous-labs.com/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation\",\"name\":\"Estimate the credit cost of a video generation\",\"description\":\"For a fixed duration, estimated_cost.amount is the exact charge. For adaptive (duration: -1, the default), estimated_cost.adaptive is true and the price is a range: amount_min–amount_max, where amount equals amount_max (the credits held up front). You are charged for the delivered length and refunded the difference. Same validation as POST /v1/videos, but without side effects — no character synthesis, no reference materialization. A cast (subjects[]) is validated identically to POST /v1/videos — cast characters are existence/readiness-checked — and does not change the price. reference_video_url/reference_audio_url (a file_ from POST /v1/files or an HTTPS URL) are validated for shape and parameter-combination compatibility, identically to POST /v1/videos. A file_ additionally gets the same read-only checks the create call performs — it must exist, belong to your team (404 otherwise), and have been uploaded with the matching purpose (400 reference_media_invalid otherwise). The media bytes are never fetched at estimate time — the estimate never touches the network — so byte-level validation (format, duration, resolution) and HTTPS-URL fetching only happen on the actual create call. A reference-to-video request is never charged for enhance_prompt, even when enhance_prompt: true — the system composes the prompt around the reference and never invokes the enhancer, so the flat enhance adder never applies. Because the reference clip is never fetched, its real duration is unknown at estimate time, so a reference (video_task: reference) or extend request is priced at the 15-second input ceiling — an upper bound. The actual charge is typically lower: the create hold prices against the real clip length. As with the image estimate, this is a deliberate, conservative divergence on that path — a BYO-reference request is never charged more than this estimate. Auto-matching is not run here, and the quote can miss in EITHER direction. This endpoint prices exactly the request body you sent. Every structural validation rule is identical to POST /v1/videos, but model MATCHING is a create-time decision: if you omit video_lora_id and a video model then matches at create (from your prompt, or — when a first_frame_url is attached — from the image), the generation dispatches as a video-input generation and is priced accordingly. Which way the charge moves depends on what YOU pinned, because a matched model supplies default_duration, default_resolution AND default_ratio for whatever you left out, and all three are priced: - You omitted duration/resolution (the usual shape for a bare first_frame_url request): with no model, this endpoint has to price adaptive duration (the 15-second ceiling) at 1080p, and the matched model then brings a shorter, smaller default. The quote is an upper bound that can substantially OVER-state — measured on the first-frame path: amount 827.26 against an actual settled charge of 279.91. On these (adaptive) requests, amount_min/amount_max is the honest range to plan against; amount is only the ceiling that gets held. - You sent duration and resolution explicitly: your values win over the model defaults, so a match can only ADD the motion-reference input leg to the price. On that shape the charge genuinely exceeds this quote. Pin video_lora_id whenever you need the quote to be exact — that is the only value that removes matching from the create path entirely. video_lora_id: null opts out of IMAGE-based matching only, so on a request without a first_frame_url it does NOT make this quote exact; and on a request WITH one it also declines the model defaults, so an otherwise-bare request prices (and charges) the adaptive-15s/1080p fallback. This is inherent to auto-matching and is not specific to first frames. Video and image rates are both DB-driven. Video is priced from the live per-model rate table — see GET /v1/models for the current per-model credit rates — NOT frozen in the Aurous-Version rate card. Image pricing works the same way: the pixel-tiered rate card behind POST /v1/images/estimate is also read live from the registry and MAY change without an Aurous-Version bump — the same pricing asymmetry the LLM chat/embeddings surfaces use (spec §6.4). Pin an Aurous-Version for stable request/response shapes; call the matching estimate endpoint for an authoritative current-price quote immediately before you generate.\",\"dateModified\":\"2026-10-23T06:19:12.623Z\",\"isPartOf\":{\"@id\":\"https://docs.aurous-labs.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.aurous-labs.com/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.aurous-labs.com/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.aurous-labs.com/api-reference/openapi\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Videos\",\"item\":\"https://docs.aurous-labs.com/api-reference/videos/create-video\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Estimate the credit cost of a video generation\",\"item\":\"https://docs.aurous-labs.com/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.aurous-labs.com/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation#apireference\",\"headline\":\"Estimate the credit cost of a video generation\",\"name\":\"Estimate the credit cost of a video generation\",\"description\":\"For a fixed duration, estimated_cost.amount is the exact charge. For adaptive (duration: -1, the default), estimated_cost.adaptive is true and the price is a range: amount_min–amount_max, where amount equals amount_max (the credits held up front). You are charged for the delivered length and refunded the difference. Same validation as POST /v1/videos, but without side effects — no character synthesis, no reference materialization. A cast (subjects[]) is validated identically to POST /v1/videos — cast characters are existence/readiness-checked — and does not change the price. reference_video_url/reference_audio_url (a file_ from POST /v1/files or an HTTPS URL) are validated for shape and parameter-combination compatibility, identically to POST /v1/videos. A file_ additionally gets the same read-only checks the create call performs — it must exist, belong to your team (404 otherwise), and have been uploaded with the matching purpose (400 reference_media_invalid otherwise). The media bytes are never fetched at estimate time — the estimate never touches the network — so byte-level validation (format, duration, resolution) and HTTPS-URL fetching only happen on the actual create call. A reference-to-video request is never charged for enhance_prompt, even when enhance_prompt: true — the system composes the prompt around the reference and never invokes the enhancer, so the flat enhance adder never applies. Because the reference clip is never fetched, its real duration is unknown at estimate time, so a reference (video_task: reference) or extend request is priced at the 15-second input ceiling — an upper bound. The actual charge is typically lower: the create hold prices against the real clip length. As with the image estimate, this is a deliberate, conservative divergence on that path — a BYO-reference request is never charged more than this estimate. Auto-matching is not run here, and the quote can miss in EITHER direction. This endpoint prices exactly the request body you sent. Every structural validation rule is identical to POST /v1/videos, but model MATCHING is a create-time decision: if you omit video_lora_id and a video model then matches at create (from your prompt, or — when a first_frame_url is attached — from the image), the generation dispatches as a video-input generation and is priced accordingly. Which way the charge moves depends on what YOU pinned, because a matched model supplies default_duration, default_resolution AND default_ratio for whatever you left out, and all three are priced: - You omitted duration/resolution (the usual shape for a bare first_frame_url request): with no model, this endpoint has to price adaptive duration (the 15-second ceiling) at 1080p, and the matched model then brings a shorter, smaller default. The quote is an upper bound that can substantially OVER-state — measured on the first-frame path: amount 827.26 against an actual settled charge of 279.91. On these (adaptive) requests, amount_min/amount_max is the honest range to plan against; amount is only the ceiling that gets held. - You sent duration and resolution explicitly: your values win over the model defaults, so a match can only ADD the motion-reference input leg to the price. On that shape the charge genuinely exceeds this quote. Pin video_lora_id whenever you need the quote to be exact — that is the only value that removes matching from the create path entirely. video_lora_id: null opts out of IMAGE-based matching only, so on a request without a first_frame_url it does NOT make this quote exact; and on a request WITH one it also declines the model defaults, so an otherwise-bare request prices (and charges) the adaptive-15s/1080p fallback. This is inherent to auto-matching and is not specific to first frames. Video and image rates are both DB-driven. Video is priced from the live per-model rate table — see GET /v1/models for the current per-model credit rates — NOT frozen in the Aurous-Version rate card. Image pricing works the same way: the pixel-tiered rate card behind POST /v1/images/estimate is also read live from the registry and MAY change without an Aurous-Version bump — the same pricing asymmetry the LLM chat/embeddings surfaces use (spec §6.4). Pin an Aurous-Version for stable request/response shapes; call the matching estimate endpoint for an authoritative current-price quote immediately before you generate.\",\"url\":\"https://docs.aurous-labs.com/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation\",\"mainEntityOfPage\":{\"@id\":\"https://docs.aurous-labs.com/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation#webpage\"},\"dateModified\":\"2026-10-23T06:19:12.623Z\",\"publisher\":{\"@id\":\"https://docs.aurous-labs.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.aurous-labs.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Aurous Labs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Aurous Labs","nav":{"global":null,"groups":[{"group":"Get started","pages":[{"title":"Quickstart","href":"/quickstart"},{"title":"Authentication","href":"/authentication"}]},{"group":"Guides","pages":[{"title":"Drop in for OpenAI","href":"/guides/openai-drop-in"},{"title":"Choose a model","href":"/guides/model-comparison"},{"title":"How we count tokens","href":"/guides/how-we-count-tokens"},{"title":"Cost transparency","href":"/guides/cost-transparency"},{"title":"Error handling","href":"/guides/error-handling"},{"title":"Composition acts","href":"/guides/actions"}]},{"group":"Concepts","pages":[{"title":"Errors","href":"/errors"},{"title":"Idempotency","href":"/idempotency"},{"title":"Rate limits","href":"/rate-limits"},{"title":"Webhooks","href":"/webhooks"}]},{"group":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/openapi"},{"group":"Images","pages":[{"title":"Models \u0026 pricing","href":"/api-reference/images/models-and-pricing"},{"title":"Create an image","openapi":"POST /v1/images","href":"/api-reference/images/create-image"},{"title":"List your generation history","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/images","href":"/api-reference/public-api-v1/list-your-generation-history"},{"title":"Retrieve an image","openapi":"GET /v1/images/{id}","href":"/api-reference/images/retrieve-image"},{"title":"Cancel a pending or processing generation","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/images/{id}/cancel","href":"/api-reference/public-api-v1/cancel-a-pending-or-processing-generation"},{"title":"Estimate the credit cost of an image generation","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/images/estimate","href":"/api-reference/public-api-v1/estimate-the-credit-cost-of-an-image-generation"},{"title":"Get a single generated image","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/images/{id}/output/{n}","href":"/api-reference/images-proxy/get-a-single-generated-image"}]},{"group":"Chat completions","pages":[{"title":"Chat completions","href":"/api-reference/chat/overview"},{"title":"Streaming","href":"/api-reference/chat/streaming"},{"title":"Tools and function calling","href":"/api-reference/chat/tools"},{"title":"Multimodal input","href":"/api-reference/chat/multimodal"},{"title":"Reasoning effort","href":"/api-reference/chat/reasoning"},{"title":"Structured output","href":"/api-reference/chat/structured-output"},{"title":"Chat idempotency","href":"/api-reference/chat/idempotency"},{"title":"Chat cancellation","href":"/api-reference/chat/cancellation"},{"title":"Pricing","href":"/api-reference/chat/pricing"},{"title":"Create a chat completion","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/chat/completions","href":"/api-reference/chat/create-a-chat-completion"},{"title":"Retrieve a stored chat completion","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/chat/completions/{id}","href":"/api-reference/chat/retrieve-a-stored-chat-completion"},{"title":"Cancel an in-flight chat completion","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/chat/completions/{id}/cancel","href":"/api-reference/chat/cancel-an-in-flight-chat-completion"},{"title":"List chat, embedding, video, and image models","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/models","href":"/api-reference/models/list-chat-embedding-video-and-image-models"}]},{"group":"Embeddings","pages":[{"title":"Embeddings","href":"/api-reference/embeddings/overview"},{"title":"Multimodal embeddings","href":"/api-reference/embeddings/multimodal"},{"title":"Output Dimensions","href":"/api-reference/embeddings/dimensions"},{"title":"Embedding limits","href":"/api-reference/embeddings/limits"},{"title":"URL fetching for image_url","href":"/api-reference/embeddings/url-fetching"},{"title":"OpenAI batch input is not supported","href":"/api-reference/embeddings/openai-batch-incompat"},{"title":"Pricing","href":"/api-reference/embeddings/pricing"},{"title":"Estimate Cost Before Embedding","href":"/api-reference/embeddings/estimate"},{"title":"Create embeddings","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/embeddings","href":"/api-reference/embeddings/create-embeddings"},{"title":"Estimate embedding credits","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/embeddings/estimate","href":"/api-reference/embeddings/estimate-embedding-credits"}]},{"group":"Characters","pages":[{"title":"Views and lifecycle","href":"/api-reference/characters/views-and-lifecycle"},{"title":"List character views","openapi":"GET /v1/characters/views","href":"/api-reference/characters/list-views"},{"title":"Mint a character upload URL","openapi":"POST /v1/characters/uploads/init","href":"/api-reference/characters/upload-init"},{"title":"Classify an uploaded ref","openapi":"POST /v1/characters/uploads/classify","href":"/api-reference/characters/upload-classify"},{"title":"Create a character draft","openapi":"POST /v1/characters/drafts","href":"/api-reference/characters/create-draft"},{"title":"Put a photo into a view","openapi":"PUT /v1/characters/{id}/refs/{view}","href":"/api-reference/characters/put-ref"},{"title":"Remove a view from a draft","openapi":"DELETE /v1/characters/{id}/refs/{view}","href":"/api-reference/characters/delete-ref"},{"title":"Build a character","openapi":"POST /v1/characters/{id}/build","href":"/api-reference/characters/build-character"},{"title":"Create a character","openapi":"POST /v1/characters","href":"/api-reference/characters/create-character"},{"title":"List characters","openapi":"GET /v1/characters","href":"/api-reference/characters/list-characters"},{"title":"Retrieve a character","openapi":"GET /v1/characters/{id}","href":"/api-reference/characters/retrieve-character"},{"title":"Update a character","openapi":"PATCH /v1/characters/{id}","href":"/api-reference/characters/update-character"},{"title":"Delete a character","openapi":"DELETE /v1/characters/{id}","href":"/api-reference/characters/delete-character"},{"title":"Regenerate a single ref pose","openapi":"POST /v1/characters/{id}/refs/regenerate","href":"/api-reference/characters/regenerate-ref"},{"title":"Regenerate a view","openapi":"POST /v1/characters/{id}/refs/{view}/regenerate","href":"/api-reference/characters/regenerate-view"},{"title":"Save a reviewing character","openapi":"POST /v1/characters/{id}/save","href":"/api-reference/characters/save-character"},{"title":"Resynthesize a character","openapi":"POST /v1/characters/{id}/resynthesize","href":"/api-reference/characters/resynthesize-character"}]},{"group":"Videos","pages":[{"title":"Create a video","description":"Submit a video generation — text-to-video, image-to-video, or subject-driven with a saved character or reference images.","openapi":"POST /v1/videos","href":"/api-reference/videos/create-video"},{"title":"Estimate the credit cost of a video generation","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/videos/estimate","href":"/api-reference/public-api-v1/estimate-the-credit-cost-of-a-video-generation"},{"title":"Get the generated video","description":"Returns the generated video. Outputs are kept for up to 30 days after generation (an output that could not be copied expires with the provider link: ~7 days for images, ~24 hours for videos); after that the endpoint returns `410 Gone` with `code: output_expired`. If the generation never produced an output (status `failed`, `cancelled`, `moderation_rejected`, or polling-timeout `expired`), this endpoint returns `422 Unprocessable Entity` with `code: output_not_available` — check `GET /v1/images/{id}` for the failure reason (the generation lookup endpoint accepts both `img_*` and `vid_*` IDs; there is no `GET /v1/videos/{id}`).\n\nRange requests (`Range: bytes=…`) are answered with `206 Partial Content` so HTML5 `\u003cvideo>` seeking works.\n\nAuthentication: send a Bearer JWT or `X-Api-Key` header, OR pass the short-lived signed `?token=` query param the API mints when it serves the video URL. The signed-token path lets browser `\u003cvideo>` tags load the URL without custom headers.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/videos/{id}/output","href":"/api-reference/videos-proxy/get-the-generated-video"}]},{"group":"Seedance (raw)","pages":[{"title":"Seedance raw API","href":"/api-reference/seedance/overview"},{"title":"Models \u0026 pricing","href":"/api-reference/seedance/models-and-pricing"},{"title":"Create a task","href":"/api-reference/seedance/create-task"},{"title":"Retrieve a task","href":"/api-reference/seedance/retrieve-task"},{"title":"List tasks","href":"/api-reference/seedance/list-tasks"},{"title":"Cancel or delete a task","href":"/api-reference/seedance/cancel-delete"},{"title":"Differences from the native API","href":"/api-reference/seedance/differences"}]},{"group":"Files","pages":[{"title":"Upload a reference file","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/files","href":"/api-reference/public-api-v1/upload-a-reference-file"},{"title":"Get a file (re-mints a fresh 1h signed URL)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/files/{id}","href":"/api-reference/public-api-v1/get-a-file-re-mints-a-fresh-1h-signed-url"},{"title":"Immediately purge a file","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/files/{id}","href":"/api-reference/public-api-v1/immediately-purge-a-file"}]},{"group":"LoRAs","pages":[{"title":"List available LoRA styles","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/loras","href":"/api-reference/public-api-v1/list-available-lora-styles"},{"title":"Get a LoRA style by ID or slug","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/loras/{id}","href":"/api-reference/public-api-v1/get-a-lora-style-by-id-or-slug"},{"title":"List available video models","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/video_loras","href":"/api-reference/public-api-v1/list-available-video-models"},{"title":"Get a video model by ID or slug","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/video_loras/{id}","href":"/api-reference/public-api-v1/get-a-video-model-by-id-or-slug"}]},{"group":"Composition acts","pages":[{"title":"List available composition acts","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/actions","href":"/api-reference/public-api-v1/list-available-composition-acts"},{"title":"Get a composition act by ID","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/actions/{id}","href":"/api-reference/public-api-v1/get-a-composition-act-by-id"}]},{"group":"Webhooks","pages":[{"title":"Register a webhook endpoint","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/webhook_endpoints","href":"/api-reference/public-api-v1/register-a-webhook-endpoint"},{"title":"List webhook endpoints","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/webhook_endpoints","href":"/api-reference/public-api-v1/list-webhook-endpoints"},{"title":"Get a webhook endpoint","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/webhook_endpoints/{id}","href":"/api-reference/public-api-v1/get-a-webhook-endpoint"},{"title":"Update a webhook endpoint","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/webhook_endpoints/{id}","href":"/api-reference/public-api-v1/update-a-webhook-endpoint"},{"title":"Delete a webhook endpoint","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /v1/webhook_endpoints/{id}","href":"/api-reference/public-api-v1/delete-a-webhook-endpoint"},{"title":"Fire a synthetic test delivery","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/webhook_endpoints/{id}/test","href":"/api-reference/public-api-v1/fire-a-synthetic-test-delivery"},{"title":"Rotate the signing secret","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/webhook_endpoints/{id}/rotate_secret","href":"/api-reference/public-api-v1/rotate-the-signing-secret"},{"title":"List delivery attempts for a webhook endpoint","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/webhook_endpoints/{id}/deliveries","href":"/api-reference/public-api-v1/list-delivery-attempts-for-a-webhook-endpoint"}]},{"group":"Usage analytics","pages":[{"title":"Usage analytics","href":"/api-reference/usage/overview"},{"title":"Usage pagination","href":"/api-reference/usage/pagination"},{"title":"Per-request usage event stream","href":"/api-reference/usage/event-stream"},{"title":"Aggregated usage metrics","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/usage","href":"/api-reference/public-api-v1/aggregated-usage-metrics"},{"title":"List credit-ledger events","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/usage/events","href":"/api-reference/public-api-v1/list-credit-ledger-events"}]},{"group":"Account","pages":[{"title":"Get your team info","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/team","href":"/api-reference/public-api-v1/get-your-team-info"},{"title":"Get credit balance","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/balance","href":"/api-reference/public-api-v1/get-credit-balance"}]}]},{"group":"Resources","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Estimate the credit cost of a video generation - Aurous Labs","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DCDCdBVX.js","utils-ME8dDnLe.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-0e84ACsd.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-wgRBj-ia.js","snippetPresets-C11Sgb-o.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-C0lapOpP.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-ZeRQV8fF.js","shallow-BupWh095.js","getApiPlaygroundDisplay-BnYQO2Ss.js","CodeSnippet-RKKOc8c_.js","CodeSnippets-Drf_m8wS.js","Page-Bevw23-4.js","getPastedJson-u6QiPzNZ.js","icon-Bb-CBSxO.js","MethodPill-F7l5AI7V.js","DuplicateIcon-IiAXkdSg.js","createIcon-FliI8EBc.js","DynamicMarkdown-B62XqCSI.js","SectionHeading-Dj31pT03.js","axios-vUo_bRtp.js","Markdown-BOgQCTwD.js","clsx-BIWXJmsZ.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DKZWslLH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-UDqbR6xh.js"]}