---
title: "Propose a project transfer"
method: PUT
path: "/v1/projects/{project_id}/transfer"
tags: ["Projects"]
---

# Propose a project transfer

`PUT /v1/projects/{project_id}/transfer`

## Request

- Base URL: `https://api.naturali.ai`
- URL: `https://api.naturali.ai/v1/projects/{project_id}/transfer`
- Auth: HTTP bearer

Proposes an existing member as the project's next owner — the account it is billed to. Nothing changes until that member accepts with `POST /v1/projects/{project_id}/transfer/accept`; a proposal already pending is replaced. The recipient is emailed.

Requires the `owner` role and an account-wide credential; refused to a connected app.

## Request body

- ProjectTransferCreate
  - `member_id` string, required: The membership ID (`pmem_` prefix) of the proposed owner.

## Response `200`

The pending transfer.

- ProjectTransfer: A change of the project's owner, pending or completed.
  - `project_id` string, required
  - `status` 'pending' | 'completed', required
  - `from_user_id` string, required: The owner before the transfer.
  - `to_user_id` string, required: The owner after it.
  - `requested_at` string, date-time, nullable, required
  - `transferred_at` string, date-time, nullable, required: When ownership moved; `null` while pending.

## Other responses

- `400`: Missing `member_id`, or it names the owner.
- `401`: Missing or invalid credentials.
- `403`: The credential is scoped to a different project, or the caller's role in the project does not carry this action.
- `404`: No such project, or no such member in it.

---

[API](https://skmtc.dev/naturali/apis/naturali-ai-api.md) · [All operations](https://skmtc.dev/naturali/apis/naturali-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/naturali/apis/naturali-ai-api/revisions/e4905b78f422?raw)
