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

# Universal KYC

> Submit identity verifications you have completed with your own KYC provider, along with the supporting documents, for Reap to review.

Universal KYC lets you bring verifications from your own KYC provider. You submit the full verified data pack and the supporting documents, and Reap reviews them and returns a decision. Use this when you run your own KYC and want Reap to review those results rather than run the verification itself.

This is one of Reap's verification methods and applies if your project is configured for it. See the [KYC overview](/compliance/kyc/overview) for the shared status model and how methods are assigned.

<Note>
  Unlike [Sumsub Token Sharing](/compliance/kyc/sumsub-token-sharing), which imports an existing verification without re-review, Universal KYC is reviewed by Reap. The user passes through `AWAITING_DOCUMENTS` and `IN_REVIEW` before a decision.
</Note>

***

## How it works

Universal KYC has two steps: submit the data pack, then upload the supporting documents. Reap reviews the complete submission and delivers the decision to your webhook endpoint.

1. Submit the verified data pack by advancing the user's application. Reap responds with `AWAITING_DOCUMENTS` and the list of documents to upload.
2. Upload each document. When the last required document is received, the application moves to `IN_REVIEW`.
3. Reap reviews the submission and sends the decision by webhook.

```mermaid theme={null}
sequenceDiagram
    participant BE as Your backend
    participant Reap as Reap API

    BE->>Reap: Create user
    Reap-->>BE: userId
    BE->>Reap: Advance application (data pack)
    Reap-->>BE: status AWAITING_DOCUMENTS + documents to upload
    BE->>Reap: Upload documents
    Reap-->>BE: status IN_REVIEW
    Reap-->>BE: USER_APPLICATION_STATUS_UPDATED (APPROVED / REJECTED / RETRY_REQUIRED)
```

***

## Step 1: Submit the data pack

[Advance the user's application](/api-reference/users/advance-the-user-application) with the `UNIVERSAL_KYC` method and the verified data you hold for the user:

* **Identity**: legal name, date of birth, and nationality.
* **Document metadata**: the type, number, and issuing country of the identity document and the proof of address.
* **Address**: the user's residential address.
* **Liveness**: the result of your liveness check.
* **Provider result**: the name of your KYC provider and the outcome it returned.

See the [advance endpoint reference](/api-reference/users/advance-the-user-application) for the exact fields.

On success the user moves to `AWAITING_DOCUMENTS`, and the response `nextAction` lists the documents you need to upload.

<Note>
  You submit document metadata (type, number, country) in the data pack. The document files themselves are uploaded separately in Step 2.
</Note>

***

## Step 2: Upload the documents

The advance response's `nextAction.documents` lists the documents to provide, each with a `type` and its current upload state. [Upload the documents](/api-reference/users/upload-application-documents) as multipart form data, one document type per request:

* `documentType`: which document this request is for, one of the pending types in `nextAction.documents` (`IDENTITY`, `PROOF_OF_ADDRESS`, or `CURP`).
* `files`: the file or files for that document. Send more than one to cover multiple pages, or the front and back of a card.

Send one request per document type, in any order. Each response returns the updated status and the documents still outstanding in `nextAction`. When the last required document is received, the application moves to `IN_REVIEW` and Reap begins its review.

### File requirements

* Accepted formats: JPEG, PNG, GIF, PDF, Word (DOC, DOCX), Excel (XLS, XLSX), and CSV.
* Maximum size: 10 MB per file.
* Up to 15 files per request, and 30 MB total per request.

***

## Mexico card programs

Card programs that issue in Mexico require extra jurisdiction data in the data pack. Include the `jurisdictionDetails` object when you advance the application, with `jurisdiction` set to `MX` and the Mexico-specific fields (country of birth, economic activity, the issuer of the government identity document, and a beneficial-ownership attestation).

For Mexican nationals, the contact and identifier fields (phone, email, tax ID, and CURP) are required, and a `CURP` document must be uploaded alongside the identity and proof-of-address documents. For applicants who are not Mexican nationals, those fields are optional and no CURP document is needed.

See the [advance endpoint reference](/api-reference/users/advance-the-user-application) for the exact `jurisdictionDetails` fields.

<Note>
  `jurisdictionDetails` applies only to Mexico card programs. Submitting it on a program that does not issue in Mexico is rejected, and omitting it on a Mexico program is rejected.
</Note>

***

## How statuses update

Universal KYC uses two statuses the other methods do not:

* `AWAITING_DOCUMENTS`: the data pack was accepted and Reap is waiting for the supporting documents.
* `IN_REVIEW`: all required documents are in and Reap is reviewing.

From there the outcome is the same as the other methods: `APPROVED`, `REJECTED`, or `RETRY_REQUIRED`. Reap emits a `USER_APPLICATION_STATUS_UPDATED` event on each transition. See [Application statuses](/compliance/kyc/overview#application-statuses) for the full model.

***

## Handling the decision

When review completes, Reap sends a `USER_APPLICATION_STATUS_UPDATED` event (see the [event reference](/api-reference/user-application-status-updated)). Handle `application.status` as described in the [status model](/compliance/kyc/overview#application-statuses). Surface `application.rejectionReason` to the user on both `REJECTED` and `RETRY_REQUIRED`.

For Universal KYC, `RETRY_REQUIRED` means the user can try again: advance the application again with a corrected data pack, then re-upload any documents the review flagged. Uploads add to the existing set, so you only need to resend what changed.

***

## Constraints

* **The data pack comes before the documents.** Advance the application first. Uploading documents before the pack is submitted is rejected.
* **Required documents depend on the user.** Every user needs an identity document and a proof of address. Mexican nationals on a Mexico card program also need a CURP document.
* **Uploading a document type that is not required is rejected.** Upload only the types listed in `nextAction`.

***

## Testing in sandbox

In the sandbox environment, run the two-step flow above, then simulate the decision instead of waiting for a real review: call [Simulate user application status](/api-reference/simulation/simulate-user-application-status) with `APPROVED` or `REJECTED`. The result arrives on the `USER_APPLICATION_STATUS_UPDATED` webhook, so wait for it rather than polling.

***

## Get started

Universal KYC is enabled per program. Talk to your Reap account manager to enable it for your project. Once enabled, follow the two-step flow above.
