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

# KYC reject codes

> The KYC error codes from the original data dictionary, broken out into the KYC domain; 60+ reject codes grouped into buckets, plus actionable columns.

## Guide

Whether your user simply needs to retake a blurry photo or has hit a compliance red line and cannot go any further, a single `errorCode` field tells you three things — whether to let the user try again, exactly what the user should do, and whether a resubmission is still possible — so that every KYC rejection becomes clear guidance rather than a vague "verification failed". As a licensed card issuer, DCS normalises the dozens of rejection reasons coming from the underlying KYC vendors into one stable set of error codes that you can consume directly in your own product.

### Where the reject code appears

When a KYC ticket's `status` moves to `REJECTED`, the response carries a pair of fields describing the reason:

| Field          | Type   | Description                                                                                              |
| -------------- | ------ | -------------------------------------------------------------------------------------------------------- |
| `errorCode`    | String | The normalised reject code; for the values see the [full reject code list](#full-reject-code-list) below |
| `errorMessage` | String | The human-readable text for that `errorCode`, which may be phrased for the end user                      |

The pair appears in the two places below with **identical values**, so you can read whichever channel suits you:

* **Querying the KYC status** (you pull): see [Query KYC status](./query-kyc); the response carries `errorCode` / `errorMessage` when `status=REJECTED`.
* **The KYC\_TICKET webhook** (you receive): DCS pushes a notification whenever the ticket status changes, and the body carries the identically named `errorCode` / `errorMessage` fields (returned only for `REJECTED`). For the structure see [Webhook data structures](../webhooks/events-and-schema).

> **Who does what**: the normalisation is done by **DCS**. You never have to deal with the raw reject codes of the underlying vendor (such as Sumsub) — you only integrate against the one set of `errorCode` values in the tables below. Mapping the raw codes onto this list is DCS's job, and DCS notifies you in advance whenever a new value is added.

### How to use these codes

Once you have an `errorCode`, work through the three steps below, which map onto the "Retryable / What the user should do / Resubmission possible" columns of the tables:

1. **Decide whether it is retryable.** First establish whether the code is fixable (retry) or terminal (no retry). Never push a user to resubmit against a terminal code; they will just be rejected again.
2. **Tell the user what to do.** For fixable codes, turn `errorMessage` or the "What the user should do" column into an in-product prompt (for example, "Please retake your document in better light"). For terminal codes, show one neutral message (for example, "Sorry, this application cannot proceed — please contact support") and **do not echo the specific compliance reason** (a sanctions or PEP hit is sensitive information).
3. **Decide whether a resubmission is possible.** Codes marked "Yes" go through the supplementary-document path (no need to fetch a new Sumsub token, call the resubmission endpoint directly); codes marked "No" mean starting over or stopping.

### Full reject code list

> The tables below regroup every reject code from the data dictionary into **business buckets** and add actionable columns. The `errorCode` values and their descriptions come faithfully from the data dictionary; the bucket, retryability, user guidance and resubmission columns are DCS documentation guidance, and the compliance position prevails in the end.
>
> **Retryable**: ✅ fixable, then retry / ❌ terminal, do not retry / ⚠️ depends (usually a system-side problem — retry later or escalate to a human).

#### Bucket 1 · Document image quality (fixable)

Something is wrong with the image itself (blurred, damaged, missing pages, wrong format); just have the user retake or re-upload it.

| errorCode                        | Description                                                                                                                      | Retryable | What the user should do                                                           | Resubmission possible |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | :-------: | --------------------------------------------------------------------------------- | :-------------------: |
| `POOR_IMAGE_CAPTURE_QUALITY`     | Please retake the photo in better light                                                                                          |     ✅     | Retake the document photo somewhere well lit                                      |          Yes          |
| `DOCUMENT_DAMAGED_OR_UNCLEAR`    | Please upload a clear, undamaged document                                                                                        |     ✅     | Upload a clear, undamaged document                                                |          Yes          |
| `POOR_PHOTO_QUALITY`             | Please upload a clear photo                                                                                                      |     ✅     | Retake and upload a clear photo                                                   |          Yes          |
| `LOW_DOCUMENT_QUALITY`           | Please upload a sharper image                                                                                                    |     ✅     | Upload a higher-resolution image                                                  |          Yes          |
| `DOCUMENT_PAGE_MISSING`          | A required document page is missing                                                                                              |     ✅     | Supply the missing document page                                                  |          Yes          |
| `INCOMPLETE_DOCUMENT_SUBMISSION` | Please upload the complete document                                                                                              |     ✅     | Upload the complete document                                                      |          Yes          |
| `BACK_SIDE_MISSING`              | Please upload the back of the document                                                                                           |     ✅     | Upload the back of the document as well                                           |          Yes          |
| `FRONT_SIDE_MISSING`             | Please upload the front of the document                                                                                          |     ✅     | Upload the front of the document as well                                          |          Yes          |
| `UNSUPPORTED_DOCUMENT_FORMAT`    | Please upload the original document / Please upload a colour copy of the document / Please upload the original physical document |     ✅     | Upload the original physical document in colour, not a re-photograph or photocopy |          Yes          |
| `INVALID_UPLOAD_TYPE`            | Please upload a valid document                                                                                                   |     ✅     | Upload a valid document that meets the requirements                               |          Yes          |
| `SCREENSHOT_DETECTED`            | Please upload the original document                                                                                              |     ✅     | Do not submit a screenshot; photograph the original with the camera               |          Yes          |
| `COLORED_COPY_REQUIRED`          | Please upload a colour document                                                                                                  |     ✅     | Upload it in colour, not a black-and-white photocopy                              |          Yes          |
| `ORIGINAL_DOCUMENT_REQUIRED`     | Please upload the original document                                                                                              |     ✅     | Upload the original physical document, not a re-photograph or photocopy           |          Yes          |

#### Bucket 2 · Document validity / type (partly fixable)

The document itself has expired, its type or template is not supported, or its language is not supported.

| errorCode                                  | Description                                                 | Retryable | What the user should do                 | Resubmission possible |
| ------------------------------------------ | ----------------------------------------------------------- | :-------: | --------------------------------------- | :-------------------: |
| `EXPIRED_DOCUMENT`                         | The document has expired                                    |     ✅     | Use a document that is still valid      |          Yes          |
| `UNSUPPORTED_DOCUMENT_TYPE`                | The document type submitted is not supported                |     ✅     | Use a supported document type instead   |          Yes          |
| `UNSUITABLE_DOCUMENT_SUBMITTED`            | The document type is not supported                          |     ✅     | Use a supported document type instead   |          Yes          |
| `UNSUPPORTED_OR_INVALID_DOCUMENT_TEMPLATE` | The document submitted is invalid                           |     ✅     | Use a supported, valid document instead |          Yes          |
| `INVALID_IDENTIFICATION_DOCUMENT`          | The identity document is invalid                            |     ✅     | Use a valid identity document instead   |          Yes          |
| `DOCUMENT_VALIDATION_FAILED`               | The document could not be validated                         |     ✅     | Re-upload a clear, valid document       |          Yes          |
| `UNSUPPORTED_LANGUAGE`                     | The language of the document submitted is not yet supported |     ✅     | Use a document in a supported language  |          Yes          |
| `UNSUPPORTED_DOCUMENT_LANGUAGE`            | The language of the document submitted is not yet supported |     ✅     | Use a document in a supported language  |          Yes          |

#### Bucket 3 · Supplementary material / incomplete information (fixable via resubmission)

Material is missing or details are incomplete; just prompt the user to supply the rest. **A new Sumsub token is usually not needed.**

| errorCode                                 | Description                                   | Retryable | What the user should do                       | Resubmission possible |
| ----------------------------------------- | --------------------------------------------- | :-------: | --------------------------------------------- | :-------------------: |
| `ADDITIONAL_SUPPORTING_DOCUMENT_REQUIRED` | Supporting documents are required             |     ✅     | Upload the supporting documents requested     |          Yes          |
| `MORE_SUPPORTING_DOCUMENTS_REQUIRED`      | Supporting documents are required             |     ✅     | Upload the supporting documents requested     |          Yes          |
| `INCOMPLETE_APPLICANT_DATA`               | The current information needs to be completed |     ✅     | Complete the application details and resubmit |          Yes          |

#### Bucket 4 · Information mismatch (fixable by checking the details)

What the user entered does not match their document or the reference database; prompt them to check and correct it.

| errorCode                       | Description                                  | Retryable | What the user should do                        | Resubmission possible |
| ------------------------------- | -------------------------------------------- | :-------: | ---------------------------------------------- | :-------------------: |
| `INFORMATION_MISMATCH`          | The information does not match               |     ✅     | Check and correct the details entered          |          Yes          |
| `PROFILE_INFORMATION_MISMATCH`  | The user's details do not match the document |     ✅     | Correct the details so they match the document |          Yes          |
| `SUBMITTED_DATA_MISMATCH`       | The application could not be processed       |     ✅     | Check the details and submit again             |          Yes          |
| `DATABASE_INFORMATION_MISMATCH` | The information could not be verified        |     ✅     | Check the personal details and submit again    |          Yes          |
| `ADDRESS_INFORMATION_MISMATCH`  | Address verification failed                  |     ✅     | Check the address or supply proof of address   |          Yes          |
| `AGE_MISMATCH`                  | The age does not match                       |     ✅     | Check the date of birth and related details    |          Yes          |
| `INVALID_POA`                   | The proof of address is invalid              |     ✅     | Re-upload a valid proof of address             |          Yes          |
| `INVALID_PROOF_OF_ADDRESS`      | Address verification failed                  |     ✅     | Re-upload a valid proof of address             |          Yes          |
| `INVALID_POI`                   | The proof of identity is invalid             |     ✅     | Re-upload a valid proof of identity            |          Yes          |
| `INVALID_PROOF_OF_IDENTITY`     | Identity verification failed                 |     ✅     | Re-upload a valid proof of identity            |          Yes          |
| `INVALID_PROOF_OF_PAYMENT`      | The proof of payment was not accepted        |     ✅     | Re-upload a valid proof of payment             |          Yes          |

#### Bucket 5 · Face / liveness verification (partly fixable)

The face match or liveness check did not pass. Quality problems can be retaken; suspected third-party assistance, multiple people or spoofing is closer to terminal.

| errorCode                              | Description                                                                                        | Retryable | What the user should do                                                            | Resubmission possible |
| -------------------------------------- | -------------------------------------------------------------------------------------------------- | :-------: | ---------------------------------------------------------------------------------- | :-------------------: |
| `FACE_VERIFICATION_FAILED`             | Face verification could not be completed / Face verification failed / Identity verification failed |     ✅     | Have the user redo face verification in person, in good light                      |          Yes          |
| `LIVENESS_CHECK_FAILED`                | The liveness check did not pass                                                                    |     ✅     | Have the user redo the liveness check in person, following the prompts             |          Yes          |
| `THIRD_PARTY_ASSISTANCE_DETECTED`      | Please complete the verification on your own                                                       |     ❌     | Tell the user they must complete it unassisted (terminal — do not retry in a loop) |           No          |
| `IDENTITY_OWNERSHIP_VALIDATION_FAILED` | Please complete the verification in person                                                         |     ❌     | Tell the user they must complete it in person (terminal)                           |           No          |
| `MULTIPLE_PERSONS_DETECTED`            | Please complete the verification on your own                                                       |     ❌     | Tell the user they must complete it alone (terminal)                               |           No          |

#### Bucket 6 · Compliance / risk terminal states (not retryable, show a neutral message)

The application hit a compliance red line such as sanctions, screening, EDD or suspicious behavior, and is **terminal**. Show one neutral message, do not echo the specific reason, and do not prompt a resubmission.

| errorCode                         | Description                                         | Retryable | What the user should do                              | Resubmission possible |
| --------------------------------- | --------------------------------------------------- | :-------: | ---------------------------------------------------- | :-------------------: |
| `NAME_SCREENING_HIT`              | Name screening hit                                  |     ❌     | Show a neutral message and point the user to support |           No          |
| `EDD_REJECTED`                    | Enhanced due diligence rejected                     |     ❌     | Show a neutral message and point the user to support |           No          |
| `SUSPICIOUS_APPLICATION_BEHAVIOR` | Cannot proceed at this time                         |     ❌     | Show a neutral message                               |           No          |
| `SECURITY_VALIDATION_FAILED`      | Cannot proceed at this time                         |     ❌     | Show a neutral message                               |           No          |
| `SECURITY_SCREENING_FAILED`       | Cannot proceed at this time                         |     ❌     | Show a neutral message                               |           No          |
| `SCREENING_UNSUCCESSFUL`          | Cannot proceed at this time                         |     ❌     | Show a neutral message                               |           No          |
| `COMPLIANCE_RESTRICTION`          | Cannot proceed at this time                         |     ❌     | Show a neutral message                               |           No          |
| `SUMSUB_BLOCKED`                  | Cannot proceed at this time; please do not resubmit |     ❌     | Show a neutral message and point the user to support |           No          |
| `BLOCKED`                         | Cannot proceed at this time; please do not resubmit |     ❌     | Show a neutral message and point the user to support |           No          |

#### Bucket 7 · Eligibility / region restrictions (terminal, varies by partner configuration)

The user is outside the supported countries or regions, or fails a partner, age or similar eligibility requirement. Mostly terminal: for that user, retrying will not help.

| errorCode                           | Description                                                                    | Retryable | What the user should do                                             | Resubmission possible |
| ----------------------------------- | ------------------------------------------------------------------------------ | :-------: | ------------------------------------------------------------------- | :-------------------: |
| `OUT_OF_ELIGIBLE_COUNTRIES`         | Outside the supported countries                                                |     ❌     | Tell the user their country is not supported yet                    |           No          |
| `REGION_OR_RESIDENCY_RESTRICTION`   | The current eligibility conditions do not allow this service                   |     ❌     | Tell the user their current circumstances are not supported yet     |           No          |
| `ELIGIBILITY_OR_REGION_RESTRICTION` | This service is not yet available in your region / Cannot proceed at this time |     ❌     | Tell the user their region is not supported yet                     |           No          |
| `FAIL_TO_MEET_DCS_REQUIREMENT`      | Does not meet DCS requirements                                                 |     ❌     | Show a neutral message and point the user to support                |           No          |
| `FAIL_TO_MEET_PARTNER_REQUIREMENT`  | Does not meet the partner's requirements                                       |     ❌     | Word the message as the partner prefers                             |           No          |
| `ELIGIBILITY_REQUIREMENT_NOT_MET`   | Does not meet the requirements                                                 |     ❌     | Show a neutral message                                              |           No          |
| `AGE_REQUIREMENT_NOT_MET`           | Does not meet the eligibility requirements                                     |     ❌     | Tell the user the age requirement is not met                        |           No          |
| `USA_TAX_RESIDENT`                  | This product is not currently offered to US tax residents                      |     ❌     | State clearly that the product is not available to US tax residents |           No          |
| `INCOME_REQUIREMENT_NOT_MET`        | Does not meet the eligibility requirements; please do not resubmit             |     ❌     | Show a neutral message; do not prompt a resubmission                |           No          |
| `CREDIT_ASSESSMENT_FAILED`          | Does not meet the eligibility requirements; please do not resubmit             |     ❌     | Show a neutral message; do not prompt a resubmission                |           No          |
| `UNSUPPORTED_PRODUCT`               | Cannot proceed at this time; please do not resubmit                            |     ❌     | Tell the user this product cannot be applied for right now          |           No          |

#### Bucket 8 · Duplicates / suspected fraud (terminal)

A duplicate application, or suspected forgery or tampering.

| errorCode                         | Description                                                                       | Retryable | What the user should do                                                                   | Resubmission possible |
| --------------------------------- | --------------------------------------------------------------------------------- | :-------: | ----------------------------------------------------------------------------------------- | :-------------------: |
| `DUPLICATE_APPLICATION_DETECTED`  | An application record already exists                                              |     ❌     | Tell the user an application already exists and not to submit again                       |           No          |
| `INVALID_OR_DUPLICATE_SUBMISSION` | The information submitted could not be verified                                   |     ❌     | Show a neutral message                                                                    |           No          |
| `REAPPLICATION_PERIOD_NOT_MET`    | After a card is closed you must wait out the cooling-off period before reapplying |     ❌     | Tell the user explicitly to wait until the cooling-off period ends, so they stop retrying |           No          |

#### Bucket 9 · Verification could not complete / data source problem (depends)

The application data could not be verified, or an upstream data source or database was unavailable. Separate "the user needs to check something" from "retry later, it is on the system side".

| errorCode                          | Description                                                                        | Retryable | What the user should do                                              | Resubmission possible |
| ---------------------------------- | ---------------------------------------------------------------------------------- | :-------: | -------------------------------------------------------------------- | :-------------------: |
| `APPLICANT_DATA_VALIDATION_FAILED` | The information submitted could not be verified / Cannot proceed at this time      |     ⚠️    | Check the details and retry; escalate to support if it keeps failing |        Depends        |
| `APPLICANT_DATA_NOT_FOUND`         | The information could not be verified                                              |     ⚠️    | Check the personal details and retry                                 |        Depends        |
| `VERIFICATION_INCOMPLETE`          | Verification could not be completed                                                |     ⚠️    | Go through the verification flow again                               |        Depends        |
| `VERIFICATION_CHECK_UNAVAILABLE`   | System error                                                                       |     ⚠️    | Retry later (system-side problem)                                    |        Depends        |
| `CONNECTIVITY_OR_SERVICE_ERROR`    | System error                                                                       |     ⚠️    | Retry later (system-side problem)                                    |        Depends        |
| `DATA_SOURCE_UNAVAILABLE`          | System error                                                                       |     ⚠️    | Retry later (system-side problem)                                    |        Depends        |
| `TIMEOUT`                          | The request timed out because no response arrived within the configured time limit |     ⚠️    | Retry later; escalate to support if it keeps failing                 |        Depends        |
| `OTHER_VALIDATION_ISSUE`           | The application cannot be processed for now                                        |     ⚠️    | Retry later or contact support                                       |        Depends        |

#### Bucket 10 · Share token / reusable KYC (mostly retryable)

Reject reasons specific to the Sumsub share token or reusable KYC path. Most are token or session problems that a fresh attempt fixes; the channel-capability ones are terminal.

| errorCode                            | Description                                           | Retryable | What the user should do                                    | Resubmission possible |
| ------------------------------------ | ----------------------------------------------------- | :-------: | ---------------------------------------------------------- | :-------------------: |
| `INVALID_SHARE_TOKEN`                | The share token is invalid or has expired             |     ✅     | Obtain a fresh share token and submit again                |          Yes          |
| `SHARE_TOKEN_FAILED`                 | The share token is invalid or has expired             |     ✅     | Obtain a fresh share token and submit again                |          Yes          |
| `INVALID_VERIFICATION_SESSION`       | Please restart the verification flow                  |     ✅     | Guide the user through the verification from the beginning |          Yes          |
| `VERIFICATION_PROCESSING_TIMEOUT`    | Please restart the verification flow                  |     ✅     | Guide the user through the verification from the beginning |          Yes          |
| `REUSABLE_INCOMPATIBLE_DOCUMENT`     | The document type is not compatible                   |     ✅     | Re-verify with a supported document type                   |          Yes          |
| `REUSABLE_KYC_NOT_ENABLED`           | Reusable KYC is not supported at the moment           |     ❌     | Use the regular KYC flow; contact DCS to have it enabled   |           No          |
| `REUSABLE_VERIFICATION_NOT_ELIGIBLE` | The applicant's data is not eligible for reusable KYC |     ❌     | Use the regular KYC flow                                   |           No          |

#### Bucket 11 · Submission not completed within the time window (TIMEOUT\_\*)

The `TIMEOUT_` prefix always means **the same thing**: the user failed to complete the submission to Sumsub within the allotted time window, so the request was terminated on timeout. The suffix only tells you which step it was on when it timed out — it does **not** mean that check actually failed.

<Warning>
  Troubleshooting tip: these codes account for a non-trivial share of rejections and are easily misread as "there is something wrong with the user's documents". When you see `TIMEOUT_*`, treat it as a **timeout** first — have the user start again and finish promptly, rather than asking them to re-supply whatever the suffix names.
</Warning>

| errorCode                                   | Timed out during            | Retryable | What the user should do                              | Resubmission possible |
| ------------------------------------------- | --------------------------- | :-------: | ---------------------------------------------------- | :-------------------: |
| `TIMEOUT_INVALID_PROOF_OF_IDENTITY`         | Proof-of-identity check     |     ✅     | Start again and complete the submission promptly     |          Yes          |
| `TIMEOUT_INVALID_PROOF_OF_ADDRESS`          | Proof-of-address check      |     ✅     | Start again and complete the submission promptly     |          Yes          |
| `TIMEOUT_DOCUMENT_VALIDATION_FAILED`        | Document validation         |     ✅     | Start again and complete the submission promptly     |          Yes          |
| `TIMEOUT_DOCUMENT_PAGE_MISSING`             | Document completeness check |     ✅     | Start again and complete the submission promptly     |          Yes          |
| `TIMEOUT_EXPIRED_DOCUMENT`                  | Document expiry check       |     ✅     | Start again and complete the submission promptly     |          Yes          |
| `TIMEOUT_POOR_PHOTO_QUALITY`                | Photo quality check         |     ✅     | Start again and complete the submission promptly     |          Yes          |
| `TIMEOUT_SCREENSHOT_DETECTED`               | Screenshot detection        |     ✅     | Start again and complete the submission promptly     |          Yes          |
| `TIMEOUT_FACE_VERIFICATION_FAILED`          | Face verification           |     ✅     | Start again and complete the submission promptly     |          Yes          |
| `TIMEOUT_AGE_REQUIREMENT_NOT_MET`           | Age eligibility check       |     ✅     | Start again and complete the submission promptly     |          Yes          |
| `TIMEOUT_ELIGIBILITY_OR_REGION_RESTRICTION` | Eligibility / region check  |     ✅     | Start again and complete the submission promptly     |          Yes          |
| `TIMEOUT_SUMSUB_BLOCKED`                    | Vendor risk check           |     ⚠️    | Start again; escalate to support if it keeps failing |        Depends        |

#### Bucket 12 · Other

| errorCode                 | Description                    | Retryable | What the user should do                                   | Resubmission possible |
| ------------------------- | ------------------------------ | :-------: | --------------------------------------------------------- | :-------------------: |
| `UNSATISFACTORY_DOCUMENT` | The document is not acceptable |     ✅     | Re-upload a document that meets the requirements          |          Yes          |
| `OTHERS`                  | Other reason                   |     ⚠️    | Judge from `errorMessage`; escalate to support if unclear |        Depends        |

### Integration advice

* **Branch on `errorCode`, never hard-code `errorMessage` text.** `errorMessage` may change between versions or be localised; base your program logic on `errorCode` and use either `errorMessage` or your own copy from these tables for display.
* **Treat `errorMessage` as multilingual.** Do not assume which language it comes back in. Program branches always follow `errorCode`; for display, use your own copy from these tables or localise `errorMessage` as a fallback.
* **Handle unknown codes.** Values are added to and removed from these tables as compliance policy evolves. Keep a fallback branch for any `errorCode` outside the known list (handle it as `OTHERS` and raise an alert) so that a new code never breaks your front end.
* **Do not retry terminal codes in a loop.** Buckets 6, 7 and 8 are terminal; resubmitting is pointless and may itself trigger risk controls. Show one neutral message and point the user to support.
* **Resubmissions do not need a new token.** Where a resubmission is possible, such as proof of address (POA), supply the material through the resubmission path described in [Apply for KYC](./apply-kyc); you usually do not need a fresh Sumsub share token.

***

## Next steps

* How to guide a user through a resubmission once you have the reject code: back to [Apply for KYC](./apply-kyc).
* Polling the ticket status yourself and parsing `errorCode`: see [Query KYC status](./query-kyc).
* Letting users supply missing documents on a hosted page: see [H5 KYC guide page](./h5-kyc-guidance).
