> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.dropboxapi.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.dropboxapi.com/_mcp/server.

# Members Remove

POST https://api.dropboxapi.com/2/team/members/remove
Content-Type: application/json

Removes a member from a team.

 Permission : Team member management

 Exactly one of team_member_id, email, or external_id must be provided to identify the user account.

 Accounts can be recovered via [members/recover](api:dropbox-api:POST/2/team/members/recover) for a 7 day period
 or until the account has been permanently deleted or transferred to another account
 (whichever comes first). Calling [members/add](api:dropbox-api:POST/2/team/members/add) while a user is still recoverable
 on your team will return with `MemberAddResult.user_already_on_team`.

 Accounts can have their files transferred via the admin console for a limited time, based on the version history
 length associated with the team (180 days for most teams).

 Accounts can have their stacks transferred through the admin console. This only transfers stacks that they have created.

 This endpoint may initiate an asynchronous job. To obtain the final result
 of the job, the client should periodically poll [members/remove/job_status/get](api:dropbox-api:POST/2/team/members/remove/job_status/get).

**Required scope:** `members.delete`

**Endpoint format:** [RPC](https://docs.dropboxapi.com/dropbox-api/docs/technical-reference/request-response-formats#rpc-endpoints)

**Authentication:** [Team](https://docs.dropboxapi.com/dropbox-api/docs/auth-types#team-authentication)

Reference: https://docs.dropboxapi.com/dropbox-api/api-reference/business-endpoints/team/members-remove

## Authentication

- `Authorization` header (bearer token, required) — Team-level OAuth 2.0 token issued to a Dropbox Business admin. Use `Authorization: Bearer <token>`. Obtain via the authorization code flow with team-scoped permissions. Grants access to team-wide administrative operations. You can generate a short-lived access token from the App Console; see [Testing with a generated token](https://docs.dropboxapi.com/dropbox-api/docs/oauth#testing-with-a-generated-token).

## Request

### Body (application/json)

This endpoint expects an object.

- `user` (object or object or object, required) — Identity of user to remove/suspend/have their files moved.
  - team.UserSelectorArg.team_member_id
    - `.tag` (enum, required)
      - Allowed values: `team_member_id`
    - `team_member_id` (string, required, nullable)
  - team.UserSelectorArg.external_id
    - `.tag` (enum, required)
      - Allowed values: `external_id`
    - `external_id` (string, required, nullable)
  - team.UserSelectorArg.email
    - `.tag` (enum, required)
      - Allowed values: `email`
    - `email` (string, required, nullable)
- `keep_account` (boolean, optional, default: false) — Downgrade the member to a Basic account. The user will retain the email address associated with their Dropbox account and data in their account that is not restricted to team members. In order to keep the account the argument `wipe_data` should be set to `false`.
- `permanently_delete_files` (boolean, optional, default: false) — Permanently delete the data in the deleted member's account. After permanent deletion, the data is no longer available to be transferred to a different user.
- `retain_team_shares` (boolean, optional, default: false) — If provided, allows removed users to keep access to Dropbox folders (not Dropbox Paper folders) already explicitly shared with them (not via a group) when they are downgraded to a Basic account. Users will not retain access to folders that do not allow external sharing. In order to keep the sharing relationships, the arguments `wipe_data` should be set to `false` and `keep_account` should be set to `true`.
- `transfer_admin_id` (object or object or object, optional, nullable) — If provided, errors during the transfer process will be sent via email to this user. If the transfer_dest_id argument was provided, then this argument must be provided as well.
  - team.UserSelectorArg.team_member_id
    - `.tag` (enum, required)
      - Allowed values: `team_member_id`
    - `team_member_id` (string, required, nullable)
  - team.UserSelectorArg.external_id
    - `.tag` (enum, required)
      - Allowed values: `external_id`
    - `external_id` (string, required, nullable)
  - team.UserSelectorArg.email
    - `.tag` (enum, required)
      - Allowed values: `email`
    - `email` (string, required, nullable)
- `transfer_dest_id` (object or object or object, optional, nullable) — If provided, files from the deleted member account will be transferred to this user.
  - team.UserSelectorArg.team_member_id
    - `.tag` (enum, required)
      - Allowed values: `team_member_id`
    - `team_member_id` (string, required, nullable)
  - team.UserSelectorArg.external_id
    - `.tag` (enum, required)
      - Allowed values: `external_id`
    - `external_id` (string, required, nullable)
  - team.UserSelectorArg.email
    - `.tag` (enum, required)
      - Allowed values: `email`
    - `email` (string, required, nullable)
- `wipe_data` (boolean, optional, default: true) — If provided, controls if the user's data will be deleted on their linked devices.

## Response

### 200

Successful response

- `object or object`
  - async_common.LaunchEmptyResult.async_job_id
    - `.tag` (enum, required)
      - Allowed values: `async_job_id`
    - `async_job_id` (string, required, nullable)
  - async_common.LaunchEmptyResult.complete
    - `.tag` (enum, required)
      - Allowed values: `complete`

## Errors

### 401 Unauthorized Error

Bad or expired token

- `error` (object or object or object or object or object or object or object or object, required) — Errors occurred during authentication.
  - auth_apiv2.AuthError.invalid_access_token
    - `.tag` (enum, required)
      - Allowed values: `invalid_access_token`
  - auth_apiv2.AuthError.invalid_select_user
    - `.tag` (enum, required)
      - Allowed values: `invalid_select_user`
  - auth_apiv2.AuthError.invalid_select_admin
    - `.tag` (enum, required)
      - Allowed values: `invalid_select_admin`
  - auth_apiv2.AuthError.user_suspended
    - `.tag` (enum, required)
      - Allowed values: `user_suspended`
  - auth_apiv2.AuthError.expired_access_token
    - `.tag` (enum, required)
      - Allowed values: `expired_access_token`
  - auth_apiv2.AuthError.missing_scope
    - `.tag` (enum, required)
      - Allowed values: `missing_scope`
    - `required_scope` (string, required) — The required scope to access the route.
  - auth_apiv2.AuthError.route_access_denied
    - `.tag` (enum, required)
      - Allowed values: `route_access_denied`
  - Other
    - `.tag` (string, optional)
- `error_summary` (string, required) — A human-readable summary of the error.

### 403 Forbidden Error

The user or team account doesn't have access to the endpoint or feature

- `error` (object or object or object or object or object, required) — Error occurred because the account doesn't have permission to access the resource.
  - auth_apiv2.AccessError.invalid_account_type
    - `.tag` (enum, required)
      - Allowed values: `invalid_account_type`
    - `invalid_account_type` (object or object or object, required)
      - auth_apiv2.InvalidAccountTypeError.endpoint
        - `.tag` (enum, required)
          - Allowed values: `endpoint`
      - auth_apiv2.InvalidAccountTypeError.feature
        - `.tag` (enum, required)
          - Allowed values: `feature`
      - Other
        - `.tag` (string, optional)
  - auth_apiv2.AccessError.paper_access_denied
    - `.tag` (enum, required)
      - Allowed values: `paper_access_denied`
    - `paper_access_denied` (object or object or object, required)
      - auth_apiv2.PaperAccessError.paper_disabled
        - `.tag` (enum, required)
          - Allowed values: `paper_disabled`
      - auth_apiv2.PaperAccessError.not_paper_user
        - `.tag` (enum, required)
          - Allowed values: `not_paper_user`
      - Other
        - `.tag` (string, optional)
  - auth_apiv2.AccessError.team_access_denied
    - `.tag` (enum, required)
      - Allowed values: `team_access_denied`
  - auth_apiv2.AccessError.no_permission
    - `.tag` (enum, required)
      - Allowed values: `no_permission`
    - `no_permission` (object or object, required)
      - auth_apiv2.NoPermissionError.unauthorized_account_id_usage
        - `.tag` (enum, required)
          - Allowed values: `unauthorized_account_id_usage`
        - `unauthorized_account_ids` (list of string, required) — The account IDs that the caller does not have permission to use.
      - Other
        - `.tag` (string, optional)
  - Other
    - `.tag` (string, optional)
- `error_summary` (string, required) — A human-readable summary of the error.

### 409 Conflict Error

Endpoint-specific error

- `error` (object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object or object, required)
  - team.MembersRemoveError.user_not_found
    - `.tag` (enum, required)
      - Allowed values: `user_not_found`
  - team.MembersRemoveError.user_not_in_team
    - `.tag` (enum, required)
      - Allowed values: `user_not_in_team`
  - team.MembersRemoveError.transfer_in_progress
    - `.tag` (enum, required)
      - Allowed values: `transfer_in_progress`
  - team.MembersRemoveError.already_transferred
    - `.tag` (enum, required)
      - Allowed values: `already_transferred`
  - team.MembersRemoveError.already_transferred_or_deleted
    - `.tag` (enum, required)
      - Allowed values: `already_transferred_or_deleted`
  - team.MembersRemoveError.removed_and_transfer_dest_should_differ
    - `.tag` (enum, required)
      - Allowed values: `removed_and_transfer_dest_should_differ`
  - team.MembersRemoveError.removed_and_transfer_admin_should_differ
    - `.tag` (enum, required)
      - Allowed values: `removed_and_transfer_admin_should_differ`
  - team.MembersRemoveError.transfer_dest_user_not_found
    - `.tag` (enum, required)
      - Allowed values: `transfer_dest_user_not_found`
  - team.MembersRemoveError.transfer_dest_user_not_in_team
    - `.tag` (enum, required)
      - Allowed values: `transfer_dest_user_not_in_team`
  - team.MembersRemoveError.transfer_admin_user_not_in_team
    - `.tag` (enum, required)
      - Allowed values: `transfer_admin_user_not_in_team`
  - team.MembersRemoveError.transfer_admin_user_not_found
    - `.tag` (enum, required)
      - Allowed values: `transfer_admin_user_not_found`
  - team.MembersRemoveError.unspecified_transfer_admin_id
    - `.tag` (enum, required)
      - Allowed values: `unspecified_transfer_admin_id`
  - team.MembersRemoveError.transfer_admin_is_not_admin
    - `.tag` (enum, required)
      - Allowed values: `transfer_admin_is_not_admin`
  - team.MembersRemoveError.recipient_not_verified
    - `.tag` (enum, required)
      - Allowed values: `recipient_not_verified`
  - team.MembersRemoveError.remove_last_admin
    - `.tag` (enum, required)
      - Allowed values: `remove_last_admin`
  - team.MembersRemoveError.cannot_keep_account_and_transfer
    - `.tag` (enum, required)
      - Allowed values: `cannot_keep_account_and_transfer`
  - team.MembersRemoveError.cannot_keep_account_and_delete_data
    - `.tag` (enum, required)
      - Allowed values: `cannot_keep_account_and_delete_data`
  - team.MembersRemoveError.cannot_keep_account_and_permanently_delete
    - `.tag` (enum, required)
      - Allowed values: `cannot_keep_account_and_permanently_delete`
  - team.MembersRemoveError.email_address_too_long_to_be_disabled
    - `.tag` (enum, required)
      - Allowed values: `email_address_too_long_to_be_disabled`
  - team.MembersRemoveError.cannot_keep_invited_user_account
    - `.tag` (enum, required)
      - Allowed values: `cannot_keep_invited_user_account`
  - team.MembersRemoveError.cannot_retain_shares_when_data_wiped
    - `.tag` (enum, required)
      - Allowed values: `cannot_retain_shares_when_data_wiped`
  - team.MembersRemoveError.cannot_retain_shares_when_no_account_kept
    - `.tag` (enum, required)
      - Allowed values: `cannot_retain_shares_when_no_account_kept`
  - team.MembersRemoveError.cannot_retain_shares_when_team_external_sharing_off
    - `.tag` (enum, required)
      - Allowed values: `cannot_retain_shares_when_team_external_sharing_off`
  - team.MembersRemoveError.cannot_keep_account
    - `.tag` (enum, required)
      - Allowed values: `cannot_keep_account`
  - team.MembersRemoveError.cannot_keep_account_under_legal_hold
    - `.tag` (enum, required)
      - Allowed values: `cannot_keep_account_under_legal_hold`
  - team.MembersRemoveError.cannot_keep_account_required_to_sign_tos
    - `.tag` (enum, required)
      - Allowed values: `cannot_keep_account_required_to_sign_tos`
  - team.MembersRemoveError.cannot_permanently_delete_and_transfer
    - `.tag` (enum, required)
      - Allowed values: `cannot_permanently_delete_and_transfer`
  - team.MembersRemoveError.member_is_transfer_destination
    - `.tag` (enum, required)
      - Allowed values: `member_is_transfer_destination`
  - Other
    - `.tag` (string, optional)
- `error_summary` (string, required) — A human-readable summary of the error.
- `user_message` (object, optional)
  - `locale` (string, optional)
  - `text` (string, optional)

### 429 Too Many Requests Error

The app is making too many requests for the given user or team and is being rate limited. The app should wait for the number of seconds specified in the "Retry-After" response header before trying again.

- `error` (object, required) — Error occurred because the app is being rate limited.
  - `reason` (object or object or object, required) — The reason why the app is being rate limited.
    - auth_apiv2.RateLimitReason.too_many_requests
      - `.tag` (enum, required)
        - Allowed values: `too_many_requests`
    - auth_apiv2.RateLimitReason.too_many_write_operations
      - `.tag` (enum, required)
        - Allowed values: `too_many_write_operations`
    - Other
      - `.tag` (string, optional)
  - `retry_after` (uint64, optional, default: 1) — The number of seconds that the app should wait before making another request.
- `error_summary` (string, required) — A human-readable summary of the error.

### 500 Internal Server Error

Internal server error. An error occurred on the Dropbox servers. Check https://status.dropbox.com/ for announcements about Dropbox service issues.

- `any`

## Examples

**Request**

```json
{
  "user": {
    ".tag": "team_member_id",
    "team_member_id": "dbmid:efgh5678"
  },
  "keep_account": false,
  "permanently_delete_files": false,
  "retain_team_shares": false,
  "transfer_admin_id": {
    ".tag": "team_member_id",
    "team_member_id": "dbmid:efgh5678"
  },
  "transfer_dest_id": {
    ".tag": "team_member_id",
    "team_member_id": "dbmid:efgh5678"
  },
  "wipe_data": true
}
```

**Response**

```json
{
  ".tag": "async_job_id",
  "async_job_id": "34g93hh34h04y384084"
}
```

**SDK Code**

```python
import requests

url = "https://api.dropboxapi.com/2/team/members/remove"

payload = {
    "user": {
        ".tag": "team_member_id",
        "team_member_id": "dbmid:efgh5678"
    },
    "keep_account": False,
    "permanently_delete_files": False,
    "retain_team_shares": False,
    "transfer_admin_id": {
        ".tag": "team_member_id",
        "team_member_id": "dbmid:efgh5678"
    },
    "transfer_dest_id": {
        ".tag": "team_member_id",
        "team_member_id": "dbmid:efgh5678"
    },
    "wipe_data": True
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.dropboxapi.com/2/team/members/remove';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"user":{".tag":"team_member_id","team_member_id":"dbmid:efgh5678"},"keep_account":false,"permanently_delete_files":false,"retain_team_shares":false,"transfer_admin_id":{".tag":"team_member_id","team_member_id":"dbmid:efgh5678"},"transfer_dest_id":{".tag":"team_member_id","team_member_id":"dbmid:efgh5678"},"wipe_data":true}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.dropboxapi.com/2/team/members/remove"

	payload := strings.NewReader("{\n  \"user\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"keep_account\": false,\n  \"permanently_delete_files\": false,\n  \"retain_team_shares\": false,\n  \"transfer_admin_id\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"transfer_dest_id\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"wipe_data\": true\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.dropboxapi.com/2/team/members/remove")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"user\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"keep_account\": false,\n  \"permanently_delete_files\": false,\n  \"retain_team_shares\": false,\n  \"transfer_admin_id\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"transfer_dest_id\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"wipe_data\": true\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.dropboxapi.com/2/team/members/remove")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"user\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"keep_account\": false,\n  \"permanently_delete_files\": false,\n  \"retain_team_shares\": false,\n  \"transfer_admin_id\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"transfer_dest_id\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"wipe_data\": true\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.dropboxapi.com/2/team/members/remove', [
  'body' => '{
  "user": {
    ".tag": "team_member_id",
    "team_member_id": "dbmid:efgh5678"
  },
  "keep_account": false,
  "permanently_delete_files": false,
  "retain_team_shares": false,
  "transfer_admin_id": {
    ".tag": "team_member_id",
    "team_member_id": "dbmid:efgh5678"
  },
  "transfer_dest_id": {
    ".tag": "team_member_id",
    "team_member_id": "dbmid:efgh5678"
  },
  "wipe_data": true
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.dropboxapi.com/2/team/members/remove");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"user\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"keep_account\": false,\n  \"permanently_delete_files\": false,\n  \"retain_team_shares\": false,\n  \"transfer_admin_id\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"transfer_dest_id\": {\n    \".tag\": \"team_member_id\",\n    \"team_member_id\": \"dbmid:efgh5678\"\n  },\n  \"wipe_data\": true\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "user": [
    ".tag": "team_member_id",
    "team_member_id": "dbmid:efgh5678"
  ],
  "keep_account": false,
  "permanently_delete_files": false,
  "retain_team_shares": false,
  "transfer_admin_id": [
    ".tag": "team_member_id",
    "team_member_id": "dbmid:efgh5678"
  ],
  "transfer_dest_id": [
    ".tag": "team_member_id",
    "team_member_id": "dbmid:efgh5678"
  ],
  "wipe_data": true
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.dropboxapi.com/2/team/members/remove")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```