seedancee2.ai 기반으로 구축하세요.
기반이 되는 Seedance 2.0 모델을 바탕으로 상위 제공업체의 기능을 통합해 캡슐화하고, 표준화된 공개 API로 제공합니다.
`pro`, `fast`, `mini`를 한 번만 통합하면 상위 제공업체의 변경 사항은 동일한 공개 계약 뒤에서 흡수됩니다.
프롬프트 우선 및 이미지 우선 비디오 생성을 하나의 API 표면에서 실행하고, 상위 제공업체별 차이를 고객에게 노출하지 않습니다.
생성 요청을 제출하고 작업 상태를 폴링하거나, 비디오가 준비되면 깔끔한 Seedancee2 응답 형태로 웹훅을 받을 수 있습니다.
Seedancee2 Enterprise API
Built on the underlying Seedance 2.0 model, Seedancee2 unifies and encapsulates upstream provider capabilities, then exposes them through a standardized public API.
Base URL
https://api.seedancee2.aiQuickstart
- Get an API key from the Seedancee2 team.
- Create a video generation task.
- Poll the task or receive a webhook when it completes.
Minimal curl example:
curl -X POST "https://api.seedancee2.ai/v1/videos/generations" \
-H "Authorization: Bearer sk_seedancee2_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "mini",
"input": {
"prompt": "A cinematic drone shot of waves breaking against black volcanic rocks",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
},
"metadata": {
"customer_job_id": "job_123"
}
}'Minimal JavaScript example:
const response = await fetch("https://api.seedancee2.ai/v1/videos/generations", {
method: "POST",
headers: {
Authorization: "Bearer sk_seedancee2_live_xxxxx",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "mini",
input: {
prompt: "A cinematic drone shot of waves breaking against black volcanic rocks",
duration: 5,
resolution: "720p",
aspect_ratio: "16:9",
},
metadata: {
customer_job_id: "job_123",
},
}),
});
const result = await response.json();
console.log(result);Minimal Python example:
import requests
response = requests.post(
"https://api.seedancee2.ai/v1/videos/generations",
headers={
"Authorization": "Bearer sk_seedancee2_live_xxxxx",
"Content-Type": "application/json",
},
json={
"model": "mini",
"input": {
"prompt": "A cinematic drone shot of waves breaking against black volcanic rocks",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
},
"metadata": {
"customer_job_id": "job_123",
},
},
timeout=60,
)
print(response.json())Authentication
All requests use bearer token authentication.
Authorization: Bearer sk_seedancee2_live_xxxxx
Content-Type: application/jsonYou can also send the key in x-api-key, but Authorization: Bearer ... is recommended.
API keys and model access
- Your Seedancee2 API key is issued by the Seedancee2 team, from your profile, or from the enterprise admin flow.
- The same Seedancee2 API key works across public models:
pro,fast, andmini. - You do not need separate customer-facing API keys for Mini, Fast, or Pro.
- Upstream provider credentials are managed by Seedancee2 and are never required in customer requests.
If you already have a working Seedancee2 API key, switching models only requires changing the request model field. Example:
{
"model": "mini"
}to:
{
"model": "fast"
}or:
{
"model": "pro"
}Public Models
These are the public model names your integration should use.
| Model | Positioning | Duration | Resolution |
|---|---|---|---|
pro | Standard quality production generation | 4-15s | 480p, 720p, 1080p |
fast | Faster iteration and preview workflows | 4-15s | 480p, 720p |
mini | Lower-cost generation | 4-15s | 480p, 720p |
New integrations should use pro, fast, and mini.
Supported aspect ratios:
16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptiveCredits
Public API credits follow the same deduction rules visible in the Seedancee2 product.
Formula:
credits = duration_seconds * per_second_rate * number_of_outputsReference images, videos, and audio currently do not add extra customer-facing surcharges. The reserved and charged credit values in the API response are the source of truth for each task.
Per-second rates currently aligned with the live Seedancee2 product billing rules:
| Model | 480p | 720p | 1080p |
|---|---|---|---|
pro | 10 credits/s | 20 credits/s | 50 credits/s |
fast | 8 credits/s | 16 credits/s | Not supported |
mini | 5 credits/s | 10 credits/s | Not supported |
Examples:
| Scenario | Credits |
|---|---|
mini, 5s, 720p | 50 |
pro, 4s, 480p | 40 |
fast, 10s, 720p | 160 |
pro, 5s, 720p, 2 reference images | 100 |
If a task fails and the job is eligible for refund, the returned status payload will show the refunded credits.
Task Lifecycle
Task statuses returned by the public API:
| Status | Meaning |
|---|---|
pending | Accepted and waiting to start |
processing | Running |
completed | Finished successfully |
failed | Finished without usable output |
Create Video Task
POST /v1/videos/generationsTop-level request fields:
| Field | Type | Required | Description |
|---|---|---|---|
model | string | Yes | Public model name: pro, fast, or mini |
input | object | Yes | Generation parameters |
callback_url | string | No | Public webhook URL for completion or failure callbacks |
metadata | object | No | Customer-defined metadata echoed back in polling and webhook responses |
Input fields:
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes | Text prompt |
generation_type | string | No | omni_reference or first_and_last_frames; default omni_reference |
image_urls | string[] | No | Reference image URLs |
video_url | string | No | Single reference video URL |
video_urls | string[] | No | Reference video URLs. Do not send together with video_url |
audio_urls | string[] | No | Reference audio URLs |
start_image_url | string | No | First frame image for first_and_last_frames |
end_image_url | string | No | Last frame image for first_and_last_frames |
duration | integer | No | Output duration in seconds, 4-15; default 5 |
resolution | string | No | 480p, 720p, or 1080p; available resolutions depend on the selected model |
aspect_ratio | string | No | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, or adaptive |
generate_audio | boolean | No | Generate synchronized audio when supported |
watermark | boolean | No | Request watermarked output |
seed | integer | No | Deterministic seed |
return_last_frame | boolean | No | Include the last frame image in the output payload |
Full example:
curl -X POST "https://api.seedancee2.ai/v1/videos/generations" \
-H "Authorization: Bearer sk_seedancee2_live_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "pro",
"callback_url": "https://example.com/webhooks/seedancee2",
"input": {
"prompt": "A cinematic tracking shot through a rain-soaked neon market at night",
"image_urls": [
"https://example-cdn.com/reference-1.png",
"https://example-cdn.com/reference-2.png"
],
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
"generate_audio": true,
"return_last_frame": true
},
"metadata": {
"customer_job_id": "job_123",
"campaign": "launch_week"
}
}'Success response:
{
"data": {
"id": "vid_01jz8b7q4x8k2p9w3m5c6n7r8s",
"status": "pending",
"model": "pro",
"credits_reserved": 100,
"created_at": "2026-06-29T10:00:00.000Z"
}
}Get Video Task
GET /v1/videos/generations/{id}Polling example:
const response = await fetch(
"https://api.seedancee2.ai/v1/videos/generations/vid_01jz8b7q4x8k2p9w3m5c6n7r8s",
{
headers: {
Authorization: "Bearer sk_seedancee2_live_xxxxx",
},
}
);
const result = await response.json();
console.log(result);Processing response:
{
"data": {
"id": "vid_01jz8b7q4x8k2p9w3m5c6n7r8s",
"status": "processing",
"model": "pro",
"created_at": "2026-06-29T10:00:00.000Z",
"metadata": {
"customer_job_id": "job_123",
"campaign": "launch_week"
}
}
}Completed response:
{
"data": {
"id": "vid_01jz8b7q4x8k2p9w3m5c6n7r8s",
"status": "completed",
"model": "pro",
"created_at": "2026-06-29T10:00:00.000Z",
"completed_at": "2026-06-29T10:06:20.000Z",
"credits_charged": 100,
"output": {
"video_url": "https://media.seedancee2.ai/videos/2026/06/29/vid_01jz8b7q4x8k2p9w3m5c6n7r8s.mp4",
"thumbnail_url": "https://media.seedancee2.ai/video-posters/2026/06/29/vid_01jz8b7q4x8k2p9w3m5c6n7r8s.jpg",
"last_frame_url": "https://media.seedancee2.ai/video-posters/2026/06/29/vid_01jz8b7q4x8k2p9w3m5c6n7r8s.jpg"
},
"metadata": {
"customer_job_id": "job_123",
"campaign": "launch_week"
}
}
}Failed response:
{
"data": {
"id": "vid_01jz8b7q4x8k2p9w3m5c6n7r8s",
"status": "failed",
"model": "pro",
"created_at": "2026-06-29T10:00:00.000Z",
"credits_charged": 0,
"credits_refunded": 100,
"error": {
"code": "generation_failed",
"message": "The video could not be generated. Please try again with a different prompt.",
"type": "generation_error"
},
"metadata": {
"customer_job_id": "job_123",
"campaign": "launch_week"
}
}
}List Video Tasks
GET /v1/videos/generationsSupported query parameters:
| Field | Type | Description |
|---|---|---|
status | string | Filter by pending, processing, completed, or failed |
limit | integer | Max results. Default 20, max 100 |
Example:
curl "https://api.seedancee2.ai/v1/videos/generations?status=completed&limit=10" \
-H "Authorization: Bearer sk_seedancee2_live_xxxxx"List Models
GET /v1/modelsExample response:
{
"data": [
{
"id": "pro",
"status": "active",
"resolutions": ["480p", "720p", "1080p"],
"duration": {
"min": 4,
"max": 15
}
}
]
}Usage Summary
GET /v1/usageSupported query parameters:
| Field | Type | Description |
|---|---|---|
start | string | Optional ISO 8601 start datetime filter |
end | string | Optional ISO 8601 end datetime filter |
limit | integer | Max daily timeline rows to return. Default 30, max 365 |
Example:
curl "https://api.seedancee2.ai/v1/usage?start=2026-07-01T00:00:00.000Z&end=2026-07-31T23:59:59.999Z&limit=7" \
-H "Authorization: Bearer sk_seedancee2_live_xxxxx"Example response:
{
"data": {
"range": {
"start": "2026-07-01T00:00:00.000Z",
"end": "2026-07-31T23:59:59.999Z"
},
"summary": {
"total_jobs": 12,
"pending_jobs": 1,
"processing_jobs": 2,
"completed_jobs": 8,
"failed_jobs": 1,
"credits_charged": 280,
"credits_refunded": 40,
"net_credits": 240
},
"by_model": [
{
"model": "mini",
"total_jobs": 7,
"pending_jobs": 0,
"processing_jobs": 1,
"completed_jobs": 5,
"failed_jobs": 1,
"credits_charged": 120,
"credits_refunded": 20,
"net_credits": 100
},
{
"model": "pro",
"total_jobs": 5,
"pending_jobs": 1,
"processing_jobs": 1,
"completed_jobs": 3,
"failed_jobs": 0,
"credits_charged": 160,
"credits_refunded": 20,
"net_credits": 140
}
],
"timeline": [
{
"date": "2026-07-01",
"total_jobs": 4,
"pending_jobs": 0,
"processing_jobs": 1,
"completed_jobs": 3,
"failed_jobs": 0,
"credits_charged": 100,
"credits_refunded": 0,
"net_credits": 100
}
]
}
}Webhooks
If callback_url is provided, Seedancee2 sends a POST request when the task reaches completed or failed.
Recommended headers to inspect:
X-Seedancee2-Event: video.generation.completed
X-Seedancee2-Signature: t=1770000000,v1=...If webhook signing is enabled for your account, the body is signed as:
payload_to_sign = "{timestamp}.{raw_json_body}"
signature = hex(hmac_sha256(webhook_secret, payload_to_sign))Completed webhook payload:
{
"data": {
"id": "vid_01jz8b7q4x8k2p9w3m5c6n7r8s",
"status": "completed",
"model": "pro",
"created_at": "2026-06-29T10:00:00.000Z",
"completed_at": "2026-06-29T10:06:20.000Z",
"credits_charged": 100,
"output": {
"video_url": "https://media.seedancee2.ai/videos/2026/06/29/vid_01jz8b7q4x8k2p9w3m5c6n7r8s.mp4",
"thumbnail_url": "https://media.seedancee2.ai/video-posters/2026/06/29/vid_01jz8b7q4x8k2p9w3m5c6n7r8s.jpg"
},
"metadata": {
"customer_job_id": "job_123",
"campaign": "launch_week"
}
}
}Failed webhook payload:
{
"data": {
"id": "vid_01jz8b7q4x8k2p9w3m5c6n7r8s",
"status": "failed",
"model": "pro",
"created_at": "2026-06-29T10:00:00.000Z",
"credits_charged": 0,
"credits_refunded": 100,
"error": {
"code": "generation_failed",
"message": "The video could not be generated. Please try again with a different prompt.",
"type": "generation_error"
},
"metadata": {
"customer_job_id": "job_123",
"campaign": "launch_week"
}
}
}Input Guidelines
Images:
| Requirement | Value |
|---|---|
| Formats | JPEG, PNG, WebP, BMP, TIFF, GIF |
| Count | Up to 9 reference images |
first_and_last_frames | Exactly 2 images |
Videos:
| Requirement | Value |
|---|---|
video_url | 1 |
video_urls | Up to 3 |
Audio:
| Requirement | Value |
|---|---|
audio_urls | Up to 3 |
Errors
Error format:
{
"error": {
"code": "insufficient_credits",
"message": "Your credit balance is too low. Please top up.",
"type": "billing_error"
}
}Current public error codes:
| HTTP status | Code | Type | Description |
|---|---|---|---|
| 400 | invalid_request | invalid_request_error | Missing or invalid parameters |
| 401 | invalid_api_key | authentication_error | API key is missing, invalid, or disabled |
| 402 | insufficient_credits | billing_error | Credit balance too low |
| 404 | model_not_found | invalid_request_error | Model does not exist or is inactive |
| 404 | task_not_found | invalid_request_error | Task ID does not exist |
| 500 | internal_error | api_error | Unexpected server error |
Integration Notes
- Use only public model names such as
pro,fast, andmini. - Do not build logic against internal provider names, internal task IDs, or internal media hosts.
- Store your own
metadataso you can join callbacks and polling results to internal business records. - For production use, prefer webhooks for completion and keep polling as a fallback.