> ## 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.

# Recheck Link Review

> Read the Sumsub review of a link again and settle it

Asks Sumsub for the review of a link's applicant and applies it the way the review webhook would. Use it when a review did not arrive or could not be applied, for example after an outage, or to poll a link your own app runs. The review is judged by the [Review rules](/endpoints/customers/create-id-link#review-rules).

Applying a review has the same effects as the webhook. The link and the customer record change state, an approval queues the on-chain registration and the eligibility admission, and a refusal or a rejection queues removals. When the link carries an email or a phone, the recipient is told of a rejection, a resubmission request or a verification that needed no registration.

## Settled links

A link's review settles once. See [A review settles once](/endpoints/customers/create-id-link#a-review-settles-once). This call therefore reports a revoked link, and a link whose review has already settled, as `SETTLED` without asking Sumsub. Nothing changes on the link.

The exception is a link approved before any wallet was bound and still waiting for one. Sumsub is asked again: a final rejection turns the link `REJECTED`, a green review answers `APPROVED`, with `registration: AWAITING_WALLET` while no wallet is bound, and a request to resubmit is ignored, which answers `SETTLED`.

A link the hosted page completed before any review arrived has not settled. Its review is read from Sumsub and applied.

## Path Parameters

<ParamField path="linkId" type="string" required>
  The link `id`, not the token.
</ParamField>

## Outcomes

| `outcome` | Meaning | Other fields |
| - | - | - |
| `SETTLED` | Nothing was applied. The link was revoked or its review had already settled, see [Settled links](#settled-links) | `status`, the link status. `reason` when Sumsub was asked and its review was ignored |
| `PENDING_REVIEW` | Sumsub has no review answer yet, or does not know the applicant | `reviewStatus`, Sumsub's review status, when it has one |
| `APPROVED` | Approved and accepted under the profile | `registration`: `AWAITING_WALLET` without a bound wallet, `PENDING` when the registration was queued, `REGISTERED` when your instance register already verifies the wallet. `customerId` when the link was finished with a wallet |
| `REFUSED` | Sumsub approved, but the review does not meet the profile. The link turns `REJECTED` | `code`: `KYC_LEVEL_MISMATCH`, `KYC_LEVEL_UNKNOWN`, `KYC_ENTITY_MISMATCH` or `COUNTRY_BLOCKED`. `message` says why |
| `REJECTED` | A final red review. The link turns `REJECTED`, also when it was approved and still waits for a wallet | None |
| `RETRY` | Sumsub asks the customer to resubmit. The link stays open, and a link the hosted page had completed is reopened as `PENDING` | None |

## Response Fields

<ResponseField name="data" type="object">
  <Expandable>
    <ResponseField name="outcome" type="string">`SETTLED`, `PENDING_REVIEW`, `APPROVED`, `REFUSED`, `REJECTED` or `RETRY`.</ResponseField>
    <ResponseField name="status" type="string">`SETTLED` only. The link status.</ResponseField>
    <ResponseField name="reason" type="string">`SETTLED` only, present when Sumsub was asked and its review was ignored: `ALREADY_SETTLED`, or `LINK_CLOSED` when the link was revoked while the call ran.</ResponseField>
    <ResponseField name="reviewStatus" type="string">`PENDING_REVIEW` only, when Sumsub reports one.</ResponseField>
    <ResponseField name="registration" type="string">`APPROVED` only. `AWAITING_WALLET`, `PENDING` or `REGISTERED`.</ResponseField>
    <ResponseField name="customerId" type="string">`APPROVED` only, when the link was finished with a wallet. The customer record written.</ResponseField>
    <ResponseField name="code" type="string">`REFUSED` only. Why the review was refused.</ResponseField>
    <ResponseField name="message" type="string">`REFUSED` only. The refusal in words.</ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "https://api.trusset.org/customers/api/id-links/cmgdx4r2k0003l50a7c1n8e2w/recheck" \
    -H "X-API-Key: trusset_your_key_here"
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch(
    'https://api.trusset.org/customers/api/id-links/cmgdx4r2k0003l50a7c1n8e2w/recheck',
    { method: 'POST', headers: { 'X-API-Key': 'trusset_your_key_here' } }
  );
  const { data } = await response.json();

  const done = data.outcome !== 'PENDING_REVIEW';
  ```
</RequestExample>

<ResponseExample>
  ```json Approved theme={null}
  {
    "success": true,
    "data": {
      "outcome": "APPROVED",
      "customerId": "cmgdx5a9q0006l50a2m4k7h1c",
      "registration": "PENDING"
    },
    "error": null,
    "metadata": {
      "requestId": "550e8400-e29b-41d4-a716-446655440000",
      "timestamp": "2026-10-05T10:12:44.000Z"
    }
  }
  ```

  ```json Refused theme={null}
  {
    "success": true,
    "data": {
      "outcome": "REFUSED",
      "code": "KYC_LEVEL_MISMATCH",
      "message": "The applicant went through the Sumsub level basic-kyc-level, but this profile requires kyb-professional."
    },
    "error": null,
    "metadata": {
      "requestId": "550e8400-e29b-41d4-a716-446655440000",
      "timestamp": "2026-10-05T10:12:44.000Z"
    }
  }
  ```
</ResponseExample>

## Error Codes

| Code | HTTP | Cause |
| - | - | - |
| `NOT_FOUND` | `404` | No link with this ID exists on your instance |
| `NO_APPLICANT` | `409` | The identity check behind the link has not started yet |
| `RATE_LIMIT_EXCEEDED` | `429` | Your instance went over its budget of 120 link onboarding requests per minute |
| `RECHECK_FAILED` | `500` | The review could not be applied |
| `SUMSUB_UNAVAILABLE` | `503` | Sumsub could not be reached. Retry shortly |


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