---
title: "Copy every bucket of another managed S3 service into this one"
method: POST
path: "/external-services/{id}/migrate-s3"
tags: ["External Services"]
---

# Copy every bucket of another managed S3 service into this one

`POST /external-services/{id}/migrate-s3`

## Request

- Base URL: `/api` (relative, and the document was published on a file host, not at the API’s origin)
- URL: `/api/external-services/{id}/migrate-s3`
- Auth: HTTP bearer

Plain S3 semantics, so data moves between any two backends (RustFS to
Garage and back). The source is only read and existing target objects are
kept. Re-run it after switching writers to pick up late writes.

## Path parameters

- `id` integer, required

## Request body

- MigrateS3ServiceRequest: Copy every bucket of another managed S3 service into this one.
  - `source_service_id` integer, required: Managed S3 service to copy from (RustFS or Garage). It is only read.

## Response `200`

Buckets copied

- S3MigrationReport: Outcome of copying one managed S3 service's buckets into another.
  - `buckets` string[], required: Buckets that were copied, by their name on the source.
  - `source_backend` string, required
  - `source_service_id` integer, required
  - `target_backend` string, required
  - `target_service_id` integer, required

## Other responses

- `400`: Either service is not a migratable managed S3 service
- `401`: Unauthorized
- `403`: Insufficient permissions
- `404`: Service not found
- `500`: Internal server error

## Changes

> 81 revisions in range; 1 not diffed.

- **2026-10-16** `76eee115265f`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/gotempsh/apis/temps/changes/external-services/:id/migrate-s3/post.md)

---

[API](https://skmtc.dev/gotempsh/apis/temps.md) · [All operations](https://skmtc.dev/gotempsh/apis/temps/llms.txt) · [OpenAPI document](https://skmtc.dev/gotempsh/apis/temps/revisions/ab6d5d19e930?raw)
