# Copy files (object store)

Copy files between two object-store connections, one receipt record per object.

## When to use it

Copy selected objects between stored connections and inspect each receipt. Confirm the destination prefix and collision policy before running. Copying a file is different from importing a snapshot into an app’s managed document list.

## Add and configure

1. Add **Copy files (object store)** from the workflow step picker.
2. Give the step a recognisable name and connect its required inputs.
3. Set the options below. Nested names identify fields within an object or a list item.
4. Validate the recipe, inspect the test result, then run it on the intended data.

The step identifier used in the editor’s code view is `object_copy`.

## Settings

| Setting | Accepted value | Required | Default | What it controls |
| --- | --- | --- | --- | --- |
| Endpoint (`destination`) | object | Yes | Not specified | Destination object-store connection. |
| Catalog Slug (`destination.catalog_slug`) | string or null | No | null | Catalog slug — mirrored for FE convenience (icon/label resolution). |
| Connection Id (`destination.connection_id`) | string; format uuid or null | No | null | UUID of the Connection (integration row). |
| Display Name (`destination.display_name`) | string or null | No | null | Human-readable label — the connection's display_name resolved server-side. |
| EndpointKind (`destination.kind`) | "connection" | No | "connection" | Destination location type. Supply the corresponding destination connection or app location. |
| Object Keys (`object_keys`) | list of string | No | Not specified | Explicit object keys to copy. Empty = all under `prefix`. |
| Prefix (`prefix`) | string | No | "" | Key prefix filter when listing the source store. |
| Selection (`selection`) | "auto" / "input" | No | "auto" | Use input for an explicit file-list job; an empty list copies nothing. Auto retains legacy prefix selection. |
| Endpoint (`source`) | object | Yes | Not specified | Source object-store connection. |
| Catalog Slug (`source.catalog_slug`) | string or null | No | null | Catalog slug — mirrored for FE convenience (icon/label resolution). |
| Connection Id (`source.connection_id`) | string; format uuid or null | No | null | UUID of the Connection (integration row). |
| Display Name (`source.display_name`) | string or null | No | null | Human-readable label — the connection's display_name resolved server-side. |
| EndpointKind (`source.kind`) | "connection" | No | "connection" | Source location type. Select the supported source and provide its corresponding connection or app location. |

## Inputs and outputs

| Direction | Port | Content | Required | Multiple records |
| --- | --- | --- | --- | --- |
| Inputs | `in` | files | Yes | Yes |
| Outputs | `out` | files | Yes | Yes |

## Effects, testing, and recovery

Can write or act on an external destination.

The declared preview behaviour is to skip this step. Configuration can affect preview behaviour; HTTP GET is a notable exception. Read [dry runs](/docs/workflows/dry-runs) before using a preview with live connections.

Duplicate prevention uses the operation’s natural identity. Do not assume that manually repeating the step is free of repeated effects.

## Example: Mirror a prefix of the platform store into an S3 bucket

Step settings:

```json
{
  "destination": {
    "catalog_slug": "s3_storage",
    "connection_id": "55555555-5555-4555-8555-555555555555"
  },
  "prefix": "exports/",
  "source": {
    "catalog_slug": "platform_store",
    "connection_id": "33333333-3333-4333-8333-333333333333"
  }
}
```

## Example: Copy exactly the files an upstream file-list job selected

Step settings:

```json
{
  "destination": {
    "catalog_slug": "platform_store",
    "connection_id": "33333333-3333-4333-8333-333333333333"
  },
  "selection": "input",
  "source": {
    "catalog_slug": "s3_storage",
    "connection_id": "55555555-5555-4555-8555-555555555555"
  }
}
```

## Check the result

Inspect the selected run’s status, counts, errors, and output records. An empty collection can be a valid result, and a completed step can contain per-record failures where the step defines that behaviour. Check the next step’s expected record shape before publishing or delivering the result.
