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

> Submit a verified business pack and supporting documents for Reap to review.

Universal KYB lets you bring business verification you have already completed. You submit the company pack and supporting documents, and Reap reviews them and returns a decision. Use this when your project is configured for Universal KYB.

This is one of Reap's company verification methods. See the [KYB overview](/compliance/kyb/overview) for the shared company statuses. Managed KYB (hosted session) is unchanged: send `redirectUri` to [Advance company application](/api-reference/companies/advance-company-application) and use `sessionUrl`.

***

## How it works

1. Create a company.
2. Submit the Universal KYB pack on [Advance company application](/api-reference/companies/advance-company-application) with `method: UNIVERSAL_KYB`. The first call creates the application. Later calls with the same method amend it.
3. Upload each outstanding document from `nextAction`. Company documents use [Upload application documents](/api-reference/companies/upload-application-documents). Beneficial-owner identity documents use [Upload related person documents](/api-reference/companies/upload-related-person-documents).
4. When `nextAction.type` is `SUBMIT`, call [Submit company application](/api-reference/companies/submit-company-application). The company moves to `IN_REVIEW`.
5. Reap reviews the application and sends `COMPANY_STATUS_UPDATED`.

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

    BE->>Reap: Create company
    Reap-->>BE: companyId
    BE->>Reap: Advance application (UNIVERSAL_KYB pack)
    Reap-->>BE: nextAction DOCUMENT_UPLOAD
    BE->>Reap: Upload company and UBO documents
    Reap-->>BE: nextAction SUBMIT
    BE->>Reap: Submit application
    Reap-->>BE: company IN_REVIEW
    Reap-->>BE: COMPANY_STATUS_UPDATED (ACTIVE / REJECTED / ACTION_REQUIRED)
```

Submit is explicit. Uploading the last required document does not lock the application, so you can still add optional documents such as `REGISTER_OF_DIRECTORS` and `BUSINESS_REGISTRY`.

***

## Pack

Send `method: UNIVERSAL_KYB` plus the verified business data: legal name, legal form, registration number, registered and operating addresses, email domains, line of business, and at least one beneficial owner. Both addresses require `line2`. Optional `ddq` and `edd` objects are accepted when you have them.

Declared ownership may sum to less than 100. A sum above 100 is rejected.

`nextAction` lists what is still required:

* `DOCUMENT_UPLOAD` with the outstanding company documents and any outstanding `UBO_IDENTITY` items (`relatedPersonId` + `uboDocumentType`)
* `SUBMIT` when required uploads are complete
* `null` after submit, or for Managed KYB

***

## Documents

Upload one document type per request.

### Company documents

Required before submit: `CERTIFICATE_OF_INCORPORATION`, `COMPANY_PROFILE`, `SHAREHOLDING_CHART`. Optional: `REGISTER_OF_DIRECTORS`, `BUSINESS_REGISTRY`, `SOURCE_OF_FUNDS`, `SOURCE_OF_WEALTH`.

Accepted formats: JPEG, PNG, GIF, PDF, Word (DOC, DOCX), Excel (XLS, XLSX), and CSV. Maximum 5 files per request and 5 MB total.

### Beneficial-owner documents

Each declared identity-document type needs a file on that related person. Accepted formats: JPEG, PNG, and PDF only. Maximum 2 files per request (front, then back) and 5 MB total.

***

## Incomplete submissions

If you submit before every required document is uploaded, the API returns `400` with `code: COMPANY_APPLICATION_INCOMPLETE`, plus `missing` and `invalid`, so you can fix every gap in one pass. When the outstanding items are documents, `documents` lists each one in the same shape as `nextAction.documents`, including `relatedPersonId` and `uboDocumentType` for beneficial-owner documents.

***

## Testing in sandbox

Simulation runs the same completeness check and sends the same `COMPANY_STATUS_UPDATED` webhook as a real review.

1. Submit a complete application as described in [How it works](#how-it-works).
2. Call [Simulate company status](/api-reference/simulation/simulate-company-status) with `ACTIVE`, `REJECTED`, `ACTION_REQUIRED`, or `CANCELLED`.
3. Wait for `COMPANY_STATUS_UPDATED`. The simulate call returns `204` and the new status arrives with the webhook.

Simulating before submit returns `SIMULATION_INVALID_STATE`. `IN_REVIEW` cannot be simulated because submit produces it. `ACTIVE` does not need `applicationDetails`. Reap uses the submitted application.

***

## Managed KYB

Projects configured for Managed KYB keep the existing flow. Send only `redirectUri` (or `method: MANAGED_KYB` with `redirectUri`). The response still includes `sessionUrl`. `nextAction` is `null`. Get and list application stay the same resource shape.


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