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

# Cherry Shot API Quickstart: Your First Shoot in Minutes

> Go from a raw product photo to studio-quality images and video ads using the Cherry Shot REST API — no design tools or studio required.

The Cherry Shot API transforms ordinary product photos into polished, studio-quality images and video ads. It follows a simple async job model: you create a shoot, poll until it's ready, then download your results. This guide walks you through the entire flow — from grabbing your API key to retrieving finished images — in just a few minutes.

<Steps>
  <Step title="Get an API key">
    Open the [Cherry Shot dashboard](https://cherryshot.io), navigate to **Profile → API**, and create a new key. Copy it immediately — the full key (beginning with `cs_`) is shown **only once**. Store it in a secure location such as an environment variable or secrets manager.

    See the [Authentication](/authentication) guide for full details on key management and rotation.
  </Step>

  <Step title="Check your credits">
    Before creating a shoot, verify your available credits with a quick `GET /v1/credits` request.

    <CodeGroup>
      ```bash cURL theme={null}
      curl https://kyliwpyuseadbwawnsyd.supabase.co/functions/v1/api/v1/credits \
        -H "Authorization: Bearer cs_your_key"
      ```

      ```python Python theme={null}
      import requests

      BASE = "https://kyliwpyuseadbwawnsyd.supabase.co/functions/v1/api"
      headers = {"Authorization": "Bearer cs_your_key"}

      response = requests.get(f"{BASE}/v1/credits", headers=headers)
      print(response.json())
      ```

      ```javascript Node theme={null}
      const BASE = "https://kyliwpyuseadbwawnsyd.supabase.co/functions/v1/api";
      const headers = { Authorization: "Bearer cs_your_key" };

      const res = await fetch(`${BASE}/v1/credits`, { headers });
      console.log(await res.json());
      ```
    </CodeGroup>

    ```json Response theme={null}
    { "credits": 250 }
    ```

    Each shot costs 1 credit (standard quality), 2 credits (pro / 2K), or 4 credits (4K). If your balance is low, top up from the dashboard before continuing.
  </Step>

  <Step title="Create a shoot">
    Submit one or more public product image URLs along with a style and the number of shots you want. The API returns a shoot object immediately with a `pending` status — processing happens asynchronously.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST https://kyliwpyuseadbwawnsyd.supabase.co/functions/v1/api/v1/shoots \
        -H "Authorization: Bearer cs_your_key" \
        -H "Content-Type: application/json" \
        -d '{
          "product_image_urls": ["https://example.com/my-product.jpg"],
          "style": "editorial",
          "shots": 4
        }'
      ```

      ```python Python theme={null}
      import requests

      BASE = "https://kyliwpyuseadbwawnsyd.supabase.co/functions/v1/api"
      headers = {"Authorization": "Bearer cs_your_key"}

      payload = {
          "product_image_urls": ["https://example.com/my-product.jpg"],
          "style": "editorial",
          "shots": 4,
      }

      shoot = requests.post(f"{BASE}/v1/shoots", headers=headers, json=payload).json()
      print(shoot["id"])
      ```

      ```javascript Node theme={null}
      const BASE = "https://kyliwpyuseadbwawnsyd.supabase.co/functions/v1/api";
      const headers = { Authorization: "Bearer cs_your_key" };

      const payload = {
        product_image_urls: ["https://example.com/my-product.jpg"],
        style: "editorial",
        shots: 4,
      };

      const shoot = await (
        await fetch(`${BASE}/v1/shoots`, {
          method: "POST",
          headers: { ...headers, "Content-Type": "application/json" },
          body: JSON.stringify(payload),
        })
      ).json();

      console.log(shoot.id);
      ```
    </CodeGroup>

    ```json Response theme={null}
    {
      "id": "b3f1c2a4-...",
      "object": "shoot",
      "status": "pending",
      "shots": 4,
      "credits_used": 4,
      "credits_remaining": 246,
      "created_at": "2026-07-01T10:00:00Z"
    }
    ```

    Save the `id` field — you'll need it to poll for results in the next step.
  </Step>

  <Step title="Poll until the shoot is complete">
    Cherry Shot processes shoots asynchronously. Poll `GET /v1/shoots/{id}` every few seconds until the `status` field changes to `completed` (or `failed`).

    <CodeGroup>
      ```bash cURL theme={null}
      curl https://kyliwpyuseadbwawnsyd.supabase.co/functions/v1/api/v1/shoots/b3f1c2a4-... \
        -H "Authorization: Bearer cs_your_key"
      ```

      ```python Python theme={null}
      import requests
      import time

      BASE = "https://kyliwpyuseadbwawnsyd.supabase.co/functions/v1/api"
      headers = {"Authorization": "Bearer cs_your_key"}

      shoot_id = shoot["id"]  # from the previous step

      while True:
          result = requests.get(f"{BASE}/v1/shoots/{shoot_id}", headers=headers).json()
          if result["status"] in ("completed", "failed"):
              break
          time.sleep(4)

      for img in result["images"]:
          print(img["url"])
      ```
    </CodeGroup>

    ```json Response (completed) 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"
    }
    ```

    Each entry in `images` contains a full-resolution `url` and a `thumbnail_url` for previews. Download or pass these URLs directly into your application.
  </Step>

  <Step title="Turn your shoot into a video (optional)">
    Once you have completed shoot images, you can generate a video ad from them. Pass the image URLs to `POST /v1/videos` to kick off a video generation job that follows the same async create-and-poll pattern.

    See the [Videos guide](/guides/videos) for the full request schema, available styles, and duration options.
  </Step>
</Steps>

<Tip>
  Prefer chatting to writing code? Add the [Cherry Shot MCP server](/guides/mcp) to Claude Desktop and simply say "generate an editorial shoot for this product" — then follow up with "make a 10-second ad from it." The MCP server handles all API calls on your behalf.
</Tip>
