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

# Update Media Order

> Bulk reorder product media items.

## Method

`PATCH` `/v1/products/:id/media/order`

## Path Parameters

<ParamField path="id" type="uuid" required>Product ID.</ParamField>

## Body Parameters

<ParamField name="items" type="array" required>
  Array of objects. Each entry must include either `mediaId` (existing media record) or `assetId` (gallery asset reference) and the desired integer `sort` value.
</ParamField>

### Item shape

<ParamField name="mediaId" type="string">Media ID to reorder.</ParamField>
<ParamField name="assetId" type="string">Gallery asset ID to reorder (used before mediaId is known).</ParamField>
<ParamField name="sort" type="integer" required>Target sort position (0-based).</ParamField>

## Headers

<ParamField header="Authorization" type="string">Bearer token (requires `products:write`).</ParamField>
<ParamField header="content-type" type="string">`application/json`</ParamField>

## Request Example

<RequestExample>
  ```bash cURL theme={null}
  curl -X PATCH "https://api.voyantcloud.com/v1/products/prod_123/media/order" \
    -H "Authorization: Bearer $VOYANT_API_KEY" \
    -H "content-type: application/json" \
    -d '{
      "items": [
        { "mediaId": "media_01J0E6V4ZBAVQ9PQJRT2P27QX0", "sort": 0 },
        { "mediaId": "media_01J0E6V4ZBAVQ9PQJRTR6K9HQC", "sort": 1 }
      ]
    }'
  ```

  ```javascript Node.js theme={null}
  await fetch("https://api.voyantcloud.com/v1/products/prod_123/media/order", {
    method: "PATCH",
    headers: {
      Authorization: `Bearer ${process.env.VOYANT_API_KEY}`,
      "content-type": "application/json",
    },
    body: JSON.stringify({
      items: [
        { mediaId: "media_01J0E6V4ZBAVQ9PQJRT2P27QX0", sort: 1 },
        { mediaId: "media_01J0E6V4ZBAVQ9PQJRTR6K9HQC", sort: 0 }
      ],
    }),
  })
  ```

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

  payload = {
    "items": [
      {"assetId": "asset_01HZY8SM9P8K4B8N7Q", "sort": 0},
      {"mediaId": "media_01J0E6V4ZBAVQ9PQJRTR6K9HQC", "sort": 1}
    ]
  }

  resp = requests.patch(
    "https://api.voyantcloud.com/v1/products/prod_123/media/order",
    headers={
      "Authorization": f"Bearer {os.environ['VOYANT_API_KEY']}",
      "content-type": "application/json",
    },
    json=payload,
  )
  result = resp.json()
  ```
</RequestExample>

## Response Example

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "data": {
      "updated": 2,
      "attempted": 2,
      "details": [
        {
          "mediaId": "media_01J0E6V4ZBAVQ9PQJRTR6K9HQC",
          "previousSort": 1,
          "newSort": 0
        }
      ]
    }
  }
  ```

  ```json 400 Bad Request theme={null}
  {
    "error": "items array is required and cannot be empty"
  }
  ```
</ResponseExample>

<Tip>
  `mediaOrderUpdateSchema` requires at least one item; mixed `mediaId` and `assetId` entries are allowed to support pre-save ordering flows.
</Tip>
