The verification.* family (4 verbs). Every verb enters through the one front door: it is capability-checked, permission-checked, scope-checked and audited before it runs (see Security & permissions). Each entry below lists its capability, risk class (which fixes the minimum autonomy level), the minimum caller permission, its availability tier, whether it is idempotent, and any outbound egress.
Cancelverification.cancel
| Property | Value |
|---|---|
| Capability | verification.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Abort an IN-FLIGHT verification check (PENDING|IN_PROGRESS)
-> WITHDRAWN. The operator twin of verification.update’s WITHDRAWN transition, but GUARDED: only a
non-terminal check can be cancelled - a COMPLETE/FAILED check is terminal (its result/verdict is
recorded), and re-cancelling an already-WITHDRAWN check is an idempotent no-op-shaped success. The row
is RETAINED, never deleted (INV-8, the statutory KYC trail); WITHDRAWN is the status (status-not-
timestamp, INV-3). Workspace-scoped via the explicit workspace_id = $ predicate + RLS; a check in
another workspace reads back not-found (anti-enumeration). The optional reason is folded into
result_details.cancelledReason (provider-shaped JSON, never raw PII).
Input { checkId, reason? } (fields ending in ? are optional)
Call POST /v/verification.cancel with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool verification.cancel.
Createverification.create
| Property | Value |
|---|---|
| Capability | verification.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | Admin only (CLI/HTTP; never advertised over MCP) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Mints a
verification_check PENDING artefact attached to the party (folds kyc.run - the provider is a
rail BEHIND the one artefact). The (provider, externalId) unique index makes the provider callback
idempotent.
Input { partyId, checkType, provider?, externalId?, matterId? } (fields ending in ? are optional)
Call POST /v/verification.create with a JSON body; returns JSON (or { error, code }). Not advertised over MCP (admin-only); reachable via the CLI and HTTP doors.
Createverification.ext.create
| Property | Value |
|---|---|
| Capability | verification.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
(write-once). Called immediately after
verification.create in the same admin-gated onfido flow under the SAME session bearer (CC-OPBOX 89
Condition 7: no new seat/token). Fences the verificationCheckId in the caller’s workspace, then writes
the index row ONCE; a retry (a row already exists for the check) is a no-op success (idempotent
{ verificationCheckId, subjectEmail, subjectName, stakeholderId?, applicantId, onfidoApplicantContext? }.
Call POST /v/verification.ext.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool verification.ext.create.
Updateverification.update
| Property | Value |
|---|---|
| Capability | verification.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | External (portal / signer token) |
| Availability | Admin only (CLI/HTTP; never advertised over MCP) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Transitions a check’s status (and,
when COMPLETE, its result). The verification_result_requires_complete CHECK enforces that a
result is only stored when status = COMPLETE. result_details is a provider-shaped JSON payload
(never raw PII). Idempotent: a re-fired callback re-asserting the same terminal status is a no-op.
Input { checkId, status, result?, resultDetails? } (fields ending in ? are optional)
Call POST /v/verification.update with a JSON body; returns JSON (or { error, code }). Not advertised over MCP (admin-only); reachable via the CLI and HTTP doors.