Copy
Copy an object — or a whole prefix — from one location to another.
202 means accepted, not done — and comes in two flavors:
- Single object —
fromandtoeach name one object. The response is{id, status: "queued"}; pollGET /v1/transfers/{id}(statusesqueued,running,complete,failed). - Bulk job — both paths end in
/(a prefix copy), or amanifestlists the keys to copy. The response is{job_id, status: "planning"}; pollGET /v1/jobs/{id}for status and per-object counts (statusesplanning,running,complete,partial,failed,canceled). Failed objects are listed underGET /v1/jobs/{id}/failuresand can be re-planned withPOST /v1/jobs/{id}/retry;POST /v1/jobs/{id}/cancelstops the job.
Targets
Each side addresses a location the same way as List Objects — byname or id (a
non-unique name returns 409 with the candidates) — plus a path within it.
Two equivalent shapes are accepted:
:; a UUID before the colon
addresses by id, anything else by name. Arrays are not accepted — to copy
many objects, use a prefix or manifest bulk copy.
Paths are exact bytes
Paths are stored and executed verbatim, never normalized — providers treat object keys as exact bytes, so a “cleaned up” path would name a different object. A single-object path must bebucket/object-key: no leading or
trailing /, no :, no .. segment, and it may not start with -. A bulk
prefix is bucket/ or bucket/dir/.../ — always slash-terminated, on both
sides. Copying an object or prefix onto itself is rejected.
409 — refresh it
via POST /v1/locations/refresh and retry. Copy accepts are limited to
30 per account per minute; the body is capped at 8 MiB (sized for
manifests of up to 100,000 keys).Examples
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Source target: location (name or id) plus path. A trailing / on the path makes this a bulk prefix copy (then to must be a prefix as well).
"prod-backups:archives/2026-04-21/data.bin"
Destination target: location (name or id) plus path.
"prod-backups:archives/2026-04-21/data.bin"
Bulk only: an explicit list of object keys to copy, each relative to the from prefix (both paths must be slash-terminated prefixes). At most 100,000 keys; each key at most 4096 bytes, with no leading or trailing / and no ... The whole body is capped at 8 MiB.
100000Bulk only (a 400 on single-object copies): always replaces existing destination objects; if-missing skips objects that already exist at the destination.
always, if-missing Response
Copy accepted. Single-object copies return a transfer ({id, status: "queued"} — poll GET /v1/transfers/{id}); bulk copies return a job ({job_id, status: "planning"} — poll GET /v1/jobs/{id}).
- Transfer accepted (single object)
- Job accepted (bulk)
A single-object copy was accepted. Poll GET /v1/transfers/{id} for progress.

