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 bash
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"
  }'
JavaScript javascript
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",
  }),
});
Python python
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

JSON json
{
  "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.