---
title: "Move several files into a folder in one request"
method: POST
path: "/api/assets/bulk-move"
tags: ["Assets - Admin"]
---

# Move several files into a folder in one request

`POST /api/assets/bulk-move`

Move many files into one destination folder. Body:
`{"sources": ["<rel path>", ...], "destination": "<rel folder>"}`
(both relative to `assets/`; an empty destination means the `assets/` root).

⚠️ Unlike `POST /assets/move`, this route **never overwrites**: the
destination is probed with `head_object` first and a collision is reported,
not silently clobbered. `copy_object` has no if-none-match, so this is a
check-then-act — the window is small but real; two tabs moving the same
filename concurrently can still lose one. It is strictly safer than the
unconditional copy, not a lock.

Returns `{"moved": n, "results": [{"source", "status", "erro"?}, ...]}` with
`status` in `moved` | `collision` | `source_missing` | `same_location` |
`invalid` | `error`.

## Headers

- `x-website-token` string, nullable
- `x-api-token` string, nullable

## Request body

- object

## Response `200`

Successful Response

- object

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/multigest/apis/multigest-protected-api.md) · [All operations](https://skmtc.dev/multigest/apis/multigest-protected-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/multigest/multigest-protected-api/revisions/4b44eb76b3ee/schema)
