Start a server-side copy or sync between two S3 storage connections
const url = 'https://gateway.example.com/api/storage/copy-jobs';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"sourceStorageId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","destinationStorageId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","buckets":"all","mode":"copy","dryRun":false,"createBuckets":true,"allowLiveDestination":true,"executorNodeId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","limits":{"timeoutSeconds":1,"cpuCores":1,"memoryMb":1,"transfers":1}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://gateway.example.com/api/storage/copy-jobs \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "sourceStorageId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "destinationStorageId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "buckets": "all", "mode": "copy", "dryRun": false, "createBuckets": true, "allowLiveDestination": true, "executorNodeId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "limits": { "timeoutSeconds": 1, "cpuCores": 1, "memoryMb": 1, "transfers": 1 } }'Copies objects from the source to the destination S3 connection (managed or external) on a Storage node, then runs a check and reports object counts, bytes and missing or differing keys. Both connections must be S3: an SFTP or FTP(S) connection is refused with 400 STORAGE_COPY_PROVIDER_UNSUPPORTED. buckets is “all” or a list of names (kept on the destination). mode “sync” also deletes destination objects the source does not have. dryRun only compares. Reruns copy only what changed; swap source and destination to roll back. Credentials are never returned.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”JSON request body
object
object
Responses
Section titled “Responses”Created
object
Resource object. Exact fields depend on the endpoint.
object
Example
{ "data": { "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Example resource", "createdAt": "2024-01-01T12:00:00.000Z", "updatedAt": "2024-01-01T12:30:00.000Z" }}Bad request
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "VALIDATION_ERROR", "message": "Request validation failed", "details": [ { "path": [ "name" ], "message": "Required" } ]}Authentication required
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "UNAUTHORIZED", "message": "Authentication required"}Forbidden
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "FORBIDDEN", "message": "Insufficient permissions"}Not found
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "NOT_FOUND", "message": "Resource not found"}Conflict
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "CONFLICT", "message": "Resource already exists"}Unprocessable entity
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "UNPROCESSABLE_ENTITY", "message": "Request could not be processed"}Internal server error
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "INTERNAL_ERROR", "message": "Internal server error"}