Skip to main content

Case Management & Review

When a verification needs a human decision, the API opens a review case and routes it to your review queue. Reviewers then claim the case, inspect the session (including a tamper-evident evidence bundle), and record a decision.

Sessions are flagged for review when they fail or warn (and can be routed to manual review explicitly via flows).

Flag values​

FlagMeaning
failThe session failed a required check
warnThe session passed but with a warning worth a look
passPassed (a case is not opened for these)
manualExplicitly routed to manual review

Case lifecycle​

open → claimed → decided.

List the queue​

GET /admin/reviews?status=open&limit=100
curl -H "Authorization: Bearer YOUR_ADMIN_KEY" \
"https://api.dev.valydar.com/admin/reviews?status=open"

Response:

{
"cases": [
{
"id": "rev_...",
"verification_id": "vry_...",
"flag": "fail",
"reason": "liveness check failed",
"status": "open",
"reviewer": null,
"decision": null,
"decision_note": null,
"created_at": "2026-09-26T12:00:00Z"
}
]
}

Filter with ?status= (open | claimed | decided).

Inspect a case​

GET /admin/reviews/{id}

Returns the case plus its append-only audit trail (flagged, claimed, decided) and the linked verification (session context):

{ "case": { }, "audit": [ ], "verification": { "status": "...", "checks_results": { } } }

Claim​

POST /admin/reviews/{id}/claim

Marks the case claimed and records who took it. 400 if the case is not open.

Decide​

POST /admin/reviews/{id}/decision
curl -X POST https://api.dev.valydar.com/admin/reviews/rev_.../decision \
-H "Authorization: Bearer YOUR_ADMIN_KEY" \
-H 'Content-Type: application/json' \
-d '{"decision": "approved", "note": "verified against source"}
'
DecisionMeaning
approvedThe session is accepted
rejectedThe session is refused
refutedThe initial flag is overturned

Recording a decision fires a review.decided webhook to the session's client (see Webhooks).

Evidence bundle​

GET /admin/reviews/{id}/evidence # JSON manifest
GET /admin/reviews/{id}/evidence?format=pdf # printable PDF

When a verification completes, the SHA-256 of every captured artifact is frozen. The evidence endpoint recomputes the digests from the bytes currently stored and reports any artifact that no longer matches — proving whether evidence was altered after capture:

{
"verified": false,
"algorithm": "sha256",
"artifacts": [
{
"artifact_id": "doc_...",
"kind": "passport",
"status": "modified",
"stored_sha256": "1ad0…",
"current_sha256": "aae9…"
}
],
"tampered": ["doc_..."],
"bundle_sha256": "..."
}
StatusMeaning
verifiedCurrent bytes match the digest captured at completion
modifiedThe artifact still exists but its bytes changed
missingA captured artifact is no longer stored
untrackedAn artifact exists now that was never captured

verified is true only when every artifact verifies. bundle_sha256 is a stable digest over the whole manifest (equal content ⇒ equal hash). format=pdf returns a printable, paginated manifest.

Admin review console​

A minimal web console is available at GET /admin/ui (Review Queue tab) for listing cases, viewing context + audit, claiming/deciding, and downloading evidence.

Permissions​

All /admin/reviews* endpoints require the reviews:manage permission (admin keys).