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

One of three transfer variants. This one has no source container; `source_entity_id` makes the
entity itself the source, so nothing is decremented. See
[Introduction to Transfers](/docs/introduction-to-transfers) for the concepts, and
[Source Container](/docs/single-transfer-source-container) or
[Non-Empty Container](/docs/single-transfer-transfer-into-non-empty-container) for the variants that
draw from a real container.

This example uses the [V3 API](/docs/v3-api-overview) through the
[V3 Python SDK](/docs/getting-started-with-the-v3-sdk).

> **Info**
>
> `container.transfer` is stable, but `unit.list`, which this example uses to look up unit IDs, is
> beta. Set `early_access="true"` on the client, as below, or send the `EARLY-ACCESS: true` header on
> raw HTTP requests. See the [V3 Stability Guidelines](/docs/stability-guidelines).

#### 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 with
`early_access="true"`.

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

```python Python (lines 1-12)
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,
    early_access="true",
)
```

#### Look up unit IDs

V3 measurements name their unit by ID, not by a symbol like `"mL"`. This helper looks a unit up
by name with `unit.list`.

**`Python (lines 14-15)`**

```python Python (lines 14-15)
def unit_id(name):
    return next(iter(benchling.unit.list(name_any_of=name))).id
```

#### Destination and source

Both are fixed API IDs for demonstration. Neither needs fetching, because the source is an entity, not
a container whose quantity has to be read.

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

```python Python (lines 17-18)
destination = "con_TbU7UrgR"
source_entity = "prtn_tNciwmYB"
```

#### Perform the transfer

The `SingleTransferInput` sets `source_entity_id` rather than `source_container_id`, which is what
makes the source unlimited. `source_concentration` sets the entity's concentration, here 25%.
Because the destination is empty, it ends up holding the entity at 25%, as the V2 version of
this recipe did. Leave `source_concentration` out and the concentration isn't tracked. `container.transfer` starts an async task, and `wait_for_task_response`
polls it until it finishes.

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

```python Python (lines 20-30)
link = benchling.container.transfer(
    transfers=[
        SingleTransferInput(
            destination_container_id=destination,
            source_entity_id=source_entity,
            transfer_quantity=MeasurementInput(value=5, unit_id=unit_id("milliliter")),
            source_concentration=MeasurementInput(value=25, unit_id=unit_id("percent")),
        )
    ]
)
benchling.wait_for_task_response(link)
```

#### 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,
    early_access="true",
)

def unit_id(name):
    return next(iter(benchling.unit.list(name_any_of=name))).id

destination = "con_TbU7UrgR"
source_entity = "prtn_tNciwmYB"

link = benchling.container.transfer(
    transfers=[
        SingleTransferInput(
            destination_container_id=destination,
            source_entity_id=source_entity,
            transfer_quantity=MeasurementInput(value=5, unit_id=unit_id("milliliter")),
            source_concentration=MeasurementInput(value=25, unit_id=unit_id("percent")),
        )
    ]
)
benchling.wait_for_task_response(link)
```