> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trusset.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Request Removal

> Queue a wallet for removal from a profile eligibility register

Queues the removal of a wallet from the eligibility register of one verification profile. Nothing is written on chain here. The admission turns `REMOVAL_PENDING` until your wallet signs the removal through [Build Removal](/endpoints/customers/build-removal) and [Confirm Removal](/endpoints/customers/confirm-removal). See [Eligibility registers](/endpoints/customers/introduction#eligibility-registers).

<Warning>
  Until the removal is signed and mined, the wallet stays on the register, and every lending market and vault that reads the register keeps admitting it. Build and sign the removal promptly.
</Warning>

An admission still waiting to be signed is cancelled instead, since it never reached the register. Trusset queues removals on its own as well, for a revoked identity, a rejected review, a newly blocked country and a lapsed admission.

## Body Parameters

<ParamField body="profileKey" type="string">
  The profile, by key. Matched exactly, then in upper and lower case. Send this or `profileId`.
</ParamField>

<ParamField body="profileId" type="string">
  The profile, by `id`. Used instead of `profileKey` when both are sent.
</ParamField>

<ParamField body="walletAddress" type="string" required>
  The wallet to remove, `0x` followed by 40 hex characters.
</ParamField>

<ParamField body="reason" type="string" default="MANUAL">
  `LAPSED`, `REVOKED`, `REJECTED`, `COUNTRY_BLOCKED` or `MANUAL`, in any case. Any other value is recorded as `MANUAL`. It is kept as the admission's `removalReason`.
</ParamField>

<ParamField body="note" type="string">
  A note kept in the audit log when a removal is queued, up to 300 characters.
</ParamField>

## What comes back

Every outcome answers `200`.

| The admission was | Now | Response |
| - | - | - |
| `ADMITTED` | `REMOVAL_PENDING` | `cancelled: false` |
| `PENDING` | `CANCELLED` | `cancelled: true` |
| `REMOVAL_PENDING` | Unchanged | `alreadyPending: true` |

## Response Fields

<ResponseField name="data" type="object">
  <Expandable>
    <ResponseField name="admission" type="object">The admission after the request, as on [List Admissions](/endpoints/customers/list-admissions).</ResponseField>
    <ResponseField name="cancelled" type="boolean">`true` when a waiting admission was cancelled, `false` when a removal was queued. Absent with `alreadyPending`.</ResponseField>
    <ResponseField name="alreadyPending" type="boolean">Present and `true` when a removal was already waiting.</ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "https://api.trusset.org/customers/api/eligibility/removals" \
    -H "Content-Type: application/json" \
    -H "X-API-Key: trusset_your_key_here" \
    -d '{
      "profileKey": "PROFESSIONAL",
      "walletAddress": "0x06DAf160e10be3BE6b5b30491102Ef7E34B7b98D",
      "reason": "MANUAL",
      "note": "Client requested reclassification as retail"
    }'
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch('https://api.trusset.org/customers/api/eligibility/removals', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': 'trusset_your_key_here'
    },
    body: JSON.stringify({
      profileKey: 'PROFESSIONAL',
      walletAddress: '0x06DAf160e10be3BE6b5b30491102Ef7E34B7b98D',
      reason: 'MANUAL',
      note: 'Client requested reclassification as retail'
    })
  });
  const { data } = await response.json();
  ```
</RequestExample>

<ResponseExample>
  ```json Response theme={null}
  {
    "success": true,
    "data": {
      "admission": {
        "id": "cmgdz6t3y0009l40a1d5f8g2h",
        "profileKey": "PROFESSIONAL",
        "profileName": "Professional",
        "registryAddress": "0x4f2A9c81D06e3b75A1C8E24D9B07f56E3a1d8C90",
        "walletAddress": "0x06DAf160e10be3BE6b5b30491102Ef7E34B7b98D",
        "customerId": "cmgdv9j4d0003l30a6p8r2s4u",
        "status": "REMOVAL_PENDING",
        "source": "API",
        "sourceRef": null,
        "lapsed": false,
        "current": true,
        "requirementsHash": "0x8919ea37bac1f44ea0e8a37529be970cb49e9779ebd4c4e98490cfd754e9d390",
        "dueAt": "2027-10-02T14:08:11.000Z",
        "admittedTxHash": "0x5de1122479f288ddb475ee4df5a105a8d6f201fe2b3328061ea29a37941c837d",
        "admittedAt": "2026-10-02T14:08:11.000Z",
        "removalReason": "MANUAL",
        "removalTxHash": null,
        "removedAt": null,
        "signedBy": "0xCD92134767aEC2562be15d2a2062A082dA17dD84",
        "error": null,
        "createdAt": "2026-10-02T13:55:37.104Z",
        "updatedAt": "2026-10-05T11:20:40.316Z"
      },
      "cancelled": false
    },
    "error": null,
    "metadata": {
      "requestId": "550e8400-e29b-41d4-a716-446655440000",
      "timestamp": "2026-10-05T11:20:40.330Z"
    }
  }
  ```
</ResponseExample>

## Error Codes

| Code | HTTP | Cause |
| - | - | - |
| `INVALID_ADDRESS` | `400` | `walletAddress` is not a valid address, or is the zero address |
| `PROFILE_NOT_FOUND` | `404` | Neither `profileId` nor `profileKey` names a profile of your instance |
| `NOT_ADMITTED` | `404` | The wallet has no admission under the profile's register, or it is already `REMOVED` or `CANCELLED` |
| `ELIGIBILITY_REGISTER_NOT_SET` | `409` | The profile has no eligibility register |
| `RATE_LIMIT_EXCEEDED` | `429` | Your instance went over its budget of 120 eligibility requests per minute |
| `REQUEST_REMOVAL_FAILED` | `500` | The removal could not be recorded |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.