Docs · v1
Shopable
Async product image and video generation optimized for Shopify. List packs for allowed formats, then generate and poll by id.
GET/shopable/packs
Returns categories, allowed formats, and defaults for generate calls.
Parameters
No query parameters. Authenticate with X-Api-Key.
POST/shopable/images
Parameters
| Name | Required | Description |
|---|---|---|
category |
Yes | Pack category from list packs |
format |
Yes | Allowed format for that category |
image_url |
Yes | Source product image |
context |
No | Creative direction |
aspect_ratio |
No | For example 9:16 |
curl -X POST "https://app.makeugc.ai/api/platform/shopable/images" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"category": "general",
"format": "kinetic_start_frame",
"context": "premium clean tone, product hero",
"image_url": "https://cdn.example.com/product.png",
"aspect_ratio": "9:16"
}'
const response = await fetch("https://app.makeugc.ai/api/platform/shopable/images", {
method: "POST",
headers: {
"X-Api-Key": process.env.MAKEUGC_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
category: "general",
format: "kinetic_start_frame",
context: "premium clean tone, product hero",
image_url: "https://cdn.example.com/product.png",
aspect_ratio: "9:16",
}),
});
import os
import requests
response = requests.post(
"https://app.makeugc.ai/api/platform/shopable/images",
headers={"X-Api-Key": os.environ["MAKEUGC_API_KEY"]},
json={
"category": "general",
"format": "kinetic_start_frame",
"context": "premium clean tone, product hero",
"image_url": "https://cdn.example.com/product.png",
"aspect_ratio": "9:16",
},
)
Poll
GET /shopable/images/status?id={id}
POST/shopable/videos
Parameters
Same pack fields as images, with image_urls (array) and duration
instead of a single image_url.
Request body
{
"category": "general",
"format": "kinetic_packshot",
"context": "premium product motion, clean CTA",
"image_urls": ["https://cdn.example.com/product.png"],
"duration": "7",
"aspect_ratio": "9:16"
}
Poll
GET /shopable/videos/status?id={id}
Questions
How do shopable status payloads look?
Image and video status routes use the same normalized shape as Product-in-Hand: processing, completed, or failed, with url when completed.
Where do category and format values come from?
Call GET /shopable/packs first. It returns categories, allowed formats, and defaults to send on generate.
