Applicant status (GetApplicantProgress)
Read where a user is in the KYC workflow. The GetApplicantProgress request, its response shape, and the enum vocabulary every status field uses.
GetApplicantProgress answers "where is this user in the workflow?". It is the endpoint the SDK itself
polls, and the one to call from your backend whenever you need status on demand.
Call it after onComplete fires, and whenever you render a status badge. For the push side, subscribe to
webhooks instead of polling on a timer.
GET {baseUrl}/api/Applicant/GetApplicantProgress?applicantId={id}&fetchStepInfo={bool}Request
| Parameter | Type | Required | Description |
|---|---|---|---|
applicantId | long | yes | The applicant ID returned by createToken. |
fetchStepInfo | bool | no | true re-evaluates and returns full localized step metadata. |
Use fetchStepInfo=true on first load and when the user changes language. Ordinary polling uses false,
which keeps the call cheap.
| Header | Value |
|---|---|
Authorization | Bearer {accessToken} |
Accept-Language | ISO 639-1 locale (en, de, ar). Controls localized step copy. |
Abp-TenantId / ClientId | Tenant scope. |
Response
{
"success": true,
"result": {
"applicantId": 1248,
"externalUserId": "USER-12345",
"workFlowKey": "INDIVIDUAL_FULL_KYC",
"workflowResult": "InProgress",
"riskLevel": "LowRisk",
"kycStatus": "Pending",
"reviewStatus": "InProgress",
"nextWorkflowKey": null,
"nextWorkflowName": null,
"status": "InProgress",
"customMessage": "",
"customMessageDE": "",
"currentStep": {
"order": 2,
"action": "Questionaries",
"name": "QuestionnaireStep",
"title": "Knowledge questionnaire",
"description": "Please answer the following questions"
},
"flowSteps": [ /* every step in this workflow, same shape */ ],
"stepInfoList": [ /* full localized info, only when fetchStepInfo=true */ ]
}
}For a status badge there is a lighter variant that skips the step metadata entirely.
Do not grant access on kycStatus alone
kycStatus is the identity verdict. Whether a customer may trade also depends on review and risk
outcomes, so gate on your own backend's reading of the full result, never on a browser callback.
Enum reference
Every status field above uses one of these vocabularies.
ApplicantProgressStatus
| Value | Numeric | Meaning |
|---|---|---|
None | 0 | Not started. |
InProgress | 1 | Workflow is active on a step. |
Finished | 2 | Workflow tree complete. |
OnHold | 3 | Paused for manual review, document review, or representative KYC. |
IdentityPending | 4 | Submitted to the ID provider, waiting on their webhook. |
ReviewStatus
| Value | Meaning |
|---|---|
New | Just created, no decisions yet. |
InProgress | Workflow running. |
UnderReview | Waiting on the admin team. |
AdminReview | Routed to an admin for an explicit decision. |
Approved | Final state, passed. |
Reject | Final state, failed. |
Closed | Final state, archived. |
KycStatus
| Value | Numeric |
|---|---|
None | 0 |
Pending | 1 |
Approved | 2 |
Rejected | 3 |
ResendRequested | 4 |
RiskLevel
| Value | Numeric |
|---|---|
LowRisk | 0 |
MediumRisk | 1 |
HighRisk | 2 |
Alert | 3 |
WorkflowResultType
| Value | Numeric |
|---|---|
NotStarted | 0 |
InProgress | 1 |
Success | 2 |
PartialSuccess | 3 |
Failed | 4 |
Skipped | 5 |
AdminReview | 6 |
SkippedAndAdminReview | 7 |
WorkflowStepAction
| Value | Numeric |
|---|---|
IdentitySdk | 0 |
RiskScoring | 1 |
Questionaries | 2 |
AdditionalData | 3 |
AppropriatenessTest | 4 |
UploadDocument | 5 |
ManualReview | 6 |
Overview | 7 |
Questionaries and OnHoldPrgocess keep their original spelling for backwards compatibility. Match them
exactly.
KYC integration (MetaKYC SDK)
Embed Assetera's KYC flow with the @asseteragmbh/metakyc React SDK. Get npm access, mint a session token on your server, then render the workflow.
KYC webhooks
The authoritative KYC result channel. The common envelope, every event type MetaKYC emits, sample payloads, and how to register a subscription.