---
title: "Transfer an app between the caller and a team"
method: POST
path: "/api/v1/apps/{appId}/transfer"
tags: ["Apps"]
---

# Transfer an app between the caller and a team

`POST /api/v1/apps/{appId}/transfer`

## Request

- Base URL: `https://charm.ing`
- URL: `https://charm.ing/api/v1/apps/{appId}/transfer`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `__Secure-better-auth.session_token`

User-gated (`chrm_user_*` or session). With `teamId`: user→team (caller must hold `app:manage` on the app and be owner/admin of the team). Without: team→user transfer to the caller.

## Path parameters

- `appId` string, uuid, required

## Request body

- object
  - `teamId` string, nullable: Destination team. Absent or null = transfer to the caller.
  - `keepExistingAppMembers` boolean: Keep direct grants, pending invitations, and active single-use links. Omitted means true.

## Response `200`

App transferred.

- AppTransferResponse: Post-transfer owner scope: exactly one of userId/teamId is set.
  - `ok` true, required
  - `userId` string, nullable, required
  - `teamId` string, nullable, required

## Other responses

- `400`: Malformed app id, malformed body, or a no-op/cross-scope transfer.
- `401`: Sign-in required.
- `403`: Caller does not manage the app / cannot create in the team.
- `404`: App not found.
- `409`: The destination already owns an app with this name.

---

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