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

# Retry KYC

> Retry KYC verification for a user whose KYC was denied

Retries KYC for a user in a `denied` state. The system automatically detects the correct retry path:

* **Persona KYC failed** — Creates a new Persona inquiry and returns a new `verificationUrl`
* **Persona passed, KYC denied** — Re-submits stored identity documents without requiring the user to redo Persona verification

Each user can be retried up to **3 times**. After that, contact support.

<ParamField header="Authorization" type="string" required>
  Bearer token. Example: `Bearer sk_staging_your_api_key`
</ParamField>

<ParamField path="serviceId" type="string" required>
  The `serviceId` of the user to retry KYC for.
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://services-staging.getplu.com/api/v2/partner/card/users/acme-user-abc123/retry-kyc \
    -H "Authorization: Bearer sk_staging_your_api_key" \
    -H "Content-Type: application/json"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    'https://services-staging.getplu.com/api/v2/partner/card/users/acme-user-abc123/retry-kyc',
    {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer sk_staging_your_api_key',
        'Content-Type': 'application/json',
      },
    }
  );
  ```
</RequestExample>

<ResponseExample>
  ```json 200 — KYC retry (automated) theme={null}
  {
    "status": "success",
    "message": "KYC retry initiated successfully",
    "data": {
      "serviceId": "acme-user-abc123",
      "applicationStatus": "pending",
      "retryCount": 1
    }
  }
  ```

  ```json 200 — Persona retry theme={null}
  {
    "status": "success",
    "message": "KYC retry initiated successfully",
    "data": {
      "serviceId": "acme-user-abc123",
      "verificationUrl": "https://withpersona.com/verify?inquiry-id=inq_abc123...",
      "retryCount": 1
    }
  }
  ```

  ```json 400 — Not retryable theme={null}
  {
    "status": "error",
    "message": "NOT_RETRYABLE",
    "data": {
      "error": "User KYC is not in a failed state"
    }
  }
  ```

  ```json 400 — Retry limit reached theme={null}
  {
    "status": "error",
    "message": "RETRY_LIMIT_REACHED",
    "data": {
      "error": "Maximum KYC retry attempts reached (3). Contact support."
    }
  }
  ```

  ```json 404 — User not found theme={null}
  {
    "status": "error",
    "message": "USER_NOT_FOUND",
    "data": {
      "error": "User not found"
    }
  }
  ```
</ResponseExample>

## Response Fields

The response varies based on the retry path:

| Field               | Type   | Description                                                             |
| ------------------- | ------ | ----------------------------------------------------------------------- |
| `serviceId`         | string | The user's service ID                                                   |
| `applicationStatus` | string | KYC application status (automated retries)                              |
| `verificationUrl`   | string | Persona verification URL (returned when Persona KYC needs to be redone) |
| `retryCount`        | number | Total number of retries attempted for this user                         |

## After Retry

* **If `verificationUrl` is returned**: Redirect the user to complete Persona KYC again
* **If `applicationStatus` is returned**: The retry is fully automated — listen for [KYC webhook events](/webhooks#kyc-events) for the outcome
* In both cases, you'll receive the same webhook events as the original user creation flow
