Verification (KYB)
Run corporation verification through the SumSub SDK and track which capabilities each level unlocks.
Before You Start
Read the following guides before proceeding:
| Guide | Why |
|---|---|
| Getting Started | Platform overview and setup |
| Api Basics | Required headers and request configuration |
| Authentication | How to obtain the corporation token |
| Registering a Corporation | The corporation must exist before it can be verified |
| Capabilities | What each verification level unlocks |
Overview
Verification (KYB) is performed by the corporation itself, inside the SumSub SDK. Wirex issues the SDK
token; your application hosts the SDK; SumSub collects company documents, ownership structure and
director identities. Wirex advances the corporation's verification status as the review progresses.
A corporation carries one status per level, not a single global status. SDD unlocks one set of
capabilities; XDDBridgeBase, XDDOpenPaydBase and EDD unlock others. A corporation can hold SDD
as Approved while EDD is still Applied.
There is no API-side data submission path. Everything the reviewer sees comes from the SDK session.
Verification Levels
| Level | Covers |
|---|---|
SDD | Standard due diligence — company information, registration documents, ownership structure, and identity checks on directors and beneficial owners |
EDD | Enhanced due diligence — additional checks on the corporation, its directors and its beneficial owners |
XDDBridgeBase | Extra due diligence required by the Bridge provider — a short questionnaire for the corporation, its directors and beneficial owners |
XDDOpenPaydBase | Extra due diligence required by the OpenPayd provider — same shape, different provider |
N/A | No verification required. Not a level you can request |
Which levels a capability requires depends on the corporation's registration country. Read the
requirement from the capability itself rather than assuming — verification_requirements on each entry
of GET /api/v1/corporations lists the levels and the order they are expected in.
Verification Statuses
None → Pending → Applied → InReview → Approved
↓
Rejected / Canceled
| Status | Description |
|---|---|
None | No verification started |
Pending | Verification created, not yet submitted |
Applied | The corporation submitted its documents |
InReview | Under review by the verification provider |
Approved | Passed. Capabilities gated on this level become available |
Rejected | Failed. Contact Wirex before resubmitting |
Canceled | Withdrawn or superseded |
Only Approved counts. A level in any other status is treated as not passed by capability evaluation.
Step 1: Request an SDK Token for a Level
POST /api/v1/corporations/level-token
Requires Su. This is a superuser-only endpoint and cannot be delegated to a custom role.
Request body:
{
"verification_level": "SDD"
}| Field | Type | Required | Description |
|---|---|---|---|
verification_level | string | Yes | SDD, EDD, XDDBridgeBase or XDDOpenPaydBase |
Response:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}| Field | Description |
|---|---|
token | SumSub SDK token. Pass it to the SDK to open the verification session |
An unrecognised
verification_levelsilently produces anSDDtoken. Only the literal value
N/Ais rejected, with400 ErrorInvalidFieldand
Verification level cannot be 'None' for this request. Any other unknown string — including an empty
one, a lowercasesdd, or a typo such asXDDBridge— falls through toSDD, and the corporation
ends up in the wrong review. Send one of the four documented values exactly as written.
Code
const response = await fetch(`${baseUrl}/api/v1/corporations/level-token`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${corporationToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ verification_level: 'SDD' })
});
const { token: sdkToken } = await response.json();response = requests.post(
f"{base_url}/api/v1/corporations/level-token",
headers={
"Authorization": f"Bearer {corporation_token}",
"Content-Type": "application/json",
},
json={"verification_level": "SDD"},
)
sdk_token = response.json()["token"]body, _ := json.Marshal(map[string]string{"verification_level": "SDD"})
req, _ := http.NewRequest("POST", baseURL+"/api/v1/corporations/level-token", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer "+corporationToken)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var tokenResp struct {
Token string `json:"token"`
}
json.NewDecoder(resp.Body).Decode(&tokenResp)Step 2: Open the SDK Session
Initialise the SumSub Web or Mobile SDK with the token from Step 1. The session runs entirely in the
SDK; Wirex receives the outcome from the provider.
Tokens are short-lived. Request a fresh one when the SDK reports an expired token rather than caching
it across sessions.
Step 3: Track the Result
Verification progress arrives two ways.
Webhook — POST {your_webhook_base_url}/v2/webhooks/corporations on each corporation change,
carrying the new verification_status. See Webhooks.
Read — GET /api/v1/corporations returns the per-level detail the webhook does not carry:
{
"verification_status": "InReview",
"verification_levels": [
{ "level": "SDD", "status": "Approved" },
{ "level": "EDD", "status": "InReview" }
],
"passed_levels": ["SDD"],
"capabilities": [
{
"type": "SepaAccount",
"status": "ActivationNotStarted",
"status_reason": "Account should be activated in order to use this capability",
"verification_requirements": [{ "type": "SDD", "order": 1 }],
"prerequisites": []
}
]
}| Field | Description |
|---|---|
verification_status | The corporation's overall KYB status |
verification_levels[] | Per-level status. The authoritative source |
passed_levels[] | Levels passed. Obsolete — it will be removed in a future release; read verification_levels instead |
capabilities[].verification_requirements[] | Levels this capability requires, with the order they are expected in |
SDD Shorthand
POST /api/v1/corporations/verification-token
Requires Su. Takes an empty body and returns an SDK token for SDD — it is
POST /api/v1/corporations/level-token with verification_level hard-wired to SDD.
{}Use level-token for new integrations; it covers every level, including SDD.
What Happens Next
- The corporation completes the SDK session; its level status moves to
Applied. - The provider reviews; the level status moves to
InReview. - On approval, the level status becomes
Approvedand the on-chain verification status is advanced by
the Wirex oracle. - Capabilities whose
verification_requirementsare now satisfied move offNotFulfilled. Most then
readActivationNotStarted— verification unlocks a capability, it does not activate it. Bank
account capabilities still needPOST /api/v1/bank/accounts; see
Activating Bank Account Details. - A corporation whose profile status reaches
Activecan use its approved capabilities.
Limitations
- There is no endpoint to submit or amend KYB data through the API. Everything is collected in the SDK.
- There is no endpoint to cancel or restart a verification. A
Rejectedlevel requires Wirex
intervention. - Employee-level identity verification is not exposed by the Corporate API. Employee records carry
personal data for card embossing and delivery, not a verification status you can drive.
Error Handling
{
"error_reason": "ErrorInvalidField",
"error_description": "Verification level cannot be 'None' for this request",
"error_category": {
"category": "CategoryValidationFailure",
"http_status_code": 400
},
"error_details": [
{ "key": "field", "details": "verification_level" }
]
}Validation Errors (400)
| Error Reason | Error Details | Description | Resolution |
|---|---|---|---|
ErrorInvalidField | field: verification_level | verification_level was N/A | Send SDD, EDD, XDDBridgeBase or XDDOpenPaydBase |
Permission Errors (403)
| Error Reason | Description | Resolution |
|---|---|---|
ErrorPermissionDenied | User does not have required permissions | Both token endpoints require Su. Log in as the corporation owner |
Server Errors (500)
| Error Reason | Description | Resolution |
|---|---|---|
ErrorGeneral | Failed to get verification token | The corporation is not eligible for this level, or the provider rejected the request. Read GET /api/v1/corporations and check the level is not already Approved |
ErrorGeneral | Failed to get corporation id from context | The corporation token is malformed — log in again |
Updated 20 days ago

