> Reverse Contact API documentation. This is the Markdown copy of https://docs.reversecontact.com/endpoints/list-members-remove
> Every page is listed at https://docs.reversecontact.com/llms.txt, every endpoint with its credit cost and status at https://docs.reversecontact.com/catalog.json

# Remove members

> Remove List members and their stored data, or dismiss Pending Intake lines by id, at no credit cost. Previous charges are not refunded.

- Endpoint: `DELETE https://api.reversecontact.com/v2/lists/:listId/members`
- Credits: Free.
- Answer: synchronous.
- Available in: REST API, MCP tool `remove_list_members`, TypeScript and Python SDKs.
- Last verified: 2026-11-04

## Introduction

The Remove members endpoint takes List Members out of a List, with the data the List stored for them, and dismisses [Pending Intake](https://docs.reversecontact.com/guides/lists#pending-intake) lines. Removing members never dismisses Pending Intake: send the `pendingIds` of the lines you want gone.

Removing is **free** (0 credits), and nothing is refunded: credits spent on a member stay spent. A person removed then added again is charged again at the price of its Signal.

The API key needs the `lists` permission (see [API key management](https://docs.reversecontact.com/guides/api-key-management)).

## Authorization

| Name     | Type   | Required | Description                                                                                         |
| -------- | ------ | -------- | --------------------------------------------------------------------------------------------------- |
| `apikey` | string | Yes      | Your API key from the developer dashboard. Pass it via `Authorization: Bearer YOUR_API_KEY` header. |

## Request body

The List is named in the path: `DELETE /v2/lists/:listId/members`. Send at least one id in either array, and at most 25,000 ids in both together.

| Name         | Type     | Required    | Description                                                                         |
| ------------ | -------- | ----------- | ----------------------------------------------------------------------------------- |
| `memberIds`  | string[] | Conditional | Member ids (UUID) to remove, the `id` of rows with `kind: "member"`                 |
| `pendingIds` | string[] | Conditional | Pending Intake ids (UUID) to dismiss, the `id` of rows with `kind: "pending"`       |

## Response structure

| Field     | Type    | Description                                      |
| --------- | ------- | ------------------------------------------------ |
| `success` | boolean | `true` if the request was processed              |
| `error`   | `null`  | Always `null` on success                         |

**data** (RemoveMembers): What was removed

| Field       | Type   | Description                     |
| ----------- | ------ | ------------------------------- |
| `removed`   | number | Members removed                 |
| `dismissed` | number | Pending Intake lines dismissed  |

An id that is not on the List is left out of the counts. `quotas` and `metadata` are the blocks of every V2 response: see [Usage](https://docs.reversecontact.com/endpoints/usage#response-structure).

## Errors

| Status | Code                 | Meaning                                       |
| ------ | -------------------- | --------------------------------------------- |
| `400`  | `LIST_INVALID_INPUT` | Neither `memberIds` nor `pendingIds` holds an id, or they hold more than 25,000 ids together |
| `404`  | `LIST_NOT_FOUND`     | No List with this id in your workspace        |
| `404`  | `LISTS_NOT_ACTIVATED` | The workspace has never had a List           |
| `422`  | `VALIDATION_ERROR`   | An id is not a UUID                           |

## Code examples

**Code Examples**

```bash [cURL]
curl -X DELETE https://api.reversecontact.com/v2/lists/3f6c2a8e-1b4d-4f0a-9c7e-5d2b8a1e6f40/members \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "memberIds": ["9b1e4c7a-2d3f-4e8a-b6c5-0a1f2e3d4c5b"],
    "pendingIds": ["7e8f9a0b-1c2d-4e3f-8a4b-5c6d7e8f9a0b"]
  }'
```
```javascript [JavaScript]
const listId = "3f6c2a8e-1b4d-4f0a-9c7e-5d2b8a1e6f40";
const response = await fetch(`https://api.reversecontact.com/v2/lists/${listId}/members`, {
  method: "DELETE",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    memberIds: ["9b1e4c7a-2d3f-4e8a-b6c5-0a1f2e3d4c5b"],
    pendingIds: ["7e8f9a0b-1c2d-4e3f-8a4b-5c6d7e8f9a0b"]
  })
});

const { data } = await response.json();
console.log(`${data.removed} removed, ${data.dismissed} dismissed`);
```
```python [Python]
import requests

list_id = "3f6c2a8e-1b4d-4f0a-9c7e-5d2b8a1e6f40"
response = requests.delete(
    f"https://api.reversecontact.com/v2/lists/{list_id}/members",
    headers={
        "Authorization": "Bearer YOUR_API_KEY",
        "Content-Type": "application/json"
    },
    json={
        "memberIds": ["9b1e4c7a-2d3f-4e8a-b6c5-0a1f2e3d4c5b"],
        "pendingIds": ["7e8f9a0b-1c2d-4e3f-8a4b-5c6d7e8f9a0b"]
    }
)

data = response.json()["data"]
print(f"{data['removed']} removed, {data['dismissed']} dismissed")
```

## Example response

**Example Response**

```json [200 - Success]
{
  "success": true,
  "data": {
    "removed": 1,
    "dismissed": 1
  },
  "error": null,
  "quotas": {
    "creditsConsumed": 0,
    "workspace": {
      "id": "ws_abc123",
      "credits": { "total": 10000, "used": 4522, "left": 5478 }
    }
  },
  "metadata": {
    "requestId": "546b4889-3390-4f29-86b2-561608af3373",
    "executionTimeMs": 33
  }
}
```
