> ## Documentation Index
> Fetch the complete documentation index at: https://docs.crun.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Seedance Asset Upload API

> Upload custom image, video, and audio assets for Seedance workflows

## Overview

Use this endpoint when your Seedance workflow needs a reviewed asset ID instead of a direct public URL.

Typical cases:

* Real-person photos
* Realistic AI characters or avatars
* Any material that needs to enter the asset review process before generation

<Tip>
  Only assets whose `Status` is `Active` can be used in Seedance generation requests.
</Tip>

## When Upload Is Required

| Asset type               | Typical content                                                         | How to use                                                    |
| ------------------------ | ----------------------------------------------------------------------- | ------------------------------------------------------------- |
| Normal image             | Landscapes, products, buildings, animals, cartoons, pure scene material | Use the public URL directly in the video generation request   |
| Human face image         | Photos containing a real person                                         | Upload first, wait for review, then use the approved asset ID |
| Realistic humanoid image | AI characters, virtual idols, digital humans, realistic avatars         | Upload first, wait for review, then use the approved asset ID |

## Flow

1. Prepare a publicly accessible resource URL.
2. Call [Seedance Asset Upload API](/models/seedance/asset-upload) with `name`, `asset_type`, and `asset_url`.
3. For real-person assets, first complete [Seedance Real-Person Asset Validation API](/models/seedance/visual-validate), then pass the returned `GroupId` as `group_id`.
4. If the upload succeeds, the API returns an `asset_id`.
5. Asset requires review, wait until the review is approved before using it in generation. Call [Seedance Asset Info API](/models/seedance/asset-info) and keep polling until `Status` becomes `Active`.
6. Use the approved asset identifier in Seedance video generation requests, typically in the form `asset://xxx`.

## Request Example

```json theme={null}
{
  "name": "fashion-model-front",
  "asset_type": "Image",
  "asset_url": "https://example.com/assets/fashion-model-front.jpg",
  "group_id": "group-20260331145705-*****"
}
```

For non-real-person assets, omit `group_id`. For real-person assets, `group_id` must be the `GroupId` returned by the validation result endpoint.

## Response Example

```json theme={null}
{
  "code": 200,
  "message": "success",
  "data": {
    "AssetId": "asset-20260420153000-ab12c"
  }
}
```

## Use Uploaded Assets In Seedance

After approval, pass the asset ID into the Seedance video generation endpoint:

* `img_urls`
* `last_frame_image`
* `reference_images`
* `reference_videos`
* `reference_audios`

## Related Resources

<CardGroup cols={2}>
  <Card title="Asset Info" icon="magnifying-glass" href="/models/seedance/asset-info">
    Query upload status and wait for the asset to become active
  </Card>

  <Card title="Real-Person Validation" icon="shield-check" href="/models/seedance/visual-validate">
    Get the Asset Group ID required for real-person asset uploads
  </Card>

  <Card title="Seedance 2.0 Image to Video" icon="video" href="/models/seedance/2-0/image-to-video">
    Use uploaded image assets in image-to-video requests
  </Card>

  <Card title="Seedance 2.0 Reference to Video" icon="video" href="/models/seedance/2-0/reference-to-video">
    Use uploaded image, video, and audio assets in reference-to-video requests
  </Card>
</CardGroup>


## OpenAPI

````yaml models/seedance/asset-upload.json post /api/v1/client/job/asset-upload
openapi: 3.0.0
info:
  title: Seedance Asset Upload API
  description: >-
    API documentation for uploading custom image, video, and audio assets used
    by Seedance workflows
  version: 1.0.0
  contact:
    name: Technical Support
    email: support@crun.ai
servers:
  - url: https://api.crun.ai
    description: API Server
security:
  - ApiKeyAuth: []
paths:
  /api/v1/client/job/asset-upload:
    post:
      summary: Upload a custom asset for Seedance
      description: Upload custom image, video, or audio assets for Seedance workflows.
      operationId: seedance/asset-upload
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - asset_type
                - asset_url
              properties:
                name:
                  type: string
                  description: Display name of the asset.
                  minLength: 1
                  maxLength: 64
                  example: fashion-model-front
                asset_type:
                  type: string
                  description: Type of asset being uploaded.
                  enum:
                    - Image
                    - Video
                    - Audio
                  example: Image
                asset_url:
                  type: string
                  format: uri
                  description: >-
                    Publicly accessible asset URL. Image, video, and audio
                    uploads only support URL input; Base64 is not supported.


                    ## Input Requirements


                    ### General Rules

                    - When passing image, video, or audio materials, **only URLs
                    are supported**.

                    - **Base64 encoding is NOT supported**.


                    ---


                    ## Image Requirements


                    - **Formats**: jpeg, png, webp, bmp, tiff, gif, heic, heif  

                    - **Aspect Ratio (width / height)**: (0.4, 2.5)  

                    - **Dimensions (px)**: (300, 6000)  

                    - **File Size**: less than 30 MB per image  


                    ---


                    ## Video Requirements


                    - **Formats**: mp4, mov  

                    - **Resolution**: 480p, 720p  

                    - **Duration**: [2, 15] seconds  

                    - **Dimensions**:
                      - Aspect Ratio (width / height): [0.4, 2.5]  
                      - Width/Height (px): [300, 6000]  
                      - Total Pixels: width × height ∈ [409600, 927408]  
                    - **File Size**: ≤ 50 MB per video  

                    - **Frame Rate (FPS)**: [24, 60]  


                    ---


                    ## Audio Requirements


                    - **Formats**: wav, mp3  

                    - **Duration**: [2, 15] seconds  

                    - **File Size**: ≤ 15 MB per audio  
                  example: https://example.com/assets/fashion-model-front.jpg
                group_id:
                  type: string
                  nullable: true
                  description: >-
                    Optional Asset Group ID for real-person asset uploads. Get
                    this value from [Seedance Real-Person Asset Validation
                    API](/models/seedance/visual-validate) and pass it only when
                    uploading assets that should be bound to that validated real
                    person.
                  example: group-20260331145705-*****
            example:
              name: fashion-model-front
              asset_type: Image
              asset_url: https://example.com/assets/fashion-model-front.jpg
              group_id: group-20260331145705-*****
      responses:
        '200':
          description: Upload request accepted
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiResponse'
                  - type: object
                    properties:
                      data:
                        type: object
                        properties:
                          AssetId:
                            type: string
                            description: >-
                              Returned asset identifier. Query its status with
                              [Seedance Asset Info
                              API](/models/seedance/asset-info) and use it only
                              after `Status` becomes `Active`.
                            example: asset-20260420153000-ab12c
              example:
                code: 200
                message: success
                data:
                  AssetId: asset-20260420153000-ab12c
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiResponse'
                  - type: object
                    properties:
                      errors:
                        type: array
                        description: Detailed validation error messages
                        items:
                          type: string
                        example:
                          - Value error, asset upload failed
              example:
                code: 422
                message: Asset upload failed. Please try other resources.
        '500':
          $ref: '#/components/responses/Error'
components:
  schemas:
    ApiResponse:
      type: object
      properties:
        code:
          type: integer
          enum:
            - 200
            - 401
            - 402
            - 404
            - 422
            - 429
            - 455
            - 500
            - 501
            - 505
          description: >-
            Response status code


            - **200**: Success - Request has been processed successfully

            - **401**: Unauthorized - Authentication credentials are missing or
            invalid

            - **402**: Insufficient Credits - Account does not have enough
            credits to perform the operation

            - **404**: Not Found - The requested resource or endpoint does not
            exist

            - **422**: Validation Error - The request parameters failed
            validation checks

            - **429**: Rate Limited - Request limit has been exceeded for this
            resource

            - **455**: Service Unavailable - System is currently undergoing
            maintenance

            - **500**: Server Error - An unexpected error occurred while
            processing the request

            - **501**: Generation Failed - Content generation task failed

            - **505**: Feature Disabled - The requested feature is currently
            disabled
        message:
          type: string
          description: Response message, error description when failed
          example: success
  responses:
    Error:
      description: Server Error
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        All APIs require authentication via API Key.


        Get API Key:

        1. Visit [API Key Management Page](https://crun.ai/user-api-key) to get
        your API Key


        Usage:

        Add to request header:


        x-api-key: YOUR_API_KEY


        Note:

        - Keep your API Key secure and do not share it with others

        - If you suspect your API Key has been compromised, reset it immediately
        in the management page

````