---
title: "Create a looping 360-degree product video"
method: POST
path: "/v2/tool/product-360-video"
tags: ["video-generate"]
---

# Create a looping 360-degree product video

`POST /v2/tool/product-360-video`

Animates one product image through a complete turntable revolution and returns to the starting pose so the result loops cleanly.
Video generation runs asynchronously. Poll `GET /v1/generations/{generation_id}` with the returned `generation_id` until the generation completes or fails.

## Query parameters

- `dry_run` boolean

## Request body

- Product360VideoRequest
  - `image_asset_identifier` AssetIdentifier, required — An identifier for an ideogram asset.
    - `asset_type` 'ASSET' | 'CANVAS_ASSET' | 'LAYERED_ASSET' | 'RESPONSE' | 'UPLOAD', required
    - `asset_id` string, required
  - `direction` 'clockwise' | 'counter-clockwise', required — Direction the product rotates around its vertical axis.
  - `product_description` string — Optional factual description of the product in the source image.
  - `resolution` '480p' | '720p' | '1080p' — The resolution tier of the generated video.
  - `duration` integer — The length of the generated video in seconds. When omitted, the model picks the best duration for the prompt ("auto").
  - `target_collection_id` string — A collection you can write to, by its URL-safe base64 collection id. The output video is added to it when the request completes.

## Response `200`

Product video accepted for asynchronous processing.

- GenerateVideoSeedDance25Response — Acknowledgement returned by the Seedance 2.5 video generation endpoints. Video generation always runs asynchronously, so the generated video is never part of this response: poll for it with `GET /v1/generations/{generation_id}` using the returned `generation_id`, or receive it at the `webhook_url` you supplied.
  - `generation_id` string, required — URL-safe base64 ID of the accepted generation. Accepted by the `GET /v1/generations/{generation_id}` polling endpoint.
  - `created` string, date-time, required — The time the request was accepted.

## Other responses

- `400` — Invalid input provided.
- `401` — Unauthorized.
- `402` — Insufficient credits or quota.
- `403` — This account does not have access to product video generation.
- `404` — The product image was not found or is not readable.
- `422` — The product description did not pass safety checks.
- `429` — Too many requests.
- `503` — The endpoint is temporarily unavailable.

## Changes

- **2026-09-27** `987f73fc82de` — 4 info
  - added the optional property `max_inflight_requests` to the response with the `402` status
  - added the optional property `max_inflight_requests` to the response with the `429` status
  - added the optional property `task_completion_speed` to the response with the `402` status
  - added the optional property `task_completion_speed` to the response with the `429` status
- **2026-09-23** `cdaa218128ba` — 1 info
  - added the new optional `query` request parameter `dry_run`
- **2026-09-19** `4e95197be44a` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/ideogram/apis/ideogram-openapi-3-0/changes/v2/tool/product-360-video/post.md)

---

[API](https://skmtc.dev/ideogram/apis/ideogram-openapi-3-0.md) · [All operations](https://skmtc.dev/ideogram/apis/ideogram-openapi-3-0/llms.txt) · [OpenAPI document](https://skmtc.dev/ideogram/apis/ideogram-openapi-3-0/revisions/987f73fc82de?raw)
