{{ isCnWorkspace ? 'JojoKey Video CN Beta' : 'JojoKey Video' }}
{{ $t('Recharge') }} JojoKey {{ $t('Go to JojoKey sign in') }} {{ $t('Create a JojoKey account') }}
{{ $t('This account uses native_direct mode. Generate video with an overseas BytePlus ARK API key and endpoint from the account configuration. You can still upload assets and copy asset:// references here.') }}
{{ $t('Prompt') }}
{{ $t('English is recommended. Some models also support Chinese, Japanese, Spanish, Portuguese, and Indonesian.') }} {{ form.prompt.length }} {{ $t('characters') }}
{{ $t('Creation method') }}
{{ $t('Text to video') }} {{ $t('First and last frame animation') }} {{ isSpecialUpscaleModel ? $t('Image to video') : $t('Multi-reference creation') }}
{{ $t('The estimate is based on the selected product parameters. After completion, use the actual cost shown in task details.') }}
{{ $t('Names come from uploaded files and identify assets only. They do not indicate the model, upload format, or feature type. URLs and the various asset:// forms are reference labels used by this system.') }}
{{ $t('Start and end frames') }}
{{ $t('First frame image') }} {{ $t('Remove') }}
{{ assetDisplayName(firstFrameUpload) }}
{{ assetMetaLine(firstFrameUpload) }}
{{ assetScopeLabel(firstFrameUpload) }} · role=first_frame
{{ assetDisplayName(a) }} {{ assetMetaLine(a) }}
{{ $t('Upload and use') }}
{{ $t('Last frame image (optional)') }} {{ $t('Remove') }}
{{ assetDisplayName(lastFrameUpload) }}
{{ assetMetaLine(lastFrameUpload) }}
{{ assetScopeLabel(lastFrameUpload) }} · role=last_frame
{{ assetDisplayName(a) }} {{ assetMetaLine(a) }}
{{ $t('Upload and use') }}
{{ $t('Reference image board') }}
{{ $t('Image order matches Image 1, Image 2, and so on in the prompt.') }}
{{ $t('Upload and add') }}
{{ assetDisplayName(a) }} {{ assetMetaLine(a) }}
{{ $t('Image number', { number: idx + 1 }) }}
{{ assetDisplayName(a) }}
{{ assetMetaLine(a) }}
{{ assetScopeLabel(a) }} · role=reference_image
{{ specialPreparationLabel(a) }} {{ $t('Retry') }}
{{ $t('Move up') }} {{ $t('Move down') }}
{{ $t('No reference images yet. Added images appear as Image 1, Image 2, and so on, and are sent as reference_image when generating.') }}
{{ $t('Reference video (optional)') }}
{{ $t('Use it to reference motion rhythm, camera movement, or action style. It is sent as reference_video when generating.') }}
{{ $t('Upload video') }}
{{ assetDisplayName(a) }} {{ assetMetaLine(a) }}
{{ assetDisplayName(referenceVideoUpload) }}
{{ assetMetaLine(referenceVideoUpload) }}
{{ assetScopeLabel(referenceVideoUpload) }} · role=reference_video
{{ $t('Remove') }}
{{ $t('Without a reference video, you can still create text-to-video, first-and-last-frame animation, or multi-reference videos. Selecting one recalculates the estimate with a video reference.') }}
{{ $t('Reference audio (optional)') }}
{{ $t('Use MP3 or WAV to reference voice, melody, rhythm, or singing timing. It is sent as reference_audio and requires at least one reference image or reference video.') }}
{{ $t('Upload audio') }}
{{ assetDisplayName(a) }} {{ assetMetaLine(a) }}
{{ assetDisplayName(referenceAudioUpload) }}
{{ assetMetaLine(referenceAudioUpload) }}
{{ assetScopeLabel(referenceAudioUpload) }} · role=reference_audio
{{ $t('Remove') }}
{{ $t('Reference audio cannot be used by itself. Keep a reference image or reference video selected so the model has a visual target for lip sync or singing timing.') }}
{{ $t('Parameters') }}
{{ $t('Special models') }} {{ $t('Text to video, 4-15 seconds, 720P / 1080P output') }}
{{ $t('Smart duration lets the service choose the final output duration.') }}
{{ $t('Frames mode sends frames instead of duration.') }}
{{ $t('The official parameter is an integer. The same prompt and Seed can produce similar results, but exact matches are not guaranteed.') }}
{{ $t('Generate audio') }}
{{ $t(currentModelSupportsAudio ? 'Supported by Seedance 2.0 / 2.0 Fast / 1.5 Pro' : 'Not supported by the current model') }}
{{ $t('Add watermark') }}
{{ $t('Official brand watermark') }}
{{ $t('Advanced Seedance options') }}
{{ $t('Return last frame') }}
{{ $t('Ask the service to return last_frame_url for continuation clips.') }}
{{ $t('Web search enhancement') }}
{{ $t('Seedance 2.0 can search the web when the prompt needs current information.') }} {{ $t('Only Seedance 2.0 models support web search.') }}
{{ $t('Smart duration') }}
{{ $t('Frames mode already controls length.') }} {{ $t('Let the model choose the final integer-second duration.') }} {{ $t('Only Seedance 2.0 and 1.5 Pro support smart duration.') }}
{{ $t('Expert timing and cost controls') }}
{{ $t('Show frame count and service tier controls.') }}
{{ $t('Use frames') }}
{{ $t('Frames must be 29-289 and follow 25 + 4n.') }} {{ $t('Approximate duration') }} {{ framesDurationSeconds }}s
{{ $t('Default tier') }} {{ $t('Flex tier') }}
{{ $t('Offline flex inference lowers the estimate and usually waits longer.') }} {{ $t('Flex tier is exposed only for Seedance 2.0 models in the web app.') }} {{ $t('Default online inference is recommended for normal jobs.') }}
{{ $t('Estimated settlement') }}
{{ $t('Calculated from current parameters; use the actual cost shown after completion.') }}
{{ $t('Pre-authorization cap') }} ${{ fmt(estimatedCost) }}
${{ fmt(estimatedSettlementCost) }}
{{ $t('Available balance') }} {{ fmtUsd(me?.available_usd) }}
{{ $t('On hold') }} {{ fmtUsd(me?.held_usd) }} ({{ me?.pending_tasks }})
{{ $t('Insufficient balance') }}: {{ $t('Estimated settlement') }} ${{ fmt(estimatedSettlementCost) }}; {{ $t('Required pre-authorization') }} ${{ fmt(estimatedCost) }} {{ $t('Submit generation') }}
{{ $t('Billing notes') }}
  • {{ $t('Estimated settlement is for reference. After completion, use the actual cost shown in task details.') }}
  • {{ $t('The pre-authorization cap is the maximum amount held at submission to ensure sufficient balance. It is not the final charge.') }}
  • {{ $t('After a task completes, the difference is refunded or charged as needed. Failed, cancelled, and expired tasks release the held amount.') }}
  • {{ $t('Text-to-video, first-and-last-frame animation, and multi-reference creation cost the same for the same model, resolution, and duration. Video references, audio generation, resolution, duration, and model choice can change the price.') }}
{{ $t('Submit with sexy reasoning API') }}
{{ $t('Use this API when the prompt direction clearly needs nudity, or when the uploaded person will appear nude or undressing in the video.') }}
{{ $t('Suitable for video tasks with several person reference images. It reuses the current prompt, reference materials, and parameters. After submission, the task still appears in My videos, with progress, results, and fees shown under the standard video task flow.') }}
{{ $t('Prefer Seedance 2.0 Pro for stronger reasoning. Mini or Fast may fail at storyboard and face reasoning.') }}
{{ $t('Open multi-image composition studio') }} {{ $t('Submit with sexy reasoning API') }}
{{ $t('At least one first frame, last frame, or reference image is required. The normal Submit generation button above is not affected.') }}
{{ $t('The sexy reasoning API supports at most 8 image references.') }}
{{ $t('The sexy reasoning API does not support reference videos.') }}
{{ $t('Submit with lower-body reasoning API') }}
{{ $t('Use this API when the prompt clearly includes lower-body visual content.') }}
{{ $t('The lower-body studio requires Person 1 and optionally accepts Person 2, with one to four images per referenced person. The platform generates one scene-and-pose composition image from the prompt.') }}
{{ $t('Enhanced storyboard is available only with Seedance 2.0 Pro. Turn it off to use Fast or Mini.') }}
{{ $t('Enhanced storyboard') }}
{{ $t('Single reference image represents') }}
{{ $t('Open lower-body reasoning studio') }} {{ $t('Submit with lower-body reasoning API') }}
{{ $t('Enhanced storyboard is available only with Seedance 2.0 Pro. Turn it off to use Fast or Mini.') }}
{{ $t('The lower-body reasoning API requires exactly one face image reference and cannot be used with a reference video.') }}
{{ $t('Submit with celebrity reasoning API') }}
{{ $t('Use this when the uploaded image clearly contains a public figure or celebrity. The platform will enable the corresponding handling flow.') }}
{{ $t('Currently this scene supports text-to-video only and may include lower-body or sexual content. Exactly one face image is required; multiple images and reference videos are not supported.') }}
{{ $t('Prefer Seedance 2.0 Pro for stronger reasoning. Mini or Fast may fail at storyboard and face reasoning.') }}
{{ $t('Submit with celebrity reasoning API') }}
{{ $t('The celebrity reasoning API requires exactly one face image reference and cannot be used with a reference video.') }}

{{ $t('No tasks yet. Create one to get started.') }}

{{ $t('Create video') }}
{{ taskStatusLabel(t) }}
{{ $t('This content has expired') }}
{{ taskStatusLabel(t) }}
{{ t.id }} {{ fmtTs(t.created_at) }}

{{ t.prompt_text || '—' }}

{{ $t('Review reason') }}
{{ taskModerationSummary(t) || (moderationResultLoading[t.id] ? $t('Querying detailed failure reason...') : $t('Open details to view or query again')) }}
{{ t.model }} · {{ t.resolution || '-' }} · {{ t.duration || '-' }}s ${{ fmt(t.actual_cost_usd ?? t.estimated_cost_usd) }}
{{ detailTask.id }}
{{ detailTask.model }} · {{ detailTask.resolution || '-' }} · {{ detailTask.duration || '-' }}s · {{ fmtTs(detailTask.created_at) }}
{{ taskStatusLabel(detailTask) }}
{{ $t('Original user prompt') }}
"{{ detailTask.prompt_text }}"
{{ $t('Task reference assets') }}
{{ detailTask.reference_materials.length }} {{ $t('items') }}
{{ referenceMaterialTitle(item) }}
{{ referenceKindLabel(item.kind) }} · {{ referenceRoleLabel(item.role) }}
{{ item.original_filename }}
{{ item.asset_url || item.url }}
{{ $t('Close') }} {{ $t('Use this task again') }}
{{ $t('Upload asset') }}
{{ $t('Supports JPG, PNG, WebP, MP4, MOV, MP3, and WAV. Use stable, publicly reachable asset URLs.') }}
{{ $t('Upload') }}
{{ $t('Turn this off for a normal first-frame upload. For an obvious face or portrait, pre-registration is recommended. It registers the image as asset:// to reduce privacy-detection risk from raw face URLs; it does not bypass review or guarantee upstream approval.') }}
{{ $t('Most users do not need this. Use it only when operations confirms that an upstream GroupId is bound to one verified person. Do not mix other faces into that group. This registers an asset in the existing group and does not start official identity verification.') }}
{{ $t('Seedream image generation') }}

{{ $t('Generate an image asset from text. When complete, it appears in My assets and can be used as a video reference image.') }}

{{ $t('Saved as an image asset after generation') }}
{{ $t('Select model') }}
{{ $t('Image prompt') }}
{{ $t('Reference images') }}
{{ assetDisplayName(a) }} {{ assetScopeLabel(a) }}
{{ assetDisplayName(a) }}
{{ assetMetaLine(a) }}
{{ $t('Seedream reference image · sends the original asset URL upstream') }}
{{ $t('Optional. With references this is image-to-image or multi-reference generation; without them it is text-to-image. Seedream references are sent upstream in the official') }} image {{ $t('field.') }}
{{ $t('Batch and optimization') }}
{{ $t('Creates a related image set with shared style and subject. Reference image count plus maximum output count cannot exceed') }} {{ seedreamSequentialMaxTotal }}.
{{ $t('Maximum output images') }}
{{ $t('You can currently output up to') }} {{ seedreamOutputMaxCount }} {{ $t('images. The upstream response may contain fewer; billing follows the number actually saved.') }}
{{ $t('Sets') }} optimize_prompt_options.mode {{ $t('to') }} standard{{ $t(', which usually improves interpretation but may add a few seconds.') }}
{{ $t('Size and resolution') }}
{{ $t(seedreamSizeLabelKey(s)) }} {{ $t('Custom dimensions') }}
{{ seedreamSizeHelp }}
{{ $t('Generate image') }}
{{ $t('No generated images yet') }}
{{ $t('Describe the image you want. Generated images appear here and in My assets.') }}
{{ $t('Image pre-registration') }}

{{ $t('If you already have an HTTPS image URL, pre-register it to get asset://. This is useful for reusable portraits, references, and batch tasks; it is neither official identity verification nor a review bypass.') }}

{{ $t('Pre-register') }}
{{ $t('After success, it appears in My assets below with the Image pre-registration label. Use the returned asset:// directly when generating video.') }}

{{ $t('No assets yet. Upload a reference image or video first.') }}

{{ assetDisplayName(a) }}
{{ assetMetaLine(a) }}
{{ a.id }} · {{ formatBytes(a.size_bytes) }}
{{ assetScopeLabel(a) }}
{{ $t('Use as reference') }} {{ $t('Copy reference') }} {{ $t('Open') }} {{ $t('Delete') }}
{{ a.asset_url }}
{{ $t('CN account status') }}
{{ $t('Loading /v1/video-cn/me ...') }}
{{ $t('Submit JojoKey Video CN task') }}
{{ $t('Generation mode') }}
{{ $t('Text-to-video') }} {{ $t('First/last-frame animation') }} {{ $t('Multi-reference creation') }}
{{ $t('Text-to-video sends only the prompt. First/last-frame animation uses first_frame / last_frame. Multi-reference creation uses reference_image and reference_video.') }}
{{ $t('first_frame (first frame)') }}
{{ $t('last_frame (last frame, optional)') }}
{{ $t('reference_image (reference images, up to 9)') }}
{{ $t('reference_video (reference video, optional)') }}
{{ $t('Generate audio') }} {{ $t('return_last_frame (return last frame)') }}
{{ $t('This entry submits a JojoKey Video CN task. Review the estimate before submission and the actual cost after completion.') }}
{{ $t('Submit JojoKey Video CN task') }}
{{ $t('CN task list') }} {{ $t('Refresh') }}
{{ task.id }}
{{ task.mode }} · {{ task.resolution }} · {{ task.duration || '-' }}s
{{ statusLabel(task.status) }}
{{ task.prompt_text }}
{{ $t('Pre-authorized') }} ¥{{ money(task.held_cny || 0) }} {{ $t('Settled') }} ¥{{ money(task.actual_cost_cny || 0) }} {{ $t('Seed') }} {{ task.seed ?? '-' }} generate_audio {{ task.generate_audio === null || task.generate_audio === undefined ? '-' : (task.generate_audio ? 'true' : 'false') }}
{{ task.error.message }}
{{ $t('View details') }} {{ $t('Query status') }} {{ $t('Copy video link') }} {{ $t('Copy last-frame link') }}
{{ $t('CN asset list') }} {{ $t('Refresh') }}
{{ $t('Upload local asset') }}
{{ $t('Upload and pre-register as asset://') }}
{{ $t('This calls POST /v1/video-cn/assets. On success it returns an asset:// reference for first_frame, last_frame, reference_image, or reference_video.') }}
{{ $t('Register asset from URL') }}
{{ $t('Register CN asset') }}
{{ $t('This calls /v1/video-cn/assets/from-url and registers a JojoKey Video CN asset. Use stable image or video URLs. asset_type=3 audio assets are not available yet.') }}
{{ asset.asset_name || asset.id }}
{{ asset.asset_url }}
{{ cnAssetTypeLabel(asset) }} · {{ $t('CN asset sync status') }}: {{ cnSyncLabel(asset) }} · sync_status: {{ asset.sync_status ?? '-' }} · asset_status: {{ asset.asset_status ?? '-' }}
{{ asset.error.message }}
{{ $t('Copy asset://') }} {{ $t('Copy source URL') }}
{{ $t('Who should use it') }}

{{ $t('JojoKey Video CN Beta is for test customers who need domestic Seedance / Jimeng video capabilities. It uses independent CNY balance, CN task ledger, and CN asset registration. It does not mix with the overseas USD ledger or write CN tasks into the overseas Seedance workspace.') }}

{{ $t('Only test accounts enabled by an administrator can use it for now. Accounts that are not enabled can still see the entry, but submissions are blocked.') }}
{{ $t('Complete usage flow') }}
1
{{ $t('1. Admin enables CN Beta') }}

{{ $t('The administrator enables JojoKey Video CN Beta for the account and tops up the CNY balance. The user side then shows ¥ balance, CN tasks, and CN asset registration.') }}

2
{{ $t('2. Prepare domestically reachable asset URLs') }}

{{ $t('Use stable, publicly reachable image and video asset URLs to reduce fetch timeouts.') }}

3
{{ $t('3. Create a video task') }}

{{ $t('In Create CN video, fill in the prompt, mode, resolution, ratio, and duration. The system pre-authorizes CNY first.') }}

4
{{ $t('4. View results in My tasks') }}

{{ $t('After submission, the task appears in My tasks. Click a task to view details, play the result, and copy the video or last-frame link. Failed tasks show a customer-safe error message.') }}

5
{{ $t('5. Reconcile and top up') }}

{{ $t('CN tasks settle against the CNY ledger. Contact an administrator to top up when balance is insufficient. Overseas USD balance cannot offset CN tasks.') }}

{{ $t('Asset preparation rules') }}
{{ $t('Asset type') }} {{ $t('Current recommendation') }} {{ $t('Notes') }}
{{ $t('Image asset') }} {{ $t('For people, products, and scene references. JPG / PNG / WebP are recommended.') }} {{ $t('Prefer domestic HTTPS URLs. Register faces and complex assets before using them for generation.') }}
{{ $t('Video asset') }} {{ $t('For motion, camera, pose, or style references. The frontend supports MP4 / MOV.') }} {{ $t('Use short clips from stable, publicly reachable URLs to reduce fetch timeouts.') }}
{{ $t('Audio asset') }} {{ $t('Audio asset registration is not open during Beta.') }} {{ $t('The API returns video_cn_audio_asset_not_supported. Use image or video assets for now.') }}
{{ $t('Fees and pre-authorization') }}

{{ $t('Review the estimated amount before submission. After completion, use the actual cost shown in task details; failed tasks are handled according to the service rules.') }}

{{ $t('Higher resolution and longer duration usually increase the estimate. Professional super-resolution is not available during Beta.') }}
{{ $t('Known limitations') }}
  • {{ $t('generate_audio=false currently cannot guarantee forced silence. If no music is required, state in the prompt: no background music, keep only ambient sound.') }}
  • {{ $t('Professional super-resolution is not available during Beta.') }}
  • {{ $t('asset_type=3 audio assets are not open yet.') }}
  • {{ $t('duration=-1 smart duration can be sent; the actual output duration may vary.') }}
  • {{ $t('Use stable, publicly reachable asset URLs to reduce fetch timeouts.') }}
{{ $t('Launch recommendation') }}

{{ $t('Start with a small CNY balance for test users and verify the asset registration -> create video -> my tasks -> reconciliation loop. Increase concurrency and duration only after asset sources are stable.') }}

{{ $t('Create CN video') }} {{ $t('CN asset registration') }} {{ $t('View CN API Key') }}
{{ $t('JojoKey Video CN API documentation') }}

{{ $t('This page only describes the domestic JojoKey Video CN Beta APIs. Overseas Seedance still uses overseas APIs such as /v1/videos and /v1/uploads. The two systems do not share balances, assets, or tasks.') }}

{{ $t('Base URL') }}: {{ cnApiHost() }}. {{ $t('All requests use the Authorization header.') }}
{{ $t('Endpoint overview') }}
{{ $t('Endpoint') }} {{ $t('Purpose') }}
GET /v1/video-cn/me{{ $t('View enablement status, CNY balance, and held amount.') }}
POST /v1/video-cn/videos{{ $t('Submit a CN video task.') }}
GET /v1/video-cn/videos{{ $t('View the current account CN task list.') }}
GET /v1/video-cn/videos/{id}{{ $t('Query one task status and trigger refresh.') }}
POST /v1/video-cn/assets{{ $t('Upload a local asset and pre-register it as a CN asset://.') }}
POST /v1/video-cn/assets/from-url{{ $t('Register a public asset URL into the CN asset ledger.') }}
GET /v1/video-cn/assets{{ $t('View the current account CN asset list.') }}
GET /v1/video-cn/assets/{asset_id}{{ $t('Query the latest status of one CN asset.') }}
{{ $t('Authentication') }}

{{ $t('Use the CN Relay API Key shown on the account page. The request header format is:') }}

Authorization: Bearer $KEY Content-Type: application/json
{{ $t('Request example: text-to-video') }}
curl -X POST {{ cnApiHost() }}/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "阳光竹林里,一位女子缓慢走向镜头,电影感写实风格", "mode": "fast", "resolution": "720p", "ratio": "9:16", "duration": 5 }'
{{ $t('Request example: use reference assets') }}

{{ $t('Register an asset URL or upload a local asset first, then put the returned asset address into content[] as a reference. CN asset sync status should reach sync_status=2 before generation.') }}

curl -X POST {{ cnApiHost() }}/assets \ -H "Authorization: Bearer $KEY" \ -F "file=@reference.mp4;type=video/mp4" \ -F "asset_type=2" \ -F "asset_name=walk-reference"
curl -X POST {{ cnApiHost() }}/assets/from-url \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://cdn.example.cn/reference.jpg", "asset_name": "model-reference", "asset_type": 1 }'
curl -X POST {{ cnApiHost() }}/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "content": [ { "type": "text", "text": "参考图片中的人物,在城市街头自然行走" }, { "type": "image_url", "image_url": { "url": "asset://asset_xxx" }, "role": "reference_image" } ], "mode": "fast", "resolution": "720p", "ratio": "9:16", "duration": 5 }'
{{ $t('Request example: first/last-frame animation') }}

{{ $t('First/last-frame animation uses first_frame and last_frame, suitable for specifying the starting and ending frames.') }}

curl -X POST {{ cnApiHost() }}/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "content": [ { "type": "text", "text": "让首帧人物自然走到尾帧姿态,镜头稳定,写实风格" }, { "type": "image_url", "image_url": { "url": "asset://asset_first" }, "role": "first_frame" }, { "type": "image_url", "image_url": { "url": "asset://asset_last" }, "role": "last_frame" } ], "mode": "pro", "resolution": "720p", "ratio": "9:16", "duration": 5, "return_last_frame": true }'
{{ $t('Request example: reference video') }}

{{ $t('Reference video uses reference_video and is suitable for referencing motion rhythm, camera movement, or pose changes. Image references still use reference_image.') }}

curl -X POST {{ cnApiHost() }}/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "content": [ { "type": "text", "text": "参考视频里的走路节奏,换成夏日街拍风格" }, { "type": "video_url", "video_url": { "url": "asset://asset_video" }, "role": "reference_video" } ], "mode": "fast", "resolution": "720p", "ratio": "9:16", "duration": 5, "bitrate_mode": "high" }'
{{ $t('Parameter reference') }}
{{ $t('Parameter') }} {{ $t('Description') }}
prompt{{ $t('Prompt shorthand. If content[] is provided, prompt can be omitted.') }}
content[]{{ $t('Full content array, supporting references such as text, image_url, and video_url.') }}
images / videos{{ $t('Shorthand arrays for lightweight integration. Use content[] when exact roles are required.') }}
audios{{ $t('Reserved field. Audio references are not available during Beta.') }}
mode{{ $t('fast, pro, or mini.') }}
resolution{{ $t('480p, 720p, 1080p, or 4k. Higher resolution usually increases the estimate.') }}
ratio{{ $t('Common values are 9:16, 16:9, 1:1, and 3:4.') }}
duration{{ $t('Usually 4-15 seconds. -1 means smart duration.') }}
generate_audio{{ $t('Whether to attempt audio generation. false cannot guarantee forced silence. If no music is required, state that in the prompt.') }}
watermark{{ $t('Whether to request a watermark. Availability depends on the selected product capability.') }}
return_last_frame{{ $t('Requests a last-frame image URL. Task details show last_frame_url when available.') }}
bitrate_mode{{ $t('Can be normal or high. High bitrate is better for tasks that need to preserve details.') }}
seed{{ $t('Seed for making similar requests easier to reproduce. If omitted, the service chooses a value.') }}
super_resolution_config{{ $t('Reserved super-resolution field. Professional super-resolution is not available during Beta.') }}
ips{{ $t('Reserved copyright allowlist ID field. Current handling is offline filing, not frontend self-service validation.') }}
{{ $t('Asset API fields') }}
{{ $t('Field') }} {{ $t('Description') }}
asset_type=1{{ $t('Image asset. Supports JPG / PNG / WebP and is used for first_frame, last_frame, and reference_image.') }}
asset_type=2{{ $t('Video asset. Supports MP4 / MOV and is used for reference_video. Short clips and domestic URLs are recommended.') }}
asset_type=3{{ $t('Audio assets are not open yet. Requests return video_cn_audio_asset_not_supported.') }}
asset_url{{ $t('Returned asset:// URI. Put it into content[] for video generation; do not write it into the prompt body.') }}
sync_status=2{{ $t('Treat as synced and usable. If it is not 2, query asset details first or retry later.') }}
source_url{{ $t('Source asset URL. Use domestic object storage or a domestic CDN to avoid overseas URL fetch timeouts.') }}
{{ $t('Response example and task statuses') }}
{ "id": "cnv_xxx", "status": "queued", "video_url": "https://cdn.example.cn/output.mp4", "last_frame_url": "https://cdn.example.cn/last-frame.jpg", "seed": 12345, "generate_audio": true, "held_cny": 3.5000, "estimated_cost_cny": 2.8000, "actual_cost_cny": 2.6136, "created_at": 1782800000 }

{{ $t('Task statuses include queued, running, succeeded, and failed. Poll GET /v1/video-cn/videos/{id} every 5-8 seconds; do not send high-frequency requests every second.') }}

{{ $t('Fees, holds, and reconciliation fields') }}
{{ $t('Field') }} {{ $t('Description') }}
held_cny{{ $t('CNY amount held at submission to ensure sufficient balance. It is not necessarily the final charge.') }}
estimated_cost_cny{{ $t('Customer-side price estimated from current parameters, for reference before and after submission.') }}
actual_cost_cny{{ $t('Customer-side actual settlement after task completion. Failed tasks are usually 0.') }}
{{ $t('Beta disabled or pending capabilities') }}
  • {{ $t('professional super-resolution is not available during Beta.') }}
  • {{ $t('asset_type=3 audio assets: documented as reserved, but self-service registration is not open yet.') }}
  • {{ $t('generate_audio=false can be sent but cannot guarantee forced silence. To reduce music risk, state no background music in the prompt.') }}
  • {{ $t('duration=-1 smart duration can be sent; the actual output duration may vary.') }}
  • {{ $t('resolution_limit custom short-side super-resolution and ips copyright allowlist ID are not exposed as regular customer self-service parameters.') }}
{{ $t('Error codes') }}
{{ $t('Error code') }} {{ $t('Meaning and handling') }}
video_cn_beta_not_enabled{{ $t('The current account is not enabled for CN Beta. Contact an administrator to enable it.') }}
insufficient_video_cn_balance{{ $t('CNY balance is insufficient. Top up and retry.') }}
video_cn_professional_super_resolution_disabled{{ $t('professional super-resolution is not open yet.') }}
video_cn_audio_asset_not_supported{{ $t('Audio asset registration is not open yet. Use image or video assets first.') }}
invalid_video_cn_request{{ $t('The request body is invalid, usually due to content[] structure, role, or parameter range.') }}
invalid_video_cn_asset_url{{ $t('The asset URL is not an http/https public URL.') }}
invalid_video_cn_upload_type{{ $t('The local upload file type is not supported. Only image and video assets are open currently.') }}
video_cn_asset_type_mismatch{{ $t('The uploaded file type does not match asset_type.') }}
task_failed{{ $t('The task failed. Check the input assets and prompt, then retry or contact support.') }}
{ "error": { "code": "insufficient_video_cn_balance", "message": "JojoKey Video CN 任务需要预扣 ¥3.0000,当前余额 ¥1.0000", "needed_cny": 3.0, "balance_cny": 1.0 } }
{{ $t('CN Video Beta configuration') }}

{{ $t('Under the same account, the CN line uses independent CNY balance and CN task ledger. The frontend currently shows the CN entry and CN Relay API Key. If fully separate keys are needed later, they can be issued separately in the admin backend.') }}

{{ $t('CN host') }}
{{ cnApiHost() }}
{{ $t('CN CNY balance') }}
{{ fmtCny(cnVideoInfo?.balance_cny) }}
{{ $t('CN tasks') }}
{{ cnVideoInfo?.pending_tasks || 0 }}
{{ $t('CN Relay API Key') }}
{{ selectedCnVideoTask.id }}
{{ selectedCnVideoTask.mode }} · {{ selectedCnVideoTask.resolution || '-' }} · {{ selectedCnVideoTask.ratio || '-' }} · {{ selectedCnVideoTask.duration || '-' }}s · {{ fmtTs(selectedCnVideoTask.created_at) }}
{{ statusLabel(selectedCnVideoTask.status) }}
{{ $t('User prompt') }}
{{ selectedCnVideoTask.prompt_text }}
{{ $t('This settlement CNY') }}
{{ fmtCny(selectedCnVideoTask.actual_cost_cny ?? selectedCnVideoTask.estimated_cost_cny) }}
{{ $t('Pre-authorized') }} {{ fmtCny(selectedCnVideoTask.held_cny || 0) }}
{{ $t('Close') }} {{ $t('Refresh CN status') }} {{ $t('Reuse this task for CN generation') }}
{{ $t('Get started in 3 minutes') }}

{{ $t('The shortest path: set your Relay API key, submit a task, poll its status, then open the official link within 23 hours after success. Image-to-video can use a direct first-frame upload or an asset:// returned from image pre-registration.') }}

1
{{ $t('Set up your API key') }}

{{ $t('Put the sk- key provided by the platform in the Authorization header. The web app does not ask you for an Ark API key.') }}

2
{{ $t('Submit generation') }}

{{ $t('For text-to-video, send a prompt. For image-to-video, upload a first frame directly or pre-register an image and put its asset:// in content[].') }}

3
{{ $t('Poll and download') }}

{{ $t('The task flow is submit → poll → download. Download within 23 hours after success; expired results show “This content has expired”.') }}

{{ $t('Create video') }} {{ $t('Assets') }} {{ $t('Full API documentation') }}
{{ $t('Model capability overview') }}

{{ $t('Use the Fast or Mini product for everyday testing. Use the Pro product when quality, portrait consistency, or multimodal references matter.') }}

{{ $t('Model') }} {{ $t('Best for') }} {{ $t('Capabilities') }}
Seedance 2.0 Pro {{ $t('Quality first, portrait and product consistency, and multi-reference assets') }} {{ $t('Text-to-video, image-to-video, video/audio references, and generated synchronized audio') }}
Seedance 2.0 Fast {{ $t('Batch testing, speed first, and cost-sensitive work') }} {{ $t('Text-to-video, image-to-video, multi-reference, and generated synchronized audio') }}
Seedance 2.0 Mini {{ $t('binbin-sd-mini, lightweight, fast, and low-cost 480p/720p testing') }} {{ $t('Text-to-video, image-to-video, multi-reference, and generated synchronized audio; 1080p is not supported') }}
Seedance 1.5 Pro {{ $t('Seedance 1.5 audiovisual model') }} {{ $t('Text-to-video, image-to-video, and generated synchronized audio') }}
Seedance 1.0 / Lite {{ $t('Lightweight tasks or a specified legacy model') }} {{ $t('Text-to-video or image-to-video depending on the model; no generated synchronized audio') }}
{{ $t('Pre-register face images when possible: direct first-frame upload is still supported, but for a clear face or portrait, use /v1/uploads for pre-registration or call /v1/image-audits to get asset:// before placing it in content[].') }}
{{ $t('Sexy reasoning API (authorized)') }}

{{ $t('After the sexy reasoning API is enabled, you can keep using the standard /v1/videos request shape. Set enterprise_interface=sexy_reasoning in metadata to explicitly submit one to eight reference images through the dedicated generation chain. Accounts with auto-routing enabled may still route single-image tasks automatically. The task is returned as a normal video task, and status, result links, and settlement are queried through the standard flow.') }}

1
{{ $t('Pass the prompt and reference image') }}

{{ $t('Supports HTTPS image URLs or registered asset:// assets. The recommended image role is reference_image.') }}

2
{{ $t('Dedicated quality optimization') }}

{{ $t('The platform combines the reference image and prompt to improve visual quality, identity consistency, and motion expression, making the final video better suited for demanding commercial or entertainment scenarios.') }}

3
{{ $t('Poll the standard task result') }}

{{ $t('After creation, keep querying the same vid_ task. On success you receive the official result link; on failure, check the error reason in task details.') }}

{{ $t('View sexy reasoning API docs') }} {{ $t('Open internal test bench') }}
{{ $t('Lower-body reasoning API (authorized)') }}

{{ $t('Use the lower-body reasoning API when the video direction clearly needs lower-body visual expression. Keep enterprise_interface=lower_body_reasoning in metadata. The standard submission accepts exactly one face image and lets you bind it to Person 1 or Person 2. The dedicated studio accepts one or two identity groups and does not support reference videos.') }}

{{ $t('View lower-body reasoning API docs') }}
{{ $t('Celebrity reasoning API (authorized)') }}

{{ $t('Use the celebrity reasoning API when the uploaded image clearly contains a public figure or celebrity. This API requires exactly one face image reference. It first generates a black-and-white sketch reference and a realistic text-to-image result, then registers them as assets and submits the video. The task is still returned as a standard video task. Customer systems can also add enterprise_interface=celebrity_reasoning in metadata for call marking.') }}

{{ $t('View celebrity reasoning API docs') }}
{{ $t('Task lifecycle') }}

{{ $t('Submit, poll, and download: after submission you receive vid_xxx; check about every 5 to 8 seconds. On success, open the official video_url; downloads remain available for 23 hours.') }}

{{ $t('When downloads expire, the task record remains but the full video may no longer be retrievable. The page marks the content as expired and does not offer unavailable recovery actions.') }}
{{ $t('Why the Relay Key is still trustworthy') }}

{{ $t('With hosted access, submit through the JojoKey API and query the standard task endpoint for status and results. Preview and download use the video_url returned in task details.') }}

{{ $t('Step 1') }}

{{ $t('Upload or register assets') }}

{{ $t('Use /v1/uploads for local files and /v1/uploads/from-url for public images or videos. A first frame without a clear face can be uploaded directly; for a clear face or portrait, use image pre-registration. Returned assets belong only to the account for the current API key.') }}

{{ $t('Go to assets') }} {{ $t('Copy command') }}
{{ guideUploadCurl }}
{{ $t('Image pre-registration') }}

{{ $t('Pre-register an image as asset://') }}

{{ $t('For a reusable portrait or reference image, call /v1/image-audits first and reuse the returned asset://. This is image pre-registration only: it is not official real-person KYC, does not bypass review, and does not guarantee upstream approval.') }}

{{ $t('Go to pre-registration') }} {{ $t('Copy command') }}
{{ guideImageAuditCurl }}
metadata.audit_image

{{ $t('Automatically register an asset during generation') }}

{{ $t('For a one-off first-frame task, send prompt, images, and metadata.audit_image=true to /v1/videos. This is a service-side switch and is not forwarded to overseas BytePlus ARK. The image is registered as asset:// before it is sent upstream. One top-level image becomes first_frame; multiple images become reference_image entries. For complex multi-reference work, use the full content[] array with one image_url.url per image.') }}

{{ $t('Copy command') }}
{{ guideAuditImageVideoCurl }}
{{ $t('Step 2') }}

{{ $t('Generate with the native BytePlus structure') }}

{{ $t('Generation uses fields such as model, content, resolution, ratio, and duration. The web app maps assets to roles: first-and-last-frame animation uses first_frame / last_frame, while multi-reference creation uses reference_image. Each image_url.url accepts only one image URL; do not join multiple references with commas.') }}

{{ $t('Create video') }} {{ $t('Copy command') }}
{{ guideNativeCurl }}
{{ $t('Native Direct') }}

{{ $t('Native direct configuration') }}

{{ $t('A native_direct account generates video with an overseas BytePlus ARK API key and endpoint. A hybrid account can also call this service through /v1/videos with a Relay API Key. Asset upload and image pre-registration still use this service.') }}

{{ $t('View configuration') }} {{ $t('Copy callback command') }}
{{ guideDirectTaskCurl }}
{{ $t('Video generation method examples') }}

{{ $t('All examples below use the native /v1/videos request-body shape. Customers can copy the JSON directly into a command line, SDK, or their own backend.') }}

{{ $t(item.title) }}

{{ $t(item.note) }}

{{ item.code }}
{{ $t('Copy') }}
{{ $t('Key isolation') }}

{{ $t('Creators only use the Relay API Key. Hosted generation uses the platform fallback key or the Ark key bound in the admin backend; asset registration only uses AK/SK stored on the server.') }}

{{ $t('Asset isolation') }}

{{ $t('The asset list is queried by the current API key. asset:// IDs uploaded or generated by another account cannot be used by the current account; the server returns asset_not_owned.') }}

{{ $t('1. Reference image source') }}

{{ $t('Upload a local image, paste an HTTPS image URL, or choose an image from My assets. This page is for internal integration testing; customer production systems should use the standard /v1/videos API.') }}

{{ $t('Local files are submitted as data:image/...;base64 and are not written to browser storage.') }}
{{ assetDisplayName(a) }} {{ assetMetaLine(a) }}
{{ $t('When an asset-library image is selected, the system uses its accessible source file for internal testing.') }}
{{ $t('Current reference preview') }}
{{ $t('Upload or choose an image to preview it here') }}
{{ $t('2. Generation parameters') }}
{{ $t('The same prompt is used for the dedicated platform processing and final video.') }} {{ $t('Character count', { count: referenceWorkflowForm.prompt.length }) }}
{{ $t('A 202 Accepted response only means the sexy reasoning task has been queued. Keep polling the same wfv_... task and do not submit repeatedly. The Idempotency-Key changes automatically when the image, prompt, or parameters change.') }}
{{ $t('Copy curl example') }} {{ $t('Submit sexy reasoning') }}
{{ $t('3. Progress') }}
{{ $t('Task ID') }}
{{ referenceWorkflow.id }}
{{ $t('Current status') }}
{{ workflowStatusLabel(referenceWorkflow.status) }}
{{ $t('Current stage') }}
{{ workflowStatusLabel(referenceWorkflow.current_stage || referenceWorkflow.status) }}
{{ $t('Video task') }}
{{ referenceWorkflow.video_task_id || '-' }}
{{ stage.label }}
{{ stage.help }}
{{ $t('Refresh manually') }} {{ $t('Copy ID') }} {{ $t('Retry video stage only') }}
{{ $t('4. Result') }}
{{ $t('Original reference image') }}
{{ $t('Waiting for image') }}
{{ $t('Dedicated processing result') }}
{{ $t('Shown after generation completes') }}
{{ $t('Final video') }}
{{ $t('Shown after the video completes') }}
{{ $t('Open video link') }} {{ $t('Copy video link') }}
{{ referenceWorkflow.safe_error_message || referenceWorkflow.error_message }}
{{ $t('Request and response diagnostics') }}

{{ $t('Only redacted request and response bodies are shown here. Authorization headers and full keys are not displayed. You can copy this area for engineering diagnosis.') }}

{{ $t('Last request') }}
{{ referenceWorkflowRequestLogText }}
{{ $t('Last response') }}
{{ referenceWorkflowResponseLogText }}
{{ $t('1. Generation parameters') }}
{{ $t('Custom size accepts values such as 864x1536. When empty, generation follows the aspect ratio. After submission, the task is polled automatically; repeated clicks are not needed.') }}
{{ $t('Refresh status') }} {{ $t('Submit image generation') }}
{{ $t('Request log') }}
{{ lowerBodyImageLabRequestText }}
{{ $t('2. Task status') }}
{{ $t('Task ID') }}
{{ lowerBodyImageLabTask.id }}
{{ $t('Status') }}
{{ mediaTaskStatusLabel(lowerBodyImageLabTask.status) }}
{{ $t('Image size') }}
{{ lowerBodyImageLabTask.size || '-' }}
{{ $t('This cost') }}
{{ fmtUsd(lowerBodyImageLabTask.cost_usd ?? lowerBodyImageLabTask.estimated_cost_usd) }}
{{ $t('3. Image result') }}
{{ $t('Generated image') }}
{{ $t('Shown after image generation completes') }}
{{ $t('Open original image') }} {{ $t('Copy image link') }}
{{ lowerBodyImageLabTask.error.message || lowerBodyImageLabTask.error.code }}
{{ $t('1. Person reference image') }}
{{ $t('JPG, PNG, and WebP are supported. The image is used only for this submission and is not written to browser storage.') }}
{{ $t('Current reference image') }}
{{ $t('Choose an image to show the preview') }}
{{ $t('2. Video parameters') }}
{{ $t('Refresh status') }} {{ $t('Submit celebrity video') }}
{{ $t('3. Task status') }}
{{ $t('Orchestration task ID') }}
{{ celebritiesLabTask.id }}
{{ $t('Current status') }}
{{ celebrityTaskStatusLabel(celebritiesLabTask.status) }}
{{ $t('Video task') }}
{{ celebritiesLabTask.video_task_id || celebritiesLabTask.video_task?.id || '-' }}
{{ $t('Specification') }}
{{ celebritiesLabTask.resolution || '-' }} · {{ celebritiesLabTask.ratio || '-' }} · {{ celebritiesLabTask.duration || '-' }}s
{{ $t('4. Generated result') }}
{{ $t('Person reference image') }}
{{ $t('Waiting for reference image') }}
{{ $t('Celebrity image') }}
{{ $t('Shown after image rendering completes') }}
{{ $t('Final video') }}
{{ $t('Shown after the video completes') }}
{{ $t('Open video link') }} {{ $t('Copy video link') }}
{{ celebritiesLabTask.error.message || celebritiesLabTask.error.code }}
{{ $t('Total balance') }}
{{ fmtUsd(me?.total_usd) }}
● {{ $t('Available') }} {{ fmtUsd(me?.available_usd) }}
● {{ $t('Held') }} ({{ $t('Task count', { count: me?.pending_tasks }) }}) {{ fmtUsd(me?.held_usd) }}
{{ $t('Lifetime spent') }} {{ fmtUsd(me?.lifetime_spent_usd) }}

{{ $t('Contact the platform administrator if you need a top-up.') }}

{{ $t('Sexy reasoning API') }}
{{ $t('Sexy reasoning API') }}

{{ $t('Upload a reference image or choose one from the asset library. The platform completes dedicated processing and submits the video task automatically. Authorized accounts only.') }}

{{ $t('Open sexy reasoning API') }} {{ $t('Copy API example') }}
{{ $t('Lower Body Image API') }}
{{ $t('Lower body image test bench') }}

{{ $t('Enter a visual description and choose an aspect ratio to test realistic portrait image generation. This entry is shown only to authorized test accounts.') }}

{{ $t('Open lower body image test bench') }}
{{ $t('Celebrity Reasoning Lab') }}
{{ $t('Celebrity interface test bench') }}

{{ $t('Upload one person reference image and enter a creative description to test celebrity video generation with identity preservation.') }}

{{ $t('Open celebrity interface test bench') }}
{{ $t('Lower-body reasoning API') }}
{{ $t('Lower-body reasoning API') }}

{{ $t('For video tasks that explicitly need lower-body visual expression. The API shape follows standard video tasks, and authorized accounts can choose dedicated submission on the Create video page.') }}

{{ $t('Go to create video') }} {{ $t('Copy API example') }}
{{ $t('Celebrity reasoning API') }}
{{ $t('Celebrity reasoning API') }}

{{ $t('For authorized video tasks containing a public figure or celebrity reference image. Exactly one clear face reference image is required; the platform automatically prepares the task, and results are viewed under My videos.') }}

{{ $t('Go to create video') }} {{ $t('Copy API example') }}
{{ $t('Overseas Video') }}
{{ $t('Mode') }}
{{ modeLabel }}
{{ $t('Endpoint') }}
{{ nativeConfig?.endpoint_id || me?.endpoint_id || $t('Default model mapping') }}
{{ $t('Project') }}
{{ nativeConfig?.project_name || me?.project_name || '-' }}
{{ $t('Overseas host') }}
{{ overseasApiHost() }}
{{ $t('The Relay API Key is only used to sign in to this platform and for hosted relay calls. The Ark API Key is not shown in the frontend. For native_direct, use the overseas BytePlus ARK native key issued by operations.') }}
{{ nativeExampleJson }}
{{ $t('Copy native example') }} {{ $t('Assets') }}
{{ $t('Overseas Relay API Key') }}

{{ $t('Used to sign in to this platform, upload assets, and make hosted relay calls.') }}

# {{ $t('Create video task') }} curl https://video.example.com/v1/videos \ -X POST \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "video-pro", "content": [{"type":"text","text":"a cat dancing"}], "resolution": "720p", "duration": 5 }'
{{ $t('Domestic Video CN Beta') }}

{{ $t('Under the same account, the domestic line uses an independent CNY balance and domestic task ledger. The domestic host and domestic Relay API Key are only used for /v1/video-cn/*.') }}

{{ $t('Domestic host') }}
{{ cnApiHost() }}
{{ $t('Domestic CNY balance') }}
{{ fmtCny(cnVideoInfo?.balance_cny) }}
{{ $t('Domestic tasks') }}
{{ cnVideoInfo?.pending_tasks || 0 }}
{{ $t('Domestic Relay API Key') }}
# {{ $t('Create domestic video task') }} curl {{ cnApiHost() }}/videos \ -X POST \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "阳光竹林里,一位女子缓慢走向镜头", "mode": "fast", "resolution": "720p", "duration": 5 }'