> This page is for Developer Documentation.

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

# Single Transfer: Transfer Into Non-Empty Container

One of three transfer variants. See [Introduction to Transfers](/docs/introduction-to-transfers) for
the concepts, and [Source Container](/docs/single-transfer-source-container) or
[Unlimited Source](/docs/single-transfer-unlimited-source) for the other two.

This example uses the [V3 API](/docs/v3-api-overview) through the
[V3 Python SDK](/docs/getting-started-with-the-v3-sdk). `container.get` and `container.transfer`
are stable, so the client doesn't need `early_access`.

#### Imports and config

Import the SDK and the two input models this example needs, and read the tenant URL and API key
from the environment rather than hard-coding them. Then initialize the client.

**`Python (lines 1-8)`**

```python Python (lines 1-8)
import os

from benchling_v3_sdk import Benchling, MeasurementInput, SingleTransferInput

TENANT_URL = os.environ.get("TENANT_URL")
API_KEY = os.environ.get("API_KEY")

benchling = Benchling(base_url=TENANT_URL, api_key=API_KEY)
```

#### Destination and source

Both containers are fetched here, not just the source. The destination is not empty, so this
prints its contents before the transfer for comparison.

**`Python (lines 10-13)`**

```python Python (lines 10-13)
destination_well = benchling.container.get("con_W5llmhfe")
source_well = benchling.container.get("con_m4AXFaoE")
for content in destination_well.contents:
    print(content.entity.id, content.concentration)
```

#### Transfer quantity

A fixed 5mL rather than the source's full volume. V3 measurements take a unit ID, so this reuses
the unit of the source container's quantity, which is mL in this example.

**`Python (line 15)`**

```python Python (line 15)
volume = MeasurementInput(value=5, unit_id=source_well.quantity.unit.id)
```

#### Perform the transfer

V3 transfers have no `destination_contents`, so the request only names the destination, the
source container, and the quantity. V3 works out the combined contents and recalculates their
concentrations itself. `container.transfer` starts an async task, and
`wait_for_task_response` polls it until it finishes.

**`Python (lines 17-26)`**

```python Python (lines 17-26)
link = benchling.container.transfer(
    transfers=[
        SingleTransferInput(
            destination_container_id=destination_well.id,
            source_container_id=source_well.id,
            transfer_quantity=volume,
        )
    ]
)
benchling.wait_for_task_response(link)
```

#### Check the result

Read the destination again to see the contents and concentrations it holds after the transfer.

**`Python (lines 28-30)`**

```python Python (lines 28-30)
destination_well = benchling.container.get(destination_well.id)
for content in destination_well.contents:
    print(content.entity.id, content.concentration)
```

#### Complete files

**`Python`**

```python title="Python"
import os

from benchling_v3_sdk import Benchling, MeasurementInput, SingleTransferInput

TENANT_URL = os.environ.get("TENANT_URL")
API_KEY = os.environ.get("API_KEY")

benchling = Benchling(base_url=TENANT_URL, api_key=API_KEY)

destination_well = benchling.container.get("con_W5llmhfe")
source_well = benchling.container.get("con_m4AXFaoE")
for content in destination_well.contents:
    print(content.entity.id, content.concentration)

volume = MeasurementInput(value=5, unit_id=source_well.quantity.unit.id)

link = benchling.container.transfer(
    transfers=[
        SingleTransferInput(
            destination_container_id=destination_well.id,
            source_container_id=source_well.id,
            transfer_quantity=volume,
        )
    ]
)
benchling.wait_for_task_response(link)

destination_well = benchling.container.get(destination_well.id)
for content in destination_well.contents:
    print(content.entity.id, content.concentration)
```

## Diluting in the same transfer

To top the destination up to a target volume as part of the transfer, set `final_quantity`. V3
recalculates every concentration for the final volume, so a dilution into a non-empty container
takes one transfer rather than a transfer and a separate update:

**`Python`**

```python title="Python"
link = benchling.container.transfer(
    transfers=[
        SingleTransferInput(
            destination_container_id=destination_well.id,
            source_container_id=source_well.id,
            transfer_quantity=volume,
            final_quantity=MeasurementInput(value=20, unit_id=source_well.quantity.unit.id),
        )
    ]
)
benchling.wait_for_task_response(link)
```

`final_quantity` has to be at least the destination's existing quantity plus the transfer quantity.
A lower value is accepted, but the task fails with "Your request is invalid", which
`wait_for_task_response` raises as a `TaskFailureException`.