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

# Animate an image

> Turn a completed image into a video clip.

Use a completed image as the first frame and describe motion in `prompt`. The defaults are `model: "kling-2.5"` and a five-second duration.

Kling 3 models support clips of 3–15 seconds, saved-asset subjects, audio, and multi-shot options. With `multi_prompt`, omit the top-level `prompt` and `duration`; shot durations must total at most 15 seconds. Optional start and end frames must meet the [video input requirements](/api-reference/models). The result has `type: "video"` and cannot be passed to an image-only operation.

A successful request returns HTTP `202` with a `jobs` array. Save each `id`, then [get the job](/api-reference/jobs/get) until it finishes. Read the completed media from `result.url` and its reusable ID from `result.id`. Use an [Idempotency-Key](/api-reference/errors) when submitting work that may be retried.


## OpenAPI

````yaml api-reference/openapi.json POST /v1/images/{id}/video
openapi: 3.0.3
info:
  title: bitStudio public API
  version: 1.0.0
  description: >-
    Public v1 operations. Create work with a focused endpoint, then retrieve its
    job. Media IDs are opaque; API clients do not manage Studio versions. New
    response fields may be added; clients should ignore fields they do not
    recognize.
servers:
  - url: https://api.bitstudio.ai
    description: Production
security:
  - bearerAuth: []
paths:
  /v1/images/{id}/video:
    post:
      summary: Animate an image
      operationId: image-to-video
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Source resource ID.
        - name: Idempotency-Key
          in: header
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 128
            pattern: ^[!-~]+$
          description: >-
            Use a unique key for each intended creation. Retry the same method,
            path and JSON with the same key to replay its response for 24 hours
            after completion. Conflicting requests and unfinished or uncertain
            outcomes return 409. An uncertain receipt is never automatically
            rerun.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicImageToVideoRequest'
            example:
              prompt: The model turns gently
      responses:
        '202':
          description: Accepted; poll each job.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Submission'
              example:
                jobs:
                  - id: 11111111-1111-4111-8111-111111111111
                    status: pending
                    task: image-to-video
                    created_at: '2026-09-15T12:00:00Z'
                    result: null
                    error: null
                    credits_used: 15
        default:
          description: Request failed; inspect code and message.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    PublicImageToVideoRequest:
      type: object
      additionalProperties: false
      properties:
        prompt:
          type: string
          description: Scene and motion direction. Omit when using multi_prompt.
        model:
          type: string
          description: >-
            Video model. Defaults to kling-2.5 when omitted. All successful
            submissions return jobs.
          enum:
            - kling-2.5
            - kling-v3-pro
            - kling-v3-standard
        multi_prompt:
          type: array
          items:
            type: object
            properties:
              prompt:
                type: string
                description: Directions for this shot.
                minLength: 1
              duration:
                type: integer
                description: Shot length in seconds.
                minimum: 3
                maximum: 15
            required:
              - prompt
              - duration
            additionalProperties: false
          description: >-
            Kling 3 shots. Omit prompt and duration when using this array. Each
            shot requires 3–15 seconds; their total must not exceed 15 seconds.
            End frames require a single shot.
          minItems: 1
          maxItems: 5
        elements:
          type: array
          items:
            type: object
            additionalProperties: false
            properties:
              asset_id:
                type: string
                format: uuid
            required:
              - asset_id
          description: >-
            Kling 3 subject references. Each asset must be an accessible model
            or outfit with an HTTP(S) display_image. Model assets are ordered
            before outfit assets in provider element numbering.
        generate_audio:
          type: boolean
          description: Generate audio with Kling 3. Must be false or omitted for kling-2.5.
          default: false
        duration:
          type: integer
          description: >-
            Single-shot length in seconds: 5 for kling-2.5; 3–15 for Kling 3.
            Omit when using multi_prompt.
          example: 5
          default: 5
          minimum: 3
          maximum: 15
        aspect_ratio:
          type: string
          description: Video output ratio.
          enum:
            - '16:9'
            - '9:16'
            - '1:1'
        avatar_text:
          type: string
          description: Additional subject directions for Kling 3 only.
        outfit_text:
          type: string
          description: Additional subject directions for Kling 3 only.
        last_frame_id:
          type: string
          description: >-
            Optional end frame. Its dimensions must match the start frame.
            Mutually exclusive with last_frame_url.
          format: uuid
        last_frame_url:
          type: string
          description: Direct end-frame URL. The same media constraints apply.
          format: uri
      allOf:
        - not:
            required:
              - multi_prompt
              - duration
        - not:
            required:
              - multi_prompt
              - prompt
        - not:
            required:
              - last_frame_id
              - last_frame_url
        - oneOf:
            - properties:
                model:
                  enum:
                    - kling-2.5
                  default: kling-2.5
                  example: kling-2.5
                duration:
                  enum:
                    - 5
                generate_audio:
                  enum:
                    - false
              not:
                anyOf:
                  - required:
                      - multi_prompt
                  - required:
                      - elements
                  - required:
                      - avatar_text
                  - required:
                      - outfit_text
              title: Kling 2.5 (default)
            - required:
                - model
              properties:
                model:
                  enum:
                    - kling-v3-pro
                    - kling-v3-standard
                  example: kling-v3-standard
              title: Kling 3
    Submission:
      type: object
      required:
        - jobs
      properties:
        jobs:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/Job'
    Error:
      type: object
      required:
        - code
        - message
        - request_id
      properties:
        code:
          type: string
        message:
          type: string
        request_id:
          type: string
          format: uuid
        error:
          type: string
          description: Compatibility error description.
        cta:
          type: boolean
          description: Account action is required.
        next_action:
          type: string
    Job:
      type: object
      required:
        - id
        - status
        - task
        - created_at
        - result
        - error
        - credits_used
      properties:
        id:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - pending
            - generating
            - completed
            - failed
            - policy_blocked
        task:
          type: string
          nullable: true
          description: >-
            Processing task. This may be more specific than the submitted
            operation.
        created_at:
          type: string
          format: date-time
        result:
          $ref: '#/components/schemas/JobResult'
        error:
          $ref: '#/components/schemas/JobError'
        credits_used:
          type: number
          minimum: 0
          description: >-
            Credits currently charged for this output, in display credits: 1
            means one Studio credit. Fractional amounts are preserved. A
            completed refund is reflected as 0 when polling. Creation and
            idempotency replay responses are snapshots; poll for the latest
            charge.
          example: 1.5
    JobResult:
      type: object
      nullable: true
      required:
        - image_id
        - url
        - width
        - height
        - id
        - type
      properties:
        image_id:
          type: string
          format: uuid
          description: Compatibility alias for id. Use id for new integrations.
        url:
          type: string
          format: uri
          description: Completed media URL.
        width:
          type: integer
          nullable: true
        height:
          type: integer
          nullable: true
        id:
          type: string
          format: uuid
          description: >-
            Opaque media ID. Pass an image result ID into the next image
            operation.
        type:
          type: string
          enum:
            - image
            - video
    JobError:
      type: object
      nullable: true
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: >-
            Safe failure classification. Handle unknown or new values with a
            general failure message.
        message:
          type: string
          description: Safe, readable failure description.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Create an API key in Studio → account menu → API Keys. Keep it on your
        server.

````