Browse help guides
KYC
Create a user with KYC
The New user form with a default KYC method: person or company first, identity, Create — plus what happens when Sumsub fails.
How it should feel
- Once: Settings → Sumsub (token, secret, level name) → make Sumsub the default method.
- Every new user: choose Person or Company → fill in identity → Create.
- The footer always offers two ways out: Create without KYC, and Use manual KYC instead.
flowchart TD
A["New user"] --> B["Person or company"]
B --> C["Identity fields"]
C --> D{"Default KYC method"}
D -->|"Sumsub"| E["Create Sumsub applicant + link"]
D -->|"Manual"| F["Manual KYC on the same submit"]
D -->|"Skip / footer"| G["User only, Not started"]
E -->|"ok"| H["User page + copy link"]
E -->|"fail"| I["User saved, Not started"]
I --> J["Retry Sumsub"]
I --> K["Continue with manual"]Choose the default once
Settings → Default KYC method. Sumsub can be chosen only while a connection is active.
| Default | What Create does | Primary button |
|---|---|---|
| Sumsub | Saves the user, creates the Sumsub applicant and a 30-minute link. | Create and generate link |
| Manual | Saves the user and your manual KYC decision in one submit. | Create and save KYC |
| No KYC | Saves the user only, at Not started. | Create user |
The New user form
- Users → New user.
- Choose Person or Company. People get first/last name and date of birth; companies get legal name and registration number.
- Fill in identity: email and phone are also sent to Sumsub as hints so it can prefill.
- Check the KYC block. With Sumsub it is a read-only recap: connection, environment, level and what will be sent. With Manual it holds the manual fields.
- Press the primary button — or use the footer: Create without KYC, or Use manual KYC instead (swaps in the manual fields without losing what you typed).
With Sumsub: the happy path
No method step: type → identity → Create → the user page with a live link. The desk does not wait while the client verifies.
sequenceDiagram
actor Staff
participant W as New user form
participant Core as Open Dram
participant API as Sumsub
participant Led as Ledger
Staff->>W: person or company
Staff->>W: name, email, phone, residency, reg. no.
Staff->>W: Create
W->>Led: user saved
W->>Core: start Sumsub
Core->>API: POST /resources/applicants?levelName
API-->>Core: applicantId
Core->>Led: applicant.created (sumsub)
Core->>API: POST websdkLink
API-->>Core: link
Core->>Led: applicant.link_issued
Core-->>W: user page + link + expiry
Staff->>Staff: copy link to clientsequenceDiagram
actor Staff
participant Desk
participant Sumsub
actor Client
Staff->>Desk: Create user
Desk->>Sumsub: applicant + hosted link
Desk-->>Staff: link
Staff->>Client: send link
Client->>Sumsub: documents + liveness
Sumsub-->>Desk: webhook or Fetch
Desk-->>Staff: badge approvedsequenceDiagram
actor Client
participant Sumsub
participant Hook as Fetch status (or webhook)
participant Core as Open Dram
participant Led as Ledger
Client->>Sumsub: opens link, documents + liveness
Sumsub->>Hook: review finished
Hook->>Core: map GREEN / RED
Core->>Led: applicant.status_changed
Note over Led: Approved, Needs documents or RejectedThe badge moves Link sent → Pending → Approved, Needs documents or Rejected. The access token used to make the link is never stored; the link itself and its expiry are.
When Sumsub fails
The user is always kept. The user page says: “User saved. Sumsub did not start. Retry the link or finish KYC manually.”
flowchart TD
A["Create, default Sumsub"] --> B{"Create Sumsub applicant"}
B -->|"401 / bad level / network"| C["Show the error"]
C --> D["User is still saved"]
D --> E["User page: Not started"]
E --> F["Retry Sumsub"]
E --> G["Continue with manual"]
F --> B
G --> H["Manual KYC form on this user"]
H --> I["applicant.created (manual)"]
B -->|"link failed after applicant exists"| J["User saved, applicant Not started"]
J --> F
B -->|"200"| K["Happy path"]| What went wrong | What you see | What is recorded |
|---|---|---|
| Token rejected (401) | “Token rejected. Open Settings and check the Sumsub keys.” | The user only. |
| Unknown level (400) | The exact level name that Sumsub did not recognise. | The user only. |
| Timeout or failure after the applicant was created | The KYC panel offers Retry Sumsub; retry reuses the same applicant. | The user + applicant.created. |
| Sumsub already has this user | Open Dram attaches the existing Sumsub applicant instead of creating another. | applicant.created for the existing applicant. |
| No internet | “Could not reach Sumsub.” | The user only. |
Manual KYC
- Decision: Pending (default), Needs documents, Approved or Rejected.
- AML screening: Unknown (default), Clear, Review or Hit.
- Document type, country and valid-until date.
- Name and date of birth on the document — prefilled from the identity you typed.
- Reason — required when rejecting.
- No file upload is required; you can attach files on the user's Files tab.
flowchart TD
A["New user"] --> B["Type + identity"]
B --> C["Manual KYC fields on the same submit"]
C --> D["User saved"]
D --> E["applicant.created (manual)"]
E --> F["applicant.status_changed"]
F --> G["Badge = chosen status"]Create without KYC
Only the user is saved, at Not started. KYC can start later from the user page. Booking stays locked for operators.
flowchart LR
A["New user"] --> B["Type + identity"]
B --> C["User saved"]
C --> D["Badge: Not started"]
D --> E["Start Sumsub later"]
D --> F["Start manual later"]
D --> G["Book trade"]
G --> H{"Desk role + status"}
H -->|"operator"| I["Locked"]
H -->|"compliance / owner"| J["Override + reason, then post"]The user page afterwards
- The KYC badge from the current record.
- Sumsub: the link with Copy and its expiry, Fetch status, and Generate new link when the link expired or documents are needed.
- Use manual instead: records a manual decision that becomes the current record.
- Approve with override (compliance and owner only).
- KYC history: every event, newest first, with the desk role that did it.
Something missing or out of date? Send feedback.
