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

# Product shoots

> Generate studio-quality product photography — with or without an AI model.

A **shoot** turns one or more product images into a set of professional photos in the
style you choose. Create it, then poll until it's `completed`.

## Create a shoot

`POST /v1/shoots`

<ParamField body="product_image_urls" type="string[]" required>
  1–8 public http(s) URLs of your product image(s). The first is treated as the hero.
</ParamField>

<ParamField body="style" type="string" required>
  One of: `classic`, `minimal`, `luxury`, `loud_luxury`, `magazine`, `editorial`,
  `avant_garde`, `element`, `influencer`, `lifestyle`.
</ParamField>

<ParamField body="mode" type="string" default="product_only">
  `product_only` for the product alone, or `with_model` to place it on an AI model.
</ParamField>

<ParamField body="model_url" type="string">
  Required when `mode` is `with_model`. A public image URL of the model (browse presets
  via [`GET /v1/models`](/api-reference)).
</ParamField>

<ParamField body="shots" type="integer" default="4">
  `1`, `4`, or `6`. `6` is available only for `classic` and `minimal`; for other styles it
  is clamped to `4` and the response includes `shots_adjusted: true`.
</ParamField>

<ParamField body="quality" type="string" default="standard">
  `standard` (1 credit/image), `pro` (2, 2K), or `4k` (4, 4K).
</ParamField>

<ParamField body="aspect_ratio" type="string" default="1:1">
  e.g. `1:1`, `4:5`, `9:16`, `16:9`.
</ParamField>

<ParamField body="background_color" type="string">
  Optional background hint (supported for studio styles).
</ParamField>

<ParamField body="callback_url" type="string">
  Optional. Reserved for push delivery; poll in the meantime.
</ParamField>

Credits are **reserved when you create the shoot** (`credits_used` in the response), so a
create call that returns `201` has already secured the credits.

## Poll a shoot

`GET /v1/shoots/{id}`

`status` moves through `pending` → `analyzing` → `generating` → `completed` (or `failed`).
When `completed`, `images` holds the results:

```json theme={null}
{
  "id": "b3f1c2a4-...",
  "object": "shoot",
  "status": "completed",
  "images": [
    { "url": "https://.../shot-1.png", "thumbnail_url": "https://.../thumb-1.png", "status": "fulfilled" }
  ],
  "credits_used": 4,
  "created_at": "2026-07-01T10:00:00Z"
}
```

<Tip>
  Poll every 3–5 seconds. A full set typically completes in well under a minute.
</Tip>
