Skip to main content
PATCH
/
v3
/
session
/
{sessionId}
/
update-status
/
curl
curl -X PATCH \
  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-status/ \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "new_status": "Approved",
    "comment": "All checks passed manual review"
  }'
{
  "session_id": "3472fb7c-8f7c-4d1a-9cf4-cf3d74ce1a60"
}

Session kind

This endpoint works identically for User Verification (KYC) and Business Verification (KYB) sessions. Didit looks up the session_id in both tables; status-transition validation is model-agnostic (the same enum of statuses applies to both). The response includes session_kind so your downstream logic can switch on the outcome kind.

Allowed transitions

You can move a session to APPROVED, DECLINED, IN_REVIEW, or RESUBMITTED. The session’s current status must be one of: APPROVED, DECLINED, IN_REVIEW, KYC_EXPIRED, ABANDONED, or RESUBMITTED — otherwise the API returns a validation error.

Examples

curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../update-status/ \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "new_status": "Approved",
    "comment": "Cleared after manual review by compliance team"
  }'

Permission

Requires the write:sessions privilege. The same privilege covers both kinds.

Authorizations

x-api-key
string
header
required

Path Parameters

sessionId
string<uuid>
required

UUID of the verification session to update. Accepts both user (KYC) and business (KYB) session IDs — the service resolves the ID across both session types.

Example:

"11111111-2222-3333-4444-555555555555"

Body

application/json
new_status
enum<string>
required

Target status. Approved and Declined record a final manual decision (each can also overturn the other). Resubmitted clears the selected steps and sends the session back to the user. Any other value returns 400.

Available options:
Approved,
Declined,
Resubmitted
Example:

"Approved"

comment
string

Free-text reason for the change, stored on the session's review trail and returned in the reviews array of Get Decision. For example Duplicated user.

Example:

"All checks passed manual review"

nodes_to_resubmit
object[]

Workflow steps the user must redo. Only acted on when new_status is Resubmitted. For Approved/Declined the entries are still schema-validated (an invalid feature value returns 400) but schema-valid entries are semantically ignored. If omitted, the server auto-selects existing OCR, Liveness, Face Match, POA, Phone, Email, AML, Database Validation, and Questionnaire attempts whose status is Declined, In Review, Not Finished, or Expired (NFC, IP analysis, age estimation, face search, and KYB document attempts are never auto-selected; non-face-match face attempts are selected as LIVENESS) — features the user never attempted (no recorded attempt) are NOT selected, so a session with zero attempts returns 400 ("No features found that need resubmission") even though nothing was approved; pass nodes_to_resubmit explicitly in that case. Steps are executed in workflow-graph order regardless of the order you send them. KYB_REGISTRY, KYB_KEY_PEOPLE, and the KYB alias are rejected with 400 — those parent checks recompute from their child KYC sessions.

send_email
boolean
default:false

Whether to email the user about the change. Requires email_address. For Approved/Declined the user receives a status notice; for Resubmitted the email includes the verification link and the per-step resubmission reasons.

Example:

false

email_address
string<email>

Recipient for the notification email. Required when send_email is true — omitting it returns 400.

Example:

"user@example.com"

email_language
string
default:en

Language for the notification email. Accepts any string at schema level; unsupported codes silently fall back to English (en).

Example:

"en"

Response

Status updated. The response contains only the session_id — fetch the updated session via Get Decision. The status.updated webhook fires once the change commits.

session_id
string<uuid>

UUID of the updated session.