All Status Values
Every status is an exact string returned by the Didit API and webhooks. Always use strict string matching (e.g.,
=== "In Review") in your code — these values are case-sensitive and include spaces.| Status | String Value | Description |
|---|---|---|
| Not Started | "Not Started" | Session created, user hasn’t opened the link |
| In Progress | "In Progress" | User is actively completing verification |
| Approved | "Approved" | All checks passed — identity verified |
| Declined | "Declined" | One or more checks failed |
| In Review | "In Review" | Flagged for manual compliance review |
| Resubmitted | "Resubmitted" | User asked to redo specific steps |
| Expired | "Expired" | Session timed out before user opened the link |
| Abandoned | "Abandoned" | User started but didn’t finish in time |
| KYC Expired | "Kyc Expired" | Previously approved session exceeded KYC expiration |
Session Statuses
Not Started — "Not Started"
Not Started — "Not Started"
API value:
"Not Started"The session has been created via the API but the user has not opened the verification link yet.- What to do: Wait for the user to begin, or send a reminder if too much time passes.
- Transitions to:
"In Progress","Expired"
In Progress — "In Progress"
In Progress — "In Progress"
API value:
"In Progress"The user has opened the link and is actively completing verification steps (document capture, liveness, etc.).- What to do: No action needed — the user is working through the flow.
- Transitions to:
"Approved","Declined","In Review","Abandoned"
Approved — "Approved"
Approved — "Approved"
API value:
"Approved"All verification checks passed successfully. The user’s identity has been verified.- What to do: Grant the user access, update their profile, and store the decision data.
- Webhook includes: Full
decisionobject with all feature results. - Transitions to:
"Kyc Expired"(if a KYC expiration policy is configured)
Declined — "Declined"
Declined — "Declined"
API value:
"Declined"One or more verification checks failed. The user did not pass verification.- What to do: Notify the user. Optionally request a resubmission if the issue is fixable.
- Webhook includes: Full
decisionobject with warnings explaining the failure. - Transitions to:
"Resubmitted"(if a reviewer requests it)
In Review — "In Review"
In Review — "In Review"
API value:
"In Review"Automated checks flagged warnings that need human review. A compliance reviewer must make the final decision.- What to do: A reviewer should open the session in the Console and approve, decline, or request resubmission.
- Webhook includes: Full
decisionobject with warnings. - Transitions to:
"Approved","Declined","Resubmitted"
Resubmitted — "Resubmitted"
Resubmitted — "Resubmitted"
API value:
"Resubmitted"A reviewer has requested that the user redo specific verification steps (e.g., retake a blurry document photo).- What to do: Wait for the user to complete the resubmitted steps. The system will automatically re-evaluate.
- Webhook includes:
resubmit_infoobject with the list of features to redo and reasons. - Transitions to:
"Approved","Declined","In Review"
Expired — "Expired"
Expired — "Expired"
API value:
"Expired"The session timed out before the user opened the verification link.- What to do: Create a new session and send the user a fresh link.
- Terminal status — no further transitions.
Abandoned — "Abandoned"
Abandoned — "Abandoned"
API value:
"Abandoned"The user started but did not finish the verification within the allowed timeframe.- What to do: Send a reminder or create a new session.
- Terminal status — no further transitions.
KYC Expired — "Kyc Expired"
KYC Expired — "Kyc Expired"
API value:
"Kyc Expired"A previously approved session has exceeded the configured KYC expiration period (e.g., 12 months).- What to do: Request the user to re-verify by creating a new session.
- Terminal status — no further transitions.
Status Transitions
| From | To | Trigger |
|---|---|---|
"Not Started" | "In Progress" | User opens the verification link |
"Not Started" | "Expired" | Session TTL elapses before the user opens the link |
"In Progress" | "Approved" | All automated checks pass |
"In Progress" | "Declined" | One or more checks fail |
"In Progress" | "In Review" | Checks flag warnings requiring human review |
"In Progress" | "Abandoned" | User doesn’t finish within the timeframe |
"In Review" | "Approved" | Reviewer manually approves |
"In Review" | "Declined" | Reviewer manually declines |
"In Review" | "Resubmitted" | Reviewer requests specific steps to be redone |
"Declined" | "Resubmitted" | Reviewer requests specific steps to be redone |
"Resubmitted" | "Approved" | Resubmitted steps pass all checks |
"Resubmitted" | "Declined" | Resubmitted steps fail |
"Resubmitted" | "In Review" | Resubmitted steps flag new warnings |
"Approved" | "Kyc Expired" | KYC expiration policy triggers |
Terminal vs Non-Terminal
| Category | Statuses | Meaning |
|---|---|---|
| Terminal | "Approved", "Declined", "Kyc Expired" | Final decision — session won’t change again |
| Non-Terminal | "Not Started", "In Progress", "Resubmitted" | Still active — awaiting user action or processing |
| Actionable | "In Review" | Requires manual intervention from your team |
| Inactive | "Expired", "Abandoned" | Ended without a verification decision |
Handling Statuses in Your Code
Use webhooks or the Retrieve Session API to react to status changes.Resubmission
The Resubmitted status lets your compliance team give users a second chance without creating a new session.Reviewer initiates resubmission
From the Console, open an
In Review or Declined session and click Request Resubmission. Select which steps need to be redone.Previous data is archived
The system resets the selected features and marks prior data as
previous_attempt — preserving the full audit trail.User is notified
If an email is available, the user receives a localized email with a direct link to resume.
User redoes specific steps
The user only repeats the steps that were flagged — not the entire verification.
Resubmission Webhook Payload
Which Features Can Be Resubmitted?
Any feature with a non-approved status: Declined, In Review, Not Finished, Not Started, or Expired.Best Practices
Monitor In Review
Set up alerts (email or Slack) in your Didit Console to get notified when sessions need manual review.
Prefer Resubmission
If the issue is fixable (blurry photo, wrong document side), request a resubmission instead of declining. This improves conversion.
Track Drop-offs
High Abandoned or Expired rates may indicate UX friction. Consider adjusting session TTL or improving user guidance.
Idempotent Handlers
Webhooks may be retried. Use
session_id as a unique key to ensure you process each status change only once.