# How to transfer volume ownership between projects

Source: https://docs.quake.ai/docs/block/how-to/transfer-ownership
Markdown: https://docs.quake.ai/docs/block/how-to/transfer-ownership.md

---

# How to transfer volume ownership between projects

Move a block storage volume from one Quake AI project to another. The source project creates a transfer record. The target project accepts the record with the transfer ID and authorization key.



The workflow spans two Quake AI projects. The source project creates the transfer; the target project accepts it. You need credentials for both projects:

- **Console**: switch projects in the portal between steps 1 and 2.
- **CLI / API**: each application credential belongs to one project, so use a user-level credential (`OS_AUTH_TYPE=password` or `OS_AUTH_TYPE=v3token`) or two application credentials (one per project). Re-source the matching `openrc.sh` between steps 1 and 2.



<PrerequisiteBlock methods={["console", "cli", "api"]}>

- The volume is in **Available** status (not attached to an instance)
- You have access to both the source and target projects (see the callout above for credential shape)

</PrerequisiteBlock>

## Step 1. Create the transfer (source project)

<MethodTabs>
<Method label="Console">

<NoMoreButton />

1. Switch to the source project in the portal.
2. Go to **Storage** > **Volumes**.
3. Locate the volume you want to transfer. On its row, open the **Settings** (gear) icon dropdown (the last column on the row) and select **Create Transfer**.

   The row's **Settings** dropdown lists **Edit**, **Create Transfer**, and **Delete**. **Create Transfer** is the only volume-scoped action in that menu. Attach, Create Snapshot, Create Image, Clone Volume, Restore From Snapshot, Extend Volume, and Change Type live in the row's **Volume action** middle-icon dropdown.

4. The **Create Transfer** dialog opens with a required **Transfer Name** text field and an info paragraph explaining the cross-project transfer. Enter a name.
5. Select **OK**.

The Console downloads a text file that contains the Transfer ID and Auth Key. Share both values with the recipient.

</Method>
<Method label="CLI">

```bash
openstack volume transfer request create \
  --name my-transfer \
  my-volume
```

The response includes `id` (the Transfer ID) and `auth_key`. Share both values with the recipient.

</Method>
<Method label="API">

<BlockApiEnvPrereqs />

```bash
curl -X POST "$OS_VOLUME_URL/os-volume-transfer" \
  -H "X-Auth-Token: $OS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"transfer": {"name": "my-transfer", "volume_id": "VOLUME_ID"}}'
```

The response contains `id` and `auth_key`. Share both values with the recipient.

</Method>
</MethodTabs>

## Step 2. Accept the transfer (target project)

<MethodTabs>
<Method label="Console">

1. Switch to the target project in the portal.
2. Go to **Storage** > **Volumes** and select **Accept Volume Transfer** in the top-right toolbar (between **Create Volume** and **Delete**).
3. The **Accept Volume Transfer** dialog opens with two required fields: **Transfer ID** and **Auth Key**. Enter the values from the transfer record.
4. Select **OK**.

The volume now belongs to the target project.

</Method>
<Method label="CLI">

Source the target project's `openrc.sh`, then accept:

```bash
source ~/path/to/target-project-openrc.sh

openstack volume transfer request accept \
  --auth-key AUTH_KEY \
  TRANSFER_ID
```

</Method>
<Method label="API">

Use a token scoped to the target project, then accept the transfer:

```bash
curl -X POST "$OS_VOLUME_URL/os-volume-transfer/TRANSFER_ID/accept" \
  -H "X-Auth-Token: TARGET_PROJECT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"accept": {"auth_key": "AUTH_KEY"}}'
```

</Method>
</MethodTabs>

## Cancel the transfer

The source project can cancel a pending transfer before the recipient accepts it.

<MethodTabs>
<Method label="Console">

1. In the source project, go to **Storage** > **Volumes**.
2. Locate the volume with status **Awaiting Transfer**. On its row, open the **Settings** (gear) icon dropdown and select **Cancel Transfer**.
3. Confirm the cancellation when prompted ("Are you sure to cancel transfer volume `VOLUME_NAME`?"). The volume returns to **Available** status.

</Method>
<Method label="CLI">

```bash
openstack volume transfer request delete TRANSFER_ID
```

</Method>
<Method label="API">

```bash
curl -X DELETE "$OS_VOLUME_URL/os-volume-transfer/TRANSFER_ID" \
  -H "X-Auth-Token: $OS_TOKEN"
```

</Method>
</MethodTabs>

## See also

- [Volumes concepts](/docs/block/concepts/volumes)
- [Create a volume](/docs/block/how-to/create-volume)
- [Manage cloud projects](/docs/account/projects)
