> 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: Source Container

One of three transfer variants. See [Introduction to Transfers](/docs/introduction-to-transfers) for
the concepts, and [Unlimited Source](/docs/single-transfer-unlimited-source) or
[Non-Empty Container](/docs/single-transfer-transfer-into-non-empty-container) 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. `base_url` is the
tenant root; the SDK adds `/api/v3` itself.

**`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

The destination is just an API ID, but the source has to be fetched, because the transfer needs
its quantity.

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

```python Python (lines 10-11)
destination = "con_W5llmhfe"
source_well = benchling.container.get("con_m4AXFaoE")
```

#### Transfer quantity

This example moves the source container's entire contents, so the transfer quantity is built to
match the source container's own quantity exactly. V3 measurements take a unit ID rather than a
unit symbol, so reuse the ID from the source's `quantity`.

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

```python Python (lines 13-16)
quantity = MeasurementInput(
    value=source_well.quantity.value,
    unit_id=source_well.quantity.unit.id,
)
```

#### Perform the transfer

Each `SingleTransferInput` names the destination, exactly one source, and the quantity.
There is no `destination_contents` to build: V3 copies every content of the source, at its
concentration in the source, into the destination. `source_concentration` can't be set on a
container-to-container transfer.
`container.transfer` takes a list of them and starts an async task; `wait_for_task_response`
polls it and raises `TaskFailureException` if it fails. See
[Async tasks](/docs/common-sdk-interactions-and-examples-v3#async-tasks).

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

```python Python (lines 18-28)
link = benchling.container.transfer(
    transfers=[
        SingleTransferInput(
            destination_container_id=destination,
            source_container_id=source_well.id,
            transfer_quantity=quantity,
        )
    ]
)
task = benchling.wait_for_task_response(link)
print(task.result.destination_container_ids)
```

#### 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 = "con_W5llmhfe"
source_well = benchling.container.get("con_m4AXFaoE")

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

link = benchling.container.transfer(
    transfers=[
        SingleTransferInput(
            destination_container_id=destination,
            source_container_id=source_well.id,
            transfer_quantity=quantity,
        )
    ]
)
task = benchling.wait_for_task_response(link)
print(task.result.destination_container_ids)
```