> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.ovalbee.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.ovalbee.com/_mcp/server.

# Copy

> Adds images and videos from one OvalBee dataset to another without duplicating the media files.

## Overview

Copies images and videos, together with their annotations, from one dataset to another. Assets already in the destination dataset are skipped.

Copied assets stay in the source dataset. Use [Move](/node-library/nodes/dataset-ops-move) instead if you want to remove them from the source.

Use it when a flow needs to reuse the same assets in another dataset.

To copy only part of the source, connect a second dataset to **Assets to copy (dataset)**, for example the output of [Filter images](/node-library/nodes/filter-filter-images). The node then copies only the source assets that this dataset also holds.

After a successful run, the node shows a badge with the number of assets added in that run.

```mermaid
flowchart LR
  source["Source Dataset"] --> copy["Copy"] --> destination["Destination Dataset"]
```

## How it works

Takes the source images and videos. When an assets dataset is set, keeps only the ones it also holds.

Compares source and destination assets by type and asset ID.

Adds each missing asset to the destination dataset.

Adds annotations linked to the added assets.
If an annotation with the same ID is already there, the node skips it.

Refreshes the destination statistics and adds the source's classes that the destination's ontology lacks.

## FAQ

#### What does Copy ignore?

Copy handles images and videos only. It ignores other asset types, and the badge does not count annotations.

#### What happens when data already exists in the destination?

The node skips both the data and its annotations. It does not add missing annotations to an existing destination membership.

Copy writes into the destination as it is and never creates a new dataset version, so a rerun adds only the assets that aren't there yet.

#### Why does the badge show \`+0 assets\`?

The source has no images or videos, the assets dataset shares none with it, or all supported data is already in the destination. Check both datasets. If the destination already has everything, no action is needed.

## Inputs

**`From dataset`** `dataset` — required

Source dataset the assets are copied from. Its own contents stay untouched. Key: `SRC_DATASET`.

---

**`To dataset`** `dataset` — required

Destination dataset where assets are added, along with their annotations. Existing assets are left alone, so a second run adds nothing. Key: `DST_DATASET`.

---

**`Assets to copy (dataset)`** `dataset`

Dataset naming which assets to copy: only the ones it shares with the source are copied. Leave empty to copy everything from the source dataset. Key: `ASSETS_DATASET`.

---

## Outputs

**`Destination Dataset`** `dataset`

ID of the destination OvalBee dataset. Key: `DST_DATASET`.

---

**`Last Copied Assets Count`** `string`

Short badge with the number of images and videos newly added to the destination in the latest run. Shown on the node as a badge. Key: `LAST_COPIED_ASSETS_COUNT`.

---

## JSON config

Machine-readable node interface for automation and advanced usage.

#### Show JSON

```json
{
  "name": "Copy",
  "description": "Adds images and videos from one OvalBee dataset to another without duplicating the media files.",
  "category": "Datasets",
  "namespace": "ovalbee",
  "templateKey": "dataset_ops/copy",
  "version": "v1",
  "inputs": [
    {
      "key": "SRC_DATASET",
      "label": "From dataset",
      "type": "dataset",
      "description": "Source dataset the assets are copied from. Its own contents stay untouched.",
      "required": true,
      "default": null,
      "visibleWhen": null,
      "options": {
        "creatable": false
      }
    },
    {
      "key": "DST_DATASET",
      "label": "To dataset",
      "type": "dataset",
      "description": "Destination dataset where assets are added, along with their annotations. Existing assets are left alone, so a second run adds nothing.",
      "required": true,
      "default": null,
      "visibleWhen": null
    },
    {
      "key": "ASSETS_DATASET",
      "label": "Assets to copy (dataset)",
      "type": "dataset",
      "description": "Dataset naming which assets to copy: only the ones it shares with the source are copied. Leave empty to copy everything from the source dataset.",
      "required": false,
      "default": null,
      "visibleWhen": null,
      "options": {
        "creatable": false
      }
    }
  ],
  "outputs": [
    {
      "key": "DST_DATASET",
      "label": "Destination Dataset",
      "type": "dataset",
      "description": "ID of the destination OvalBee dataset.",
      "artifact": false,
      "badge": false,
      "badgeOpens": null,
      "hidden": false
    },
    {
      "key": "LAST_COPIED_ASSETS_COUNT",
      "label": "Last Copied Assets Count",
      "type": "string",
      "description": "Short badge with the number of images and videos newly added to the destination in the latest run.",
      "artifact": false,
      "badge": true,
      "badgeOpens": null,
      "hidden": false
    }
  ]
}
```