Calendar-dated API version pin. New integrations should pin 2026-05-01 to opt into the newest response shapes. For back-compat the server also accepts requests with no header and resolves them to the current default (today: 2026-04-12); that default advances on each sunset date. Any unsupported value returns 400 unsupported_version.
Available options:
2026-04-12,
2026-05-01
Example:
"2026-05-01"
Response
Successful Response
The model registry the model parameters validate against.
The arrays serialize the same registries the generate verbs resolve
against, so a capability stated here is a capability the request validator
accepts — nothing is transcribed by hand.
Video model capability descriptors, for generate-video: per-mode aspect/resolution/duration envelopes, audio and seed support, input-image and reference limits, the validated model_params controls, and how each mode's cost is metered. Exact credit amounts are computed from the resolved request by the usage pipeline at the team's credit rate — the billing block reports the basis and the knobs that move it, not a flat price.
Audio model capability descriptors, for generate-audio: which of the three modes each model serves, and per mode the duration envelope, the full preset-voice menu, the prompt-character ceiling, the sample limit, and how the cost is metered. No deprecated id alias here — video's exists only because its bare-id array shipped first.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Moda","description":"Guides, API reference, and MCP server docs for Moda — the AI design tool for social posts, slide decks, and visual content.","colors":{"primary":"#850AC2","light":"#C155F6","dark":"#420561"},"logo":{"light":"https://mintcdn.com/moda-997c0526/_eKavTfp2ZbkSuMz/images/chameleon.svg?fit=max\u0026auto=format\u0026n=_eKavTfp2ZbkSuMz\u0026q=85\u0026s=d0de9a6ddda2829d62cfe525fbb38722","dark":"https://mintcdn.com/moda-997c0526/_eKavTfp2ZbkSuMz/images/chameleon.svg?fit=max\u0026auto=format\u0026n=_eKavTfp2ZbkSuMz\u0026q=85\u0026s=d0de9a6ddda2829d62cfe525fbb38722","href":"https://moda.app"},"favicon":"https://mintcdn.com/moda-997c0526/_eKavTfp2ZbkSuMz/images/chameleon.svg?fit=max\u0026auto=format\u0026n=_eKavTfp2ZbkSuMz\u0026q=85\u0026s=d0de9a6ddda2829d62cfe525fbb38722","appearance":{"default":"light"},"footer":{"socials":{"x":"https://x.com/trymoda","linkedin":"https://www.linkedin.com/company/trymoda","instagram":"https://www.instagram.com/modacanvas"}},"search":{"prompt":"Search Moda docs"},"seo":{"indexing":"all"},"fonts":{"family":"Inter","weight":400},"integrations":{"posthog":{"apiKey":"phc_5H829H6PUnXGRYUhogPS4rBboCirSiz0SqaEvB5OUco","apiHost":"https://us.i.posthog.com"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Moda app","icon":"arrow-up-right-from-square","href":"https://moda.app"},{"anchor":"Support","icon":"life-ring","href":"mailto:support@moda.app"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"moda-997c0526","hasAudioNarration":false,"actualSubdomain":"moda-997c0526","customDomains":["docs.moda.app"],"gitSource":{"type":"github","owner":"nullframe","repo":"studio","deployBranch":"main","contentDirectory":"mintlify","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"DISABLED"},"CONTEXTUAL_FEEDBACK":{"status":"DISABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af6000d2cb39c06ba022de9","clientVersion":"0.0.4124","searchFilterCounts":[{"language":"default","tag":"API Reference","count":183},{"language":"default","tag":"Help Center","count":28},{"language":"default","tag":"canvas-actions","count":28},{"language":"default","tag":"cloud-computers","count":24},{"language":"default","tag":"media","count":22},{"language":"default","tag":"websites","count":12},{"language":"default","tag":"MCP Server (Legacy)","count":11},{"language":"default","tag":"canvases","count":11},{"language":"default","tag":"drive","count":10},{"language":"default","tag":"voices","count":10}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","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":"rbac-expansion","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":"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":"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":"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":"editor-metadata","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},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","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}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/media/list-models","slug":"/api-reference/media/list-models","pageMetadata":{"title":"List Models","description":"The model registry the ``model`` parameters validate against.","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /media/models","href":"/api-reference/media/list-models","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"The model registry the \", _jsx(_components.code, {\n children: \"model\"\n }), \" parameters validate against.\"]\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":"List Models","description":"The model registry the ``model`` parameters validate against.","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /media/models","href":"/api-reference/media/list-models","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["media"],"summary":"List Models","description":"The model registry the ``model`` parameters validate against.","operationId":"mediaListModels","responses":{"200":"c4be4015-0c18-44b3-8096-5b5589d85276","401":"203cc441-00c5-473a-b4fa-fdfe53718420","402":"a43c10ba-7731-4ca7-9f56-3f92d1299cab","403":"803da551-a195-423d-8e28-2ef92d6642ec","404":"fd2bcf28-60d7-4af4-82cb-9e7e44aed8d7","409":"0a2da372-51d7-4880-a319-62d38fccd835","422":"2fc4f1e8-3952-4ac7-bcfc-cbc2301902c3","429":"38fca15c-45c7-4f7d-9118-d3796f1fe32e","500":"a13bb8b3-f980-4458-83b6-db80856c63ec"},"security":["66f2befd-2cd3-41f4-8120-560fc2cb2780"],"parameters":["5ac5ec1b-9a33-45a4-a8e4-15d52d843528"],"method":"get","type":"path","servers":["900bd1dd-1657-41cc-9e95-57b7af147e04"],"path":"/media/models","baseUrlOptions":["https://api.moda.app/v1"],"title":"List Models","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"5ac5ec1b-9a33-45a4-a8e4-15d52d843528":{"name":"Moda-Version","in":"header","required":false,"description":"Calendar-dated API version pin. New integrations should pin `2026-05-01` to opt into the newest response shapes. For back-compat the server also accepts requests with no header and resolves them to the current default (today: `2026-04-12`); that default advances on each [sunset date](/api-reference/versioning). Any unsupported value returns 400 `unsupported_version`.","example":"2026-05-01","schema":{"type":"string","enum":["2026-04-12","2026-05-01"],"default":"2026-05-01","example":"2026-05-01","isRequired":false,"description":"Calendar-dated API version pin. New integrations should pin `2026-05-01` to opt into the newest response shapes. For back-compat the server also accepts requests with no header and resolves them to the current default (today: `2026-04-12`); that default advances on each [sunset date](/api-reference/versioning). Any unsupported value returns 400 `unsupported_version`.","uniqueKey":"","typeLabel":"enum\u003cstring>"}}},"responses":{"c4be4015-0c18-44b3-8096-5b5589d85276":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"image_transforms":{"items":{"properties":{"id":{"type":"string","title":"Id","isRequired":true,"uniqueKey":"image_transforms.items.[INDEX].id","typeLabel":"string"},"label":{"type":"string","title":"Label","isRequired":true,"uniqueKey":"image_transforms.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","title":"Description","isRequired":true,"uniqueKey":"image_transforms.items.[INDEX].description","typeLabel":"string"},"operation":{"type":"string","enum":["vectorize","precise_edit"],"title":"Operation","isRequired":true,"uniqueKey":"image_transforms.items.[INDEX].operation","typeLabel":"enum\u003cstring>"},"output_format":{"type":"string","title":"Output Format","isRequired":true,"uniqueKey":"image_transforms.items.[INDEX].output_format","typeLabel":"string"},"modes":{"items":{"type":"string","uniqueKey":"image_transforms.items.[INDEX].modes.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Modes","isRequired":true,"uniqueKey":"image_transforms.items.[INDEX].modes","typeLabel":"string[]"},"max_input_bytes":{"type":"integer","title":"Max Input Bytes","isRequired":true,"uniqueKey":"image_transforms.items.[INDEX].max_input_bytes","typeLabel":"integer"},"accepted_input_mimes":{"items":{"type":"string","uniqueKey":"image_transforms.items.[INDEX].accepted_input_mimes.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Input Mimes","isRequired":true,"uniqueKey":"image_transforms.items.[INDEX].accepted_input_mimes","typeLabel":"string[]"}},"type":"object","required":["id","label","description","operation","output_format","modes","max_input_bytes","accepted_input_mimes"],"title":"PublicImageTransformModel","uniqueKey":"image_transforms.items.[INDEX]","typeLabel":"PublicImageTransformModel · object"},"type":"array","title":"Image Transforms","description":"Image transforms served by /v1/media/vectorize and /v1/media/precise-edit (modes: quality).","isRequired":true,"uniqueKey":"image_transforms","typeLabel":"PublicImageTransformModel · object[]"},"image_models":{"items":{"additionalProperties":true,"type":"object","uniqueKey":"image_models.items.[INDEX]","typeLabel":"object"},"type":"array","title":"Image Models","description":"Image model capability descriptors, for generate-image / edit-image.","isRequired":true,"uniqueKey":"image_models","typeLabel":"Image Models · object[]"},"video_models":{"items":{"properties":{"id":{"type":"string","title":"Id","description":"The registry id the generate-video 'model' parameter validates against.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].id","typeLabel":"string"},"label":{"type":"string","title":"Label","isRequired":true,"uniqueKey":"video_models.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","title":"Description","description":"What the model is good at, relative to its registry siblings.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].description","typeLabel":"string"},"supports_generate_audio":{"type":"boolean","title":"Supports Generate Audio","description":"Whether the model can generate native audio. generate_audio=true on a model where this is false is rejected before billing.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].supports_generate_audio","typeLabel":"boolean"},"generate_audio_default":{"type":"boolean","title":"Generate Audio Default","description":"The effective audio setting when generate_audio is omitted. Where billing.audio_priced_separately is true, a default of true means the DEFAULT render bills the audio rate — pass generate_audio=false for the cheaper silent rate.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].generate_audio_default","typeLabel":"boolean"},"generate_audio_controllable":{"type":"boolean","title":"Generate Audio Controllable","description":"Whether generate_audio can be turned off. False means audio is intrinsic to the model: generate_audio=false is accepted, reported as an adjustment, and produces audio anyway. Steer such a model's audio through the prompt instead.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].generate_audio_controllable","typeLabel":"boolean"},"supports_seed":{"type":"boolean","title":"Supports Seed","description":"Whether the request may pin a seed; an unsupported seed is rejected.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].supports_seed","typeLabel":"boolean"},"modes":{"properties":{"text_to_video":{"oneOf":[{"type":"object","title":"PublicVideoModeCapability","description":"One generation mode's real capability envelope for one model.","required":["aspect_ratios","default_aspect_ratio","resolutions","default_resolution","duration_seconds","supports_end_image","max_reference_images","reference_videos","reference_audios","max_reference_inputs_total","generate_audio_controllable","billing"],"properties":{"aspect_ratios":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.aspect_ratios.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Aspect Ratios","description":"Aspect ratios the mode accepts ('auto' = the provider chooses the framing). Empty means the mode has no aspect control at all — the endpoint decides (an image route frames from its input still, a source_video mode from the source clip, a text route from the endpoint's own default), and a requested ratio is dropped and reported.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.aspect_ratios","typeLabel":"string[]"},"default_aspect_ratio":{"oneOf":[{"type":"string","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.default_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.default_aspect_ratio","typeLabel":"string | null"},"resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Resolutions","description":"Supported resolution tiers (for example 720p, 2k, or 4k). Actual pixel dimensions may depend on the selected aspect ratio or input image. Empty means the mode has no resolution control and a requested resolution is dropped and reported. What comes back instead: where the mode declares a source_video, the source clip's own frame size, which is also what selects the rate tier; otherwise read fixed_output_resolution, where a size is what the endpoint ALWAYS returns and only a null means the output size is genuinely not something we can state.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.resolutions","typeLabel":"string[]"},"default_resolution":{"oneOf":[{"type":"string","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.default_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.default_resolution.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.default_resolution","typeLabel":"string | null"},"duration_seconds":{"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds.controllable","typeLabel":"boolean"}},"type":"object","required":["min_seconds","max_seconds","default","supports_auto"],"title":"PublicVideoDuration","description":"One mode's clip-length envelope, in whole seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.duration_seconds","typeLabel":"PublicVideoDuration · object"},"supports_end_image":{"type":"boolean","title":"Supports End Image","description":"image_to_video only: whether the request may carry end_image alongside start_image for a first-to-last-frame morph.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.supports_end_image","typeLabel":"boolean"},"max_reference_images":{"type":"integer","title":"Max Reference Images","description":"reference_to_video only: maximum reference_images one request may carry. 0 means the mode takes no reference images.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.max_reference_images","typeLabel":"integer"},"reference_videos":{"oneOf":[{"type":"object","title":"PublicVideoReferenceVideos","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","input_duration_billed","price_multiplier","input_duration_price_multiplier"],"properties":{"max_count":{"type":"integer","title":"Max Count","description":"Maximum reference clips one request may carry.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_videos.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","description":"Minimum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_videos.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","description":"Maximum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_videos.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","description":"Maximum combined running time across all reference clips.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_videos.oneOf.0.max_total_seconds","typeLabel":"number"},"input_duration_billed":{"type":"boolean","title":"Input Duration Billed","description":"Whether the reference clips' own running time is billed on top of the generated clip's.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_videos.oneOf.0.input_duration_billed","typeLabel":"boolean"},"price_multiplier":{"type":"number","title":"Price Multiplier","description":"The provider's published factor a reference-video call's whole charge (including any billed input duration) is multiplied by. 1.0 means the provider publishes no factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_videos.oneOf.0.price_multiplier","typeLabel":"number"},"input_duration_price_multiplier":{"type":"number","title":"Input Duration Price Multiplier","description":"Factor applied only to billed reference-video duration; 1.0 means no input-only factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_videos.oneOf.0.input_duration_price_multiplier","typeLabel":"number"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_videos.oneOf.0","typeLabel":"PublicVideoReferenceVideos · object"},{"type":"null","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_videos.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_videos","typeLabel":"PublicVideoReferenceVideos · object | null"},"reference_audios":{"oneOf":[{"type":"object","title":"PublicVideoReferenceAudios","description":"The reference-audio envelope; null when the mode takes no audio reference input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","requires_visual_reference"],"properties":{"max_count":{"type":"integer","title":"Max Count","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.0.max_total_seconds","typeLabel":"number"},"requires_visual_reference":{"type":"boolean","title":"Requires Visual Reference","description":"Whether at least one reference image or video must accompany reference audio.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.0.requires_visual_reference","typeLabel":"boolean"},"accepted_container_types":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types","typeLabel":"string[] | null"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.0","typeLabel":"PublicVideoReferenceAudios · object"},{"type":"null","description":"The reference-audio envelope; null when the mode takes no audio reference input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.reference_audios","typeLabel":"PublicVideoReferenceAudios · object | null"},"max_reference_inputs_total":{"oneOf":[{"type":"integer","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.max_reference_inputs_total.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.max_reference_inputs_total.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.max_reference_inputs_total","typeLabel":"integer | null"},"generate_audio_controllable":{"type":"boolean","title":"Generate Audio Controllable","description":"Whether generate_audio can be turned off ON THIS MODE. False means this endpoint has no such control: generate_audio=false is accepted, reported as an adjustment, and audio comes back anyway. The model-level field of the same name says it about every mode at once; this one can be false on a single mode while the model's others are controllable.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.generate_audio_controllable","typeLabel":"boolean"},"billing":{"properties":{"basis":{"type":"string","title":"Basis","description":"The quantity the price is quoted in: 'second' bills per second of generated output; 'megapixel_second' bills on frame area x duration, so resolution AND aspect ratio scale the cost, not just clip length; 'call' bills one flat price per generation, so the clip's running time does not move the charge at all — see higher_rate_durations for the clip lengths that carry a different flat price. Always present — a model whose basis is not expressible does not register.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing.basis","typeLabel":"string"},"duration_quantity":{"type":"string","title":"Duration Quantity","description":"The duration multiplied by a per-second basis: measured_output for ordinary generation, measured_input_audio when a driving track determines and meters the clip length, measured_whole_return when an extension bills source plus tail, or requested_extension when only the requested generated tail is metered.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing.duration_quantity","typeLabel":"string"},"audio_priced_separately":{"type":"boolean","title":"Audio Priced Separately","description":"Whether generate_audio=true bills a distinct (higher) rate than a silent render. False means audio is folded into one price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing.audio_priced_separately","typeLabel":"boolean"},"higher_rate_resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing.higher_rate_resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Higher Rate Resolutions","description":"Resolutions whose RATE is above this mode's base rate. For a 'megapixel_second' basis every resolution already scales the cost by area, so this lists only extra rate tiers — and a resolution absent from it can still cost more, because the frame is larger. A provider may even meter a larger frame at a lower rate (Seedance 2.0's 4K), which is why this reads the rate rather than which resolutions carry their own price. Where the resolutions list is empty because the output follows a source video, these bands are selected by the SOURCE clip's measured frame rather than by anything the request carries.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing.higher_rate_resolutions","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of a source video adds a per-second charge on top of the returned clip's rate, on its own key. False means the source clip costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing.input_seconds_priced_separately","typeLabel":"boolean"},"higher_rate_durations":{"items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing.higher_rate_durations.items.[INDEX]","typeLabel":"integer"},"type":"array","title":"Higher Rate Durations","description":"Clip lengths, in whole seconds, whose RATE is above this mode's base rate. Non-empty only where the provider publishes a separate price per clip length that is not a multiple of a per-second rate (Hailuo 2.3 standard: $0.28 for 6 seconds against $0.56 for 10). Empty means clip length either does not change the rate or scales it linearly through the basis above.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing.higher_rate_durations","typeLabel":"integer[]"},"reference_images_priced_separately":{"type":"boolean","title":"Reference Images Priced Separately","description":"Whether each reference image adds a flat charge on top of the per-second rate, billed independently of clip length and resolution. False means reference images cost nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing.reference_images_priced_separately","typeLabel":"boolean"},"reference_images_included_before_surcharge":{"type":"integer","title":"Reference Images Included Before Surcharge","description":"How many reference images carry no separate input surcharge. Meaningful only when reference_images_priced_separately is true.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing.reference_images_included_before_surcharge","typeLabel":"integer"}},"type":"object","required":["basis","duration_quantity","audio_priced_separately","higher_rate_resolutions","input_seconds_priced_separately","higher_rate_durations","reference_images_priced_separately","reference_images_included_before_surcharge"],"title":"PublicVideoModeBilling","description":"How this mode's provider cost is metered.\n\nNo dollar or credit amount appears here, whatever the basis: the charge is\ncomputed asynchronously by the usage pipeline from the resolved request at\nthe team's own credit rate, which this document cannot know. So this reports\nthe BASIS and the knobs that move it — including `call`, where the provider\nquotes one flat price per generation and the clip's running time moves\nnothing. A flat basis still does not mean a publishable number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.billing","typeLabel":"PublicVideoModeBilling · object"},"end_image_aspect_ratios":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_aspect_ratios.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_aspect_ratios.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_aspect_ratios.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_aspect_ratios","typeLabel":"string[] | null"},"end_image_default_aspect_ratio":{"oneOf":[{"type":"string","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_default_aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_default_aspect_ratio","typeLabel":"string | null"},"fixed_output_resolution":{"oneOf":[{"type":"string","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.fixed_output_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.fixed_output_resolution.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.fixed_output_resolution","typeLabel":"string | null"},"end_image_duration_seconds":{"oneOf":[{"type":"object","title":"PublicVideoDuration","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","required":["min_seconds","max_seconds","default","supports_auto"],"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.controllable","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.0","typeLabel":"PublicVideoDuration · object"},{"type":"null","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.end_image_duration_seconds","typeLabel":"PublicVideoDuration · object | null"},"source_video":{"oneOf":[{"type":"object","title":"PublicVideoSourceVideo","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","required":["min_seconds","max_seconds","max_area_pixels","accepted_formats","input_seconds_priced_separately","output_includes_source"],"properties":{"min_seconds":{"oneOf":[{"type":"number","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.min_seconds","typeLabel":"number | null"},"max_seconds":{"oneOf":[{"type":"number","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.max_seconds","typeLabel":"number | null"},"max_area_pixels":{"oneOf":[{"type":"integer","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels","typeLabel":"integer | null"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Container and codecs the provider documents for the source clip, and which Moda enforces against the clip's own bytes before uploading it: a container or a video codec outside this list is refused here rather than by the provider. A clip whose codec cannot be read is not refused — unknown is not the same as unsupported. Empty means the provider publishes no restriction and its own validation is the only gate.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.accepted_formats","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of the SOURCE clip is billed on top of the returned clip's per-second charge. False means the source costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.input_seconds_priced_separately","typeLabel":"boolean"},"output_includes_source":{"type":"boolean","title":"Output Includes Source","description":"Whether the returned clip contains the source as well as the new footage. When true, duration_seconds is the length of the ADDED segment and the delivered video is longer than it by the source's own running time. Read billing.duration_quantity to learn whether the provider meters that whole return or only the requested extension.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0.output_includes_source","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.0","typeLabel":"PublicVideoSourceVideo · object"},{"type":"null","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.source_video","typeLabel":"PublicVideoSourceVideo · object | null"},"image_requirements":{"items":{"properties":{"roles":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].roles.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Roles","description":"The image roles this envelope covers: 'start', 'end', and/or 'reference'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].roles","typeLabel":"string[]"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Accepted DECODED image formats (e.g. 'JPEG', 'PNG'). Empty means the provider publishes no format restriction. Matched against the decoded bytes, not the file name or Content-Type.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].accepted_formats","typeLabel":"string[]"},"max_bytes":{"oneOf":[{"type":"integer","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes","typeLabel":"integer | null"},"min_width":{"oneOf":[{"type":"integer","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].min_width","typeLabel":"integer | null"},"min_height":{"oneOf":[{"type":"integer","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].min_height","typeLabel":"integer | null"},"max_pixels":{"oneOf":[{"type":"integer","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels","typeLabel":"integer | null"},"min_aspect_ratio":{"oneOf":[{"type":"number","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio","typeLabel":"number | null"},"max_aspect_ratio":{"oneOf":[{"type":"number","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio","typeLabel":"number | null"}},"type":"object","required":["roles","accepted_formats","max_bytes","min_width","min_height","max_pixels","min_aspect_ratio","max_aspect_ratio"],"title":"PublicVideoImageRequirements","description":"The documented envelope for the images a mode is handed.\n\nProvider-published, except that max_pixels may also carry a Moda platform\nceiling. A null field means nothing is stated — not that anything goes.\nModa checks these before submitting whenever it already knows the property;\nthe provider validates either way.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements.items.[INDEX]","typeLabel":"PublicVideoImageRequirements · object"},"type":"array","title":"Image Requirements","description":"The provider's documented requirements for the images this mode is handed, one entry per group of roles sharing an envelope (roles never repeat across entries). Empty when the provider publishes none and its own validation is the only gate. Moda checks these before submitting whenever it already measured the property; for an image supplied as an external URL it has measured nothing, so the provider is the only gate.","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0.image_requirements","typeLabel":"PublicVideoImageRequirements · object[]"}},"uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.0","typeLabel":"PublicVideoModeCapability · object"},{"type":"null","uniqueKey":"video_models.items.[INDEX].modes.text_to_video.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.text_to_video","typeLabel":"PublicVideoModeCapability · object | null"},"image_to_video":{"oneOf":[{"type":"object","title":"PublicVideoModeCapability","description":"One generation mode's real capability envelope for one model.","required":["aspect_ratios","default_aspect_ratio","resolutions","default_resolution","duration_seconds","supports_end_image","max_reference_images","reference_videos","reference_audios","max_reference_inputs_total","generate_audio_controllable","billing"],"properties":{"aspect_ratios":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.aspect_ratios.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Aspect Ratios","description":"Aspect ratios the mode accepts ('auto' = the provider chooses the framing). Empty means the mode has no aspect control at all — the endpoint decides (an image route frames from its input still, a source_video mode from the source clip, a text route from the endpoint's own default), and a requested ratio is dropped and reported.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.aspect_ratios","typeLabel":"string[]"},"default_aspect_ratio":{"oneOf":[{"type":"string","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.default_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.default_aspect_ratio","typeLabel":"string | null"},"resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Resolutions","description":"Supported resolution tiers (for example 720p, 2k, or 4k). Actual pixel dimensions may depend on the selected aspect ratio or input image. Empty means the mode has no resolution control and a requested resolution is dropped and reported. What comes back instead: where the mode declares a source_video, the source clip's own frame size, which is also what selects the rate tier; otherwise read fixed_output_resolution, where a size is what the endpoint ALWAYS returns and only a null means the output size is genuinely not something we can state.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.resolutions","typeLabel":"string[]"},"default_resolution":{"oneOf":[{"type":"string","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.default_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.default_resolution.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.default_resolution","typeLabel":"string | null"},"duration_seconds":{"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds.controllable","typeLabel":"boolean"}},"type":"object","required":["min_seconds","max_seconds","default","supports_auto"],"title":"PublicVideoDuration","description":"One mode's clip-length envelope, in whole seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.duration_seconds","typeLabel":"PublicVideoDuration · object"},"supports_end_image":{"type":"boolean","title":"Supports End Image","description":"image_to_video only: whether the request may carry end_image alongside start_image for a first-to-last-frame morph.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.supports_end_image","typeLabel":"boolean"},"max_reference_images":{"type":"integer","title":"Max Reference Images","description":"reference_to_video only: maximum reference_images one request may carry. 0 means the mode takes no reference images.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.max_reference_images","typeLabel":"integer"},"reference_videos":{"oneOf":[{"type":"object","title":"PublicVideoReferenceVideos","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","input_duration_billed","price_multiplier","input_duration_price_multiplier"],"properties":{"max_count":{"type":"integer","title":"Max Count","description":"Maximum reference clips one request may carry.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_videos.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","description":"Minimum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_videos.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","description":"Maximum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_videos.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","description":"Maximum combined running time across all reference clips.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_videos.oneOf.0.max_total_seconds","typeLabel":"number"},"input_duration_billed":{"type":"boolean","title":"Input Duration Billed","description":"Whether the reference clips' own running time is billed on top of the generated clip's.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_videos.oneOf.0.input_duration_billed","typeLabel":"boolean"},"price_multiplier":{"type":"number","title":"Price Multiplier","description":"The provider's published factor a reference-video call's whole charge (including any billed input duration) is multiplied by. 1.0 means the provider publishes no factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_videos.oneOf.0.price_multiplier","typeLabel":"number"},"input_duration_price_multiplier":{"type":"number","title":"Input Duration Price Multiplier","description":"Factor applied only to billed reference-video duration; 1.0 means no input-only factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_videos.oneOf.0.input_duration_price_multiplier","typeLabel":"number"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_videos.oneOf.0","typeLabel":"PublicVideoReferenceVideos · object"},{"type":"null","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_videos.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_videos","typeLabel":"PublicVideoReferenceVideos · object | null"},"reference_audios":{"oneOf":[{"type":"object","title":"PublicVideoReferenceAudios","description":"The reference-audio envelope; null when the mode takes no audio reference input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","requires_visual_reference"],"properties":{"max_count":{"type":"integer","title":"Max Count","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.0.max_total_seconds","typeLabel":"number"},"requires_visual_reference":{"type":"boolean","title":"Requires Visual Reference","description":"Whether at least one reference image or video must accompany reference audio.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.0.requires_visual_reference","typeLabel":"boolean"},"accepted_container_types":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types","typeLabel":"string[] | null"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.0","typeLabel":"PublicVideoReferenceAudios · object"},{"type":"null","description":"The reference-audio envelope; null when the mode takes no audio reference input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.reference_audios","typeLabel":"PublicVideoReferenceAudios · object | null"},"max_reference_inputs_total":{"oneOf":[{"type":"integer","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.max_reference_inputs_total.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.max_reference_inputs_total.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.max_reference_inputs_total","typeLabel":"integer | null"},"generate_audio_controllable":{"type":"boolean","title":"Generate Audio Controllable","description":"Whether generate_audio can be turned off ON THIS MODE. False means this endpoint has no such control: generate_audio=false is accepted, reported as an adjustment, and audio comes back anyway. The model-level field of the same name says it about every mode at once; this one can be false on a single mode while the model's others are controllable.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.generate_audio_controllable","typeLabel":"boolean"},"billing":{"properties":{"basis":{"type":"string","title":"Basis","description":"The quantity the price is quoted in: 'second' bills per second of generated output; 'megapixel_second' bills on frame area x duration, so resolution AND aspect ratio scale the cost, not just clip length; 'call' bills one flat price per generation, so the clip's running time does not move the charge at all — see higher_rate_durations for the clip lengths that carry a different flat price. Always present — a model whose basis is not expressible does not register.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing.basis","typeLabel":"string"},"duration_quantity":{"type":"string","title":"Duration Quantity","description":"The duration multiplied by a per-second basis: measured_output for ordinary generation, measured_input_audio when a driving track determines and meters the clip length, measured_whole_return when an extension bills source plus tail, or requested_extension when only the requested generated tail is metered.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing.duration_quantity","typeLabel":"string"},"audio_priced_separately":{"type":"boolean","title":"Audio Priced Separately","description":"Whether generate_audio=true bills a distinct (higher) rate than a silent render. False means audio is folded into one price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing.audio_priced_separately","typeLabel":"boolean"},"higher_rate_resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing.higher_rate_resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Higher Rate Resolutions","description":"Resolutions whose RATE is above this mode's base rate. For a 'megapixel_second' basis every resolution already scales the cost by area, so this lists only extra rate tiers — and a resolution absent from it can still cost more, because the frame is larger. A provider may even meter a larger frame at a lower rate (Seedance 2.0's 4K), which is why this reads the rate rather than which resolutions carry their own price. Where the resolutions list is empty because the output follows a source video, these bands are selected by the SOURCE clip's measured frame rather than by anything the request carries.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing.higher_rate_resolutions","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of a source video adds a per-second charge on top of the returned clip's rate, on its own key. False means the source clip costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing.input_seconds_priced_separately","typeLabel":"boolean"},"higher_rate_durations":{"items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing.higher_rate_durations.items.[INDEX]","typeLabel":"integer"},"type":"array","title":"Higher Rate Durations","description":"Clip lengths, in whole seconds, whose RATE is above this mode's base rate. Non-empty only where the provider publishes a separate price per clip length that is not a multiple of a per-second rate (Hailuo 2.3 standard: $0.28 for 6 seconds against $0.56 for 10). Empty means clip length either does not change the rate or scales it linearly through the basis above.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing.higher_rate_durations","typeLabel":"integer[]"},"reference_images_priced_separately":{"type":"boolean","title":"Reference Images Priced Separately","description":"Whether each reference image adds a flat charge on top of the per-second rate, billed independently of clip length and resolution. False means reference images cost nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing.reference_images_priced_separately","typeLabel":"boolean"},"reference_images_included_before_surcharge":{"type":"integer","title":"Reference Images Included Before Surcharge","description":"How many reference images carry no separate input surcharge. Meaningful only when reference_images_priced_separately is true.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing.reference_images_included_before_surcharge","typeLabel":"integer"}},"type":"object","required":["basis","duration_quantity","audio_priced_separately","higher_rate_resolutions","input_seconds_priced_separately","higher_rate_durations","reference_images_priced_separately","reference_images_included_before_surcharge"],"title":"PublicVideoModeBilling","description":"How this mode's provider cost is metered.\n\nNo dollar or credit amount appears here, whatever the basis: the charge is\ncomputed asynchronously by the usage pipeline from the resolved request at\nthe team's own credit rate, which this document cannot know. So this reports\nthe BASIS and the knobs that move it — including `call`, where the provider\nquotes one flat price per generation and the clip's running time moves\nnothing. A flat basis still does not mean a publishable number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.billing","typeLabel":"PublicVideoModeBilling · object"},"end_image_aspect_ratios":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_aspect_ratios.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_aspect_ratios.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_aspect_ratios.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_aspect_ratios","typeLabel":"string[] | null"},"end_image_default_aspect_ratio":{"oneOf":[{"type":"string","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_default_aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_default_aspect_ratio","typeLabel":"string | null"},"fixed_output_resolution":{"oneOf":[{"type":"string","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.fixed_output_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.fixed_output_resolution.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.fixed_output_resolution","typeLabel":"string | null"},"end_image_duration_seconds":{"oneOf":[{"type":"object","title":"PublicVideoDuration","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","required":["min_seconds","max_seconds","default","supports_auto"],"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.controllable","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.0","typeLabel":"PublicVideoDuration · object"},{"type":"null","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.end_image_duration_seconds","typeLabel":"PublicVideoDuration · object | null"},"source_video":{"oneOf":[{"type":"object","title":"PublicVideoSourceVideo","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","required":["min_seconds","max_seconds","max_area_pixels","accepted_formats","input_seconds_priced_separately","output_includes_source"],"properties":{"min_seconds":{"oneOf":[{"type":"number","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.min_seconds","typeLabel":"number | null"},"max_seconds":{"oneOf":[{"type":"number","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.max_seconds","typeLabel":"number | null"},"max_area_pixels":{"oneOf":[{"type":"integer","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels","typeLabel":"integer | null"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Container and codecs the provider documents for the source clip, and which Moda enforces against the clip's own bytes before uploading it: a container or a video codec outside this list is refused here rather than by the provider. A clip whose codec cannot be read is not refused — unknown is not the same as unsupported. Empty means the provider publishes no restriction and its own validation is the only gate.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.accepted_formats","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of the SOURCE clip is billed on top of the returned clip's per-second charge. False means the source costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.input_seconds_priced_separately","typeLabel":"boolean"},"output_includes_source":{"type":"boolean","title":"Output Includes Source","description":"Whether the returned clip contains the source as well as the new footage. When true, duration_seconds is the length of the ADDED segment and the delivered video is longer than it by the source's own running time. Read billing.duration_quantity to learn whether the provider meters that whole return or only the requested extension.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0.output_includes_source","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.0","typeLabel":"PublicVideoSourceVideo · object"},{"type":"null","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.source_video","typeLabel":"PublicVideoSourceVideo · object | null"},"image_requirements":{"items":{"properties":{"roles":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].roles.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Roles","description":"The image roles this envelope covers: 'start', 'end', and/or 'reference'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].roles","typeLabel":"string[]"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Accepted DECODED image formats (e.g. 'JPEG', 'PNG'). Empty means the provider publishes no format restriction. Matched against the decoded bytes, not the file name or Content-Type.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].accepted_formats","typeLabel":"string[]"},"max_bytes":{"oneOf":[{"type":"integer","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes","typeLabel":"integer | null"},"min_width":{"oneOf":[{"type":"integer","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].min_width","typeLabel":"integer | null"},"min_height":{"oneOf":[{"type":"integer","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].min_height","typeLabel":"integer | null"},"max_pixels":{"oneOf":[{"type":"integer","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels","typeLabel":"integer | null"},"min_aspect_ratio":{"oneOf":[{"type":"number","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio","typeLabel":"number | null"},"max_aspect_ratio":{"oneOf":[{"type":"number","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio","typeLabel":"number | null"}},"type":"object","required":["roles","accepted_formats","max_bytes","min_width","min_height","max_pixels","min_aspect_ratio","max_aspect_ratio"],"title":"PublicVideoImageRequirements","description":"The documented envelope for the images a mode is handed.\n\nProvider-published, except that max_pixels may also carry a Moda platform\nceiling. A null field means nothing is stated — not that anything goes.\nModa checks these before submitting whenever it already knows the property;\nthe provider validates either way.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements.items.[INDEX]","typeLabel":"PublicVideoImageRequirements · object"},"type":"array","title":"Image Requirements","description":"The provider's documented requirements for the images this mode is handed, one entry per group of roles sharing an envelope (roles never repeat across entries). Empty when the provider publishes none and its own validation is the only gate. Moda checks these before submitting whenever it already measured the property; for an image supplied as an external URL it has measured nothing, so the provider is the only gate.","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0.image_requirements","typeLabel":"PublicVideoImageRequirements · object[]"}},"uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.0","typeLabel":"PublicVideoModeCapability · object"},{"type":"null","uniqueKey":"video_models.items.[INDEX].modes.image_to_video.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.image_to_video","typeLabel":"PublicVideoModeCapability · object | null"},"reference_to_video":{"oneOf":[{"type":"object","title":"PublicVideoModeCapability","description":"One generation mode's real capability envelope for one model.","required":["aspect_ratios","default_aspect_ratio","resolutions","default_resolution","duration_seconds","supports_end_image","max_reference_images","reference_videos","reference_audios","max_reference_inputs_total","generate_audio_controllable","billing"],"properties":{"aspect_ratios":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.aspect_ratios.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Aspect Ratios","description":"Aspect ratios the mode accepts ('auto' = the provider chooses the framing). Empty means the mode has no aspect control at all — the endpoint decides (an image route frames from its input still, a source_video mode from the source clip, a text route from the endpoint's own default), and a requested ratio is dropped and reported.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.aspect_ratios","typeLabel":"string[]"},"default_aspect_ratio":{"oneOf":[{"type":"string","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.default_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.default_aspect_ratio","typeLabel":"string | null"},"resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Resolutions","description":"Supported resolution tiers (for example 720p, 2k, or 4k). Actual pixel dimensions may depend on the selected aspect ratio or input image. Empty means the mode has no resolution control and a requested resolution is dropped and reported. What comes back instead: where the mode declares a source_video, the source clip's own frame size, which is also what selects the rate tier; otherwise read fixed_output_resolution, where a size is what the endpoint ALWAYS returns and only a null means the output size is genuinely not something we can state.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.resolutions","typeLabel":"string[]"},"default_resolution":{"oneOf":[{"type":"string","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.default_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.default_resolution.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.default_resolution","typeLabel":"string | null"},"duration_seconds":{"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds.controllable","typeLabel":"boolean"}},"type":"object","required":["min_seconds","max_seconds","default","supports_auto"],"title":"PublicVideoDuration","description":"One mode's clip-length envelope, in whole seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.duration_seconds","typeLabel":"PublicVideoDuration · object"},"supports_end_image":{"type":"boolean","title":"Supports End Image","description":"image_to_video only: whether the request may carry end_image alongside start_image for a first-to-last-frame morph.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.supports_end_image","typeLabel":"boolean"},"max_reference_images":{"type":"integer","title":"Max Reference Images","description":"reference_to_video only: maximum reference_images one request may carry. 0 means the mode takes no reference images.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.max_reference_images","typeLabel":"integer"},"reference_videos":{"oneOf":[{"type":"object","title":"PublicVideoReferenceVideos","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","input_duration_billed","price_multiplier","input_duration_price_multiplier"],"properties":{"max_count":{"type":"integer","title":"Max Count","description":"Maximum reference clips one request may carry.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_videos.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","description":"Minimum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_videos.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","description":"Maximum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_videos.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","description":"Maximum combined running time across all reference clips.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_videos.oneOf.0.max_total_seconds","typeLabel":"number"},"input_duration_billed":{"type":"boolean","title":"Input Duration Billed","description":"Whether the reference clips' own running time is billed on top of the generated clip's.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_videos.oneOf.0.input_duration_billed","typeLabel":"boolean"},"price_multiplier":{"type":"number","title":"Price Multiplier","description":"The provider's published factor a reference-video call's whole charge (including any billed input duration) is multiplied by. 1.0 means the provider publishes no factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_videos.oneOf.0.price_multiplier","typeLabel":"number"},"input_duration_price_multiplier":{"type":"number","title":"Input Duration Price Multiplier","description":"Factor applied only to billed reference-video duration; 1.0 means no input-only factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_videos.oneOf.0.input_duration_price_multiplier","typeLabel":"number"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_videos.oneOf.0","typeLabel":"PublicVideoReferenceVideos · object"},{"type":"null","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_videos.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_videos","typeLabel":"PublicVideoReferenceVideos · object | null"},"reference_audios":{"oneOf":[{"type":"object","title":"PublicVideoReferenceAudios","description":"The reference-audio envelope; null when the mode takes no audio reference input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","requires_visual_reference"],"properties":{"max_count":{"type":"integer","title":"Max Count","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.0.max_total_seconds","typeLabel":"number"},"requires_visual_reference":{"type":"boolean","title":"Requires Visual Reference","description":"Whether at least one reference image or video must accompany reference audio.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.0.requires_visual_reference","typeLabel":"boolean"},"accepted_container_types":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types","typeLabel":"string[] | null"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.0","typeLabel":"PublicVideoReferenceAudios · object"},{"type":"null","description":"The reference-audio envelope; null when the mode takes no audio reference input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.reference_audios","typeLabel":"PublicVideoReferenceAudios · object | null"},"max_reference_inputs_total":{"oneOf":[{"type":"integer","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.max_reference_inputs_total.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.max_reference_inputs_total.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.max_reference_inputs_total","typeLabel":"integer | null"},"generate_audio_controllable":{"type":"boolean","title":"Generate Audio Controllable","description":"Whether generate_audio can be turned off ON THIS MODE. False means this endpoint has no such control: generate_audio=false is accepted, reported as an adjustment, and audio comes back anyway. The model-level field of the same name says it about every mode at once; this one can be false on a single mode while the model's others are controllable.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.generate_audio_controllable","typeLabel":"boolean"},"billing":{"properties":{"basis":{"type":"string","title":"Basis","description":"The quantity the price is quoted in: 'second' bills per second of generated output; 'megapixel_second' bills on frame area x duration, so resolution AND aspect ratio scale the cost, not just clip length; 'call' bills one flat price per generation, so the clip's running time does not move the charge at all — see higher_rate_durations for the clip lengths that carry a different flat price. Always present — a model whose basis is not expressible does not register.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing.basis","typeLabel":"string"},"duration_quantity":{"type":"string","title":"Duration Quantity","description":"The duration multiplied by a per-second basis: measured_output for ordinary generation, measured_input_audio when a driving track determines and meters the clip length, measured_whole_return when an extension bills source plus tail, or requested_extension when only the requested generated tail is metered.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing.duration_quantity","typeLabel":"string"},"audio_priced_separately":{"type":"boolean","title":"Audio Priced Separately","description":"Whether generate_audio=true bills a distinct (higher) rate than a silent render. False means audio is folded into one price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing.audio_priced_separately","typeLabel":"boolean"},"higher_rate_resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing.higher_rate_resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Higher Rate Resolutions","description":"Resolutions whose RATE is above this mode's base rate. For a 'megapixel_second' basis every resolution already scales the cost by area, so this lists only extra rate tiers — and a resolution absent from it can still cost more, because the frame is larger. A provider may even meter a larger frame at a lower rate (Seedance 2.0's 4K), which is why this reads the rate rather than which resolutions carry their own price. Where the resolutions list is empty because the output follows a source video, these bands are selected by the SOURCE clip's measured frame rather than by anything the request carries.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing.higher_rate_resolutions","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of a source video adds a per-second charge on top of the returned clip's rate, on its own key. False means the source clip costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing.input_seconds_priced_separately","typeLabel":"boolean"},"higher_rate_durations":{"items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing.higher_rate_durations.items.[INDEX]","typeLabel":"integer"},"type":"array","title":"Higher Rate Durations","description":"Clip lengths, in whole seconds, whose RATE is above this mode's base rate. Non-empty only where the provider publishes a separate price per clip length that is not a multiple of a per-second rate (Hailuo 2.3 standard: $0.28 for 6 seconds against $0.56 for 10). Empty means clip length either does not change the rate or scales it linearly through the basis above.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing.higher_rate_durations","typeLabel":"integer[]"},"reference_images_priced_separately":{"type":"boolean","title":"Reference Images Priced Separately","description":"Whether each reference image adds a flat charge on top of the per-second rate, billed independently of clip length and resolution. False means reference images cost nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing.reference_images_priced_separately","typeLabel":"boolean"},"reference_images_included_before_surcharge":{"type":"integer","title":"Reference Images Included Before Surcharge","description":"How many reference images carry no separate input surcharge. Meaningful only when reference_images_priced_separately is true.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing.reference_images_included_before_surcharge","typeLabel":"integer"}},"type":"object","required":["basis","duration_quantity","audio_priced_separately","higher_rate_resolutions","input_seconds_priced_separately","higher_rate_durations","reference_images_priced_separately","reference_images_included_before_surcharge"],"title":"PublicVideoModeBilling","description":"How this mode's provider cost is metered.\n\nNo dollar or credit amount appears here, whatever the basis: the charge is\ncomputed asynchronously by the usage pipeline from the resolved request at\nthe team's own credit rate, which this document cannot know. So this reports\nthe BASIS and the knobs that move it — including `call`, where the provider\nquotes one flat price per generation and the clip's running time moves\nnothing. A flat basis still does not mean a publishable number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.billing","typeLabel":"PublicVideoModeBilling · object"},"end_image_aspect_ratios":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_aspect_ratios.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_aspect_ratios.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_aspect_ratios.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_aspect_ratios","typeLabel":"string[] | null"},"end_image_default_aspect_ratio":{"oneOf":[{"type":"string","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_default_aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_default_aspect_ratio","typeLabel":"string | null"},"fixed_output_resolution":{"oneOf":[{"type":"string","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.fixed_output_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.fixed_output_resolution.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.fixed_output_resolution","typeLabel":"string | null"},"end_image_duration_seconds":{"oneOf":[{"type":"object","title":"PublicVideoDuration","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","required":["min_seconds","max_seconds","default","supports_auto"],"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.controllable","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.0","typeLabel":"PublicVideoDuration · object"},{"type":"null","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.end_image_duration_seconds","typeLabel":"PublicVideoDuration · object | null"},"source_video":{"oneOf":[{"type":"object","title":"PublicVideoSourceVideo","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","required":["min_seconds","max_seconds","max_area_pixels","accepted_formats","input_seconds_priced_separately","output_includes_source"],"properties":{"min_seconds":{"oneOf":[{"type":"number","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.min_seconds","typeLabel":"number | null"},"max_seconds":{"oneOf":[{"type":"number","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.max_seconds","typeLabel":"number | null"},"max_area_pixels":{"oneOf":[{"type":"integer","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels","typeLabel":"integer | null"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Container and codecs the provider documents for the source clip, and which Moda enforces against the clip's own bytes before uploading it: a container or a video codec outside this list is refused here rather than by the provider. A clip whose codec cannot be read is not refused — unknown is not the same as unsupported. Empty means the provider publishes no restriction and its own validation is the only gate.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.accepted_formats","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of the SOURCE clip is billed on top of the returned clip's per-second charge. False means the source costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.input_seconds_priced_separately","typeLabel":"boolean"},"output_includes_source":{"type":"boolean","title":"Output Includes Source","description":"Whether the returned clip contains the source as well as the new footage. When true, duration_seconds is the length of the ADDED segment and the delivered video is longer than it by the source's own running time. Read billing.duration_quantity to learn whether the provider meters that whole return or only the requested extension.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0.output_includes_source","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.0","typeLabel":"PublicVideoSourceVideo · object"},{"type":"null","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.source_video","typeLabel":"PublicVideoSourceVideo · object | null"},"image_requirements":{"items":{"properties":{"roles":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].roles.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Roles","description":"The image roles this envelope covers: 'start', 'end', and/or 'reference'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].roles","typeLabel":"string[]"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Accepted DECODED image formats (e.g. 'JPEG', 'PNG'). Empty means the provider publishes no format restriction. Matched against the decoded bytes, not the file name or Content-Type.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].accepted_formats","typeLabel":"string[]"},"max_bytes":{"oneOf":[{"type":"integer","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes","typeLabel":"integer | null"},"min_width":{"oneOf":[{"type":"integer","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].min_width","typeLabel":"integer | null"},"min_height":{"oneOf":[{"type":"integer","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].min_height","typeLabel":"integer | null"},"max_pixels":{"oneOf":[{"type":"integer","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels","typeLabel":"integer | null"},"min_aspect_ratio":{"oneOf":[{"type":"number","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio","typeLabel":"number | null"},"max_aspect_ratio":{"oneOf":[{"type":"number","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio","typeLabel":"number | null"}},"type":"object","required":["roles","accepted_formats","max_bytes","min_width","min_height","max_pixels","min_aspect_ratio","max_aspect_ratio"],"title":"PublicVideoImageRequirements","description":"The documented envelope for the images a mode is handed.\n\nProvider-published, except that max_pixels may also carry a Moda platform\nceiling. A null field means nothing is stated — not that anything goes.\nModa checks these before submitting whenever it already knows the property;\nthe provider validates either way.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements.items.[INDEX]","typeLabel":"PublicVideoImageRequirements · object"},"type":"array","title":"Image Requirements","description":"The provider's documented requirements for the images this mode is handed, one entry per group of roles sharing an envelope (roles never repeat across entries). Empty when the provider publishes none and its own validation is the only gate. Moda checks these before submitting whenever it already measured the property; for an image supplied as an external URL it has measured nothing, so the provider is the only gate.","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0.image_requirements","typeLabel":"PublicVideoImageRequirements · object[]"}},"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.0","typeLabel":"PublicVideoModeCapability · object"},{"type":"null","uniqueKey":"video_models.items.[INDEX].modes.reference_to_video.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.reference_to_video","typeLabel":"PublicVideoModeCapability · object | null"},"audio_to_video":{"oneOf":[{"type":"object","title":"PublicVideoModeCapability","description":"One generation mode's real capability envelope for one model.","required":["aspect_ratios","default_aspect_ratio","resolutions","default_resolution","duration_seconds","supports_end_image","max_reference_images","reference_videos","reference_audios","max_reference_inputs_total","generate_audio_controllable","billing"],"properties":{"aspect_ratios":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.aspect_ratios.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Aspect Ratios","description":"Aspect ratios the mode accepts ('auto' = the provider chooses the framing). Empty means the mode has no aspect control at all — the endpoint decides (an image route frames from its input still, a source_video mode from the source clip, a text route from the endpoint's own default), and a requested ratio is dropped and reported.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.aspect_ratios","typeLabel":"string[]"},"default_aspect_ratio":{"oneOf":[{"type":"string","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.default_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.default_aspect_ratio","typeLabel":"string | null"},"resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Resolutions","description":"Supported resolution tiers (for example 720p, 2k, or 4k). Actual pixel dimensions may depend on the selected aspect ratio or input image. Empty means the mode has no resolution control and a requested resolution is dropped and reported. What comes back instead: where the mode declares a source_video, the source clip's own frame size, which is also what selects the rate tier; otherwise read fixed_output_resolution, where a size is what the endpoint ALWAYS returns and only a null means the output size is genuinely not something we can state.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.resolutions","typeLabel":"string[]"},"default_resolution":{"oneOf":[{"type":"string","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.default_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.default_resolution.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.default_resolution","typeLabel":"string | null"},"duration_seconds":{"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds.controllable","typeLabel":"boolean"}},"type":"object","required":["min_seconds","max_seconds","default","supports_auto"],"title":"PublicVideoDuration","description":"One mode's clip-length envelope, in whole seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.duration_seconds","typeLabel":"PublicVideoDuration · object"},"supports_end_image":{"type":"boolean","title":"Supports End Image","description":"image_to_video only: whether the request may carry end_image alongside start_image for a first-to-last-frame morph.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.supports_end_image","typeLabel":"boolean"},"max_reference_images":{"type":"integer","title":"Max Reference Images","description":"reference_to_video only: maximum reference_images one request may carry. 0 means the mode takes no reference images.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.max_reference_images","typeLabel":"integer"},"reference_videos":{"oneOf":[{"type":"object","title":"PublicVideoReferenceVideos","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","input_duration_billed","price_multiplier","input_duration_price_multiplier"],"properties":{"max_count":{"type":"integer","title":"Max Count","description":"Maximum reference clips one request may carry.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_videos.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","description":"Minimum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_videos.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","description":"Maximum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_videos.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","description":"Maximum combined running time across all reference clips.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_videos.oneOf.0.max_total_seconds","typeLabel":"number"},"input_duration_billed":{"type":"boolean","title":"Input Duration Billed","description":"Whether the reference clips' own running time is billed on top of the generated clip's.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_videos.oneOf.0.input_duration_billed","typeLabel":"boolean"},"price_multiplier":{"type":"number","title":"Price Multiplier","description":"The provider's published factor a reference-video call's whole charge (including any billed input duration) is multiplied by. 1.0 means the provider publishes no factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_videos.oneOf.0.price_multiplier","typeLabel":"number"},"input_duration_price_multiplier":{"type":"number","title":"Input Duration Price Multiplier","description":"Factor applied only to billed reference-video duration; 1.0 means no input-only factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_videos.oneOf.0.input_duration_price_multiplier","typeLabel":"number"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_videos.oneOf.0","typeLabel":"PublicVideoReferenceVideos · object"},{"type":"null","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_videos.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_videos","typeLabel":"PublicVideoReferenceVideos · object | null"},"reference_audios":{"oneOf":[{"type":"object","title":"PublicVideoReferenceAudios","description":"The reference-audio envelope; null when the mode takes no audio reference input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","requires_visual_reference"],"properties":{"max_count":{"type":"integer","title":"Max Count","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.0.max_total_seconds","typeLabel":"number"},"requires_visual_reference":{"type":"boolean","title":"Requires Visual Reference","description":"Whether at least one reference image or video must accompany reference audio.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.0.requires_visual_reference","typeLabel":"boolean"},"accepted_container_types":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.0.accepted_container_types","typeLabel":"string[] | null"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.0","typeLabel":"PublicVideoReferenceAudios · object"},{"type":"null","description":"The reference-audio envelope; null when the mode takes no audio reference input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.reference_audios","typeLabel":"PublicVideoReferenceAudios · object | null"},"max_reference_inputs_total":{"oneOf":[{"type":"integer","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.max_reference_inputs_total.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.max_reference_inputs_total.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.max_reference_inputs_total","typeLabel":"integer | null"},"generate_audio_controllable":{"type":"boolean","title":"Generate Audio Controllable","description":"Whether generate_audio can be turned off ON THIS MODE. False means this endpoint has no such control: generate_audio=false is accepted, reported as an adjustment, and audio comes back anyway. The model-level field of the same name says it about every mode at once; this one can be false on a single mode while the model's others are controllable.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.generate_audio_controllable","typeLabel":"boolean"},"billing":{"properties":{"basis":{"type":"string","title":"Basis","description":"The quantity the price is quoted in: 'second' bills per second of generated output; 'megapixel_second' bills on frame area x duration, so resolution AND aspect ratio scale the cost, not just clip length; 'call' bills one flat price per generation, so the clip's running time does not move the charge at all — see higher_rate_durations for the clip lengths that carry a different flat price. Always present — a model whose basis is not expressible does not register.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing.basis","typeLabel":"string"},"duration_quantity":{"type":"string","title":"Duration Quantity","description":"The duration multiplied by a per-second basis: measured_output for ordinary generation, measured_input_audio when a driving track determines and meters the clip length, measured_whole_return when an extension bills source plus tail, or requested_extension when only the requested generated tail is metered.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing.duration_quantity","typeLabel":"string"},"audio_priced_separately":{"type":"boolean","title":"Audio Priced Separately","description":"Whether generate_audio=true bills a distinct (higher) rate than a silent render. False means audio is folded into one price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing.audio_priced_separately","typeLabel":"boolean"},"higher_rate_resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing.higher_rate_resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Higher Rate Resolutions","description":"Resolutions whose RATE is above this mode's base rate. For a 'megapixel_second' basis every resolution already scales the cost by area, so this lists only extra rate tiers — and a resolution absent from it can still cost more, because the frame is larger. A provider may even meter a larger frame at a lower rate (Seedance 2.0's 4K), which is why this reads the rate rather than which resolutions carry their own price. Where the resolutions list is empty because the output follows a source video, these bands are selected by the SOURCE clip's measured frame rather than by anything the request carries.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing.higher_rate_resolutions","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of a source video adds a per-second charge on top of the returned clip's rate, on its own key. False means the source clip costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing.input_seconds_priced_separately","typeLabel":"boolean"},"higher_rate_durations":{"items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing.higher_rate_durations.items.[INDEX]","typeLabel":"integer"},"type":"array","title":"Higher Rate Durations","description":"Clip lengths, in whole seconds, whose RATE is above this mode's base rate. Non-empty only where the provider publishes a separate price per clip length that is not a multiple of a per-second rate (Hailuo 2.3 standard: $0.28 for 6 seconds against $0.56 for 10). Empty means clip length either does not change the rate or scales it linearly through the basis above.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing.higher_rate_durations","typeLabel":"integer[]"},"reference_images_priced_separately":{"type":"boolean","title":"Reference Images Priced Separately","description":"Whether each reference image adds a flat charge on top of the per-second rate, billed independently of clip length and resolution. False means reference images cost nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing.reference_images_priced_separately","typeLabel":"boolean"},"reference_images_included_before_surcharge":{"type":"integer","title":"Reference Images Included Before Surcharge","description":"How many reference images carry no separate input surcharge. Meaningful only when reference_images_priced_separately is true.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing.reference_images_included_before_surcharge","typeLabel":"integer"}},"type":"object","required":["basis","duration_quantity","audio_priced_separately","higher_rate_resolutions","input_seconds_priced_separately","higher_rate_durations","reference_images_priced_separately","reference_images_included_before_surcharge"],"title":"PublicVideoModeBilling","description":"How this mode's provider cost is metered.\n\nNo dollar or credit amount appears here, whatever the basis: the charge is\ncomputed asynchronously by the usage pipeline from the resolved request at\nthe team's own credit rate, which this document cannot know. So this reports\nthe BASIS and the knobs that move it — including `call`, where the provider\nquotes one flat price per generation and the clip's running time moves\nnothing. A flat basis still does not mean a publishable number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.billing","typeLabel":"PublicVideoModeBilling · object"},"end_image_aspect_ratios":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_aspect_ratios.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_aspect_ratios.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_aspect_ratios.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_aspect_ratios","typeLabel":"string[] | null"},"end_image_default_aspect_ratio":{"oneOf":[{"type":"string","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_default_aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_default_aspect_ratio","typeLabel":"string | null"},"fixed_output_resolution":{"oneOf":[{"type":"string","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.fixed_output_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.fixed_output_resolution.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.fixed_output_resolution","typeLabel":"string | null"},"end_image_duration_seconds":{"oneOf":[{"type":"object","title":"PublicVideoDuration","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","required":["min_seconds","max_seconds","default","supports_auto"],"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0.controllable","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.0","typeLabel":"PublicVideoDuration · object"},{"type":"null","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.end_image_duration_seconds","typeLabel":"PublicVideoDuration · object | null"},"source_video":{"oneOf":[{"type":"object","title":"PublicVideoSourceVideo","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","required":["min_seconds","max_seconds","max_area_pixels","accepted_formats","input_seconds_priced_separately","output_includes_source"],"properties":{"min_seconds":{"oneOf":[{"type":"number","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.min_seconds","typeLabel":"number | null"},"max_seconds":{"oneOf":[{"type":"number","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.max_seconds","typeLabel":"number | null"},"max_area_pixels":{"oneOf":[{"type":"integer","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.max_area_pixels","typeLabel":"integer | null"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Container and codecs the provider documents for the source clip, and which Moda enforces against the clip's own bytes before uploading it: a container or a video codec outside this list is refused here rather than by the provider. A clip whose codec cannot be read is not refused — unknown is not the same as unsupported. Empty means the provider publishes no restriction and its own validation is the only gate.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.accepted_formats","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of the SOURCE clip is billed on top of the returned clip's per-second charge. False means the source costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.input_seconds_priced_separately","typeLabel":"boolean"},"output_includes_source":{"type":"boolean","title":"Output Includes Source","description":"Whether the returned clip contains the source as well as the new footage. When true, duration_seconds is the length of the ADDED segment and the delivered video is longer than it by the source's own running time. Read billing.duration_quantity to learn whether the provider meters that whole return or only the requested extension.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0.output_includes_source","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.0","typeLabel":"PublicVideoSourceVideo · object"},{"type":"null","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.source_video","typeLabel":"PublicVideoSourceVideo · object | null"},"image_requirements":{"items":{"properties":{"roles":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].roles.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Roles","description":"The image roles this envelope covers: 'start', 'end', and/or 'reference'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].roles","typeLabel":"string[]"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Accepted DECODED image formats (e.g. 'JPEG', 'PNG'). Empty means the provider publishes no format restriction. Matched against the decoded bytes, not the file name or Content-Type.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].accepted_formats","typeLabel":"string[]"},"max_bytes":{"oneOf":[{"type":"integer","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].max_bytes","typeLabel":"integer | null"},"min_width":{"oneOf":[{"type":"integer","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].min_width","typeLabel":"integer | null"},"min_height":{"oneOf":[{"type":"integer","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].min_height","typeLabel":"integer | null"},"max_pixels":{"oneOf":[{"type":"integer","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].max_pixels","typeLabel":"integer | null"},"min_aspect_ratio":{"oneOf":[{"type":"number","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio","typeLabel":"number | null"},"max_aspect_ratio":{"oneOf":[{"type":"number","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio","typeLabel":"number | null"}},"type":"object","required":["roles","accepted_formats","max_bytes","min_width","min_height","max_pixels","min_aspect_ratio","max_aspect_ratio"],"title":"PublicVideoImageRequirements","description":"The documented envelope for the images a mode is handed.\n\nProvider-published, except that max_pixels may also carry a Moda platform\nceiling. A null field means nothing is stated — not that anything goes.\nModa checks these before submitting whenever it already knows the property;\nthe provider validates either way.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements.items.[INDEX]","typeLabel":"PublicVideoImageRequirements · object"},"type":"array","title":"Image Requirements","description":"The provider's documented requirements for the images this mode is handed, one entry per group of roles sharing an envelope (roles never repeat across entries). Empty when the provider publishes none and its own validation is the only gate. Moda checks these before submitting whenever it already measured the property; for an image supplied as an external URL it has measured nothing, so the provider is the only gate.","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0.image_requirements","typeLabel":"PublicVideoImageRequirements · object[]"}},"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.0","typeLabel":"PublicVideoModeCapability · object"},{"type":"null","uniqueKey":"video_models.items.[INDEX].modes.audio_to_video.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.audio_to_video","typeLabel":"PublicVideoModeCapability · object | null"},"video_extend":{"oneOf":[{"type":"object","title":"PublicVideoModeCapability","description":"One generation mode's real capability envelope for one model.","required":["aspect_ratios","default_aspect_ratio","resolutions","default_resolution","duration_seconds","supports_end_image","max_reference_images","reference_videos","reference_audios","max_reference_inputs_total","generate_audio_controllable","billing"],"properties":{"aspect_ratios":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.aspect_ratios.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Aspect Ratios","description":"Aspect ratios the mode accepts ('auto' = the provider chooses the framing). Empty means the mode has no aspect control at all — the endpoint decides (an image route frames from its input still, a source_video mode from the source clip, a text route from the endpoint's own default), and a requested ratio is dropped and reported.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.aspect_ratios","typeLabel":"string[]"},"default_aspect_ratio":{"oneOf":[{"type":"string","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.default_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.default_aspect_ratio","typeLabel":"string | null"},"resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Resolutions","description":"Supported resolution tiers (for example 720p, 2k, or 4k). Actual pixel dimensions may depend on the selected aspect ratio or input image. Empty means the mode has no resolution control and a requested resolution is dropped and reported. What comes back instead: where the mode declares a source_video, the source clip's own frame size, which is also what selects the rate tier; otherwise read fixed_output_resolution, where a size is what the endpoint ALWAYS returns and only a null means the output size is genuinely not something we can state.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.resolutions","typeLabel":"string[]"},"default_resolution":{"oneOf":[{"type":"string","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.default_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.default_resolution.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.default_resolution","typeLabel":"string | null"},"duration_seconds":{"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds.controllable","typeLabel":"boolean"}},"type":"object","required":["min_seconds","max_seconds","default","supports_auto"],"title":"PublicVideoDuration","description":"One mode's clip-length envelope, in whole seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.duration_seconds","typeLabel":"PublicVideoDuration · object"},"supports_end_image":{"type":"boolean","title":"Supports End Image","description":"image_to_video only: whether the request may carry end_image alongside start_image for a first-to-last-frame morph.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.supports_end_image","typeLabel":"boolean"},"max_reference_images":{"type":"integer","title":"Max Reference Images","description":"reference_to_video only: maximum reference_images one request may carry. 0 means the mode takes no reference images.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.max_reference_images","typeLabel":"integer"},"reference_videos":{"oneOf":[{"type":"object","title":"PublicVideoReferenceVideos","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","input_duration_billed","price_multiplier","input_duration_price_multiplier"],"properties":{"max_count":{"type":"integer","title":"Max Count","description":"Maximum reference clips one request may carry.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_videos.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","description":"Minimum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_videos.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","description":"Maximum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_videos.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","description":"Maximum combined running time across all reference clips.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_videos.oneOf.0.max_total_seconds","typeLabel":"number"},"input_duration_billed":{"type":"boolean","title":"Input Duration Billed","description":"Whether the reference clips' own running time is billed on top of the generated clip's.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_videos.oneOf.0.input_duration_billed","typeLabel":"boolean"},"price_multiplier":{"type":"number","title":"Price Multiplier","description":"The provider's published factor a reference-video call's whole charge (including any billed input duration) is multiplied by. 1.0 means the provider publishes no factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_videos.oneOf.0.price_multiplier","typeLabel":"number"},"input_duration_price_multiplier":{"type":"number","title":"Input Duration Price Multiplier","description":"Factor applied only to billed reference-video duration; 1.0 means no input-only factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_videos.oneOf.0.input_duration_price_multiplier","typeLabel":"number"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_videos.oneOf.0","typeLabel":"PublicVideoReferenceVideos · object"},{"type":"null","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_videos.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_videos","typeLabel":"PublicVideoReferenceVideos · object | null"},"reference_audios":{"oneOf":[{"type":"object","title":"PublicVideoReferenceAudios","description":"The reference-audio envelope; null when the mode takes no audio reference input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","requires_visual_reference"],"properties":{"max_count":{"type":"integer","title":"Max Count","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.0.max_total_seconds","typeLabel":"number"},"requires_visual_reference":{"type":"boolean","title":"Requires Visual Reference","description":"Whether at least one reference image or video must accompany reference audio.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.0.requires_visual_reference","typeLabel":"boolean"},"accepted_container_types":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.0.accepted_container_types","typeLabel":"string[] | null"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.0","typeLabel":"PublicVideoReferenceAudios · object"},{"type":"null","description":"The reference-audio envelope; null when the mode takes no audio reference input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.reference_audios","typeLabel":"PublicVideoReferenceAudios · object | null"},"max_reference_inputs_total":{"oneOf":[{"type":"integer","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.max_reference_inputs_total.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.max_reference_inputs_total.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.max_reference_inputs_total","typeLabel":"integer | null"},"generate_audio_controllable":{"type":"boolean","title":"Generate Audio Controllable","description":"Whether generate_audio can be turned off ON THIS MODE. False means this endpoint has no such control: generate_audio=false is accepted, reported as an adjustment, and audio comes back anyway. The model-level field of the same name says it about every mode at once; this one can be false on a single mode while the model's others are controllable.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.generate_audio_controllable","typeLabel":"boolean"},"billing":{"properties":{"basis":{"type":"string","title":"Basis","description":"The quantity the price is quoted in: 'second' bills per second of generated output; 'megapixel_second' bills on frame area x duration, so resolution AND aspect ratio scale the cost, not just clip length; 'call' bills one flat price per generation, so the clip's running time does not move the charge at all — see higher_rate_durations for the clip lengths that carry a different flat price. Always present — a model whose basis is not expressible does not register.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing.basis","typeLabel":"string"},"duration_quantity":{"type":"string","title":"Duration Quantity","description":"The duration multiplied by a per-second basis: measured_output for ordinary generation, measured_input_audio when a driving track determines and meters the clip length, measured_whole_return when an extension bills source plus tail, or requested_extension when only the requested generated tail is metered.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing.duration_quantity","typeLabel":"string"},"audio_priced_separately":{"type":"boolean","title":"Audio Priced Separately","description":"Whether generate_audio=true bills a distinct (higher) rate than a silent render. False means audio is folded into one price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing.audio_priced_separately","typeLabel":"boolean"},"higher_rate_resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing.higher_rate_resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Higher Rate Resolutions","description":"Resolutions whose RATE is above this mode's base rate. For a 'megapixel_second' basis every resolution already scales the cost by area, so this lists only extra rate tiers — and a resolution absent from it can still cost more, because the frame is larger. A provider may even meter a larger frame at a lower rate (Seedance 2.0's 4K), which is why this reads the rate rather than which resolutions carry their own price. Where the resolutions list is empty because the output follows a source video, these bands are selected by the SOURCE clip's measured frame rather than by anything the request carries.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing.higher_rate_resolutions","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of a source video adds a per-second charge on top of the returned clip's rate, on its own key. False means the source clip costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing.input_seconds_priced_separately","typeLabel":"boolean"},"higher_rate_durations":{"items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing.higher_rate_durations.items.[INDEX]","typeLabel":"integer"},"type":"array","title":"Higher Rate Durations","description":"Clip lengths, in whole seconds, whose RATE is above this mode's base rate. Non-empty only where the provider publishes a separate price per clip length that is not a multiple of a per-second rate (Hailuo 2.3 standard: $0.28 for 6 seconds against $0.56 for 10). Empty means clip length either does not change the rate or scales it linearly through the basis above.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing.higher_rate_durations","typeLabel":"integer[]"},"reference_images_priced_separately":{"type":"boolean","title":"Reference Images Priced Separately","description":"Whether each reference image adds a flat charge on top of the per-second rate, billed independently of clip length and resolution. False means reference images cost nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing.reference_images_priced_separately","typeLabel":"boolean"},"reference_images_included_before_surcharge":{"type":"integer","title":"Reference Images Included Before Surcharge","description":"How many reference images carry no separate input surcharge. Meaningful only when reference_images_priced_separately is true.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing.reference_images_included_before_surcharge","typeLabel":"integer"}},"type":"object","required":["basis","duration_quantity","audio_priced_separately","higher_rate_resolutions","input_seconds_priced_separately","higher_rate_durations","reference_images_priced_separately","reference_images_included_before_surcharge"],"title":"PublicVideoModeBilling","description":"How this mode's provider cost is metered.\n\nNo dollar or credit amount appears here, whatever the basis: the charge is\ncomputed asynchronously by the usage pipeline from the resolved request at\nthe team's own credit rate, which this document cannot know. So this reports\nthe BASIS and the knobs that move it — including `call`, where the provider\nquotes one flat price per generation and the clip's running time moves\nnothing. A flat basis still does not mean a publishable number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.billing","typeLabel":"PublicVideoModeBilling · object"},"end_image_aspect_ratios":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_aspect_ratios.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_aspect_ratios.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_aspect_ratios.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_aspect_ratios","typeLabel":"string[] | null"},"end_image_default_aspect_ratio":{"oneOf":[{"type":"string","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_default_aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_default_aspect_ratio","typeLabel":"string | null"},"fixed_output_resolution":{"oneOf":[{"type":"string","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.fixed_output_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.fixed_output_resolution.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.fixed_output_resolution","typeLabel":"string | null"},"end_image_duration_seconds":{"oneOf":[{"type":"object","title":"PublicVideoDuration","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","required":["min_seconds","max_seconds","default","supports_auto"],"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0.controllable","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.0","typeLabel":"PublicVideoDuration · object"},{"type":"null","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.end_image_duration_seconds","typeLabel":"PublicVideoDuration · object | null"},"source_video":{"oneOf":[{"type":"object","title":"PublicVideoSourceVideo","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","required":["min_seconds","max_seconds","max_area_pixels","accepted_formats","input_seconds_priced_separately","output_includes_source"],"properties":{"min_seconds":{"oneOf":[{"type":"number","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.min_seconds","typeLabel":"number | null"},"max_seconds":{"oneOf":[{"type":"number","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.max_seconds","typeLabel":"number | null"},"max_area_pixels":{"oneOf":[{"type":"integer","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.max_area_pixels","typeLabel":"integer | null"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Container and codecs the provider documents for the source clip, and which Moda enforces against the clip's own bytes before uploading it: a container or a video codec outside this list is refused here rather than by the provider. A clip whose codec cannot be read is not refused — unknown is not the same as unsupported. Empty means the provider publishes no restriction and its own validation is the only gate.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.accepted_formats","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of the SOURCE clip is billed on top of the returned clip's per-second charge. False means the source costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.input_seconds_priced_separately","typeLabel":"boolean"},"output_includes_source":{"type":"boolean","title":"Output Includes Source","description":"Whether the returned clip contains the source as well as the new footage. When true, duration_seconds is the length of the ADDED segment and the delivered video is longer than it by the source's own running time. Read billing.duration_quantity to learn whether the provider meters that whole return or only the requested extension.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0.output_includes_source","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.0","typeLabel":"PublicVideoSourceVideo · object"},{"type":"null","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.source_video","typeLabel":"PublicVideoSourceVideo · object | null"},"image_requirements":{"items":{"properties":{"roles":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].roles.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Roles","description":"The image roles this envelope covers: 'start', 'end', and/or 'reference'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].roles","typeLabel":"string[]"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Accepted DECODED image formats (e.g. 'JPEG', 'PNG'). Empty means the provider publishes no format restriction. Matched against the decoded bytes, not the file name or Content-Type.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].accepted_formats","typeLabel":"string[]"},"max_bytes":{"oneOf":[{"type":"integer","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].max_bytes","typeLabel":"integer | null"},"min_width":{"oneOf":[{"type":"integer","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].min_width","typeLabel":"integer | null"},"min_height":{"oneOf":[{"type":"integer","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].min_height","typeLabel":"integer | null"},"max_pixels":{"oneOf":[{"type":"integer","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].max_pixels","typeLabel":"integer | null"},"min_aspect_ratio":{"oneOf":[{"type":"number","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio","typeLabel":"number | null"},"max_aspect_ratio":{"oneOf":[{"type":"number","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio","typeLabel":"number | null"}},"type":"object","required":["roles","accepted_formats","max_bytes","min_width","min_height","max_pixels","min_aspect_ratio","max_aspect_ratio"],"title":"PublicVideoImageRequirements","description":"The documented envelope for the images a mode is handed.\n\nProvider-published, except that max_pixels may also carry a Moda platform\nceiling. A null field means nothing is stated — not that anything goes.\nModa checks these before submitting whenever it already knows the property;\nthe provider validates either way.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements.items.[INDEX]","typeLabel":"PublicVideoImageRequirements · object"},"type":"array","title":"Image Requirements","description":"The provider's documented requirements for the images this mode is handed, one entry per group of roles sharing an envelope (roles never repeat across entries). Empty when the provider publishes none and its own validation is the only gate. Moda checks these before submitting whenever it already measured the property; for an image supplied as an external URL it has measured nothing, so the provider is the only gate.","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0.image_requirements","typeLabel":"PublicVideoImageRequirements · object[]"}},"uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.0","typeLabel":"PublicVideoModeCapability · object"},{"type":"null","uniqueKey":"video_models.items.[INDEX].modes.video_extend.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_extend","typeLabel":"PublicVideoModeCapability · object | null"},"video_lipsync":{"oneOf":[{"type":"object","title":"PublicVideoModeCapability","description":"One generation mode's real capability envelope for one model.","required":["aspect_ratios","default_aspect_ratio","resolutions","default_resolution","duration_seconds","supports_end_image","max_reference_images","reference_videos","reference_audios","max_reference_inputs_total","generate_audio_controllable","billing"],"properties":{"aspect_ratios":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.aspect_ratios.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Aspect Ratios","description":"Aspect ratios the mode accepts ('auto' = the provider chooses the framing). Empty means the mode has no aspect control at all — the endpoint decides (an image route frames from its input still, a source_video mode from the source clip, a text route from the endpoint's own default), and a requested ratio is dropped and reported.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.aspect_ratios","typeLabel":"string[]"},"default_aspect_ratio":{"oneOf":[{"type":"string","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Aspect Ratio","description":"The framing used when aspect_ratio is omitted; null when the mode has no aspect control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.default_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.default_aspect_ratio","typeLabel":"string | null"},"resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Resolutions","description":"Supported resolution tiers (for example 720p, 2k, or 4k). Actual pixel dimensions may depend on the selected aspect ratio or input image. Empty means the mode has no resolution control and a requested resolution is dropped and reported. What comes back instead: where the mode declares a source_video, the source clip's own frame size, which is also what selects the rate tier; otherwise read fixed_output_resolution, where a size is what the endpoint ALWAYS returns and only a null means the output size is genuinely not something we can state.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.resolutions","typeLabel":"string[]"},"default_resolution":{"oneOf":[{"type":"string","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.default_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Resolution","description":"The resolution used when resolution is omitted; null when the mode has no resolution control.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.default_resolution.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.default_resolution","typeLabel":"string | null"},"duration_seconds":{"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds.controllable","typeLabel":"boolean"}},"type":"object","required":["min_seconds","max_seconds","default","supports_auto"],"title":"PublicVideoDuration","description":"One mode's clip-length envelope, in whole seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.duration_seconds","typeLabel":"PublicVideoDuration · object"},"supports_end_image":{"type":"boolean","title":"Supports End Image","description":"image_to_video only: whether the request may carry end_image alongside start_image for a first-to-last-frame morph.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.supports_end_image","typeLabel":"boolean"},"max_reference_images":{"type":"integer","title":"Max Reference Images","description":"reference_to_video only: maximum reference_images one request may carry. 0 means the mode takes no reference images.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.max_reference_images","typeLabel":"integer"},"reference_videos":{"oneOf":[{"type":"object","title":"PublicVideoReferenceVideos","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","input_duration_billed","price_multiplier","input_duration_price_multiplier"],"properties":{"max_count":{"type":"integer","title":"Max Count","description":"Maximum reference clips one request may carry.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_videos.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","description":"Minimum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_videos.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","description":"Maximum running time per reference clip, in seconds.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_videos.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","description":"Maximum combined running time across all reference clips.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_videos.oneOf.0.max_total_seconds","typeLabel":"number"},"input_duration_billed":{"type":"boolean","title":"Input Duration Billed","description":"Whether the reference clips' own running time is billed on top of the generated clip's.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_videos.oneOf.0.input_duration_billed","typeLabel":"boolean"},"price_multiplier":{"type":"number","title":"Price Multiplier","description":"The provider's published factor a reference-video call's whole charge (including any billed input duration) is multiplied by. 1.0 means the provider publishes no factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_videos.oneOf.0.price_multiplier","typeLabel":"number"},"input_duration_price_multiplier":{"type":"number","title":"Input Duration Price Multiplier","description":"Factor applied only to billed reference-video duration; 1.0 means no input-only factor.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_videos.oneOf.0.input_duration_price_multiplier","typeLabel":"number"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_videos.oneOf.0","typeLabel":"PublicVideoReferenceVideos · object"},{"type":"null","description":"The reference-video (video-to-video) envelope; null when the mode takes no video input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_videos.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_videos","typeLabel":"PublicVideoReferenceVideos · object | null"},"reference_audios":{"oneOf":[{"type":"object","title":"PublicVideoReferenceAudios","description":"The reference-audio envelope; null when the mode takes no audio reference input.","required":["max_count","min_seconds_each","max_seconds_each","max_total_seconds","requires_visual_reference"],"properties":{"max_count":{"type":"integer","title":"Max Count","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.0.max_count","typeLabel":"integer"},"min_seconds_each":{"type":"number","title":"Min Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.0.min_seconds_each","typeLabel":"number"},"max_seconds_each":{"type":"number","title":"Max Seconds Each","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.0.max_seconds_each","typeLabel":"number"},"max_total_seconds":{"type":"number","title":"Max Total Seconds","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.0.max_total_seconds","typeLabel":"number"},"requires_visual_reference":{"type":"boolean","title":"Requires Visual Reference","description":"Whether at least one reference image or video must accompany reference audio.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.0.requires_visual_reference","typeLabel":"boolean"},"accepted_container_types":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Accepted Container Types","description":"Content types accepted for the driving track, where the mode derives the clip's length from it and bills that length. Only containers Moda measures frame by frame qualify; a container that merely declares its own duration is refused. Null where the mode does not bill the track, in which case every supported audio type is accepted.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.0.accepted_container_types.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.0.accepted_container_types","typeLabel":"string[] | null"}},"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.0","typeLabel":"PublicVideoReferenceAudios · object"},{"type":"null","description":"The reference-audio envelope; null when the mode takes no audio reference input.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.reference_audios","typeLabel":"PublicVideoReferenceAudios · object | null"},"max_reference_inputs_total":{"oneOf":[{"type":"integer","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.max_reference_inputs_total.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Reference Inputs Total","description":"Maximum combined reference image, video, and audio count; null when there is no combined cap.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.max_reference_inputs_total.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.max_reference_inputs_total","typeLabel":"integer | null"},"generate_audio_controllable":{"type":"boolean","title":"Generate Audio Controllable","description":"Whether generate_audio can be turned off ON THIS MODE. False means this endpoint has no such control: generate_audio=false is accepted, reported as an adjustment, and audio comes back anyway. The model-level field of the same name says it about every mode at once; this one can be false on a single mode while the model's others are controllable.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.generate_audio_controllable","typeLabel":"boolean"},"billing":{"properties":{"basis":{"type":"string","title":"Basis","description":"The quantity the price is quoted in: 'second' bills per second of generated output; 'megapixel_second' bills on frame area x duration, so resolution AND aspect ratio scale the cost, not just clip length; 'call' bills one flat price per generation, so the clip's running time does not move the charge at all — see higher_rate_durations for the clip lengths that carry a different flat price. Always present — a model whose basis is not expressible does not register.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing.basis","typeLabel":"string"},"duration_quantity":{"type":"string","title":"Duration Quantity","description":"The duration multiplied by a per-second basis: measured_output for ordinary generation, measured_input_audio when a driving track determines and meters the clip length, measured_whole_return when an extension bills source plus tail, or requested_extension when only the requested generated tail is metered.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing.duration_quantity","typeLabel":"string"},"audio_priced_separately":{"type":"boolean","title":"Audio Priced Separately","description":"Whether generate_audio=true bills a distinct (higher) rate than a silent render. False means audio is folded into one price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing.audio_priced_separately","typeLabel":"boolean"},"higher_rate_resolutions":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing.higher_rate_resolutions.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Higher Rate Resolutions","description":"Resolutions whose RATE is above this mode's base rate. For a 'megapixel_second' basis every resolution already scales the cost by area, so this lists only extra rate tiers — and a resolution absent from it can still cost more, because the frame is larger. A provider may even meter a larger frame at a lower rate (Seedance 2.0's 4K), which is why this reads the rate rather than which resolutions carry their own price. Where the resolutions list is empty because the output follows a source video, these bands are selected by the SOURCE clip's measured frame rather than by anything the request carries.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing.higher_rate_resolutions","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of a source video adds a per-second charge on top of the returned clip's rate, on its own key. False means the source clip costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing.input_seconds_priced_separately","typeLabel":"boolean"},"higher_rate_durations":{"items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing.higher_rate_durations.items.[INDEX]","typeLabel":"integer"},"type":"array","title":"Higher Rate Durations","description":"Clip lengths, in whole seconds, whose RATE is above this mode's base rate. Non-empty only where the provider publishes a separate price per clip length that is not a multiple of a per-second rate (Hailuo 2.3 standard: $0.28 for 6 seconds against $0.56 for 10). Empty means clip length either does not change the rate or scales it linearly through the basis above.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing.higher_rate_durations","typeLabel":"integer[]"},"reference_images_priced_separately":{"type":"boolean","title":"Reference Images Priced Separately","description":"Whether each reference image adds a flat charge on top of the per-second rate, billed independently of clip length and resolution. False means reference images cost nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing.reference_images_priced_separately","typeLabel":"boolean"},"reference_images_included_before_surcharge":{"type":"integer","title":"Reference Images Included Before Surcharge","description":"How many reference images carry no separate input surcharge. Meaningful only when reference_images_priced_separately is true.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing.reference_images_included_before_surcharge","typeLabel":"integer"}},"type":"object","required":["basis","duration_quantity","audio_priced_separately","higher_rate_resolutions","input_seconds_priced_separately","higher_rate_durations","reference_images_priced_separately","reference_images_included_before_surcharge"],"title":"PublicVideoModeBilling","description":"How this mode's provider cost is metered.\n\nNo dollar or credit amount appears here, whatever the basis: the charge is\ncomputed asynchronously by the usage pipeline from the resolved request at\nthe team's own credit rate, which this document cannot know. So this reports\nthe BASIS and the knobs that move it — including `call`, where the provider\nquotes one flat price per generation and the clip's running time moves\nnothing. A flat basis still does not mean a publishable number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.billing","typeLabel":"PublicVideoModeBilling · object"},"end_image_aspect_ratios":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_aspect_ratios.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_aspect_ratios.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"End Image Aspect Ratios","description":"The both-frames route's aspect ratios when they differ from the single-frame route.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_aspect_ratios.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_aspect_ratios","typeLabel":"string[] | null"},"end_image_default_aspect_ratio":{"oneOf":[{"type":"string","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_default_aspect_ratio.oneOf.0","typeLabel":"string"},{"type":"null","title":"End Image Default Aspect Ratio","description":"The both-frames route's default aspect ratio when that route has its own axis.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_default_aspect_ratio.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_default_aspect_ratio","typeLabel":"string | null"},"fixed_output_resolution":{"oneOf":[{"type":"string","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.fixed_output_resolution.oneOf.0","typeLabel":"string"},{"type":"null","title":"Fixed Output Resolution","description":"The size this mode ALWAYS returns, where it has no resolution control to ask with. Null means the output size is not something we can state — not that it varies with the request. Read this rather than resolutions when resolutions is empty.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.fixed_output_resolution.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.fixed_output_resolution","typeLabel":"string | null"},"end_image_duration_seconds":{"oneOf":[{"type":"object","title":"PublicVideoDuration","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","required":["min_seconds","max_seconds","default","supports_auto"],"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this is the length of the ADDED segment and the delivered clip is longer than it by the source's own running time — read source_video before budgeting from this number.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds. On a mode whose source_video reports output_includes_source, this bounds the ADDED segment rather than the delivered clip, and the provider may meter the whole delivered clip or only the added segment; read billing.duration_quantity.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.max_seconds","typeLabel":"integer"},"default":{"oneOf":[{"type":"integer","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.0","typeLabel":"integer"},{"type":"string","title":"Default","description":"What runs when duration_seconds is omitted. A numeric value is a fixed default; 'auto' means omission itself lets the provider pick the clip length.","const":"auto","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.default.oneOf.1","typeLabel":"string"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.default","typeLabel":"integer | string"},"supports_auto":{"type":"boolean","title":"Supports Auto","description":"Whether the model can be asked to pick the clip length by passing duration_seconds=\"auto\". Omitting duration_seconds takes default, which may independently be numeric or 'auto'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.supports_auto","typeLabel":"boolean"},"allowed_seconds":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Seconds","description":"The exact legal clip lengths, for a model that takes only fixed lengths (e.g. Veo's 4/6/8). null means every whole second in [min_seconds, max_seconds] is legal. Out-of-envelope asks snap to the nearest supported value and the adjustment is reported in the response.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.allowed_seconds","typeLabel":"integer[] | null"},"controllable":{"type":"boolean","title":"Controllable","description":"Whether duration_seconds is a control on this mode at all. False means the clip length is DERIVED from an input: an audio-driven mode renders to the driving track, and a lip-sync returns the source clip at its own length. Either way every explicit ask is answered with the input's measured length and reported as an adjustment, and the min/max here bound that input rather than a choice. Where this is false, read default and supports_auto as 'nothing to pick', not as 'the provider picks'.","default":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0.controllable","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.0","typeLabel":"PublicVideoDuration · object"},{"type":"null","description":"The clip-length envelope that applies when the request carries end_image, where the first-to-last-frame morph accepts a narrower set than the animation route on the same mode (Veo 3.1 Lite: 8 seconds only, against 4/6/8). null means duration_seconds applies to both. An out-of-envelope ask snaps and the adjustment is reported, so a 4-second morph renders 8 seconds rather than failing — check it if the length matters.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.end_image_duration_seconds","typeLabel":"PublicVideoDuration · object | null"},"source_video":{"oneOf":[{"type":"object","title":"PublicVideoSourceVideo","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","required":["min_seconds","max_seconds","max_area_pixels","accepted_formats","input_seconds_priced_separately","output_includes_source"],"properties":{"min_seconds":{"oneOf":[{"type":"number","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Seconds","description":"Shortest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.min_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.min_seconds","typeLabel":"number | null"},"max_seconds":{"oneOf":[{"type":"number","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Seconds","description":"Longest source clip the mode accepts, if published.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.max_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.max_seconds","typeLabel":"number | null"},"max_area_pixels":{"oneOf":[{"type":"integer","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Area Pixels","description":"Largest source frame the mode accepts, in total pixels (width x height). Stated as an area rather than a width and a height, which is how the provider enforces it: a portrait clip is accepted at the same pixel count as a landscape one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.max_area_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.max_area_pixels","typeLabel":"integer | null"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Container and codecs the provider documents for the source clip, and which Moda enforces against the clip's own bytes before uploading it: a container or a video codec outside this list is refused here rather than by the provider. A clip whose codec cannot be read is not refused — unknown is not the same as unsupported. Empty means the provider publishes no restriction and its own validation is the only gate.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.accepted_formats","typeLabel":"string[]"},"input_seconds_priced_separately":{"type":"boolean","title":"Input Seconds Priced Separately","description":"Whether every second of the SOURCE clip is billed on top of the returned clip's per-second charge. False means the source costs nothing beyond the mode's main price.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.input_seconds_priced_separately","typeLabel":"boolean"},"output_includes_source":{"type":"boolean","title":"Output Includes Source","description":"Whether the returned clip contains the source as well as the new footage. When true, duration_seconds is the length of the ADDED segment and the delivered video is longer than it by the source's own running time. Read billing.duration_quantity to learn whether the provider meters that whole return or only the requested extension.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0.output_includes_source","typeLabel":"boolean"}},"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.0","typeLabel":"PublicVideoSourceVideo · object"},{"type":"null","description":"video_extend only: the envelope for the clip this mode operates on. null when the mode takes no source video.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.source_video","typeLabel":"PublicVideoSourceVideo · object | null"},"image_requirements":{"items":{"properties":{"roles":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].roles.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Roles","description":"The image roles this envelope covers: 'start', 'end', and/or 'reference'.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].roles","typeLabel":"string[]"},"accepted_formats":{"items":{"type":"string","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].accepted_formats.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Accepted Formats","description":"Accepted DECODED image formats (e.g. 'JPEG', 'PNG'). Empty means the provider publishes no format restriction. Matched against the decoded bytes, not the file name or Content-Type.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].accepted_formats","typeLabel":"string[]"},"max_bytes":{"oneOf":[{"type":"integer","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Bytes","description":"Largest accepted encoded image, in bytes. Applies per image, not to the set.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].max_bytes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].max_bytes","typeLabel":"integer | null"},"min_width":{"oneOf":[{"type":"integer","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Width","description":"Smallest accepted width, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].min_width.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].min_width","typeLabel":"integer | null"},"min_height":{"oneOf":[{"type":"integer","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Min Height","description":"Smallest accepted height, in pixels.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].min_height.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].min_height","typeLabel":"integer | null"},"max_pixels":{"oneOf":[{"type":"integer","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Pixels","description":"Largest accepted decoded size, in total pixels (width x height). May be a Moda platform ceiling rather than a provider-published one.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].max_pixels.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].max_pixels","typeLabel":"integer | null"},"min_aspect_ratio":{"oneOf":[{"type":"number","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Min Aspect Ratio","description":"Smallest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].min_aspect_ratio","typeLabel":"number | null"},"max_aspect_ratio":{"oneOf":[{"type":"number","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.0","typeLabel":"number"},{"type":"null","title":"Max Aspect Ratio","description":"Largest accepted aspect ratio, measured as width divided by height, inclusive.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX].max_aspect_ratio","typeLabel":"number | null"}},"type":"object","required":["roles","accepted_formats","max_bytes","min_width","min_height","max_pixels","min_aspect_ratio","max_aspect_ratio"],"title":"PublicVideoImageRequirements","description":"The documented envelope for the images a mode is handed.\n\nProvider-published, except that max_pixels may also carry a Moda platform\nceiling. A null field means nothing is stated — not that anything goes.\nModa checks these before submitting whenever it already knows the property;\nthe provider validates either way.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements.items.[INDEX]","typeLabel":"PublicVideoImageRequirements · object"},"type":"array","title":"Image Requirements","description":"The provider's documented requirements for the images this mode is handed, one entry per group of roles sharing an envelope (roles never repeat across entries). Empty when the provider publishes none and its own validation is the only gate. Moda checks these before submitting whenever it already measured the property; for an image supplied as an external URL it has measured nothing, so the provider is the only gate.","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0.image_requirements","typeLabel":"PublicVideoImageRequirements · object[]"}},"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.0","typeLabel":"PublicVideoModeCapability · object"},{"type":"null","uniqueKey":"video_models.items.[INDEX].modes.video_lipsync.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].modes.video_lipsync","typeLabel":"PublicVideoModeCapability · object | null"}},"type":"object","title":"PublicVideoModelModes","description":"The modes a model supports; an absent mode is unsupported.\n\nSupplying start_image selects image_to_video; reference_images or\nreference_videos select reference_to_video, and reference_audios select it\ntoo when they arrive beside one of those. reference_audios ALONE — with or\nwithout a start_image, which is the opening frame — selects audio_to_video,\nwhere the clip is generated timed to the track and its length is the track's\nown. extend_video selects video_extend and lipsync_video selects\nvideo_lipsync; each takes one source clip, neither may be combined with the\nother or with any of the inputs above, and lipsync_video additionally\nREQUIRES one reference_audios track — the speech the mouth is re-cut to. A\nbare prompt is text_to_video.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].modes","typeLabel":"PublicVideoModelModes · object"},"model_params":{"items":{"properties":{"id":{"type":"string","title":"Id","description":"The model_params key.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].id","typeLabel":"string"},"description":{"type":"string","title":"Description","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].description","typeLabel":"string"},"type":{"type":"string","title":"Type","description":"JSON type of the value: string, integer, number, or boolean.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].type","typeLabel":"string"},"allowed_values":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].allowed_values.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Allowed Values","description":"The exact legal values, where the control is an enum.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].allowed_values.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Allowed Values","description":"The exact legal values, where the control is an enum.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].allowed_values.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].allowed_values","typeLabel":"string[] | null"},"minimum":{"oneOf":[{"type":"number","title":"Minimum","description":"Inclusive lower bound, where the control is numeric.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].minimum.oneOf.0","typeLabel":"number"},{"type":"null","title":"Minimum","description":"Inclusive lower bound, where the control is numeric.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].minimum.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].minimum","typeLabel":"number | null"},"maximum":{"oneOf":[{"type":"number","title":"Maximum","description":"Inclusive upper bound, where the control is numeric.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].maximum.oneOf.0","typeLabel":"number"},{"type":"null","title":"Maximum","description":"Inclusive upper bound, where the control is numeric.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].maximum.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].maximum","typeLabel":"number | null"},"max_length":{"oneOf":[{"type":"integer","title":"Max Length","description":"Maximum character count, where the control is a string and the provider publishes a limit.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].max_length.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Length","description":"Maximum character count, where the control is a string and the provider publishes a limit.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].max_length.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].max_length","typeLabel":"integer | null"},"max_bytes":{"oneOf":[{"type":"integer","title":"Max Bytes","description":"Maximum UTF-8 encoded byte count for a string control; distinct from characters.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].max_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Bytes","description":"Maximum UTF-8 encoded byte count for a string control; distinct from characters.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].max_bytes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].max_bytes","typeLabel":"integer | null"},"modes":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].modes.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Modes","description":"The generation modes the control applies to; null means every mode the model supports.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].modes.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Modes","description":"The generation modes the control applies to; null means every mode the model supports.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].modes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX].modes","typeLabel":"string[] | null"}},"type":"object","required":["id","description","type","allowed_values","minimum","maximum","max_length","max_bytes","modes"],"title":"PublicVideoModelParam","description":"One model-specific ``model_params`` control and its validated envelope.","uniqueKey":"video_models.items.[INDEX].model_params.items.[INDEX]","typeLabel":"PublicVideoModelParam · object"},"type":"array","title":"Model Params","description":"The model-specific controls the model_params object accepts, with their validated envelopes. Keys not listed here are rejected before billing — never forwarded on the chance the provider accepts them.","isRequired":true,"uniqueKey":"video_models.items.[INDEX].model_params","typeLabel":"PublicVideoModelParam · object[]"},"max_prompt_chars":{"oneOf":[{"type":"integer","title":"Max Prompt Chars","description":"The provider's documented ceiling on prompt length, in characters. A longer prompt is rejected before any input is resolved or billed, so read this before composing one. Null means no ceiling has been established for this model — not that it has none.","uniqueKey":"video_models.items.[INDEX].max_prompt_chars.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Prompt Chars","description":"The provider's documented ceiling on prompt length, in characters. A longer prompt is rejected before any input is resolved or billed, so read this before composing one. Null means no ceiling has been established for this model — not that it has none.","uniqueKey":"video_models.items.[INDEX].max_prompt_chars.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].max_prompt_chars","typeLabel":"integer | null"},"max_prompt_bytes":{"oneOf":[{"type":"integer","title":"Max Prompt Bytes","description":"The provider's documented UTF-8 byte ceiling on prompt length. Null means no byte ceiling has been established, not that the model has none.","uniqueKey":"video_models.items.[INDEX].max_prompt_bytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Prompt Bytes","description":"The provider's documented UTF-8 byte ceiling on prompt length. Null means no byte ceiling has been established, not that the model has none.","uniqueKey":"video_models.items.[INDEX].max_prompt_bytes.oneOf.1","typeLabel":"null"}],"uniqueKey":"video_models.items.[INDEX].max_prompt_bytes","typeLabel":"integer | null"}},"type":"object","required":["id","label","description","supports_generate_audio","generate_audio_default","generate_audio_controllable","supports_seed","modes","model_params"],"title":"PublicVideoModelDescriptor","description":"One video model's caller-facing capability card.","uniqueKey":"video_models.items.[INDEX]","typeLabel":"PublicVideoModelDescriptor · object"},"type":"array","title":"Video Models","description":"Video model capability descriptors, for generate-video: per-mode aspect/resolution/duration envelopes, audio and seed support, input-image and reference limits, the validated model_params controls, and how each mode's cost is metered. Exact credit amounts are computed from the resolved request by the usage pipeline at the team's credit rate — the billing block reports the basis and the knobs that move it, not a flat price.","isRequired":true,"uniqueKey":"video_models","typeLabel":"PublicVideoModelDescriptor · object[]"},"video_model_ids":{"items":{"type":"string","uniqueKey":"video_model_ids.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Video Model Ids","description":"Deprecated: the same ids as video_models[].id. Kept one release for compatibility.","isRequired":true,"uniqueKey":"video_model_ids","typeLabel":"string[]"},"audio_models":{"items":{"properties":{"id":{"type":"string","title":"Id","description":"The registry id the generate-audio 'model' parameter validates against.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].id","typeLabel":"string"},"label":{"type":"string","title":"Label","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","title":"Description","description":"What the model is good at, relative to its registry siblings.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].description","typeLabel":"string"},"modes":{"properties":{"text_to_speech":{"oneOf":[{"type":"object","title":"PublicAudioModeCapability","description":"One generation mode's real capability envelope for one model.","required":["duration_seconds","voices","voice_is_free_form","default_voice","max_prompt_chars","max_samples","output_mime_types","billing"],"properties":{"duration_seconds":{"oneOf":[{"type":"object","title":"PublicAudioDuration","description":"The clip-length envelope, or null where the mode has no duration control at all — speech is as long as the script takes to read, and a requested duration is dropped and reported in the response's adjustments rather than rejected.","required":["min_seconds","max_seconds","default","billing_floor_seconds","billing_granularity_seconds","bills_measured_output"],"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0.max_seconds","typeLabel":"integer"},"default":{"type":"integer","title":"Default","description":"The length that runs when duration_seconds is omitted.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0.default","typeLabel":"integer"},"billing_floor_seconds":{"oneOf":[{"type":"integer","title":"Billing Floor Seconds","description":"A sample shorter than this bills as this many seconds. null means the provider publishes no floor and none is applied. Combined with num_samples this is multiplicative: four 5-second samples against a 10-second floor bill 40 seconds, not 20.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0.billing_floor_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Billing Floor Seconds","description":"A sample shorter than this bills as this many seconds. null means the provider publishes no floor and none is applied. Combined with num_samples this is multiplicative: four 5-second samples against a 10-second floor bill 40 seconds, not 20.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0.billing_floor_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0.billing_floor_seconds","typeLabel":"integer | null"},"billing_granularity_seconds":{"oneOf":[{"type":"integer","title":"Billing Granularity Seconds","description":"Billing rounds UP to a whole multiple of this many seconds. null means it does not. Where a value is set the quoted per-second rate is charged on the rounded figure, so a 5-second ask against a 60-second granularity bills 60 seconds and 61 bills 120 — ask on the boundary.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0.billing_granularity_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Billing Granularity Seconds","description":"Billing rounds UP to a whole multiple of this many seconds. null means it does not. Where a value is set the quoted per-second rate is charged on the rounded figure, so a 5-second ask against a 60-second granularity bills 60 seconds and 61 bills 120 — ask on the boundary.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0.billing_granularity_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0.billing_granularity_seconds","typeLabel":"integer | null"},"bills_measured_output":{"type":"boolean","title":"Bills Measured Output","description":"True when the charge meters the audio actually RETURNED rather than the duration requested, so duration_seconds is an upper bound for billing rather than the billed quantity. The charge never exceeds the estimate taken from the request.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0.bills_measured_output","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.0","typeLabel":"PublicAudioDuration · object"},{"type":"null","description":"The clip-length envelope, or null where the mode has no duration control at all — speech is as long as the script takes to read, and a requested duration is dropped and reported in the response's adjustments rather than rejected.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.duration_seconds","typeLabel":"PublicAudioDuration · object | null"},"voices":{"items":{"type":"string","uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.voices.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Voices","description":"The preset voice names the voice parameter accepts, verbatim. Where a name carries a language tag ('Heitor (pt)'), the bare name ('Heitor') is accepted too when it names exactly one preset; a tag for a different language is rejected. Empty means one of two things, and voice_is_free_form tells you which: with it false, the mode has no voice axis and passing voice is rejected; with it true, the mode does take a voice but the provider publishes no roster to list.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.voices","typeLabel":"string[]"},"voice_is_free_form":{"type":"boolean","title":"Voice Is Free Form","description":"True when voice accepts any provider voice name or cloned-voice id rather than a value from voices — the provider enumerates no roster, so only the shape is checked here and an unusable name fails at the provider. False on every mode with a preset roster, and on every mode with no voice axis at all.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.voice_is_free_form","typeLabel":"boolean"},"default_voice":{"oneOf":[{"type":"string","title":"Default Voice","description":"The voice used when voice is omitted; null when the mode has no voice axis, and also null when voice_is_free_form is true and the provider's own default is whatever it applies.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.default_voice.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Voice","description":"The voice used when voice is omitted; null when the mode has no voice axis, and also null when voice_is_free_form is true and the provider's own default is whatever it applies.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.default_voice.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.default_voice","typeLabel":"string | null"},"max_prompt_chars":{"oneOf":[{"type":"integer","title":"Max Prompt Chars","description":"The provider's documented ceiling on the prompt, in characters. A longer prompt is rejected before anything is generated or billed. null means no ceiling has been established for this mode — not that it has none.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.max_prompt_chars.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Prompt Chars","description":"The provider's documented ceiling on the prompt, in characters. A longer prompt is rejected before anything is generated or billed. null means no ceiling has been established for this mode — not that it has none.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.max_prompt_chars.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.max_prompt_chars","typeLabel":"integer | null"},"max_samples":{"type":"integer","title":"Max Samples","description":"How many distinct takes one call may render. 1 means the mode has no sample axis and num_samples above 1 is rejected. Every sample is billed.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.max_samples","typeLabel":"integer"},"output_mime_types":{"items":{"type":"string","uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.output_mime_types.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Output Mime Types","description":"The audio container(s) this mode's output can arrive in.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.output_mime_types","typeLabel":"string[]"},"billing":{"properties":{"basis":{"type":"string","title":"Basis","description":"The quantity the price is quoted in: 'character' bills per character of the prompt text (speech — nothing knows how long the clip will be until it exists); 'utf8_byte' bills per UTF-8 byte of the prompt text (Fish Audio speech, so non-Latin scripts cost more per character); 'second' bills per second of generated audio, multiplied by num_samples and raised to duration_seconds.billing_floor_seconds where one is declared.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.billing.basis","typeLabel":"string"}},"type":"object","required":["basis"],"title":"PublicAudioModeBilling","description":"How this mode's provider cost is metered.\n\nExact credit amounts are computed from the resolved request at the team's\ncredit rate, so this reports the basis and the knobs that move it rather than\na flat price.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0.billing","typeLabel":"PublicAudioModeBilling · object"}},"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.0","typeLabel":"PublicAudioModeCapability · object"},{"type":"null","uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech.oneOf.1","typeLabel":"null"}],"uniqueKey":"audio_models.items.[INDEX].modes.text_to_speech","typeLabel":"PublicAudioModeCapability · object | null"},"text_to_music":{"oneOf":[{"type":"object","title":"PublicAudioModeCapability","description":"One generation mode's real capability envelope for one model.","required":["duration_seconds","voices","voice_is_free_form","default_voice","max_prompt_chars","max_samples","output_mime_types","billing"],"properties":{"duration_seconds":{"oneOf":[{"type":"object","title":"PublicAudioDuration","description":"The clip-length envelope, or null where the mode has no duration control at all — speech is as long as the script takes to read, and a requested duration is dropped and reported in the response's adjustments rather than rejected.","required":["min_seconds","max_seconds","default","billing_floor_seconds","billing_granularity_seconds","bills_measured_output"],"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0.max_seconds","typeLabel":"integer"},"default":{"type":"integer","title":"Default","description":"The length that runs when duration_seconds is omitted.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0.default","typeLabel":"integer"},"billing_floor_seconds":{"oneOf":[{"type":"integer","title":"Billing Floor Seconds","description":"A sample shorter than this bills as this many seconds. null means the provider publishes no floor and none is applied. Combined with num_samples this is multiplicative: four 5-second samples against a 10-second floor bill 40 seconds, not 20.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0.billing_floor_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Billing Floor Seconds","description":"A sample shorter than this bills as this many seconds. null means the provider publishes no floor and none is applied. Combined with num_samples this is multiplicative: four 5-second samples against a 10-second floor bill 40 seconds, not 20.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0.billing_floor_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0.billing_floor_seconds","typeLabel":"integer | null"},"billing_granularity_seconds":{"oneOf":[{"type":"integer","title":"Billing Granularity Seconds","description":"Billing rounds UP to a whole multiple of this many seconds. null means it does not. Where a value is set the quoted per-second rate is charged on the rounded figure, so a 5-second ask against a 60-second granularity bills 60 seconds and 61 bills 120 — ask on the boundary.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0.billing_granularity_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Billing Granularity Seconds","description":"Billing rounds UP to a whole multiple of this many seconds. null means it does not. Where a value is set the quoted per-second rate is charged on the rounded figure, so a 5-second ask against a 60-second granularity bills 60 seconds and 61 bills 120 — ask on the boundary.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0.billing_granularity_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0.billing_granularity_seconds","typeLabel":"integer | null"},"bills_measured_output":{"type":"boolean","title":"Bills Measured Output","description":"True when the charge meters the audio actually RETURNED rather than the duration requested, so duration_seconds is an upper bound for billing rather than the billed quantity. The charge never exceeds the estimate taken from the request.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0.bills_measured_output","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.0","typeLabel":"PublicAudioDuration · object"},{"type":"null","description":"The clip-length envelope, or null where the mode has no duration control at all — speech is as long as the script takes to read, and a requested duration is dropped and reported in the response's adjustments rather than rejected.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.duration_seconds","typeLabel":"PublicAudioDuration · object | null"},"voices":{"items":{"type":"string","uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.voices.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Voices","description":"The preset voice names the voice parameter accepts, verbatim. Where a name carries a language tag ('Heitor (pt)'), the bare name ('Heitor') is accepted too when it names exactly one preset; a tag for a different language is rejected. Empty means one of two things, and voice_is_free_form tells you which: with it false, the mode has no voice axis and passing voice is rejected; with it true, the mode does take a voice but the provider publishes no roster to list.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.voices","typeLabel":"string[]"},"voice_is_free_form":{"type":"boolean","title":"Voice Is Free Form","description":"True when voice accepts any provider voice name or cloned-voice id rather than a value from voices — the provider enumerates no roster, so only the shape is checked here and an unusable name fails at the provider. False on every mode with a preset roster, and on every mode with no voice axis at all.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.voice_is_free_form","typeLabel":"boolean"},"default_voice":{"oneOf":[{"type":"string","title":"Default Voice","description":"The voice used when voice is omitted; null when the mode has no voice axis, and also null when voice_is_free_form is true and the provider's own default is whatever it applies.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.default_voice.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Voice","description":"The voice used when voice is omitted; null when the mode has no voice axis, and also null when voice_is_free_form is true and the provider's own default is whatever it applies.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.default_voice.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.default_voice","typeLabel":"string | null"},"max_prompt_chars":{"oneOf":[{"type":"integer","title":"Max Prompt Chars","description":"The provider's documented ceiling on the prompt, in characters. A longer prompt is rejected before anything is generated or billed. null means no ceiling has been established for this mode — not that it has none.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.max_prompt_chars.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Prompt Chars","description":"The provider's documented ceiling on the prompt, in characters. A longer prompt is rejected before anything is generated or billed. null means no ceiling has been established for this mode — not that it has none.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.max_prompt_chars.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.max_prompt_chars","typeLabel":"integer | null"},"max_samples":{"type":"integer","title":"Max Samples","description":"How many distinct takes one call may render. 1 means the mode has no sample axis and num_samples above 1 is rejected. Every sample is billed.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.max_samples","typeLabel":"integer"},"output_mime_types":{"items":{"type":"string","uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.output_mime_types.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Output Mime Types","description":"The audio container(s) this mode's output can arrive in.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.output_mime_types","typeLabel":"string[]"},"billing":{"properties":{"basis":{"type":"string","title":"Basis","description":"The quantity the price is quoted in: 'character' bills per character of the prompt text (speech — nothing knows how long the clip will be until it exists); 'utf8_byte' bills per UTF-8 byte of the prompt text (Fish Audio speech, so non-Latin scripts cost more per character); 'second' bills per second of generated audio, multiplied by num_samples and raised to duration_seconds.billing_floor_seconds where one is declared.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.billing.basis","typeLabel":"string"}},"type":"object","required":["basis"],"title":"PublicAudioModeBilling","description":"How this mode's provider cost is metered.\n\nExact credit amounts are computed from the resolved request at the team's\ncredit rate, so this reports the basis and the knobs that move it rather than\na flat price.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0.billing","typeLabel":"PublicAudioModeBilling · object"}},"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.0","typeLabel":"PublicAudioModeCapability · object"},{"type":"null","uniqueKey":"audio_models.items.[INDEX].modes.text_to_music.oneOf.1","typeLabel":"null"}],"uniqueKey":"audio_models.items.[INDEX].modes.text_to_music","typeLabel":"PublicAudioModeCapability · object | null"},"text_to_sfx":{"oneOf":[{"type":"object","title":"PublicAudioModeCapability","description":"One generation mode's real capability envelope for one model.","required":["duration_seconds","voices","voice_is_free_form","default_voice","max_prompt_chars","max_samples","output_mime_types","billing"],"properties":{"duration_seconds":{"oneOf":[{"type":"object","title":"PublicAudioDuration","description":"The clip-length envelope, or null where the mode has no duration control at all — speech is as long as the script takes to read, and a requested duration is dropped and reported in the response's adjustments rather than rejected.","required":["min_seconds","max_seconds","default","billing_floor_seconds","billing_granularity_seconds","bills_measured_output"],"properties":{"min_seconds":{"type":"integer","title":"Min Seconds","description":"Shortest clip this mode can generate, in whole seconds.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0.min_seconds","typeLabel":"integer"},"max_seconds":{"type":"integer","title":"Max Seconds","description":"Longest clip this mode can generate, in whole seconds.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0.max_seconds","typeLabel":"integer"},"default":{"type":"integer","title":"Default","description":"The length that runs when duration_seconds is omitted.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0.default","typeLabel":"integer"},"billing_floor_seconds":{"oneOf":[{"type":"integer","title":"Billing Floor Seconds","description":"A sample shorter than this bills as this many seconds. null means the provider publishes no floor and none is applied. Combined with num_samples this is multiplicative: four 5-second samples against a 10-second floor bill 40 seconds, not 20.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0.billing_floor_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Billing Floor Seconds","description":"A sample shorter than this bills as this many seconds. null means the provider publishes no floor and none is applied. Combined with num_samples this is multiplicative: four 5-second samples against a 10-second floor bill 40 seconds, not 20.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0.billing_floor_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0.billing_floor_seconds","typeLabel":"integer | null"},"billing_granularity_seconds":{"oneOf":[{"type":"integer","title":"Billing Granularity Seconds","description":"Billing rounds UP to a whole multiple of this many seconds. null means it does not. Where a value is set the quoted per-second rate is charged on the rounded figure, so a 5-second ask against a 60-second granularity bills 60 seconds and 61 bills 120 — ask on the boundary.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0.billing_granularity_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Billing Granularity Seconds","description":"Billing rounds UP to a whole multiple of this many seconds. null means it does not. Where a value is set the quoted per-second rate is charged on the rounded figure, so a 5-second ask against a 60-second granularity bills 60 seconds and 61 bills 120 — ask on the boundary.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0.billing_granularity_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0.billing_granularity_seconds","typeLabel":"integer | null"},"bills_measured_output":{"type":"boolean","title":"Bills Measured Output","description":"True when the charge meters the audio actually RETURNED rather than the duration requested, so duration_seconds is an upper bound for billing rather than the billed quantity. The charge never exceeds the estimate taken from the request.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0.bills_measured_output","typeLabel":"boolean"}},"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.0","typeLabel":"PublicAudioDuration · object"},{"type":"null","description":"The clip-length envelope, or null where the mode has no duration control at all — speech is as long as the script takes to read, and a requested duration is dropped and reported in the response's adjustments rather than rejected.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.duration_seconds","typeLabel":"PublicAudioDuration · object | null"},"voices":{"items":{"type":"string","uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.voices.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Voices","description":"The preset voice names the voice parameter accepts, verbatim. Where a name carries a language tag ('Heitor (pt)'), the bare name ('Heitor') is accepted too when it names exactly one preset; a tag for a different language is rejected. Empty means one of two things, and voice_is_free_form tells you which: with it false, the mode has no voice axis and passing voice is rejected; with it true, the mode does take a voice but the provider publishes no roster to list.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.voices","typeLabel":"string[]"},"voice_is_free_form":{"type":"boolean","title":"Voice Is Free Form","description":"True when voice accepts any provider voice name or cloned-voice id rather than a value from voices — the provider enumerates no roster, so only the shape is checked here and an unusable name fails at the provider. False on every mode with a preset roster, and on every mode with no voice axis at all.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.voice_is_free_form","typeLabel":"boolean"},"default_voice":{"oneOf":[{"type":"string","title":"Default Voice","description":"The voice used when voice is omitted; null when the mode has no voice axis, and also null when voice_is_free_form is true and the provider's own default is whatever it applies.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.default_voice.oneOf.0","typeLabel":"string"},{"type":"null","title":"Default Voice","description":"The voice used when voice is omitted; null when the mode has no voice axis, and also null when voice_is_free_form is true and the provider's own default is whatever it applies.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.default_voice.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.default_voice","typeLabel":"string | null"},"max_prompt_chars":{"oneOf":[{"type":"integer","title":"Max Prompt Chars","description":"The provider's documented ceiling on the prompt, in characters. A longer prompt is rejected before anything is generated or billed. null means no ceiling has been established for this mode — not that it has none.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.max_prompt_chars.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Prompt Chars","description":"The provider's documented ceiling on the prompt, in characters. A longer prompt is rejected before anything is generated or billed. null means no ceiling has been established for this mode — not that it has none.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.max_prompt_chars.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.max_prompt_chars","typeLabel":"integer | null"},"max_samples":{"type":"integer","title":"Max Samples","description":"How many distinct takes one call may render. 1 means the mode has no sample axis and num_samples above 1 is rejected. Every sample is billed.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.max_samples","typeLabel":"integer"},"output_mime_types":{"items":{"type":"string","uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.output_mime_types.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Output Mime Types","description":"The audio container(s) this mode's output can arrive in.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.output_mime_types","typeLabel":"string[]"},"billing":{"properties":{"basis":{"type":"string","title":"Basis","description":"The quantity the price is quoted in: 'character' bills per character of the prompt text (speech — nothing knows how long the clip will be until it exists); 'utf8_byte' bills per UTF-8 byte of the prompt text (Fish Audio speech, so non-Latin scripts cost more per character); 'second' bills per second of generated audio, multiplied by num_samples and raised to duration_seconds.billing_floor_seconds where one is declared.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.billing.basis","typeLabel":"string"}},"type":"object","required":["basis"],"title":"PublicAudioModeBilling","description":"How this mode's provider cost is metered.\n\nExact credit amounts are computed from the resolved request at the team's\ncredit rate, so this reports the basis and the knobs that move it rather than\na flat price.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0.billing","typeLabel":"PublicAudioModeBilling · object"}},"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.0","typeLabel":"PublicAudioModeCapability · object"},{"type":"null","uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx.oneOf.1","typeLabel":"null"}],"uniqueKey":"audio_models.items.[INDEX].modes.text_to_sfx","typeLabel":"PublicAudioModeCapability · object | null"}},"type":"object","title":"PublicAudioModelModes","description":"The modes a model supports; an absent (null) mode is unsupported.\n\nUnlike the image and video lanes, the mode is STATED by the caller rather\nthan derived from which inputs the request carries — every audio mode takes\nexactly text, so there is nothing to derive from.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].modes","typeLabel":"PublicAudioModelModes · object"},"model_params":{"items":{"properties":{"id":{"type":"string","title":"Id","description":"The model_params key.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].id","typeLabel":"string"},"description":{"type":"string","title":"Description","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].description","typeLabel":"string"},"type":{"type":"string","title":"Type","description":"JSON type of the value: string, integer, number, or boolean.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].type","typeLabel":"string"},"allowed_values":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].allowed_values.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Allowed Values","description":"The exact legal values, where the control is a string enum.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].allowed_values.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Allowed Values","description":"The exact legal values, where the control is a string enum.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].allowed_values.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].allowed_values","typeLabel":"string[] | null"},"allowed_integers":{"oneOf":[{"type":"array","items":{"type":"integer","uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].allowed_integers.oneOf.0.items.[INDEX]","typeLabel":"integer"},"title":"Allowed Integers","description":"The exact legal values, where the control is an integer enum (for example a sample rate).","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].allowed_integers.oneOf.0","typeLabel":"integer[]"},{"type":"null","title":"Allowed Integers","description":"The exact legal values, where the control is an integer enum (for example a sample rate).","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].allowed_integers.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].allowed_integers","typeLabel":"integer[] | null"},"minimum":{"oneOf":[{"type":"number","title":"Minimum","description":"Inclusive lower bound, where the control is numeric.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].minimum.oneOf.0","typeLabel":"number"},{"type":"null","title":"Minimum","description":"Inclusive lower bound, where the control is numeric.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].minimum.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].minimum","typeLabel":"number | null"},"maximum":{"oneOf":[{"type":"number","title":"Maximum","description":"Inclusive upper bound, where the control is numeric.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].maximum.oneOf.0","typeLabel":"number"},{"type":"null","title":"Maximum","description":"Inclusive upper bound, where the control is numeric.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].maximum.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].maximum","typeLabel":"number | null"},"default":{"oneOf":[{"type":"string","title":"Default","description":"The provider default when this control is omitted, where Moda publishes one; null means no default metadata is available in this registry.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].default.oneOf.0","typeLabel":"string"},{"type":"integer","title":"Default","description":"The provider default when this control is omitted, where Moda publishes one; null means no default metadata is available in this registry.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].default.oneOf.1","typeLabel":"integer"},{"type":"number","title":"Default","description":"The provider default when this control is omitted, where Moda publishes one; null means no default metadata is available in this registry.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].default.oneOf.2","typeLabel":"number"},{"type":"boolean","title":"Default","description":"The provider default when this control is omitted, where Moda publishes one; null means no default metadata is available in this registry.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].default.oneOf.3","typeLabel":"boolean"},{"type":"null","title":"Default","description":"The provider default when this control is omitted, where Moda publishes one; null means no default metadata is available in this registry.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].default.oneOf.4","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].default","typeLabel":"string | integer | number | boolean | null"},"max_length":{"oneOf":[{"type":"integer","title":"Max Length","description":"Maximum character count, where the control is a string and the provider publishes a limit.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].max_length.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Max Length","description":"Maximum character count, where the control is a string and the provider publishes a limit.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].max_length.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].max_length","typeLabel":"integer | null"},"modes":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].modes.oneOf.0.items.[INDEX]","typeLabel":"string"},"title":"Modes","description":"The generation modes the control applies to; null means every mode the model supports.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].modes.oneOf.0","typeLabel":"string[]"},{"type":"null","title":"Modes","description":"The generation modes the control applies to; null means every mode the model supports.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].modes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX].modes","typeLabel":"string[] | null"}},"type":"object","required":["id","description","type","allowed_values","allowed_integers","minimum","maximum","default","max_length","modes"],"title":"PublicAudioModelParam","description":"One model-specific ``model_params`` control and its validated envelope.","uniqueKey":"audio_models.items.[INDEX].model_params.items.[INDEX]","typeLabel":"PublicAudioModelParam · object"},"type":"array","title":"Model Params","description":"The model-specific controls the model_params object accepts, with their validated envelopes. Keys not listed here are rejected before billing — never forwarded on the chance the provider accepts them.","isRequired":true,"uniqueKey":"audio_models.items.[INDEX].model_params","typeLabel":"PublicAudioModelParam · object[]"},"price_per_1k_usd":{"type":"number","title":"Price Per 1K Usd","description":"The current customer price in USD per 1,000 characters, present on every model whose speech bills per character (billing basis 'character') and absent on every other. During a promotion it is the promo price, charged for any request admitted before promo_until.","uniqueKey":"audio_models.items.[INDEX].price_per_1k_usd","typeLabel":"number"},"list_price_per_1k_usd":{"type":"number","title":"List Price Per 1K Usd","description":"Present only during a promotion: the standard price per 1,000 characters it returns to.","uniqueKey":"audio_models.items.[INDEX].list_price_per_1k_usd","typeLabel":"number"},"promo_until":{"type":"string","format":"date-time","title":"Promo Until","description":"Present only during a promotion: the instant (ISO 8601, UTC) the promo price ends. A request admitted before it is charged the promo price; from it on the list price applies.","uniqueKey":"audio_models.items.[INDEX].promo_until","typeLabel":"string\u003cdate-time>"},"promo_percent_off":{"type":"integer","title":"Promo Percent Off","description":"Present only during a promotion: the discount off the list price as the provider announces it.","uniqueKey":"audio_models.items.[INDEX].promo_percent_off","typeLabel":"integer"}},"type":"object","required":["id","label","description","modes","model_params"],"title":"PublicAudioModelDescriptor","description":"One audio model's caller-facing capability card.","uniqueKey":"audio_models.items.[INDEX]","typeLabel":"PublicAudioModelDescriptor · object"},"type":"array","title":"Audio Models","description":"Audio model capability descriptors, for generate-audio: which of the three modes each model serves, and per mode the duration envelope, the full preset-voice menu, the prompt-character ceiling, the sample limit, and how the cost is metered. No deprecated id alias here — video's exists only because its bare-id array shipped first.","isRequired":true,"uniqueKey":"audio_models","typeLabel":"PublicAudioModelDescriptor · object[]"}},"type":"object","required":["image_transforms","image_models","video_models","video_model_ids","audio_models"],"title":"MediaModelsResponse","description":"The model registry the ``model`` parameters validate against.\n\nThe arrays serialize the same registries the generate verbs resolve\nagainst, so a capability stated here is a capability the request validator\naccepts — nothing is transcribed by hand.","uniqueKey":"","typeLabel":"MediaModelsResponse · object"},"examples":{"Example":{"title":"Example","value":{"image_transforms":[{"id":"\u003cstring>","label":"\u003cstring>","description":"\u003cstring>","operation":"vectorize","output_format":"\u003cstring>","modes":["\u003cstring>"],"max_input_bytes":123,"accepted_input_mimes":["\u003cstring>"]}],"image_models":[{}],"video_models":[{"id":"\u003cstring>","label":"\u003cstring>","description":"\u003cstring>","supports_generate_audio":true,"generate_audio_default":true,"generate_audio_controllable":true,"supports_seed":true,"modes":{"text_to_video":{"aspect_ratios":["\u003cstring>"],"default_aspect_ratio":"\u003cstring>","resolutions":["\u003cstring>"],"default_resolution":"\u003cstring>","duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"supports_end_image":true,"max_reference_images":123,"reference_videos":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"input_duration_billed":true,"price_multiplier":123,"input_duration_price_multiplier":123},"reference_audios":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"requires_visual_reference":true,"accepted_container_types":["\u003cstring>"]},"max_reference_inputs_total":123,"generate_audio_controllable":true,"billing":{"basis":"\u003cstring>","duration_quantity":"\u003cstring>","audio_priced_separately":true,"higher_rate_resolutions":["\u003cstring>"],"input_seconds_priced_separately":true,"higher_rate_durations":[123],"reference_images_priced_separately":true,"reference_images_included_before_surcharge":123},"end_image_aspect_ratios":["\u003cstring>"],"end_image_default_aspect_ratio":"\u003cstring>","fixed_output_resolution":"\u003cstring>","end_image_duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"source_video":{"min_seconds":123,"max_seconds":123,"max_area_pixels":123,"accepted_formats":["\u003cstring>"],"input_seconds_priced_separately":true,"output_includes_source":true},"image_requirements":[{"roles":["\u003cstring>"],"accepted_formats":["\u003cstring>"],"max_bytes":123,"min_width":123,"min_height":123,"max_pixels":123,"min_aspect_ratio":123,"max_aspect_ratio":123}]},"image_to_video":{"aspect_ratios":["\u003cstring>"],"default_aspect_ratio":"\u003cstring>","resolutions":["\u003cstring>"],"default_resolution":"\u003cstring>","duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"supports_end_image":true,"max_reference_images":123,"reference_videos":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"input_duration_billed":true,"price_multiplier":123,"input_duration_price_multiplier":123},"reference_audios":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"requires_visual_reference":true,"accepted_container_types":["\u003cstring>"]},"max_reference_inputs_total":123,"generate_audio_controllable":true,"billing":{"basis":"\u003cstring>","duration_quantity":"\u003cstring>","audio_priced_separately":true,"higher_rate_resolutions":["\u003cstring>"],"input_seconds_priced_separately":true,"higher_rate_durations":[123],"reference_images_priced_separately":true,"reference_images_included_before_surcharge":123},"end_image_aspect_ratios":["\u003cstring>"],"end_image_default_aspect_ratio":"\u003cstring>","fixed_output_resolution":"\u003cstring>","end_image_duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"source_video":{"min_seconds":123,"max_seconds":123,"max_area_pixels":123,"accepted_formats":["\u003cstring>"],"input_seconds_priced_separately":true,"output_includes_source":true},"image_requirements":[{"roles":["\u003cstring>"],"accepted_formats":["\u003cstring>"],"max_bytes":123,"min_width":123,"min_height":123,"max_pixels":123,"min_aspect_ratio":123,"max_aspect_ratio":123}]},"reference_to_video":{"aspect_ratios":["\u003cstring>"],"default_aspect_ratio":"\u003cstring>","resolutions":["\u003cstring>"],"default_resolution":"\u003cstring>","duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"supports_end_image":true,"max_reference_images":123,"reference_videos":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"input_duration_billed":true,"price_multiplier":123,"input_duration_price_multiplier":123},"reference_audios":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"requires_visual_reference":true,"accepted_container_types":["\u003cstring>"]},"max_reference_inputs_total":123,"generate_audio_controllable":true,"billing":{"basis":"\u003cstring>","duration_quantity":"\u003cstring>","audio_priced_separately":true,"higher_rate_resolutions":["\u003cstring>"],"input_seconds_priced_separately":true,"higher_rate_durations":[123],"reference_images_priced_separately":true,"reference_images_included_before_surcharge":123},"end_image_aspect_ratios":["\u003cstring>"],"end_image_default_aspect_ratio":"\u003cstring>","fixed_output_resolution":"\u003cstring>","end_image_duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"source_video":{"min_seconds":123,"max_seconds":123,"max_area_pixels":123,"accepted_formats":["\u003cstring>"],"input_seconds_priced_separately":true,"output_includes_source":true},"image_requirements":[{"roles":["\u003cstring>"],"accepted_formats":["\u003cstring>"],"max_bytes":123,"min_width":123,"min_height":123,"max_pixels":123,"min_aspect_ratio":123,"max_aspect_ratio":123}]},"audio_to_video":{"aspect_ratios":["\u003cstring>"],"default_aspect_ratio":"\u003cstring>","resolutions":["\u003cstring>"],"default_resolution":"\u003cstring>","duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"supports_end_image":true,"max_reference_images":123,"reference_videos":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"input_duration_billed":true,"price_multiplier":123,"input_duration_price_multiplier":123},"reference_audios":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"requires_visual_reference":true,"accepted_container_types":["\u003cstring>"]},"max_reference_inputs_total":123,"generate_audio_controllable":true,"billing":{"basis":"\u003cstring>","duration_quantity":"\u003cstring>","audio_priced_separately":true,"higher_rate_resolutions":["\u003cstring>"],"input_seconds_priced_separately":true,"higher_rate_durations":[123],"reference_images_priced_separately":true,"reference_images_included_before_surcharge":123},"end_image_aspect_ratios":["\u003cstring>"],"end_image_default_aspect_ratio":"\u003cstring>","fixed_output_resolution":"\u003cstring>","end_image_duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"source_video":{"min_seconds":123,"max_seconds":123,"max_area_pixels":123,"accepted_formats":["\u003cstring>"],"input_seconds_priced_separately":true,"output_includes_source":true},"image_requirements":[{"roles":["\u003cstring>"],"accepted_formats":["\u003cstring>"],"max_bytes":123,"min_width":123,"min_height":123,"max_pixels":123,"min_aspect_ratio":123,"max_aspect_ratio":123}]},"video_extend":{"aspect_ratios":["\u003cstring>"],"default_aspect_ratio":"\u003cstring>","resolutions":["\u003cstring>"],"default_resolution":"\u003cstring>","duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"supports_end_image":true,"max_reference_images":123,"reference_videos":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"input_duration_billed":true,"price_multiplier":123,"input_duration_price_multiplier":123},"reference_audios":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"requires_visual_reference":true,"accepted_container_types":["\u003cstring>"]},"max_reference_inputs_total":123,"generate_audio_controllable":true,"billing":{"basis":"\u003cstring>","duration_quantity":"\u003cstring>","audio_priced_separately":true,"higher_rate_resolutions":["\u003cstring>"],"input_seconds_priced_separately":true,"higher_rate_durations":[123],"reference_images_priced_separately":true,"reference_images_included_before_surcharge":123},"end_image_aspect_ratios":["\u003cstring>"],"end_image_default_aspect_ratio":"\u003cstring>","fixed_output_resolution":"\u003cstring>","end_image_duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"source_video":{"min_seconds":123,"max_seconds":123,"max_area_pixels":123,"accepted_formats":["\u003cstring>"],"input_seconds_priced_separately":true,"output_includes_source":true},"image_requirements":[{"roles":["\u003cstring>"],"accepted_formats":["\u003cstring>"],"max_bytes":123,"min_width":123,"min_height":123,"max_pixels":123,"min_aspect_ratio":123,"max_aspect_ratio":123}]},"video_lipsync":{"aspect_ratios":["\u003cstring>"],"default_aspect_ratio":"\u003cstring>","resolutions":["\u003cstring>"],"default_resolution":"\u003cstring>","duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"supports_end_image":true,"max_reference_images":123,"reference_videos":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"input_duration_billed":true,"price_multiplier":123,"input_duration_price_multiplier":123},"reference_audios":{"max_count":123,"min_seconds_each":123,"max_seconds_each":123,"max_total_seconds":123,"requires_visual_reference":true,"accepted_container_types":["\u003cstring>"]},"max_reference_inputs_total":123,"generate_audio_controllable":true,"billing":{"basis":"\u003cstring>","duration_quantity":"\u003cstring>","audio_priced_separately":true,"higher_rate_resolutions":["\u003cstring>"],"input_seconds_priced_separately":true,"higher_rate_durations":[123],"reference_images_priced_separately":true,"reference_images_included_before_surcharge":123},"end_image_aspect_ratios":["\u003cstring>"],"end_image_default_aspect_ratio":"\u003cstring>","fixed_output_resolution":"\u003cstring>","end_image_duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"supports_auto":true,"allowed_seconds":[123],"controllable":true},"source_video":{"min_seconds":123,"max_seconds":123,"max_area_pixels":123,"accepted_formats":["\u003cstring>"],"input_seconds_priced_separately":true,"output_includes_source":true},"image_requirements":[{"roles":["\u003cstring>"],"accepted_formats":["\u003cstring>"],"max_bytes":123,"min_width":123,"min_height":123,"max_pixels":123,"min_aspect_ratio":123,"max_aspect_ratio":123}]}},"model_params":[{"id":"\u003cstring>","description":"\u003cstring>","type":"\u003cstring>","allowed_values":["\u003cstring>"],"minimum":123,"maximum":123,"max_length":123,"max_bytes":123,"modes":["\u003cstring>"]}],"max_prompt_chars":123,"max_prompt_bytes":123}],"video_model_ids":["\u003cstring>"],"audio_models":[{"id":"\u003cstring>","label":"\u003cstring>","description":"\u003cstring>","modes":{"text_to_speech":{"duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"billing_floor_seconds":123,"billing_granularity_seconds":123,"bills_measured_output":true},"voices":["\u003cstring>"],"voice_is_free_form":true,"default_voice":"\u003cstring>","max_prompt_chars":123,"max_samples":123,"output_mime_types":["\u003cstring>"],"billing":{"basis":"\u003cstring>"}},"text_to_music":{"duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"billing_floor_seconds":123,"billing_granularity_seconds":123,"bills_measured_output":true},"voices":["\u003cstring>"],"voice_is_free_form":true,"default_voice":"\u003cstring>","max_prompt_chars":123,"max_samples":123,"output_mime_types":["\u003cstring>"],"billing":{"basis":"\u003cstring>"}},"text_to_sfx":{"duration_seconds":{"min_seconds":123,"max_seconds":123,"default":123,"billing_floor_seconds":123,"billing_granularity_seconds":123,"bills_measured_output":true},"voices":["\u003cstring>"],"voice_is_free_form":true,"default_voice":"\u003cstring>","max_prompt_chars":123,"max_samples":123,"output_mime_types":["\u003cstring>"],"billing":{"basis":"\u003cstring>"}}},"model_params":[{"id":"\u003cstring>","description":"\u003cstring>","type":"\u003cstring>","allowed_values":["\u003cstring>"],"allowed_integers":[123],"minimum":123,"maximum":123,"default":"\u003cstring>","max_length":123,"modes":["\u003cstring>"]}],"price_per_1k_usd":123,"list_price_per_1k_usd":123,"promo_until":"2023-11-07T05:31:56Z","promo_percent_off":123}]}}},"exampleType":"generated"}},"exampleType":"generated"},"203cc441-00c5-473a-b4fa-fdfe53718420":{"description":"Authentication required.","content":{"application/json":{"schema":{"properties":{"type":{"type":"string","enum":["invalid_request","authentication","permission","not_found","conflict","rate_limited","idempotency_conflict","unprocessable","upstream_error","internal_error"],"title":"ErrorType","description":"Closed set of high-level categories SDKs branch on.","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","title":"Code","description":"Stable machine string keyed to doc_url. Never changes once published.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable message, for developers. Not localized, not user-facing.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"doc_url":{"type":"string","title":"Doc Url","description":"Permalink to the docs page for this code.","isRequired":true,"uniqueKey":"doc_url","typeLabel":"string"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"},"causes":{"oneOf":[{"type":"array","items":{"oneOf":[{}],"uniqueKey":"causes.oneOf.0.items.[INDEX]","typeLabel":"any"},"title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.0","typeLabel":"any[]"},{"type":"null","title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.1","typeLabel":"null"}],"uniqueKey":"causes","typeLabel":"any[] | null"},"details":{"oneOf":[{"type":"object","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","additionalProperties":true,"uniqueKey":"details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","uniqueKey":"details.oneOf.1","typeLabel":"null"}],"uniqueKey":"details","typeLabel":"Details · object | null"},"retry_after_ms":{"oneOf":[{"type":"integer","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"retry_after_ms","typeLabel":"integer | null"},"retryable":{"oneOf":[{"type":"boolean","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.1","typeLabel":"null"}],"uniqueKey":"retryable","typeLabel":"boolean | null"}},"type":"object","required":["type","code","message","doc_url"],"title":"ErrorEnvelope","description":"Canonical error payload, nested under the top-level ``{\"error\": ...}`` key.","uniqueKey":"","typeLabel":"ErrorEnvelope · object"},"examples":{"Example":{"title":"Example","value":{"type":"invalid_request","code":"\u003cstring>","message":"\u003cstring>","doc_url":"\u003cstring>","request_id":"\u003cstring>","causes":["\u003cunknown>"],"details":{},"retry_after_ms":123,"retryable":true}}},"exampleType":"generated"}},"exampleType":"generated"},"a43c10ba-7731-4ca7-9f56-3f92d1299cab":{"description":"Insufficient credits for a metered operation.","content":{"application/json":{"schema":{"properties":{"type":{"type":"string","enum":["invalid_request","authentication","permission","not_found","conflict","rate_limited","idempotency_conflict","unprocessable","upstream_error","internal_error"],"title":"ErrorType","description":"Closed set of high-level categories SDKs branch on.","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","title":"Code","description":"Stable machine string keyed to doc_url. Never changes once published.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable message, for developers. Not localized, not user-facing.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"doc_url":{"type":"string","title":"Doc Url","description":"Permalink to the docs page for this code.","isRequired":true,"uniqueKey":"doc_url","typeLabel":"string"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"},"causes":{"oneOf":[{"type":"array","items":{"oneOf":[{}],"uniqueKey":"causes.oneOf.0.items.[INDEX]","typeLabel":"any"},"title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.0","typeLabel":"any[]"},{"type":"null","title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.1","typeLabel":"null"}],"uniqueKey":"causes","typeLabel":"any[] | null"},"details":{"oneOf":[{"type":"object","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","additionalProperties":true,"uniqueKey":"details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","uniqueKey":"details.oneOf.1","typeLabel":"null"}],"uniqueKey":"details","typeLabel":"Details · object | null"},"retry_after_ms":{"oneOf":[{"type":"integer","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"retry_after_ms","typeLabel":"integer | null"},"retryable":{"oneOf":[{"type":"boolean","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.1","typeLabel":"null"}],"uniqueKey":"retryable","typeLabel":"boolean | null"}},"type":"object","required":["type","code","message","doc_url"],"title":"ErrorEnvelope","description":"Canonical error payload, nested under the top-level ``{\"error\": ...}`` key.","uniqueKey":"","typeLabel":"ErrorEnvelope · object"},"examples":{"Example":{"title":"Example","value":{"type":"invalid_request","code":"\u003cstring>","message":"\u003cstring>","doc_url":"\u003cstring>","request_id":"\u003cstring>","causes":["\u003cunknown>"],"details":{},"retry_after_ms":123,"retryable":true}}},"exampleType":"generated"}},"exampleType":"generated"},"803da551-a195-423d-8e28-2ef92d6642ec":{"description":"Permission denied for this scope.","content":{"application/json":{"schema":{"properties":{"type":{"type":"string","enum":["invalid_request","authentication","permission","not_found","conflict","rate_limited","idempotency_conflict","unprocessable","upstream_error","internal_error"],"title":"ErrorType","description":"Closed set of high-level categories SDKs branch on.","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","title":"Code","description":"Stable machine string keyed to doc_url. Never changes once published.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable message, for developers. Not localized, not user-facing.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"doc_url":{"type":"string","title":"Doc Url","description":"Permalink to the docs page for this code.","isRequired":true,"uniqueKey":"doc_url","typeLabel":"string"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"},"causes":{"oneOf":[{"type":"array","items":{"oneOf":[{}],"uniqueKey":"causes.oneOf.0.items.[INDEX]","typeLabel":"any"},"title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.0","typeLabel":"any[]"},{"type":"null","title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.1","typeLabel":"null"}],"uniqueKey":"causes","typeLabel":"any[] | null"},"details":{"oneOf":[{"type":"object","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","additionalProperties":true,"uniqueKey":"details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","uniqueKey":"details.oneOf.1","typeLabel":"null"}],"uniqueKey":"details","typeLabel":"Details · object | null"},"retry_after_ms":{"oneOf":[{"type":"integer","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"retry_after_ms","typeLabel":"integer | null"},"retryable":{"oneOf":[{"type":"boolean","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.1","typeLabel":"null"}],"uniqueKey":"retryable","typeLabel":"boolean | null"}},"type":"object","required":["type","code","message","doc_url"],"title":"ErrorEnvelope","description":"Canonical error payload, nested under the top-level ``{\"error\": ...}`` key.","uniqueKey":"","typeLabel":"ErrorEnvelope · object"},"examples":{"Example":{"title":"Example","value":{"type":"invalid_request","code":"\u003cstring>","message":"\u003cstring>","doc_url":"\u003cstring>","request_id":"\u003cstring>","causes":["\u003cunknown>"],"details":{},"retry_after_ms":123,"retryable":true}}},"exampleType":"generated"}},"exampleType":"generated"},"fd2bcf28-60d7-4af4-82cb-9e7e44aed8d7":{"description":"Resource not found.","content":{"application/json":{"schema":{"properties":{"type":{"type":"string","enum":["invalid_request","authentication","permission","not_found","conflict","rate_limited","idempotency_conflict","unprocessable","upstream_error","internal_error"],"title":"ErrorType","description":"Closed set of high-level categories SDKs branch on.","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","title":"Code","description":"Stable machine string keyed to doc_url. Never changes once published.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable message, for developers. Not localized, not user-facing.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"doc_url":{"type":"string","title":"Doc Url","description":"Permalink to the docs page for this code.","isRequired":true,"uniqueKey":"doc_url","typeLabel":"string"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"},"causes":{"oneOf":[{"type":"array","items":{"oneOf":[{}],"uniqueKey":"causes.oneOf.0.items.[INDEX]","typeLabel":"any"},"title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.0","typeLabel":"any[]"},{"type":"null","title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.1","typeLabel":"null"}],"uniqueKey":"causes","typeLabel":"any[] | null"},"details":{"oneOf":[{"type":"object","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","additionalProperties":true,"uniqueKey":"details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","uniqueKey":"details.oneOf.1","typeLabel":"null"}],"uniqueKey":"details","typeLabel":"Details · object | null"},"retry_after_ms":{"oneOf":[{"type":"integer","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"retry_after_ms","typeLabel":"integer | null"},"retryable":{"oneOf":[{"type":"boolean","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.1","typeLabel":"null"}],"uniqueKey":"retryable","typeLabel":"boolean | null"}},"type":"object","required":["type","code","message","doc_url"],"title":"ErrorEnvelope","description":"Canonical error payload, nested under the top-level ``{\"error\": ...}`` key.","uniqueKey":"","typeLabel":"ErrorEnvelope · object"},"examples":{"Example":{"title":"Example","value":{"type":"invalid_request","code":"\u003cstring>","message":"\u003cstring>","doc_url":"\u003cstring>","request_id":"\u003cstring>","causes":["\u003cunknown>"],"details":{},"retry_after_ms":123,"retryable":true}}},"exampleType":"generated"}},"exampleType":"generated"},"0a2da372-51d7-4880-a319-62d38fccd835":{"description":"Conflict (idempotency / resource state).","content":{"application/json":{"schema":{"properties":{"type":{"type":"string","enum":["invalid_request","authentication","permission","not_found","conflict","rate_limited","idempotency_conflict","unprocessable","upstream_error","internal_error"],"title":"ErrorType","description":"Closed set of high-level categories SDKs branch on.","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","title":"Code","description":"Stable machine string keyed to doc_url. Never changes once published.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable message, for developers. Not localized, not user-facing.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"doc_url":{"type":"string","title":"Doc Url","description":"Permalink to the docs page for this code.","isRequired":true,"uniqueKey":"doc_url","typeLabel":"string"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"},"causes":{"oneOf":[{"type":"array","items":{"oneOf":[{}],"uniqueKey":"causes.oneOf.0.items.[INDEX]","typeLabel":"any"},"title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.0","typeLabel":"any[]"},{"type":"null","title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.1","typeLabel":"null"}],"uniqueKey":"causes","typeLabel":"any[] | null"},"details":{"oneOf":[{"type":"object","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","additionalProperties":true,"uniqueKey":"details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","uniqueKey":"details.oneOf.1","typeLabel":"null"}],"uniqueKey":"details","typeLabel":"Details · object | null"},"retry_after_ms":{"oneOf":[{"type":"integer","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"retry_after_ms","typeLabel":"integer | null"},"retryable":{"oneOf":[{"type":"boolean","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.1","typeLabel":"null"}],"uniqueKey":"retryable","typeLabel":"boolean | null"}},"type":"object","required":["type","code","message","doc_url"],"title":"ErrorEnvelope","description":"Canonical error payload, nested under the top-level ``{\"error\": ...}`` key.","uniqueKey":"","typeLabel":"ErrorEnvelope · object"},"examples":{"Example":{"title":"Example","value":{"type":"invalid_request","code":"\u003cstring>","message":"\u003cstring>","doc_url":"\u003cstring>","request_id":"\u003cstring>","causes":["\u003cunknown>"],"details":{},"retry_after_ms":123,"retryable":true}}},"exampleType":"generated"}},"exampleType":"generated"},"2fc4f1e8-3952-4ac7-bcfc-cbc2301902c3":{"description":"Request validation failed.","content":{"application/json":{"schema":{"properties":{"type":{"type":"string","enum":["invalid_request","authentication","permission","not_found","conflict","rate_limited","idempotency_conflict","unprocessable","upstream_error","internal_error"],"title":"ErrorType","description":"Closed set of high-level categories SDKs branch on.","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","title":"Code","description":"Stable machine string keyed to doc_url. Never changes once published.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable message, for developers. Not localized, not user-facing.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"doc_url":{"type":"string","title":"Doc Url","description":"Permalink to the docs page for this code.","isRequired":true,"uniqueKey":"doc_url","typeLabel":"string"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"},"causes":{"oneOf":[{"type":"array","items":{"oneOf":[{}],"uniqueKey":"causes.oneOf.0.items.[INDEX]","typeLabel":"any"},"title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.0","typeLabel":"any[]"},{"type":"null","title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.1","typeLabel":"null"}],"uniqueKey":"causes","typeLabel":"any[] | null"},"details":{"oneOf":[{"type":"object","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","additionalProperties":true,"uniqueKey":"details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","uniqueKey":"details.oneOf.1","typeLabel":"null"}],"uniqueKey":"details","typeLabel":"Details · object | null"},"retry_after_ms":{"oneOf":[{"type":"integer","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"retry_after_ms","typeLabel":"integer | null"},"retryable":{"oneOf":[{"type":"boolean","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.1","typeLabel":"null"}],"uniqueKey":"retryable","typeLabel":"boolean | null"}},"type":"object","required":["type","code","message","doc_url"],"title":"ErrorEnvelope","description":"Canonical error payload, nested under the top-level ``{\"error\": ...}`` key.","uniqueKey":"","typeLabel":"ErrorEnvelope · object"},"examples":{"Example":{"title":"Example","value":{"type":"invalid_request","code":"\u003cstring>","message":"\u003cstring>","doc_url":"\u003cstring>","request_id":"\u003cstring>","causes":["\u003cunknown>"],"details":{},"retry_after_ms":123,"retryable":true}}},"exampleType":"generated"}},"exampleType":"generated"},"38fca15c-45c7-4f7d-9118-d3796f1fe32e":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"properties":{"type":{"type":"string","enum":["invalid_request","authentication","permission","not_found","conflict","rate_limited","idempotency_conflict","unprocessable","upstream_error","internal_error"],"title":"ErrorType","description":"Closed set of high-level categories SDKs branch on.","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","title":"Code","description":"Stable machine string keyed to doc_url. Never changes once published.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable message, for developers. Not localized, not user-facing.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"doc_url":{"type":"string","title":"Doc Url","description":"Permalink to the docs page for this code.","isRequired":true,"uniqueKey":"doc_url","typeLabel":"string"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"},"causes":{"oneOf":[{"type":"array","items":{"oneOf":[{}],"uniqueKey":"causes.oneOf.0.items.[INDEX]","typeLabel":"any"},"title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.0","typeLabel":"any[]"},{"type":"null","title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.1","typeLabel":"null"}],"uniqueKey":"causes","typeLabel":"any[] | null"},"details":{"oneOf":[{"type":"object","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","additionalProperties":true,"uniqueKey":"details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","uniqueKey":"details.oneOf.1","typeLabel":"null"}],"uniqueKey":"details","typeLabel":"Details · object | null"},"retry_after_ms":{"oneOf":[{"type":"integer","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"retry_after_ms","typeLabel":"integer | null"},"retryable":{"oneOf":[{"type":"boolean","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.1","typeLabel":"null"}],"uniqueKey":"retryable","typeLabel":"boolean | null"}},"type":"object","required":["type","code","message","doc_url"],"title":"ErrorEnvelope","description":"Canonical error payload, nested under the top-level ``{\"error\": ...}`` key.","uniqueKey":"","typeLabel":"ErrorEnvelope · object"},"examples":{"Example":{"title":"Example","value":{"type":"invalid_request","code":"\u003cstring>","message":"\u003cstring>","doc_url":"\u003cstring>","request_id":"\u003cstring>","causes":["\u003cunknown>"],"details":{},"retry_after_ms":123,"retryable":true}}},"exampleType":"generated"}},"exampleType":"generated"},"a13bb8b3-f980-4458-83b6-db80856c63ec":{"description":"Internal error.","content":{"application/json":{"schema":{"properties":{"type":{"type":"string","enum":["invalid_request","authentication","permission","not_found","conflict","rate_limited","idempotency_conflict","unprocessable","upstream_error","internal_error"],"title":"ErrorType","description":"Closed set of high-level categories SDKs branch on.","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","title":"Code","description":"Stable machine string keyed to doc_url. Never changes once published.","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","title":"Message","description":"Human-readable message, for developers. Not localized, not user-facing.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"doc_url":{"type":"string","title":"Doc Url","description":"Permalink to the docs page for this code.","isRequired":true,"uniqueKey":"doc_url","typeLabel":"string"},"request_id":{"oneOf":[{"type":"string","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.0","typeLabel":"string"},{"type":"null","title":"Request Id","description":"Correlator for logs/Sentry/audit.","uniqueKey":"request_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"request_id","typeLabel":"string | null"},"causes":{"oneOf":[{"type":"array","items":{"oneOf":[{}],"uniqueKey":"causes.oneOf.0.items.[INDEX]","typeLabel":"any"},"title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.0","typeLabel":"any[]"},{"type":"null","title":"Causes","description":"Aggregated upstream failures (e.g. per-page export errors).","uniqueKey":"causes.oneOf.1","typeLabel":"null"}],"uniqueKey":"causes","typeLabel":"any[] | null"},"details":{"oneOf":[{"type":"object","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","additionalProperties":true,"uniqueKey":"details.oneOf.0","typeLabel":"Details · object"},{"type":"null","title":"Details","description":"Code-specific detail payload (e.g. validation field list). Callers should pass ``None`` rather than ``{}`` to omit the key from the response.","uniqueKey":"details.oneOf.1","typeLabel":"null"}],"uniqueKey":"details","typeLabel":"Details · object | null"},"retry_after_ms":{"oneOf":[{"type":"integer","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Retry After Ms","description":"Hint for rate-limited or transient errors.","uniqueKey":"retry_after_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"retry_after_ms","typeLabel":"integer | null"},"retryable":{"oneOf":[{"type":"boolean","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.0","typeLabel":"boolean"},{"type":"null","title":"Retryable","description":"Explicit retryability for this code, from the error-code registry: ``false`` means retrying the same request cannot succeed (fix the input / resource first); ``true`` means the condition is transient and a retry (with backoff / after the blocker clears) can succeed. For a code whose retryability is context-dependent (the registry declares none), the raising site sets it per response when it knows the cause (e.g. ``source_url_unreachable``: a timeout is retryable, a 404 is not) and omits it otherwise — do not derive it from ``type`` or the HTTP status when this field is present.","uniqueKey":"retryable.oneOf.1","typeLabel":"null"}],"uniqueKey":"retryable","typeLabel":"boolean | null"}},"type":"object","required":["type","code","message","doc_url"],"title":"ErrorEnvelope","description":"Canonical error payload, nested under the top-level ``{\"error\": ...}`` key.","uniqueKey":"","typeLabel":"ErrorEnvelope · object"},"examples":{"Example":{"title":"Example","value":{"type":"invalid_request","code":"\u003cstring>","message":"\u003cstring>","doc_url":"\u003cstring>","request_id":"\u003cstring>","causes":["\u003cunknown>"],"details":{},"retry_after_ms":123,"retryable":true}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"66f2befd-2cd3-41f4-8120-560fc2cb2780":{"API Key":{"type":"http","description":"API key from Settings > Developer > REST API","scheme":"bearer","scopes":[],"schemeName":"API Key"}}},"servers":{"900bd1dd-1657-41cc-9e95-57b7af147e04":{"url":"https://api.moda.app/v1","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","description":"API key from Settings > Developer > REST API","scheme":"bearer","scopes":[],"schemeName":"API Key"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"API key from Settings > Developer > REST API","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"API Key","name":"Authorization"}],"title":"API Key"}]},"originalFileLocation":"openapi/moda-public-api.yaml"},"subdomain":"moda-997c0526","siteName":"Moda","title":"List Models - Moda","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T18:06:16.964Z","originalFileLocation":"api-reference/media/list-models.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=\"light\"}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=\"The model registry the model parameters validate against.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Moda\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/moda-997c0526/hX3OHBAQBvwpegoX/_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/moda-997c0526/hX3OHBAQBvwpegoX/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/moda-997c0526/hX3OHBAQBvwpegoX/_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/moda-997c0526/hX3OHBAQBvwpegoX/_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/moda-997c0526/hX3OHBAQBvwpegoX/_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/moda-997c0526/hX3OHBAQBvwpegoX/_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/moda-997c0526/hX3OHBAQBvwpegoX/_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/moda-997c0526/hX3OHBAQBvwpegoX/_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/moda-997c0526/hX3OHBAQBvwpegoX/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"List Models - Moda\">\u003cmeta data-mint-head property=\"og:description\" content=\"The model registry the model parameters validate against.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Moda\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.moda.app/api-reference/media/list-models\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://moda-997c0526.mintlify.site/_mintlify/api/og/v2?division=media\u0026amp;title=List+Models\u0026amp;description=The+model+registry+the+%60%60model%60%60+parameters+validate+against.\u0026amp;theme=b22501ae2719082997928ddd\u0026amp;signature=a27fd9153f0597b0e7b2241422ebcc6915ac4ee30386ccdf32c8c783ac0fa348\">\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=\"List Models - Moda\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The model registry the model parameters validate against.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://moda-997c0526.mintlify.site/_mintlify/api/og/v2?division=media\u0026amp;title=List+Models\u0026amp;description=The+model+registry+the+%60%60model%60%60+parameters+validate+against.\u0026amp;theme=b22501ae2719082997928ddd\u0026amp;signature=a27fd9153f0597b0e7b2241422ebcc6915ac4ee30386ccdf32c8c783ac0fa348\">\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/moda-997c0526/hX3OHBAQBvwpegoX/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Moda\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#850AC2\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.moda.app/api-reference/media/list-models\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/media/list-models.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.moda.app/#organization\",\"name\":\"Moda\",\"url\":\"https://docs.moda.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/moda-997c0526/_eKavTfp2ZbkSuMz/images/chameleon.svg?fit=max\u0026auto=format\u0026n=_eKavTfp2ZbkSuMz\u0026q=85\u0026s=d0de9a6ddda2829d62cfe525fbb38722\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.moda.app#website\",\"name\":\"Moda\",\"url\":\"https://docs.moda.app\",\"publisher\":{\"@id\":\"https://docs.moda.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.moda.app/api-reference/media/list-models#webpage\",\"url\":\"https://docs.moda.app/api-reference/media/list-models\",\"name\":\"List Models\",\"description\":\"The model registry the model parameters validate against.\",\"dateModified\":\"2026-11-12T18:06:16.964Z\",\"isPartOf\":{\"@id\":\"https://docs.moda.app#website\"},\"breadcrumb\":{\"@id\":\"https://docs.moda.app/api-reference/media/list-models#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.moda.app/api-reference/media/list-models#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"media\",\"item\":\"https://docs.moda.app/api-reference/media/layerize-assets\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"List Models\",\"item\":\"https://docs.moda.app/api-reference/media/list-models\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.moda.app/api-reference/media/list-models#apireference\",\"headline\":\"List Models\",\"name\":\"List Models\",\"description\":\"The model registry the model parameters validate against.\",\"url\":\"https://docs.moda.app/api-reference/media/list-models\",\"mainEntityOfPage\":{\"@id\":\"https://docs.moda.app/api-reference/media/list-models#webpage\"},\"dateModified\":\"2026-11-12T18:06:16.964Z\",\"publisher\":{\"@id\":\"https://docs.moda.app/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.moda.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Moda\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Moda\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/media/list-models.md","siteName":"Moda","nav":{"global":{"anchors":[{"anchor":"Moda app","icon":"arrow-up-right-from-square","href":"https://moda.app"},{"anchor":"Support","icon":"life-ring","href":"mailto:support@moda.app"}]},"tabs":[{"tab":"Help Center","icon":"circle-question","pages":[{"title":"Help Center","href":"/help"}]},{"tab":"Moda for Agents","icon":"robot","pages":[{"title":"Moda for Agents","href":"/agents/setup"}]},{"tab":"MCP Server (Legacy)","icon":"box-archive","pages":[{"title":"MCP Server (Legacy)","href":"/mcp/getting-started"}]},{"tab":"API Reference","icon":"code","groups":[{"group":"Overview","icon":"book-open","pages":[{"title":"Getting Started","href":"/api-reference"},{"title":"Authentication","href":"/api-reference/authentication"},{"title":"Versioning","href":"/api-reference/versioning"},{"title":"Usage Limits","href":"/api-reference/usage-limits"},{"title":"Design Task Recipes","href":"/api-reference/design-task-recipes"},{"title":"Large file uploads","href":"/api-reference/large-file-uploads"},{"title":"Webhooks","href":"/api-reference/webhooks"},{"title":"Error codes","href":"/api-reference/errors"},{"title":"Layerize images","href":"/api-reference/layerize"}]},{"group":"canvases","pages":[{"title":"List Canvases","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases","href":"/api-reference/canvases/list-canvases"},{"title":"Search Canvases","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/search","href":"/api-reference/canvases/search-canvases"},{"title":"Get Canvas","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_id}","href":"/api-reference/canvases/get-canvas"},{"title":"Update Canvas","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml patch /canvases/{canvas_id}","href":"/api-reference/canvases/update-canvas"},{"title":"Get Canvas Tokens","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_id}/tokens","href":"/api-reference/canvases/get-canvas-tokens"},{"title":"List Canvas Pages","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_id}/pages","href":"/api-reference/canvases/list-canvas-pages"},{"title":"Export Canvas","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_id}/export","href":"/api-reference/canvases/export-canvas"},{"title":"Get Export Status","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_id}/export-status","href":"/api-reference/canvases/get-export-status"},{"title":"Make a canvas public","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_id}/share","href":"/api-reference/canvases/make-a-canvas-public"},{"title":"Import Pptx","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/import-pptx","href":"/api-reference/canvases/import-pptx"},{"title":"Get Import Pptx Status","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/import-pptx/{job_id}","href":"/api-reference/canvases/get-import-pptx-status"}]},{"group":"canvas-actions","pages":[{"title":"Create Canvas","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases","href":"/api-reference/canvas-actions/create-canvas"},{"title":"Delete Canvas","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml delete /canvases/{canvas_ref}","href":"/api-reference/canvas-actions/delete-canvas"},{"title":"Read Canvas State","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_ref}/state","href":"/api-reference/canvas-actions/read-canvas-state"},{"title":"Read Canvas State Summary","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_ref}/state/summary","href":"/api-reference/canvas-actions/read-canvas-state-summary"},{"title":"Screenshot Canvas","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/screenshot","href":"/api-reference/canvas-actions/screenshot-canvas"},{"title":"Create From Markup","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/markup","href":"/api-reference/canvas-actions/create-from-markup"},{"title":"Read Canvas Edit","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_ref}/edit","href":"/api-reference/canvas-actions/read-canvas-edit"},{"title":"Edit Canvas","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/edit","href":"/api-reference/canvas-actions/edit-canvas"},{"title":"Delete Canvas Items","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/delete-items","href":"/api-reference/canvas-actions/delete-canvas-items"},{"title":"Create Canvas Pages","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/pages","href":"/api-reference/canvas-actions/create-canvas-pages"},{"title":"Validate Canvas Edit","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/edit/validate","href":"/api-reference/canvas-actions/validate-canvas-edit"},{"title":"Apply Canvas Edit","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/edit/apply","href":"/api-reference/canvas-actions/apply-canvas-edit"},{"title":"Export Canvas Edit","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_ref}/edit/export","href":"/api-reference/canvas-actions/export-canvas-edit"},{"title":"Import Canvas Edit","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/edit/import","href":"/api-reference/canvas-actions/import-canvas-edit"},{"title":"List Canvas Animations","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_ref}/animations","href":"/api-reference/canvas-actions/list-canvas-animations"},{"title":"Add Canvas Animations","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/animations","href":"/api-reference/canvas-actions/add-canvas-animations"},{"title":"Update Canvas Animations","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/animations/update","href":"/api-reference/canvas-actions/update-canvas-animations"},{"title":"Remove Canvas Animations","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/animations/remove","href":"/api-reference/canvas-actions/remove-canvas-animations"},{"title":"Import Canvas Pages","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /canvases/{canvas_ref}/import-pages","href":"/api-reference/canvas-actions/import-canvas-pages"},{"title":"Read Canvas Instructions","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_ref}/instructions","href":"/api-reference/canvas-actions/read-canvas-instructions"},{"title":"Read Canvas Comments","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /canvases/{canvas_ref}/comments","href":"/api-reference/canvas-actions/read-canvas-comments"},{"title":"Whoami","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /whoami","href":"/api-reference/canvas-actions/whoami"},{"title":"Get Brand Kit","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /brand-kits/{brand_kit_ref}","href":"/api-reference/canvas-actions/get-brand-kit"},{"title":"List Brand Kit Guides","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /brand-kits/{brand_kit_ref}/guides","href":"/api-reference/canvas-actions/list-brand-kit-guides"},{"title":"Get Brand Kit Guide","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /brand-kits/{brand_kit_ref}/guides/{guide_id}","href":"/api-reference/canvas-actions/get-brand-kit-guide"},{"title":"List Templates","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /templates","href":"/api-reference/canvas-actions/list-templates"},{"title":"Search Template Pages","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /templates/pages","href":"/api-reference/canvas-actions/search-template-pages"},{"title":"Search Assets","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /assets/search","href":"/api-reference/canvas-actions/search-assets"}]},{"group":"tasks","pages":[{"title":"List Tasks","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /tasks","href":"/api-reference/tasks/list-tasks"},{"title":"Start Design Task","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /tasks","href":"/api-reference/tasks/start-design-task"},{"title":"Get Task Status","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /tasks/{task_id}","href":"/api-reference/tasks/get-task-status"},{"title":"Cancel Task","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /tasks/{task_id}/cancel","href":"/api-reference/tasks/cancel-task"}]},{"group":"organizations","pages":[{"title":"List Organizations","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /organizations","href":"/api-reference/organizations/list-organizations"}]},{"group":"credits","pages":[{"title":"Get Credits","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /credits","href":"/api-reference/credits/get-credits"},{"title":"Check Media Credits","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /credits/check","href":"/api-reference/credits/check-media-credits"}]},{"group":"model-access","pages":[{"title":"Request Model Access","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /model-access/{access_key}/request","href":"/api-reference/model-access/request-model-access"}]},{"group":"brand-kits","pages":[{"title":"List Brand Kits","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /brand-kits","href":"/api-reference/brand-kits/list-brand-kits"},{"title":"Create Brand Kit","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /brand-kits","href":"/api-reference/brand-kits/create-brand-kit"},{"title":"Start Brand Extraction","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /brand-kits/extractions","href":"/api-reference/brand-kits/start-brand-extraction"},{"title":"Get Brand Extraction","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /brand-kits/extractions/{job_id}","href":"/api-reference/brand-kits/get-brand-extraction"},{"title":"List Brand Kit Images","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /brand-kits/{brand_kit_id}/images","href":"/api-reference/brand-kits/list-brand-kit-images"},{"title":"Add Brand Kit Image","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /brand-kits/{brand_kit_id}/images","href":"/api-reference/brand-kits/add-brand-kit-image"},{"title":"Remove Brand Kit Image","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml delete /brand-kits/{brand_kit_id}/images/{image_id}","href":"/api-reference/brand-kits/remove-brand-kit-image"},{"title":"Delete Brand Kit","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml delete /brand-kits/{brand_kit_id}","href":"/api-reference/brand-kits/delete-brand-kit"},{"title":"Update Brand Kit","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml patch /brand-kits/{brand_kit_id}","href":"/api-reference/brand-kits/update-brand-kit"}]},{"group":"remix","pages":[{"title":"Remix Canvas","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /remix","href":"/api-reference/remix/remix-canvas"}]},{"group":"share-links","pages":[{"title":"Resolve Share Link","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /share_links/resolve","href":"/api-reference/share-links/resolve-share-link"}]},{"group":"uploads","pages":[{"title":"Get Upload Limits","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /uploads/limits","href":"/api-reference/uploads/get-upload-limits"},{"title":"Upload File","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /uploads","href":"/api-reference/uploads/upload-file"},{"title":"Create Upload Url","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /uploads/url","href":"/api-reference/uploads/create-upload-url"},{"title":"Register Upload","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /uploads/register","href":"/api-reference/uploads/register-upload"},{"title":"Upload From Url","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /uploads/from-url","href":"/api-reference/uploads/upload-from-url"}]},{"group":"voices","pages":[{"title":"Get Voice Capabilities","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /voices/capabilities","href":"/api-reference/voices/get-voice-capabilities"},{"title":"List Voices","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /voices","href":"/api-reference/voices/list-voices"},{"title":"Find Similar Voices","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /voices/similar","href":"/api-reference/voices/find-similar-voices"},{"title":"Get Voice","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /voices/{voice_id}","href":"/api-reference/voices/get-voice"},{"title":"List Voice Favorites","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /voice-favorites","href":"/api-reference/voices/list-voice-favorites"},{"title":"Put Voice Favorite","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml put /voice-favorites","href":"/api-reference/voices/put-voice-favorite"},{"title":"List Pronunciation Dictionaries","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /pronunciation-dictionaries","href":"/api-reference/voices/list-pronunciation-dictionaries"},{"title":"Create Pronunciation Dictionary","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /pronunciation-dictionaries","href":"/api-reference/voices/create-pronunciation-dictionary"},{"title":"Get Pronunciation Dictionary","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /pronunciation-dictionaries/{dictionary_id}","href":"/api-reference/voices/get-pronunciation-dictionary"},{"title":"Create Pronunciation Dictionary Revision","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /pronunciation-dictionaries/{dictionary_id}/revisions","href":"/api-reference/voices/create-pronunciation-dictionary-revision"}]},{"group":"usage","pages":[{"title":"Get Api Usage","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /usage","href":"/api-reference/usage/get-api-usage"},{"title":"List Api Events","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /events","href":"/api-reference/usage/list-api-events"}]},{"group":"webhooks","pages":[{"title":"List Deliveries","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /webhook_deliveries","href":"/api-reference/webhooks/list-deliveries"},{"title":"Redeliver Webhook","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /webhook_deliveries/{delivery_id}/redeliver","href":"/api-reference/webhooks/redeliver-webhook"}]},{"group":"feedback","pages":[{"title":"Submit Feedback","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /feedback","href":"/api-reference/feedback/submit-feedback"},{"title":"Submit Feedback Bundle","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /feedback/bundle","href":"/api-reference/feedback/submit-feedback-bundle"}]},{"group":"voyager","pages":[{"title":"Notify Review Ready","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /voyager/review-ready","href":"/api-reference/voyager/notify-review-ready"},{"title":"Notify Conversation Alert","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /voyager/conversation-alert","href":"/api-reference/voyager/notify-conversation-alert"},{"title":"Voyager Auth Config","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /voyager/auth/config","href":"/api-reference/voyager/voyager-auth-config"},{"title":"Voyager Auth Register","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /voyager/auth/register","href":"/api-reference/voyager/voyager-auth-register"},{"title":"Voyager Auth Revoke","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /voyager/auth/revoke","href":"/api-reference/voyager/voyager-auth-revoke"},{"title":"Voyager Me","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /voyager/me","href":"/api-reference/voyager/voyager-me"},{"title":"Voyager Save Onboarding Survey","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml put /voyager/me/onboarding-survey","href":"/api-reference/voyager/voyager-save-onboarding-survey"},{"title":"Voyager List Devices","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /voyager/devices","href":"/api-reference/voyager/voyager-list-devices"},{"title":"Voyager Revoke Device","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml delete /voyager/devices/{device_ref}","href":"/api-reference/voyager/voyager-revoke-device"},{"title":"Voyager Redeem Promo","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /voyager/promo/redeem","href":"/api-reference/voyager/voyager-redeem-promo"}]},{"group":"voyager-games","pages":[{"title":"List Games","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /voyager/games","href":"/api-reference/voyager-games/list-games"},{"title":"Create Game","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /voyager/games","href":"/api-reference/voyager-games/create-game"},{"title":"Get Game","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /voyager/games/{game_id}","href":"/api-reference/voyager-games/get-game"},{"title":"Rename Game","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml patch /voyager/games/{game_id}","href":"/api-reference/voyager-games/rename-game"},{"title":"Unpublish Game","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /voyager/games/{game_id}/unpublish","href":"/api-reference/voyager-games/unpublish-game"},{"title":"Publish Game","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /voyager/games/{game_id}/publish","href":"/api-reference/voyager-games/publish-game"}]},{"group":"media","pages":[{"title":"Layerize Assets","description":"Turn an image into downloadable full-size PNG layers and linked text metadata.\n\nReturns a task immediately; poll its links.self or supply callback_url for\na signed terminal webhook. Requires media:generate; polling uses tasks:read.\nNo canvas-write/export scope or rollout flag is required. Billing uses the\nnormal Layerize credit precheck and usage. Some effects may be delivered as\ncomposite layers with explicit partial-result warnings. PNG/JPEG/WebP only;\nEXIF orientation is normalized before reconstruction.","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/layerize-assets","href":"/api-reference/media/layerize-assets"},{"title":"List Models","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /media/models","href":"/api-reference/media/list-models"},{"title":"Generate Image","description":"Generate image(s) with an explicitly selected registry model (metered).","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/generate-image","href":"/api-reference/media/generate-image"},{"title":"Edit Image","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/edit-image","href":"/api-reference/media/edit-image"},{"title":"Generate Audio","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/generate-audio","href":"/api-reference/media/generate-audio"},{"title":"Get Audio Generation Status","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /media/generate-audio/{task_id}","href":"/api-reference/media/get-audio-generation-status"},{"title":"Cancel Audio Generation","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/generate-audio/{task_id}/cancel","href":"/api-reference/media/cancel-audio-generation"},{"title":"Generate 3D","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/generate-3d","href":"/api-reference/media/generate-3d"},{"title":"Get 3D Generation Status","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /media/generate-3d/{task_id}","href":"/api-reference/media/get-3d-generation-status"},{"title":"Generate Video","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/generate-video","href":"/api-reference/media/generate-video"},{"title":"Get Video Generation Status","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /media/generate-video/{task_id}","href":"/api-reference/media/get-video-generation-status"},{"title":"Upscale Video","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/upscale-video","href":"/api-reference/media/upscale-video"},{"title":"Reframe Video","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/reframe-video","href":"/api-reference/media/reframe-video"},{"title":"Video Frames","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/video-frames","href":"/api-reference/media/video-frames"},{"title":"Upscale Image","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/upscale","href":"/api-reference/media/upscale-image"},{"title":"Vectorize Image","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/vectorize","href":"/api-reference/media/vectorize-image"},{"title":"Precise Edit Image","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/precise-edit","href":"/api-reference/media/precise-edit-image"},{"title":"Remove Background","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/remove-background","href":"/api-reference/media/remove-background"},{"title":"Outpaint Image","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/outpaint","href":"/api-reference/media/outpaint-image"},{"title":"Fetch Logo","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/fetch-logo","href":"/api-reference/media/fetch-logo"},{"title":"Layerize Image","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /media/layerize","href":"/api-reference/media/layerize-image"},{"title":"Get Layerize Status","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /media/layerize/{task_id}","href":"/api-reference/media/get-layerize-status"}]},{"group":"provider-proxy","pages":[{"title":"Provider Proxy","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /provider-proxy","href":"/api-reference/provider-proxy/provider-proxy"},{"title":"Provider Proxy Lookup","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /provider-proxy/lookup","href":"/api-reference/provider-proxy/provider-proxy-lookup"}]},{"group":"inference","pages":[{"title":"Models","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /inference/models","href":"/api-reference/inference/models"},{"title":"Openai Responses","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /inference/openai/responses","href":"/api-reference/inference/openai-responses"},{"title":"Anthropic Messages","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /inference/anthropic/messages","href":"/api-reference/inference/anthropic-messages"},{"title":"Openrouter Chat Completions","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /inference/openrouter/chat/completions","href":"/api-reference/inference/openrouter-chat-completions"},{"title":"Voyager Chat Completions","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /inference/voyager/chat/completions","href":"/api-reference/inference/voyager-chat-completions"},{"title":"Typesafe Systemone","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /inference/typesafe/systemone","href":"/api-reference/inference/typesafe-systemone"}]},{"group":"cloud-computers","pages":[{"title":"List Computers","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /cloud-computers/","href":"/api-reference/cloud-computers/list-computers"},{"title":"Create","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/","href":"/api-reference/cloud-computers/create"},{"title":"List Computers","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /cloud-computers","href":"/api-reference/cloud-computers/list-computers-1"},{"title":"Create","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers","href":"/api-reference/cloud-computers/create-1"},{"title":"Offers","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /cloud-computers/offers","href":"/api-reference/cloud-computers/offers"},{"title":"Relay List","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /cloud-computers/relay/","href":"/api-reference/cloud-computers/relay-list"},{"title":"Relay List","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /cloud-computers/relay","href":"/api-reference/cloud-computers/relay-list-1"},{"title":"Verify Host","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/relay/verify-host","href":"/api-reference/cloud-computers/verify-host"},{"title":"Relay Get","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /cloud-computers/relay/{computer_id}","href":"/api-reference/cloud-computers/relay-get"},{"title":"Relay Wake","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/relay/{computer_id}/wake","href":"/api-reference/cloud-computers/relay-wake"},{"title":"Relay Update","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/relay/{computer_id}/update","href":"/api-reference/cloud-computers/relay-update"},{"title":"Host Credentials","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/host/{computer_id}/credentials","href":"/api-reference/cloud-computers/host-credentials"},{"title":"Host Heartbeat","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/host/{computer_id}/heartbeat","href":"/api-reference/cloud-computers/host-heartbeat"},{"title":"Host Admit Work","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/host/{computer_id}/admit-work","href":"/api-reference/cloud-computers/host-admit-work"},{"title":"Get Computer","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /cloud-computers/{computer_id}","href":"/api-reference/cloud-computers/get-computer"},{"title":"Delete","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml delete /cloud-computers/{computer_id}","href":"/api-reference/cloud-computers/delete"},{"title":"Update","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml patch /cloud-computers/{computer_id}","href":"/api-reference/cloud-computers/update"},{"title":"Wake","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/{computer_id}/wake","href":"/api-reference/cloud-computers/wake"},{"title":"Apply Update","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/{computer_id}/update","href":"/api-reference/cloud-computers/apply-update"},{"title":"Sleep","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/{computer_id}/sleep","href":"/api-reference/cloud-computers/sleep"},{"title":"Resize","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/{computer_id}/resize","href":"/api-reference/cloud-computers/resize"},{"title":"Usage","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /cloud-computers/{computer_id}/usage","href":"/api-reference/cloud-computers/usage"},{"title":"Files","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /cloud-computers/{computer_id}/files","href":"/api-reference/cloud-computers/files"},{"title":"Download","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /cloud-computers/{computer_id}/downloads","href":"/api-reference/cloud-computers/download"}]},{"group":"drive","pages":[{"title":"List Folders","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /drive/folders","href":"/api-reference/drive/list-folders"},{"title":"Create Folder","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /drive/folders","href":"/api-reference/drive/create-folder"},{"title":"Get Tree","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /drive/tree","href":"/api-reference/drive/get-tree"},{"title":"List Files","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /drive/files","href":"/api-reference/drive/list-files"},{"title":"List Items","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /drive/items","href":"/api-reference/drive/list-items"},{"title":"Get File","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /drive/files/{file_id}","href":"/api-reference/drive/get-file"},{"title":"Download File","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /drive/files/{file_id}/download","href":"/api-reference/drive/download-file"},{"title":"Move Item","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /drive/items/{item_ref}/move","href":"/api-reference/drive/move-item"},{"title":"Delete Item","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml delete /drive/items/{item_ref}","href":"/api-reference/drive/delete-item"},{"title":"Update Item","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml patch /drive/items/{item_ref}","href":"/api-reference/drive/update-item"}]},{"group":"web","pages":[{"title":"Web Search","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /web/search","href":"/api-reference/web/web-search"},{"title":"Web Read","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /web/read","href":"/api-reference/web/web-read"}]},{"group":"websites","pages":[{"title":"List Websites","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /websites","href":"/api-reference/websites/list-websites"},{"title":"Create Website","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /websites","href":"/api-reference/websites/create-website"},{"title":"Get Website","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /websites/{website_id}","href":"/api-reference/websites/get-website"},{"title":"Delete Website","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml delete /websites/{website_id}","href":"/api-reference/websites/delete-website"},{"title":"Update Website Content","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml put /websites/{website_id}/content","href":"/api-reference/websites/update-website-content"},{"title":"List Website Pages","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml get /websites/{website_id}/pages","href":"/api-reference/websites/list-website-pages"},{"title":"Add Website Page","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /websites/{website_id}/pages","href":"/api-reference/websites/add-website-page"},{"title":"Delete Website Page","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml delete /websites/{website_id}/pages","href":"/api-reference/websites/delete-website-page"},{"title":"Update Website Page Content","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml put /websites/{website_id}/pages/content","href":"/api-reference/websites/update-website-page-content"},{"title":"Screenshot Website","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /websites/{website_id}/screenshot","href":"/api-reference/websites/screenshot-website"},{"title":"Publish Website","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /websites/{website_id}/publish","href":"/api-reference/websites/publish-website"},{"title":"Unpublish Website","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /websites/{website_id}/unpublish","href":"/api-reference/websites/unpublish-website"}]},{"group":"ask-expert","pages":[{"title":"Ask Expert","deprecated":null,"version":null,"openapi":"/openapi/moda-public-api.yaml post /ask","href":"/api-reference/ask-expert/ask-expert"}]}]},{"tab":"Canvas Embed SDK","icon":"window","hidden":true,"pages":[{"title":"Canvas Embed SDK","href":"/canvas-embed/overview"}]}]},"basePath":"","title":"List Models - Moda","buildId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","deploymentId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CDiBsYGW.js","utils-KF9rPlmF.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C26urKTX.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BdjmJAC1.js","snippetPresets-3IpDBjt3.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-D4x_2vvo.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BIWdc5Pa.js","shallow-LQqfiMNd.js","getApiPlaygroundDisplay-DryzlOZG.js","CodeSnippet-tcJujU4r.js","CodeSnippets-BHp0nVLL.js","Page-1CZdsdAn.js","getPastedJson-DU-1ayUv.js","icon-CZK2hPr4.js","MethodPill-DOaqmTFC.js","DuplicateIcon-B5-nUxxl.js","createIcon-CDP_U77G.js","DynamicMarkdown-GHvayGOn.js","SectionHeading-BYvpkmUD.js","axios-vUo_bRtp.js","Markdown-uxhlayGT.js","clsx-B35qUV0p.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BvrGG8gU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CAf0yVYe.js"]}