Skip to content

Start a server-side copy or sync between two S3 storage connections

POST
/api/storage/copy-jobs
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.

JSON request body

Media typeapplication/json
object
sourceStorageId
required
string format: uuid
destinationStorageId
required
string format: uuid
buckets
required
Any of:
string
Allowed values: all
mode
string
default: copy
Allowed values: copy sync
dryRun
boolean
createBuckets
boolean
allowLiveDestination
boolean
executorNodeId
string format: uuid
limits
object
timeoutSeconds
integer
>= 60 <= 604800
cpuCores
integer
>= 1 <= 16
memoryMb
integer
>= 256 <= 65536
transfers
integer
>= 1 <= 32

Created

Media typeapplication/json
object
data
required

Resource object. Exact fields depend on the endpoint.

object
id
string
name
string
key
additional properties
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

Media typeapplication/json
object
code
required

Error code

string
message
required

Human-readable error message

string
details

Additional error details

Example
{
"code": "VALIDATION_ERROR",
"message": "Request validation failed",
"details": [
{
"path": [
"name"
],
"message": "Required"
}
]
}

Authentication required

Media typeapplication/json
object
code
required

Error code

string
message
required

Human-readable error message

string
details

Additional error details

Example
{
"code": "UNAUTHORIZED",
"message": "Authentication required"
}

Forbidden

Media typeapplication/json
object
code
required

Error code

string
message
required

Human-readable error message

string
details

Additional error details

Example
{
"code": "FORBIDDEN",
"message": "Insufficient permissions"
}

Not found

Media typeapplication/json
object
code
required

Error code

string
message
required

Human-readable error message

string
details

Additional error details

Example
{
"code": "NOT_FOUND",
"message": "Resource not found"
}

Conflict

Media typeapplication/json
object
code
required

Error code

string
message
required

Human-readable error message

string
details

Additional error details

Example
{
"code": "CONFLICT",
"message": "Resource already exists"
}

Unprocessable entity

Media typeapplication/json
object
code
required

Error code

string
message
required

Human-readable error message

string
details

Additional error details

Example
{
"code": "UNPROCESSABLE_ENTITY",
"message": "Request could not be processed"
}

Internal server error

Media typeapplication/json
object
code
required

Error code

string
message
required

Human-readable error message

string
details

Additional error details

Example
{
"code": "INTERNAL_ERROR",
"message": "Internal server error"
}