Skip to content

Multi-Device Sync API ​

All OpenAPI documents

Version v1.0 · OpenAPI 3.0.1 · 135 operations · Download the JSON document

API for secure multi-device key synchronization using QR pairing, Shamir recovery, and enterprise escrow. All endpoints require a Bearer token (SEC-001).

Generated from the MultiDeviceSync service's code at build time (api-specs/generated/MultiDeviceSync/Essence.Core.MultiDeviceSync.Api.json) and drift-checked in CI. It describes what the code registers, which is not the same as what any one deployment has routed.

ApproverDirectory

GET/api/v1/escrow/approvers

Lists the live FR-01.080 quorum-membership set (FR-01.093(b)).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
tenantIdquerystring (uuid)no—
cursorquerystring (date-time)no—
limitqueryinteger (int32)no—

Request body

No request body.

Responses

401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
POST/api/v1/escrow/approvers

Enrols a new break-glass approver (FR-01.093(b), AC-01.084).

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
409Conflict — ProblemDetails
DELETE/api/v1/escrow/approvers/{approverId}

Deprovisions an approver (soft-delete) and re-evaluates any in-flight reconstruction quorum the approver was part of (FR-01.093(c), AC-01.134).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
approverIdpathstring (uuid)yes—
tenantIdquerystring (uuid)no—
reasonquerystringno—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
PUT/api/v1/escrow/approvers/{approverId}/pin

Rotates an approver's credential pin after the underlying credential rotates (FR-01.093(c)).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
approverIdpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails

AssistedRecovery

POST/api/v1/recovery/assisted/authorisations

Authorises a locked-out subject's account recovery (authorise-only). Returns only opaque references — never key material.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
GET/api/v1/recovery/assisted/authorisations/{recoveryTokenRef}/confirmation

Independently confirms that the authorisation identified by recoveryTokenRef issued the CC-061 authorise-only grant and that no decrypt capability was released off the back of it (debt-2026-08-10-012).

The compliance read-back behind the zero-knowledge attestation. Where M:Essence.Core.MultiDeviceSync.Api.Controllers.AssistedRecoveryController.Authorise(Essence.Core.MultiDeviceSync.Contracts.Requests.IssueAssistedRecoveryAuthorizationRequest,System.Threading.CancellationToken) reports what the issuing call did, this re-derives the verdict from the sealed, tamper-evident audit entry — so a reviewer is checking evidence rather than trusting the requesting service's claim about itself. Gated to the same `EscrowAuditExport` compliance policy as the sibling audit read/verify endpoints (a break-glass compliance artifact, not a tenant-user surface), with the same per-enrolment org binding applied inside the handler: a caller whose org has no custody of the resolved enrolment gets 404, not 403, so the endpoint cannot be used to confirm that a reference exists.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
recoveryTokenRefpathstringyes—

Request body

No request body.

Responses

401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails

BiometricMismatchRecovery

PUT/api/v1/recovery/biometric-mismatch/fallback-code

Enrols / replaces the authenticated holder's fallback recovery code (FR-01.072).

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200Fallback verifier enrolled. — FallbackRecoveryEnrolmentResponse
400Invalid request / unresolvable user identity. — ProblemDetails
401No fresh `act=recovery-settings-change` elevation (`step-up-required`, DVS-4.4c).
423Locked — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/recovery/biometric-mismatch/rebind

Spends a verified assurance to re-bind the re-established device and returns the "what changed" delta (FR-01.072). Emits the FR-66.159 confirmation via the outbox.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200Device re-bound; delta returned. — BiometricMismatchRebindResponse
400Invalid request / unresolvable user identity. — ProblemDetails
404No usable assurance for this reference / caller. — ProblemDetails
409Assurance already consumed. — ProblemDetails
422Assurance expired. — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/recovery/biometric-mismatch/verify

Verifies a presented fallback recovery code and, on success, mints a short-lived re-bind assurance (FR-01.072). A wrong code or no enrolled verifier both return a generic 403.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200Fallback code verified; assurance minted. — BiometricMismatchAssuranceResponse
400Invalid request / unresolvable user identity. — ProblemDetails
403Fallback proof invalid (generic — no enumeration oracle). — ProblemDetails
429Verification rate limit exceeded. — ProblemDetails
500Internal Server Error — ProblemDetails

BreakGlassConsent

GET/api/v1/escrow/break-glass-consents

Lists the caller's live break-glass escrow consents (FR-01.030).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
cursorquerystring (date-time)no—
limitqueryinteger (int32)no—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
POST/api/v1/escrow/break-glass-consents

Records a durable break-glass escrow consent for the caller (FR-01.030).

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
409Conflict — ProblemDetails
GET/api/v1/escrow/break-glass-consents/export

Exports the caller's break-glass escrow consents as a GDPR Article-15 record (FR-01.030).

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
GET/api/v1/escrow/break-glass-consents/granted

The GRANTEE's read (#22511): the consents in force that name organizationId as the responder organisation. A requester picks the account holder here and opens the break-glass request by subject — it never has to be handed an internal enrolment id.

Every other action on this controller is the owner's. This one is not, so it carries the org-attribution edge gate the requester's `POST /escrow/reconstruct` carries, and the load-bearing binding is the caller's membership of the organisation it names (403 otherwise). #22847: includes the consents held on every peer sovereign this instance is configured to ask, each stamped with its `homeRegion`, and names the peers that could not be asked. localOnly is set by such a peer read so it never fans out again.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
organizationIdquerystring (uuid)no—
cursorquerystring (date-time)no—
limitqueryinteger (int32)no—
localOnlyquerybooleanno—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
DELETE/api/v1/escrow/break-glass-consents/{consentId}

Withdraws one of the caller's break-glass escrow consents (FR-01.030).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
consentIdpathstring (uuid)yes—
reasonquerystringno—

Request body

No request body.

Responses

204No Content
400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
404Not Found — ProblemDetails
PATCH/api/v1/escrow/break-glass-consents/{consentId}/holder-label

Sets, changes or clears the name the caller discloses to the grantee of one of their live consents (#22862), without withdrawing it. `null` or blank clears it. Another user's consent id is a 404.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
consentIdpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails
PATCH/api/v1/escrow/break-glass-consents/{consentId}/scope

Replaces the per-category escrow scope of one of the caller's consents (FR-01.030).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
consentIdpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails

DeviceIntegrity

GET/api/v1/devices/{id}/integrity

This device's latest server-verified integrity verdict (FR-01.104). `observed: false` when it has never been attested — not the same as a failure.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID.

Request body

No request body.

Responses

200The latest verdict, or `observed: false`. — DeviceIntegrityResponse
404Device not found or not owned by the caller. — ProblemDetails
POST/api/v1/devices/{id}/integrity-assertions

Re-checks this device's integrity with an App Attest <b>assertion</b> signed by the key it already attested, and records the verdict against its previous one (FR-01.104, #22108).

This is the cheap re-check: Apple rate-limits `attestKey`, so only a device's FIRST check goes to `integrity-attestations` and every later one comes here. The device asks `POST {id}/challenges` for an `Integrity` nonce and calls `DCAppAttestService.generateAssertion(keyId, clientDataHash)` with `clientDataHash = SHA-256(UTF-8(nonce))`. A judged assertion returns 200 whether it passed or failed — including a <b>replay</b>, whose counter did not increase: that verifies cryptographically and so is a statement about the device (`assertion_counter_replayed`), not a request error. Refusals (400/401/403/404/409/503) record nothing.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID.

Request body

Not marked as required in the document.

Responses

200The assertion was judged; the recorded verdict and its change from the prior are returned. — DeviceIntegrityResponse
400Unsupported platform, malformed base64, or the token carries no device_id. — ProblemDetails
401The nonce is not an unspent, unexpired Integrity challenge issued to this device. — ProblemDetails
403This device's signing key is bound to another session. — ProblemDetails
404Device not found or not owned by the caller. — ProblemDetails
409No attested key is on record under that key id; the device must attest first. — ProblemDetails
503Verification is not configured here; the device was not judged. — ProblemDetails
POST/api/v1/devices/{id}/integrity-attestations

Verifies a platform integrity attestation for this device and records the verdict against its previous one (FR-01.104, #17940). iOS <b>App Attest</b> or Android <b>Play Integrity</b> (#22105); either way it binds an `Integrity` challenge from `POST {id}/challenges`.

A judged attestation returns 200 whether it passed or failed — a failure is a recorded verdict, not a request error. Refusals (400/401/403/404/503) record nothing. The two platforms are configured independently, so one can be judgeable here while the other answers 503.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID.

Request body

Not marked as required in the document.

Responses

200The attestation was judged; the recorded verdict and its change from the prior are returned. — DeviceIntegrityResponse
400Unsupported platform, malformed base64, or the token carries no device_id. — ProblemDetails
401The nonce is not an unspent, unexpired Integrity challenge issued to this device. — ProblemDetails
403This device's signing key is bound to another session. — ProblemDetails
404Device not found or not owned by the caller. — ProblemDetails
503Verification is not configured here; the device was not judged. — ProblemDetails

DeviceIntegrityStepUp

POST/api/v1/devices/{id}/integrity-step-ups

This device asks another of the account's devices to approve the key-custody request it was just refused. Carries the request's method, path and body DIGEST — never the body.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesThis device's registration ID.

Request body

Not marked as required in the document.

Responses

201Opened; poll `GET {id}/integrity-step-ups/{stepUpRequestId}` for the decision. — DeviceIntegrityStepUpResponse
400Not a request the relay can carry (method, path or digest). — ProblemDetails
403The route's device is not this session's. — ProblemDetails
404Device not found or not owned by the caller. — ProblemDetails
409This device already has the maximum number of requests waiting. — ProblemDetails
GET/api/v1/devices/{id}/integrity-step-ups/pending

The requests other devices of this account are waiting for THIS device to decide.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesThis device's registration ID.

Request body

No request body.

Responses

200Oldest first; empty when nothing is waiting. — DeviceIntegrityStepUpListResponse
403The route's device is not this session's. — ProblemDetails
404Device not found or not owned by the caller. — ProblemDetails
GET/api/v1/devices/{id}/integrity-step-ups/{requestId}

This device reads back a request it opened. Once `approved`, `peerProof` is the value to retry with on `X-Device-Peer-Proof`.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesThis device's registration ID.
requestIdpathstring (uuid)yesThe step-up request.

Request body

No request body.

Responses

200The request and its status. — DeviceIntegrityStepUpResponse
403The route's device is not this session's. — ProblemDetails
404No such request opened by this device. — ProblemDetails
POST/api/v1/devices/{id}/integrity-step-ups/{requestId}/approval

This device approves another device's request with a peer proof signed by its own enrolled key, over a fresh `Proof` challenge from `POST {id}/challenges`, bound to the request's method, path and body digest. Checked here (all but spending the nonce) so a proof that would fail is refused now, on this device's screen.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesThis (approving) device's registration ID.
requestIdpathstring (uuid)yesThe step-up request.

Request body

Not marked as required in the document.

Responses

400The proof would not satisfy the request; `peerReason` says why. — ProblemDetails
403The route's device is not this session's, or it is the requesting device. — ProblemDetails
404No such request on this account. — ProblemDetails
409Already decided or lapsed. — ProblemDetails
POST/api/v1/devices/{id}/integrity-step-ups/{requestId}/decline

This device's holder declines another device's request.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesThis (declining) device's registration ID.
requestIdpathstring (uuid)yesThe step-up request.

Request body

No request body.

Responses

403The route's device is not this session's, or it is the requesting device. — ProblemDetails
404No such request on this account. — ProblemDetails
409Already decided or lapsed. — ProblemDetails

DeviceKeyRotation

POST/api/v1/devices/{id}/key-exchange-key/rotation

Replaces this device's key-exchange public key with one it has just generated, and returns the instant the rotation completed.

Only the PUBLIC half of the new key is sent. The request must carry an X-Device-Proof verified against THIS registration's enrolled signing key, whatever the possession rollout mode: the key-exchange key is what the next master-key rotation is wrapped to, so a bearer token alone must not be able to move it.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesThis device's registration ID.

Request body

Not marked as required in the document.

Responses

200Key rotated; the completion instant and new key fingerprint are returned. — DeviceKeyExchangeKeyRotationResponse
400Not a public JWK, or the token carries no user. — ProblemDetails
401No X-Device-Proof verified against this device's enrolled key. — ProblemDetails
403The proof came from another device of the account. — ProblemDetails
404Device not found, inactive, or not owned by the caller. — ProblemDetails
409The key is unchanged, or a master-key rotation is still in progress or being delivered. — ProblemDetails

Devices

GET/api/v1/devices

Lists all active devices for the current user with keyset pagination (DAT-006).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
cursorquerystringnoOptional cursor for pagination.
limitqueryinteger (int32)noPage size (default 10, max 50).

Request body

No request body.

Responses

200Devices listed successfully — DeviceRegistrationResponseCursorResult
400Bad Request — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/devices

Registers this device for the authenticated user. Idempotent per device fingerprint.

A repeat registration of a fingerprint already active for the user is not an error and not a second device: it refreshes the existing registration and answers `200 OK` with it. Only a registration that actually admitted a new device answers `201 Created`, and only that branch can be refused by the FR-01.007 cap (#7271 — previously every call inserted a row, so a client registering on each load exhausted the cap and was then refused forever).

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200This fingerprint was already registered; the existing registration was refreshed and returned — DeviceRegistrationResponse
201Device registered successfully — DeviceRegistrationResponse
400Bad Request — ProblemDetails
409Device limit exceeded (FR-01.007), or — with `reason``device_key_exchange_key_change_requires_proof` — a repeat registration tried to change the key of a device with an enrolled signing key, which only the proved rotation may do (#18640) — ProblemDetails
500Internal Server Error — ProblemDetails
GET/api/v1/devices/wipe-attestations/{attestationId}

Reads / exports a resale wipe attestation certificate (FR-01.060-distinct, debt-2026-07-07-033, journey `device-trade-in-secure-wipe-attestation-to-resale`). The holder retrieves the signed certificate — and its live/revoked state — to present to a resale counterparty. Ownership-scoped: a non-owner sees 404 (no existence oracle).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
attestationIdpathstring (uuid)yesWipe attestation ID.

Request body

No request body.

Responses

200Attestation returned. — WipeAttestationResponse
400Bad Request — ProblemDetails
404Attestation not found or not owned by caller. — ProblemDetails
POST/api/v1/devices/wipe-attestations/{attestationId}/revoke

Revokes a resale wipe attestation certificate (FR-01.060-distinct, debt-2026-07-07-033). Marks the certificate so a counterparty checking it sees it is no longer live — e.g. it was issued in error or the device was not actually wiped. Ownership-scoped (404 for a non-owner); a second revoke is rejected with 409.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
attestationIdpathstring (uuid)yesWipe attestation ID.

Request body

Not marked as required in the document.

Responses

200Attestation revoked; the revoked certificate is returned. — WipeAttestationResponse
400Missing revocation reason or invalid request. — ProblemDetails
404Attestation not found or not owned by caller. — ProblemDetails
409Attestation already revoked. — ProblemDetails
GET/api/v1/devices/{id}

Gets a specific device registration.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID

Request body

No request body.

Responses

200Device found — DeviceRegistrationResponse
404Device not found — ProblemDetails
500Internal Server Error — ProblemDetails
DELETE/api/v1/devices/{id}

Removes (unpairs) a device via the single authoritative FR-01.049 removal path.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID
deferRotationquerybooleannoFR-01.049 deferred-rotation ("Lock out later") choice (debt-2026-06-18-331). When `false` (the secure default) the UMK is rotated immediately so the removed device loses access at once. When `true` the user has made the informed choice to defer rotation; the residual-access threat is recorded and audit-anchored (`DeviceRemovedEvent.RekeyAction == "deferred-warned"`) rather than rotating now.
reasonquerystringnoWhy the owner is removing the device (FR-01.049, #18043): `user-initiated`, `lost` or `stolen` (`DeviceRemovalReasons.OwnerDeclarable`). Omitted means an ordinary removal. Carried onto `DeviceRemovedEvent.Reason`, so a theft reported here is anchored the same way as one reported on Auth's `DELETE /api/v1/devices/{id}`.

Request body

No request body.

Responses

204Device removed successfully
400The reason is not one an owner may state. — ProblemDetails
401No acceptable step-up elevation was presented (#8641).
404Device not found — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/devices/{id}/challenges

Issues a short-lived, single-use challenge for one of the caller's devices (SEC-009(a)).

`Proof` challenges are what an `X-Device-Proof` on a key-custody request signs; they are only issued to the device whose enrolled signing key is bound to this token. `Enrolment` challenges are what a device signs with the key it is enrolling.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID.

Request body

Not marked as required in the document.

Responses

201Challenge issued. — DeviceChallengeResponse
400Invalid purpose, or the token carries no device_id. — ProblemDetails
404Device not found or not owned by the caller. — ProblemDetails
409A proof challenge was asked for a device with no enrolled signing key for this session. — ProblemDetails
429Too Many Requests — ProblemDetails
POST/api/v1/devices/{id}/confirm-held

"I still have this device" (#17684): clears the possibly-lost flag a recovery enrolment on another device put on this registration (#17572), so it can approve pairings again.

Must be sent from ANOTHER enrolled device of the account that is not itself flagged, with an X-Device-Proof verified against that device's enrolled key. The handler requires the verified proof whatever the rollout mode: a flagged device cannot clear its own flag.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesThe flagged device registration ID.

Request body

No request body.

Responses

200The flag is cleared (or was already clear); the registration is returned. — DeviceRegistrationResponse
400Bad Request — ProblemDetails
401No X-Device-Proof verified against an enrolled key of this account. — ProblemDetails
403The confirming device is the device itself, is flagged, or holds no enrolled key. — ProblemDetails
404Device not found or not owned by the caller. — ProblemDetails
GET/api/v1/devices/{id}/pending-rotation

Returns the pending wrapped-UMK blob queued for this device by the rotation initiator (FR-01.016), or 204 when the queue is empty. Siblings poll this endpoint after a `KeyRotationCompletedIntegrationEvent` or on periodic sync.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID.

Request body

No request body.

Responses

200Pending wrapped key material returned. — PendingKeyRotationResponse
204No pending rotation for this device.
404Device not found or not owned by caller. — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/devices/{id}/pending-rotation/ack

Acknowledges that the sibling device has unwrapped the queued UMK locally and committed it to its own keystore (FR-01.016). Clears the pending-rotation queue on the device registration row.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID.

Request body

Not marked as required in the document.

Responses

204Acknowledgement accepted.
400Session fencing mismatch. — ProblemDetails
404Device not found or not owned by caller. — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/devices/{id}/secure-wipe

Securely wipes a device in preparation for resale / trade-in (FR-01.060-distinct "Prepare for resale", debt-2026-06-18-315). Revokes the device's cryptographic access via the authoritative FR-01.049 removal path and returns a tamper-evident wipe attestation. Distinct from account deletion (FR-01.060): only this device loses access; the account and its other devices are untouched. The plain-language confirmation gate is enforced server-side — Essence.Core.MultiDeviceSync.Contracts.Requests.SecureWipeDeviceRequest.ConfirmationAcknowledged must be `true` or the request is rejected with 400.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID.

Request body

Not marked as required in the document.

Responses

200Device securely wiped; attestation returned. — WipeAttestationResponse
400Confirmation not acknowledged or invalid request. — ProblemDetails
404Device not found or not owned by caller. — ProblemDetails
500Internal Server Error — ProblemDetails
PUT/api/v1/devices/{id}/signing-key

Enrols this device's ES256 signing key (SEC-009(a)) — the key every later key-custody request proves possession of. Needs an `Enrolment` challenge signed by the new key, and the server's authority rule: the account's sole device, a pairing approval by an enrolled peer (`pairingSessionId`), a completed recovery on this device (for a recovery-phrase recovery, the `recoveryEnrolmentTicket` its re-wrap returned, #18062), or a one-time legacy attach inside the grace window.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID.

Request body

Not marked as required in the document.

Responses

200Signing key enrolled; the updated registration is returned. — DeviceRegistrationResponse
400Not a public P-256 JWK, or the token carries no device_id. — ProblemDetails
401The enrolment proof did not verify, or its challenge was unknown, spent or expired. — ProblemDetails
403Not authorised to enrol this way (pair from an enrolled device). — ProblemDetails
404Device not found or not owned by the caller. — ProblemDetails
409A key is already enrolled, or this session's device is bound elsewhere. — ProblemDetails
GET/api/v1/devices/{id}/sync-status

Gets the sync status for a specific device (FR-01.016).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesDevice registration ID

Request body

No request body.

Responses

200Sync status retrieved — DeviceSyncStatusResponse
404Device not found — ProblemDetails
500Internal Server Error — ProblemDetails

EmergencyAccessAnchors

GET/api/v1/emergency-access-anchors

Lists recorded break-glass anchors, newest first, keyset-paginated (DAT-006).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
originInstanceIdquerystring (uuid)noOnly anchors from this sovereign.
fromquerystring (date-time)noOnly anchors that occurred at or after this instant (UTC).
toquerystring (date-time)noOnly anchors that occurred before this instant (UTC).
sessionRefquerystringnoOnly the phases of this session (64-char lowercase-hex token).
phasequerystringno`requested` | `granted` | `expired` | `revoked`.
cursorquerystringnoThe previous page's `NextCursor`.
limitqueryinteger (int32)noPage size (default 50, max 200).

Request body

No request body.

Responses

200One page of anchors. — EmergencyAccessAnchorResponseCursorResult
400A filter or the cursor is malformed, or the window ends before it starts. — ProblemDetails

EmergencyAccessRequest

GET/api/v1/escrow/emergency-access/history

Returns the authenticated owner's escrow break-glass release / disclosure history (journey `emergency-credential-access-grant-on-inactivity`, FR-01.040 anchor / FR-01.041 notify; debt-2026-07-07-028). One anchored record per terminal event — invoker, ordered approval chain, tamper-evident evidence hash + EPIC 4 anchor reference, categories released, timestamps, and terminal outcome. Backs the essence-web `EmergencyAccessHistory` surface. The subject is ALWAYS the authenticated caller (server-derived) — no client-supplied id participates in the authorisation decision.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
GET/api/v1/escrow/emergency-access/history/{subjectUserId}

Compliance / DPO export of a subject's escrow break-glass release history (FR-01.043 / FR-01.040-041; debt-2026-07-07-028). Gated to the `EscrowAuditExport` policy (`compliance-officer` / `platform-admin`) — the same instance-wide compliance surface as the audit-chain export — so a regulator / DPO can pull the same disclosure the owner sees. Returns only non-secret disclosure metadata; no decrypted credential is ever surfaced.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
subjectUserIdpathstring (uuid)yes—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
POST/api/v1/escrow/reconstruct

Opens a reconstruction request against a configured enrolment (CC-061, FR-01.035). The request is persisted in `requested` state and an outbox event is published for Tier E-3 pickup.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails
GET/api/v1/escrow/requests/mine

The caller's own break-glass requests for organizationId that can still be resumed (#22510): not reconstructed, not terminal, not past their deadline. A requester whose tab closed finds the request here; resuming it needs the ephemeral key their browser kept. Pinned to the token's subject. Metadata only.

#22852: includes the requests this instance routed to their subjects' home sovereigns, read back from each one (status `unknown` when it cannot be asked). localOnly is set by such a read-back so it never fans out again.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
organizationIdquerystring (uuid)no—
localOnlyquerybooleanno—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
GET/api/v1/escrow/requests/mine/closed

The caller's own break-glass requests for organizationId that have closed (#22590): reconstructed, denied, revoked, or past their deadline. The complement of M:Essence.Core.MultiDeviceSync.Api.Controllers.EmergencyAccessRequestController.ListMyOpenRequests(System.Guid,System.Boolean,System.Threading.CancellationToken), so a requester can find a request again to re-read its justification without keeping the reference. Pinned to the token's subject. Metadata only.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
organizationIdquerystring (uuid)no—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
GET/api/v1/escrow/requests/{id}

Returns the lifecycle snapshot for a reconstruction request (CC-061, FR-01.030 / FR-01.037). Pinned to the requester so the React hook can poll without leaking lifecycle state to other parties.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
POST/api/v1/escrow/requests/{id}/access-extension

The requester asks for a live granted access window to be extended (FR-01.038(1), #22389). Grants no time: it opens an extension cycle and returns its fresh, single-use `accessExtensionChallengeNonce`, which the re-attestation quorum signs over via `POST /requests/{id}/access-extension/approve`. Refused with 409 when the window has elapsed or ended (FR-01.038(4): open a new request) or already stands at the 72 h cumulative maximum (FR-01.038(2)).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails
POST/api/v1/escrow/requests/{id}/access-extension/approve

Records one approver's Ed25519 re-attestation of an access-window extension (FR-01.038(1)-(3), #22389). The signed payload is `escrow-extend:{requestId:N}:{enrolmentId:N}:{approverUserId:N}:{cycle}:{approvedAt:O}:{accessExtensionChallengeNonce}` where `cycle` is `accessExtensionCount + 1`. The quorum-reaching re-attestation extends the window (cut to 72 h cumulative), seals an audit entry and notifies the account holder with `reason='extended'`.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
409Conflict — ProblemDetails
POST/api/v1/escrow/requests/{id}/approve

Records an Ed25519 approval against an in-flight reconstruction request (CC-061, FR-01.037). When quorum is reached the aggregate stamps the FR-01.033 cool-off `EarliestUnlockAt`.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—
localOnlyquerybooleanno—

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails
POST/api/v1/escrow/requests/{id}/complete

Marks a reconstruction request as completed once the requester has combined the relayed shares locally (CC-061, FR-01.030 / FR-01.037). The aggregate enforces the FR-01.033 cool-off window — the call is rejected with 409 if invoked before `EarliestUnlockAt`.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails
POST/api/v1/escrow/requests/{id}/deny

Denies an in-flight reconstruction request (CC-061, FR-01.037). Any authorised approver can burn the request; the aggregate transitions to `denied` and no further approvals or share submissions are accepted.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—
localOnlyquerybooleanno—

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails
GET/api/v1/escrow/requests/{id}/justification

Returns the decrypted justification of a reconstruction request to its subject or its requester (FR-01.065 / FR-01.039, #22417), closed requests included. Anyone else, and an unknown id, get the same generic 404 and leave no trace on the audit chain; an authorised read appends a `JustificationRead` entry. A purged request answers `state: "purged"`; a seal that fails authentication is a typed 500.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
404Not Found — ProblemDetails
500Internal Server Error — ProblemDetails
503Service Unavailable — ProblemDetails
GET/api/v1/escrow/requests/{id}/reconstruction-material

Returns the enrolment material the requester's client needs to finish a reconstruction (CC-061, FR-01.037 / FR-01.039, #22335): the Shamir scheme, the holder roster, and the scoped vault keys wrapped under the EAK. Requester only; released under the same cool-off and access-window gate as the relay shares, and never once the session is terminal or zeroized.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails
GET/api/v1/escrow/requests/{id}/share-submissions

Returns the collected relay-share ciphertexts for a reconstruction request (CC-061, FR-01.037 / SR-5). Only the requester may pull, and only after the FR-01.033 cool-off window has elapsed.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails
POST/api/v1/escrow/requests/{id}/submit-share

Accepts an RSA-OAEP re-wrap of a decrypted Shamir share (CC-061, FR-01.037 / SR-5). The server stores the ciphertext only; the requester pulls the collection via `GET /requests/{id}/share-submissions` once the cool-off window has elapsed.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—
localOnlyquerybooleanno—

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails

EmergencyCardRead

POST/api/v1/emergency-card-reads

Records a wearable emergency-card read (FR-01.040/041). Anchors the read to EPIC 4 and queues the CRITICAL owner + nominated-contact notification in one unit of work; returns only when both committed.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
503Service Unavailable — ProblemDetails

Escrow

GET/api/v1/sync/escrow/audit/export

FR-01.043 — exports the tamper-evident escrow audit chain for regulator/SRE review. Gated to the `EscrowAuditExport` policy (compliance-officer or platform-admin roles). Runs the chain verifier before serialising: on a mismatch the endpoint returns 409 Conflict with the failure details in a ProblemDetails body — we DO NOT ship a payload that might encode tampered history without an explicit "chain broken" signal, since downstream consumers are likely to treat a 200 body as authoritative.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
enrolmentIdquerystring (uuid)noOptional scope — omit for a full-chain export.
formatquerystringno"json" (default) or "csv".

Request body

No request body.

Responses

200OK — string (binary)
400Bad Request — ProblemDetails
409Conflict — ProblemDetails
POST/api/v1/sync/escrow/enrolments

Creates a new EAK enrolment with its custody shares.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Created — EakEnrolmentResponse
400Bad Request — ProblemDetails
409Conflict — ProblemDetails
GET/api/v1/sync/escrow/enrolments/{id}

Gets an EAK enrolment (without encrypted share payloads).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—

Request body

No request body.

Responses

404Not Found — ProblemDetails

EscrowEnrolment

GET/api/v1/escrow/audit

Returns the tamper-evident escrow audit chain (CC-061, FR-01.038). Keyset-paged per DAT-006 — callers resume by passing the previous response's `NextCursor` back in the cursor query param. Optionally scoped to a single `enrolmentId`.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
enrolmentIdquerystring (uuid)noOptional enrolment scope.
cursorquerystringnoOpaque cursor from a previous page (null for first page).
limitqueryinteger (int32)noPage size (default 500, max 1000). Values <=0 fall back to the default.

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
GET/api/v1/escrow/audit/verify

Re-verifies the stored audit chain hashes (CC-061, FR-01.038). Does not mutate state; returns the verification outcome regardless of validity so operators can diagnose the first failing entry.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
enrolmentIdquerystring (uuid)no—

Request body

No request body.

Responses

401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
POST/api/v1/escrow/configure

Persists the Tier E-1 `EscrowEnrolmentArtefacts` tuple produced by the client-side `enrolEmergencyAccessKey()` ceremony (CC-061, FR-01.031). Returns the masked enrolment summary.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
409Conflict — ProblemDetails
GET/api/v1/escrow/enrolments/{id}

Returns a single enrolment by ID (masked). 404 when missing; the ownership check is enforced in the handler and flows through the exception pipeline as 403 when the caller is not the owner.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstringyes—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
POST/api/v1/escrow/enrolments/{id}/revoke

Revokes an enrolment and cascades to any non-terminal reconstruction requests (CC-061, FR-01.040). The enrolment's soft-delete flag frees the partial unique index on `(user_id, is_deleted=false)` for re-enrolment.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstringyes—

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
GET/api/v1/escrow/status

Returns the caller's Tier E-2 enrolments (masked — SR-5 — never returns ciphertexts). Supports keyset pagination (DAT-006) via the `cursor` query parameter: pass the `createdAt` of the last row from the previous page to continue.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
cursorquerystring (date-time)no—
limitqueryinteger (int32)no—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails

ExecutorCredentialBequest

POST/api/v1/keys/executor-bequests

A donor seals a bequest of credentials for their executor (debt-2026-07-07-007). Idempotent per (donor, executor, estate grant) — 409 if one already exists.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Bequest sealed. — SealExecutorBequestResponse
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
409A bequest already exists for this scope. — ProblemDetails
POST/api/v1/keys/executor-bequests/release

Releases a sealed bequest when the scoped legacy-release grant fires (debt-2026-07-07-007). The `estateGrantId` must match the grant the bequest was sealed under. Idempotent.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200Released (or already released). — ReleaseExecutorBequestResponse
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
404No such bequest, or the grant does not authorise it. — ProblemDetails
409The bequest has been revoked. — ProblemDetails
GET/api/v1/keys/executor-bequests/{bequestId}

The authenticated executor fetches a bequest's metadata (debt-2026-07-07-007) — status and per-item labels/statuses that back the reveal surface's list. No key material. A caller who is not the bequest's executor is answered 404 (no existence disclosure).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
bequestIdpathstring (uuid)yes—

Request body

No request body.

Responses

200The bequest summary (no key material). — ExecutorBequestSummaryResponse
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
404No such bequest for this executor. — ProblemDetails
DELETE/api/v1/keys/executor-bequests/{bequestId}

A donor withdraws a bequest (debt-2026-07-07-007) — revoked while alive, or the estate closed. Cryptographically erases every sealed envelope. Only the donor may revoke.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
bequestIdpathstring (uuid)yes—

Request body

No request body.

Responses

204Revoked (idempotent).
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
404No such bequest, or the caller is not its donor. — ProblemDetails
POST/api/v1/keys/executor-bequests/{bequestId}/items/{itemId}/reveal

The authenticated executor reveals one bequeathed credential (debt-2026-07-07-007) — backs `onReveal`. Returns the sealed envelope for client-side reconstruction (never plaintext).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
bequestIdpathstring (uuid)yes—
itemIdpathstringyes—

Request body

No request body.

Responses

200The item's sealed envelope. — RevealedBequeathedCredentialResponse
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
404No such bequest / item for this executor. — ProblemDetails
409The bequest has not been released yet. — ProblemDetails
POST/api/v1/keys/executor-bequests/{bequestId}/reveal-all

The authenticated executor reveals every currently-available bequeathed credential (debt-2026-07-07-007) — backs `onRevealAll`. Returns each item's sealed envelope for client-side reconstruction (never plaintext).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
bequestIdpathstring (uuid)yes—

Request body

No request body.

Responses

200The available items' sealed envelopes (may be empty). — RevealAllBequeathedCredentialsResponse
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
404No such bequest for this executor. — ProblemDetails
409The bequest has not been released yet. — ProblemDetails

ExecutorRehearsal

POST/api/v1/sync/escrow/executor-rehearsal

Conducts a non-destructive executor-release rehearsal. Returns the readiness report + audit anchor reference — never key material.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails

InternalAssistedRecoveryConfirmation

POST/api/v1/internal/recovery/assisted/confirmation/lookup

EPIC 1's evidenced confirmation of one authorisation, for the organisation named.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200The authorisation, re-derived from its sealed audit entry. — AssistedRecoveryGrantConfirmationResponse
400No organisation, or no reference. — ProblemDetails
401No valid bearer token. — ProblemDetails
403The caller is not a service principal. — ProblemDetails
404No authorisation the named organisation issued or holds custody of carries the reference. — ProblemDetails

InternalDeviceIntegrityDecision

POST/api/v1/internal/device-integrity/key-custody-decisions

Decides one custody request served on another instance, for the device the caller's token names. 200 with `evaluated:false` when the token names no enrolled device, when integrity was skipped, or when a refused possession ended the decision; with `possession` when it was asked for.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200The decision, or `evaluated:false`; plus `possession` when asked. — KeyCustodyIntegrityDecisionResponse
400The request is malformed (ProblemDetails). — ProblemDetails
401No valid token (or a cross-instance token without an Active federation trust). — ProblemDetails
503This instance does not hold the device register either. — ProblemDetails

InternalDeviceSigningKey

POST/api/v1/internal/device-signing-keys/lookup

The public JWK of the active, enrolled device key `keyThumbprint` of `userId`. 200 in both cases: `{"found": true, …}`, or the uniform `{"found": false}`.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200The key, or the uniform miss. — DeviceSigningKeyLookupResponse
400The request is malformed (ProblemDetails). — ProblemDetails
401No valid token (or a cross-instance token without an Active federation trust). — ProblemDetails
403The token does not carry the reader scope. — ProblemDetails
429The calling service exceeded its lookup budget. — ProblemDetails

KeyGeneration

GET/api/v1/keys/wrapped-umk/generation

The caller's current key generation.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

No request body.

Responses

200The current generation, or `null` when the account has no envelope. — CurrentKeyGenerationResponse
400The token carries no user identity. — ProblemDetails

KeyRotation

POST/api/v1/rotation/sessions

Initiates a new key rotation session.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Key rotation session created — KeyRotationSessionResponse
400Invalid request — ProblemDetails
401No acceptable step-up elevation was presented on `X-Step-Up-Token` (reason `stepup_required`, #14203) — ProblemDetails
409A rotation is already active for this user (FR-01.050 single-active-rotation invariant), or rotation is withdrawn (reason `rotation-unavailable`, #16462) — ProblemDetails
423Locked — ProblemDetails
500Internal Server Error — ProblemDetails
GET/api/v1/rotation/sessions/{id}

Gets the status of a key rotation session.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesKey rotation session ID

Request body

No request body.

Responses

200Session found — KeyRotationSessionResponse
404Session not found — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/rotation/sessions/{id}/checkpoint

Saves a checkpoint during key rotation for resume capability.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesKey rotation session ID

Request body

Not marked as required in the document.

Responses

200Checkpoint saved — KeyRotationSessionResponse
400Invalid request — ProblemDetails
404Session not found — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/rotation/sessions/{id}/complete

Completes a key rotation session, persisting the new key generation (#19068).

The body's `newGenerationEnvelope` is the new UMK wrapped under the account's password KEK. It is held even when the answer is the retryable `coverage-incomplete`, and completion makes it the current envelope while revoking every passkey, recovery-phrase and duress envelope of the outgoing generation. Without one ever sent the rotation cannot complete. With no body the call only observes the session. `passkeyRewraps` (#19144) carries the new UMK re-wrapped under each passkey the user keeps; those passkeys get a new-generation envelope instead of being revoked. Held with the envelope across `coverage-incomplete`. A credential with no live vault-unlock envelope refuses the call (409 `rotation-passkey-not-enrolled`) and nothing is staged.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesKey rotation session ID

Request body

Not marked as required in the document.

Responses

200Rotation completed — KeyRotationSessionResponse
400Invalid operation — ProblemDetails
404Session not found — ProblemDetails
409A passkey re-wrap names a credential with no live vault-unlock envelope (reason=rotation-passkey-not-enrolled, #19144); nothing changed — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/rotation/sessions/{id}/notify-devices

Notifies all registered devices about a completed key rotation (FR-01.016). The initiating device calls this after completing rotation to push the new wrapped UMK to all sibling devices.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesKey rotation session ID

Request body

Not marked as required in the document.

Responses

200Devices notified successfully — NotifyDevicesResponse
400Invalid request — ProblemDetails
404Session not found (or owned by another user — #9869) — ProblemDetails
500Internal Server Error — ProblemDetails

KeyRotationCancellation

POST/api/v1/rotation/sessions/{id}/cancel

Cancels an open key rotation session at the user's request (FR-01.051).

The OLD key generation stays write-authoritative and the single-active-rotation slot (FR-01.050) is freed, so a rotation interrupted by a closed tab no longer blocks the next one until the abandonment reaper runs (#7278). Like the other continuation calls it does not re-ask for step-up: it acts on a session only an elevated `POST` can have opened, and it moves the vault toward the key already in force, never away from it.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesKey rotation session ID

Request body

No request body.

Responses

200Rotation cancelled (or had already ended without completing) — KeyRotationSessionResponse
400The rotation has already completed and cannot be cancelled — ProblemDetails
404Session not found (or owned by another user) — ProblemDetails
500Internal Server Error — ProblemDetails

MergeRewrap

GET/api/v1/keys/merge-rewrap/pending

The re-wrap work the calling member's device should pick up on unlock. This read is what makes an adjudicated merge's key work schedulable rather than session-bound.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
takequeryinteger (int32)no—

Request body

No request body.

Responses

200Open tasks, oldest first. — PendingMergeRewrapTasksResponse
400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
POST/api/v1/keys/merge-rewrap/sessions

Opens the re-wrap task for an approved merge. Idempotent per merge session — a retried approval is answered 409 rather than forking the work in two.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Task opened. — MergeRewrapTaskResponse
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
409A task already exists for this merge session. — ProblemDetails
GET/api/v1/keys/merge-rewrap/sessions/{mergeSessionId}

Reads one task as a member of the merge (survivor sees the material it must unwrap).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
mergeSessionIdpathstring (uuid)yes—

Request body

No request body.

Responses

200Task state. — MergeRewrapTaskResponse
400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
404No task for this merge session, or the caller is on neither side. — ProblemDetails
POST/api/v1/keys/merge-rewrap/sessions/{mergeSessionId}/cancel

Cancels the task — the merge was refused, withdrawn or abandoned.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
mergeSessionIdpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

200Cancelled. — MergeRewrapTaskResponse
400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404No task for this merge session. — ProblemDetails
409The task is already terminal. — ProblemDetails
POST/api/v1/keys/merge-rewrap/sessions/{mergeSessionId}/checkpoint

Records a resume point and renews the lease.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
mergeSessionIdpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

200Checkpoint recorded. — MergeRewrapTaskResponse
400Progress went backwards or exceeded the enumerated total. — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409The lease has expired — re-claim to continue. — ProblemDetails
POST/api/v1/keys/merge-rewrap/sessions/{mergeSessionId}/claim

Takes (or renews) the work lease for one of the survivor's devices. A lapsed lease is claimable by another device, so a member whose phone died is not locked out of their own merge by their own dead phone.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
mergeSessionIdpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

200Lease held; the response carries the envelope and resume checkpoint. — MergeRewrapTaskResponse
400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404No task for this merge session, or the caller is on neither side. — ProblemDetails
409Handover not posted, another device holds a live lease, or the task has lapsed. — ProblemDetails
POST/api/v1/keys/merge-rewrap/sessions/{mergeSessionId}/complete

The leasing device reports the re-wrap finished. Refused while items remain — a partial re-wrap must not release the adjudication's key-rewrap hold.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
mergeSessionIdpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

200Complete; the completion event is enqueued for the adjudicating service. — MergeRewrapTaskResponse
400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Items remain un-re-wrapped, or the lease has expired. — ProblemDetails
POST/api/v1/keys/merge-rewrap/sessions/{mergeSessionId}/handover

Parks the retiring account's UMK wrapped to the surviving member's public key, so the survivor's device can unwrap the retiring per-item DEKs days later. Posted by whichever of the two identities' devices holds the retiring key material.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
mergeSessionIdpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

200Handover parked; the task is now workable. — MergeRewrapTaskResponse
400Malformed envelope (must be base64url, within the cap). — ProblemDetails
401Unauthorized — ProblemDetails
404No task for this merge session, or the caller is on neither side. — ProblemDetails
409A handover has already been posted, or the task has lapsed. — ProblemDetails
POST/api/v1/keys/merge-rewrap/sessions/{mergeSessionId}/release

The leasing device gives the task back without completing. Progress and checkpoint are kept so the next device resumes rather than restarts.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
mergeSessionIdpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

200Lease released; the task is claimable again. — MergeRewrapTaskResponse
400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails
GET/api/v1/keys/merge-rewrap/sessions/{mergeSessionId}/status

The adjudicating service's release gate: is the re-wrap done? Deliberately returns no key material — a staff surface can see that a merge is held without ever holding the envelope. This is the poll-side twin of the completion event, so the release gate never depends on a single message delivery.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
mergeSessionIdpathstring (uuid)yes—

Request body

No request body.

Responses

200Task state, without key material. — MergeRewrapTaskResponse
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404No task for this merge session. — ProblemDetails

PairingSessions

POST/api/v1/pairing/sessions

Creates a new pairing session (Device A).

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Pairing session created successfully — PairingSessionResponse
400Invalid request — ProblemDetails
409Conflict — ProblemDetails
429Too Many Requests — ProblemDetails
500Internal server error — ProblemDetails
GET/api/v1/pairing/sessions/{id}

Gets a pairing session by ID.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesPairing session ID

Request body

No request body.

Responses

200Pairing session found — PairingSessionResponse
404Pairing session not found — ProblemDetails
500Internal server error — ProblemDetails
DELETE/api/v1/pairing/sessions/{id}

Cancels a pairing session. Only the session initiator can cancel.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesPairing session ID

Request body

No request body.

Responses

204Pairing session cancelled
403The joining device — only the initiator may cancel — ProblemDetails
404Pairing session not found (or caller is not a participant — #9869) — ProblemDetails
409Pairing session already completed — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/pairing/sessions/{id}/confirm

Confirms fingerprint verification during pairing (FR-01.006). Both devices call this after visually confirming the fingerprint match.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesPairing session ID

Request body

Not marked as required in the document.

Responses

200Confirmation recorded — PairingSessionResponse
400Bad Request — ProblemDetails
404Pairing session not found — ProblemDetails
410Pairing session expired — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/pairing/sessions/{id}/exchange

Device A completes the pairing by providing the wrapped master key.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesPairing session ID

Request body

Not marked as required in the document.

Responses

200Pairing completed successfully — PairingSessionResponse
400Invalid request — ProblemDetails
404Pairing session not found — ProblemDetails
410Pairing session expired — ProblemDetails
500Internal server error — ProblemDetails
POST/api/v1/pairing/sessions/{id}/extend

Extends a pre-key-exchange pairing session's expiry within the FR-01.006 window (debt-2026-07-03-006). Backs the approval surface's warn-at-20% + one-action "Extend" so the user can avoid the WCAG 2.2.1 timing cut-off without re-pairing — the same QR/comparison code is preserved.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesPairing session ID

Request body

No request body.

Responses

200Session extended (or already at the aggregate cap — idempotent). — PairingSessionResponse
400Session is past the pre-key-exchange phase. — ProblemDetails
404Pairing session not found (or caller is not a participant). — ProblemDetails
410Pairing session already expired. — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/pairing/sessions/{id}/join

Device B responds to a pairing session after scanning QR code.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesPairing session ID

Request body

Not marked as required in the document.

Responses

200Response recorded successfully — PairingSessionResponse
400Invalid request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Pairing session not found — ProblemDetails
409Conflict — ProblemDetails
410Pairing session expired — ProblemDetails
500Internal server error — ProblemDetails

PasswordChangeSaga

GET/api/v1/keys/password-change-saga/status

Consults the authoritative `password_change_sagas` record for a user (End-B producer, FR-01.073/078). Returns `{ isOpen, retryAfterSeconds }`.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
userIdquerystring (uuid)noThe account whose would-be-failing auth attempt is being disambiguated.

Request body

No request body.

Responses

200Saga state returned (open or not). — PasswordChangeSagaStatusResponse
400Missing or malformed `userId`. — ProblemDetails

ProtectionStatus

PUT/api/v1/protection-status/alternate-passphrase

Reports whether the owner currently has a duress/alternate passphrase provisioned, and optionally re-acknowledges the behaviour explanation on an armed arrangement.

FR-66.182 (#22211): with `behaviourAcknowledgementVersion` this is how an owner who armed under an earlier explanation confirms the current one, without re-arming. It is a phase of this action rather than an action of its own because the controller is at its CAP-011b origin ceiling.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200Status recorded; the owner's current protection status returned. — ProtectionStatusResponse
400Invalid request / unresolvable user identity. — ProblemDetails
409An acknowledgement was sent but no alternate passphrase is armed (`reason=not-armed`). — ProblemDetails
500Internal Server Error — ProblemDetails
PUT/api/v1/protection-status/backup-vault

Reports the backup/decoy vault's presence and last-review freshness.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200Status recorded; the owner's current protection status returned. — ProtectionStatusResponse
400Invalid request / unresolvable user identity. — ProblemDetails
500Internal Server Error — ProblemDetails

RecoverySessions

POST/api/v1/recovery/sessions

Initiates a recovery session, stamping the FR-01.064 timeout window.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Recovery session created. — RecoverySessionResponse
400Invalid request / unresolvable user identity. — ProblemDetails
429Recovery-initiation rate limit exceeded (NFR-01.069). — ProblemDetails
500Internal Server Error — ProblemDetails
GET/api/v1/recovery/sessions/{id}

Reads a recovery session's server-authoritative timeout window.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—

Request body

No request body.

Responses

200Session found. — RecoverySessionResponse
404Session not found (or not owned by the caller). — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/recovery/sessions/{id}/keepalive

Re-arms the idle window ("Need more time?"). Refuses past the absolute security ceiling / extension cap (409) and on a lapsed / terminal session (422) — the server-side enforcement of the recovery-timeout ceiling.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yes—

Request body

No request body.

Responses

200Idle window re-armed; updated deadlines returned. — RecoverySessionResponse
404Session not found (or not owned by the caller). — ProblemDetails
409At the absolute security ceiling or the extension cap. — ProblemDetails
422The session has already lapsed or is terminal. — ProblemDetails
500Internal Server Error — ProblemDetails

ResponderHolder

GET/api/v1/escrow/holders

Lists the live responder-holder organisations (FR-01.033).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
tenantIdquerystring (uuid)no—
cursorquerystring (date-time)no—
limitqueryinteger (int32)no—

Request body

No request body.

Responses

401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
POST/api/v1/escrow/holders

Enrols an organisation as a break-glass escrow holder (FR-01.033).

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
409Conflict — ProblemDetails
DELETE/api/v1/escrow/holders/{organisationId}

Revokes an organisation's holder authority (FR-01.033).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
organisationIdpathstring (uuid)yes—
tenantIdquerystring (uuid)no—
reasonquerystringno—

Request body

No request body.

Responses

204No Content
400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
POST/api/v1/escrow/holders/{organisationId}/responders

Credentials an individual responder under a holder organisation (FR-01.033).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
organisationIdpathstring (uuid)yes—

Request body

Not marked as required in the document.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails
409Conflict — ProblemDetails
DELETE/api/v1/escrow/holders/{organisationId}/responders/{responderId}

Withdraws an individual responder's credentialing (FR-01.033).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
organisationIdpathstring (uuid)yes—
responderIdpathstring (uuid)yes—
tenantIdquerystring (uuid)no—
reasonquerystringno—

Request body

No request body.

Responses

400Bad Request — ProblemDetails
401Unauthorized — ProblemDetails
403Forbidden — ProblemDetails
404Not Found — ProblemDetails

RotationObligations

GET/api/v1/rotation/obligations

Lists the caller's open device-removal rotation obligations, oldest removal first.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

No request body.

Responses

200The open obligations; an empty list when nothing is owed. — KeyRotationObligationResponse[]
400The token carries no user identity. — ProblemDetails
GET/api/v1/rotation/obligations/emergency-key

Lists the caller's open emergency-key rotation obligations, oldest exposure first (FR-01.042(d), #22167): rotations owed because a break-glass grant was revoked after its Emergency Access Key had been reconstructed, so the key is treated as known-exposed.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

No request body.

Responses

200The open obligations; an empty list when nothing is owed. — EakRotationObligationResponse[]
400The token carries no user identity. — ProblemDetails
POST/api/v1/rotation/obligations/emergency-key/{id}/defer

Defers one of the caller's emergency-key rotations for one cadence period (FR-01.043 / AC-01.044 (c), #22248). The defer is recorded on the escrow audit chain and anchored to the EPIC 4 ledger as "offered, chose to defer, residual exposure window"; the reminder returns when it runs out. One defer per reminder — the rotation can be put off, never suppressed.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
idpathstring (uuid)yesThe obligation id from `GET /api/v1/rotation/obligations/emergency-key`.

Request body

No request body.

Responses

200The defer was recorded and anchored. — EakRotationDeferralResponse
400The token carries no user identity. — ProblemDetails
404The caller owes no such rotation. — ProblemDetails
409The rotation is already done (`already-rotated`) or already deferred (`already-deferred`). — ProblemDetails

SharedCredentialWrap

PUT/api/v1/keys/shared-credentials/wraps

Re-wraps a household's shared credential for the remaining granted set on rotation or member departure (FR-01.097). Only the owner may re-wrap.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200Re-wrap committed; generation bumped. — RewrapSharedCredentialResponse
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
404No wrap exists for this credential, or the caller is not its owner. — ProblemDetails
409The wrap has been revoked. — ProblemDetails
POST/api/v1/keys/shared-credentials/wraps

Creates the first-generation multi-recipient wrap for a household's shared credential (FR-01.097). Idempotent per (household, credential) — 409 if one already exists.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Wrap created. — WrapSharedCredentialResponse
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
409A wrap already exists for this credential (re-wrap instead). — ProblemDetails
DELETE/api/v1/keys/shared-credentials/wraps

Withdraws a household's shared credential from sharing (FR-01.097) — deleted, or the last grantee departed. Only the owner may revoke. Cryptographically erases every recipient wrap.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

204Revoked (idempotent).
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
404No wrap exists for this credential, or the caller is not its owner. — ProblemDetails
GET/api/v1/keys/shared-credentials/wraps/mine

Fetches the caller's own current-generation wrapped copy of a shared credential's secret (FR-01.097), to unwrap locally. A non-grantee is answered 404 (no existence disclosure).

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
householdIdquerystring (uuid)no—
sharedCredentialIdquerystringno—

Request body

No request body.

Responses

200The caller's wrapped envelope. — SharedCredentialWrapForRecipientResponse
400Invalid request. — ProblemDetails
401Unauthorized — ProblemDetails
404The caller is not a current grantee of this credential. — ProblemDetails

UserPrivateKeyEnvelope

GET/api/v1/keys/private-envelope

Fetches the caller's wrapped private-key envelope so another device can re-derive the UMK and unwrap the account keyset locally. Rate-limited (default 5/hour/account) mirroring the wrapped-UMK envelope fetch throttle (FR-01.074-style — defends online guessing/harvesting of a stolen envelope).

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

No request body.

Responses

200Envelope returned. — UserPrivateKeyEnvelopeResponse
401No authenticated identity present. — ProblemDetails
404No envelope exists for this account. — ProblemDetails
429Envelope-fetch rate limit exceeded. — ProblemDetails
PUT/api/v1/keys/private-envelope

Mints or replaces the caller's wrapped private-key envelope. Create-vs-replace is decided server-side by whether the caller already has a row; a replace submitted with a `keyEpoch` older than the stored epoch is rejected 409 (concurrent-mint convergence guard — the caller lost a race against a newer mint and must retry against the current epoch).

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200Envelope upserted. — UserPrivateKeyEnvelopeResponse
400Invalid request — no authenticated identity, or malformed base64 ciphertext/iv. — ProblemDetails
401No authenticated identity present. — ProblemDetails
409A newer epoch is already stored for this account (stale epoch). — ProblemDetails

WrappedUmk

GET/api/v1/keys/wrapped-umk

Fetches the wrapped-UMK envelope set so a fresh device can derive the KEK and unwrap the UMK with the password alone (FR-01.074). Returns the current envelope plus any retiring prior-generation envelope during a rotation dual-key window. Rate-limited (default 5/hour/account) to defend online guessing of a stolen envelope; a 429 increments the throttled-fetch count and raises the FR-01.N66.011 anomaly notification.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

No request body.

Responses

200Envelope set returned. — GetWrappedUmkEnvelopeResponse
404No envelope exists for this account. — ProblemDetails
429Envelope-fetch rate limit exceeded (FR-01.074). — ProblemDetails
500Internal Server Error — ProblemDetails
PUT/api/v1/keys/wrapped-umk

Re-wraps the same UMK under a freshly-derived KEK after a password change or PBKDF2-iteration upgrade (FR-01.073). Gated behind a re-auth proof; the UMK / key hierarchy / stored ciphertext are untouched and the generation does not advance.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200Envelope re-wrapped. — RewrapWrappedUmkEnvelopeResponse
400Invalid request or re-auth proof missing. — ProblemDetails
401EPIC 9 step-up assertion required. — ProblemDetails
403Re-auth proof invalid. — ProblemDetails
404No envelope exists for this account. — ProblemDetails
409A conflicting keylifecycle operation is in progress. — ProblemDetails
POST/api/v1/keys/wrapped-umk

Creates the wrapped-UMK envelope at registration (FR-01.075). Idempotent per account — returns 409 if an envelope already exists (use `PUT` to re-wrap). Atomically seeds the genesis `key_generations` row.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Envelope created. — CreateWrappedUmkEnvelopeResponse
400Invalid request. — ProblemDetails
409An envelope already exists for this account. — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/keys/wrapped-umk/duress-envelope

Enrols the account's <strong>decoy</strong> vault-unlock envelope plus the sealed manifest of the curated subset it exposes (journey `duress-passphrase-silent-alarm-and-decoy-unlock`).

The client derives a KEK from the owner's alternate ("duress") passphrase, wraps a freshly-generated DECOY UMK under it, re-wraps the file keys of the documents the owner curated, and seals that list under the decoy UMK. Only opaque ciphertext reaches here: the server never sees the alternate passphrase, the decoy UMK, or which documents were chosen. Unlike `POST` (the registration create) this does <b>not</b> 409 against the account's existing primary envelope — a decoy occupies a different slot. The single-current-envelope guarantee is preserved per slot by `unq_wrapped_umk_current` keyed on `(user_id, kind)`, so a second envelope of the SAME kind still conflicts exactly as before. Re-enrolling under a new alternate passphrase re-wraps the existing decoy in place.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Decoy envelope and sealed manifest enrolled (or re-wrapped). — CreateWrappedUmkEnvelopeResponse
400Invalid request or unresolved user identity. — ProblemDetails
404The account has no primary envelope to enrol a decoy against. — ProblemDetails
409A concurrent enrolment won the race for this slot. — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/keys/wrapped-umk/majority-transition-rekey

Performs the offline-capable EPIC-1 re-key leg of the CC-070 minor→adult majority transition (journey `guardian-minor-vault-to-adulthood-handover`, FR-30.011). Re-wraps the same UMK under the new adult's KEK — transferring sole key custody and severing the guardian-pre-enrolled transition envelope — and enqueues the discrete `MinorMajorityVaultRekeyedIntegrationEvent` so EPIC 4 writes the superseding attestation the transition compliance report evidences.

Authorised by a one-shot `purpose=majority-transition-rekey` token minted by the EPIC 30/9 CC-070 orchestration after it verified majority + identity — not a current-envelope re-auth proof (the first-time-claiming adult cannot produce one) and never a live guardian (FR-30.011 makes the guardian non-essential). Mirrors the FR-01.092 `purpose=envelope-provisioning` registration gate. Zero-knowledge: only the re-wrapped ciphertext + KEK parameters reach the server.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

200Re-key committed; superseding-attestation event enqueued. — RekeyMajorityTransitionResponse
400Invalid request or unresolved user identity. — ProblemDetails
403Missing/invalid majority-transition token (wrong purpose claim). — ProblemDetails
404No envelope exists for this account. — ProblemDetails
409A conflicting keylifecycle operation is in progress. — ProblemDetails
GET/api/v1/keys/wrapped-umk/passkey

Lists the account's passkey vault-unlockers and the device each is linked to (FR-01.049, #17493). A device removal revokes only the envelopes linked to that device, so an envelope listed with `enrolledByDevice: null` survives every removal and is for its owner to see and remove. Metadata only (no ciphertext or KDF input), so it is held to the default rate limit, not the FR-01.074 envelope-fetch budget.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

No request body.

Responses

200The passkey vault-unlockers (possibly none). — ListPasskeyUnlockersResponse
400Unresolved user identity. — ProblemDetails
POST/api/v1/keys/wrapped-umk/passkey

Enrols an ADDITIONAL passkey vault-unlock envelope onto the authenticated account (FR-01.058 passkey passwordless vault-unlock). The client wraps the account's UMK under a KEK HKDF-derived from the passkey's WebAuthn-PRF output; this stores that envelope keyed by resident credential. Unlike `POST` (the registration create), it coexists with the account's password / other passkey envelopes and does not seed a generation. Idempotent per credential — a re-enrol of the same credential returns 409.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Passkey envelope enrolled. — CreateWrappedUmkEnvelopeResponse
400Invalid request, or no `passkeyBindingToken` (`passkey_binding_required`). — ProblemDetails
403The `passkeyBindingToken` does not show the credential is the caller's (`passkey_binding_invalid`, #8149). — ProblemDetails
409A passkey envelope already exists for this credential. — ProblemDetails
500Internal Server Error — ProblemDetails
DELETE/api/v1/keys/wrapped-umk/passkey/{credentialId}

Removes the passkey vault-unlock envelope for a resident credential (FR-01.058 cryptographic revocation, §5). Call this whenever the passkey itself is removed so the wrapped UMK for that credential becomes unreachable. Idempotent — a non-existent credential envelope still returns 204.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
credentialIdpathstringyes—

Request body

No request body.

Responses

204Envelope removed (or already absent).
400Unresolved user identity. — ProblemDetails
401No fresh `act=recovery-settings-change` elevation (`step-up-required`, DVS-4.4c).
POST/api/v1/keys/wrapped-umk/passkey/{credentialId}/attest

Reports that this device has just unlocked the vault with a passkey (FR-01.049, #17609). An envelope listed with `enrolledByDevice: null` is linked to the device that proves possession here, so removing that device revokes it; an envelope already linked keeps its link.

Sent by the client after a successful local unwrap. The device is the one whose enrolled key verified the request's `X-Device-Proof` — never a body-supplied id (SEC-009(a)). Under the soak's `Audit` mode an unproven request still reaches here and records nothing (`outcome: device-proof-unverified`). Not on the `wrapped-umk-fetch` budget: it returns no key material.

Authentication:Bearer (the document-wide requirement)

Parameters

NameInTypeRequiredDescription
credentialIdpathstringyes—

Request body

No request body.

Responses

200What was recorded — see Essence.Core.MultiDeviceSync.Contracts.Responses.PasskeyEnvelopeAttestOutcomes. — AttestPasskeyEnvelopeResponse
400Unresolved user identity or an empty credential id. — ProblemDetails
401No verified device proof under `Enforce`. — ProblemDetails
404No live passkey envelope for this credential on the account. — ProblemDetails
POST/api/v1/keys/wrapped-umk/password-change

Initiates the FR-01.078 cross-service password change. EPIC 1 (the saga orchestrator) re-wraps the wrapped-UMK envelope, retains the prior version for compensation, and asks EPIC 9 to swap the login auth-hash. Returns 202 Accepted with the `saga_id`: the envelope re-wrap has committed and the saga is in its `AwaitingAuthHashSwap` window. Distinct from the envelope-only re-wrap (`PUT`) used by the FR-01.072(d) post-recovery path.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

202Saga opened; awaiting the EPIC 9 auth-hash swap. — ChangePasswordResponse
400Invalid request. — ProblemDetails
401An EPIC 9 `act=password-change` step-up elevation is required on `X-Step-Up-Token` (FR-01.073). — ProblemDetails
404No envelope exists for this account. — ProblemDetails
409A password change (or other keylifecycle op) is already in progress. — ProblemDetails
423Locked — ProblemDetails
GET/api/v1/keys/wrapped-umk/recovery-phrase

Fetches the account's recovery-phrase envelope (D-126 phase 2) so the client can re-derive the KEK from the phrase + stored salt and unwrap the UMK locally. Accepts an ordinary session JWT (the owner checking / rehearsing recovery), a one-shot EPIC 9 token carrying `purpose=recovery-rewrap` (a forgotten-password recoverer who has just proved possession of the phrase), OR the session a guardian recovery minted at its threshold (`purpose=recovery_session` + `amr=recovery`, #15645) — the recovering device opens this envelope with the recovery KEK it rebuilt from the guardians' shares. Any other purpose (envelope-provisioning, majority-transition-rekey, recovery_refresh, …) is 403. Rate-limited by the same `wrapped-umk-fetch` policy as the main envelope fetch (FR-01.074) to defend online guessing of a stolen phrase envelope.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

No request body.

Responses

200Recovery-phrase envelope returned. — GetRecoveryPhraseEnvelopeResponse
403A one-shot token with the wrong purpose claim. — ProblemDetails
404No recovery-phrase envelope is enrolled (`reason=recovery_phrase_envelope_missing`). — ProblemDetails
429Envelope-fetch rate limit exceeded (FR-01.074). — ProblemDetails
500Internal Server Error — ProblemDetails
POST/api/v1/keys/wrapped-umk/recovery-phrase

Enrols — or REPLACES — the account's <strong>recovery-phrase</strong> vault-unlock envelope (Decision D-126 phase 2). The client wraps the account's SAME UMK under a KEK HKDF-derived from the user's 24-word BIP39 phrase over a random salt; this stores that envelope tagged `Recovery-Phrase`. Like the passkey enrol it coexists with the password / passkey envelopes and does not seed a generation.

<b>Re-enrolment replaces.</b> A user who re-generates their phrase must be able to re-enrol, so an existing recovery-phrase envelope is soft-deleted (DAT-002) and the new one inserted in the same unit of work — this returns 201, not 409. Only a concurrent enrolment losing the unique-guard race returns 409 (`reason=recovery_phrase_envelope_exists`). Zero-knowledge: no plaintext key material is ever received here — only ciphertext, GCM parameters and the PUBLIC random HKDF salt. The phrase, KEK and UMK never leave the device.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

201Recovery-phrase envelope enrolled (or replaced). — CreateWrappedUmkEnvelopeResponse
400Invalid request or unresolved user identity. — ProblemDetails
401No fresh `act=recovery-settings-change` elevation (`step-up-required`, DVS-4.4c).
409A concurrent enrolment won the race for this user. — ProblemDetails
423Locked — ProblemDetails
500Internal Server Error — ProblemDetails
DELETE/api/v1/keys/wrapped-umk/recovery-phrase

Removes the account's recovery-phrase vault-unlock envelope (D-126 — the user disabled phrase recovery). The phrase-wrapped UMK becomes unreachable, so the phrase can no longer recover the vault. Idempotent — returns 204 when none exists.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

No request body.

Responses

204Envelope removed (or already absent).
400Unresolved user identity. — ProblemDetails
423Locked — ProblemDetails
POST/api/v1/keys/wrapped-umk/recovery-rewrap

Completes a D-126 forgotten-password recovery: replaces the CURRENT primary password envelope with the same UMK re-wrapped under a NEW password and relays the new EPIC 9 auth-hash through the FR-01.078 password-change saga — exactly as `POST .../password-change`, but WITHOUT a current-password precondition or step-up gate. The proof is the one-shot EPIC 9 token carrying `purpose=recovery-rewrap`, minted only after the user proved possession of their recovery phrase — or the session a guardian recovery minted at its threshold (`purpose=recovery_session` + `amr=recovery`, FR-01.072(d), #15645), which buys ONE re-wrap (a second since its `iat` is 409 `recovery_session_rewrap_spent`). An ordinary session JWT is rejected (403). Returns 202 with the `saga_id`: the envelope re-wrap has committed and the saga awaits the EPIC 9 auth-hash swap. The recovery-phrase envelope itself is untouched. A phrase recovery's response also carries the single-use `recoveryEnrolmentTicket` (#18062) that lets this browser enrol its signing key once after it signs in.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

202Saga opened; awaiting the EPIC 9 auth-hash swap. — RecoveryRewrapResponse
400Invalid request (incl. missing `authHashUpdate`). — ProblemDetails
403Missing/invalid recovery-rewrap token (wrong or absent purpose claim). — ProblemDetails
404No password envelope exists for this account. — ProblemDetails
409A password change (or other keylifecycle op) is already in progress, or this guardian-recovery session has already re-wrapped once. — ProblemDetails
POST/api/v1/keys/wrapped-umk/registration

Provisions the wrapped-UMK envelope at registration via the FR-01.092 inverted, envelope-first handshake (Decision D-127, option b). The caller presents a one-shot EPIC 9 envelope-provisioning token (a JWT carrying `purpose=envelope-provisioning` + the user's `sub`); EPIC 1 commits the envelope + genesis generation, opens the registration saga, and asks EPIC 9 to finalise the login auth-hash. Returns 202 Accepted with the `saga_id`: the account becomes loginable only once EPIC 9 finalises, so no observable user ever has an auth-hash without a matching envelope.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

202Saga opened; envelope provisioned, awaiting the EPIC 9 auth-hash finalisation. — ProvisionRegistrationEnvelopeResponse
400Invalid request. — ProblemDetails
403Missing/invalid envelope-provisioning token (wrong purpose claim). — ProblemDetails
409An envelope already exists, or a registration is already in progress. — ProblemDetails
POST/api/v1/keys/wrapped-umk/unlock-resolution

Reports a locally-resolved unlock — normal OR duress — so its audit / silent-alarm side effects are handed to the off-critical-path indistinguishability seam (FR-01.074, journey:duress-passphrase-silent-alarm-and-decoy-unlock, debt-2026-06-13-1072). Under zero-knowledge the server never sees the passphrase and cannot resolve duress vs normal itself; the client (having unwrapped the genuine or decoy UMK locally) reports the outcome here.

The client MUST call this on <b>every</b> unlock with an identically-shaped body, differing only in Essence.Core.MultiDeviceSync.Contracts.Requests.SignalUnlockResolutionRequest.Kind, so a coerced session cannot tell the two apart. The response is a constant `202 Accepted` for both kinds and whether or not the seam actually queued the signal — no accepted/dropped and no duress/normal tell. It is deliberately NOT on the `wrapped-umk-fetch` budget, only the platform default limiter (#9513). The envelope fetch's five-per-hour budget can be drained by the victim's own session; if the resolution shared it, a coercer could drain it and then compel an unlock the alarm could not report. For the same reason there is no per-account hourly budget of its own, which would be drainable the same way. A client whose fetch was refused reports Essence.Core.MultiDeviceSync.Contracts.Requests.UnlockResolutionKinds.Unresolved.

Authentication:Bearer (the document-wide requirement)

Parameters

Takes no parameters.

Request body

Not marked as required in the document.

Responses

202Resolution acknowledged (constant for both kinds). — SignalUnlockResolutionResponse
400Invalid request or unresolved user identity. — ProblemDetails
500Internal Server Error — ProblemDetails

Schemas

AcknowledgePendingKeyRotationRequest

PropertyTypeRequiredDescription
rotationSessionIdstring (uuid)no—

ApproveDeviceIntegrityStepUpRequest

PropertyTypeRequiredDescription
proofstring | nullno—

ApproveEscrowReconstructionRequest

PropertyTypeRequiredDescription
approvedAtstring (date-time)no—
approverKeyIdstring | nullno—
signatureBase64string | nullno—

ApproverDirectoryEntryResponse

PropertyTypeRequiredDescription
approverIdstring (uuid)no—
createdAtstring (date-time)no—
credentialTypestring | nullno—
effectiveFromstring (date-time)no—
effectiveUntilstring (date-time) | nullno—
enrolmentAdminIdstring (uuid)no—
entryIdstring | nullno—
isQuarantinedbooleanno—
signingKeyIdstring | nullno—
tenantIdstring (uuid) | nullno—

ApproverDirectoryListResponse

PropertyTypeRequiredDescription
approversApproverDirectoryEntryResponse[] | nullno—
nextCursorstring (date-time) | nullno—

AssistedRecoveryGrantConfirmationLookupRequest

PropertyTypeRequiredDescription
organizationIdstring (uuid)no—
recoveryTokenRefstring | nullno—

AssistedRecoveryGrantConfirmationResponse

PropertyTypeRequiredDescription
anchorRefstring | nullno—
attestationMatchesCanonicalbooleanno—
auditEntryHashstring | nullno—
auditEntryIdstring (uuid)no—
authorisedAtstring (date-time)no—
authorisingAdminIdstring (uuid)no—
confirmedbooleanno—
enrolmentIdstring (uuid)no—
grantScopeAuthoriseOnlybooleanno—
grantTypestring | nullno—
noDecryptCapabilityReleasedbooleanno—
recoveryTokenRefstring | nullno—
sealVerifiedbooleanno—
subjectUserIdstring (uuid)no—
unconfirmedReasonstring | nullno—
zkAttestationstring | nullno—

AssistedRecoveryGrantResponse

PropertyTypeRequiredDescription
anchorRefstring | nullno—
authorisingAdminIdstring (uuid)no—
enrolmentIdstring (uuid)no—
issuedAtstring (date-time)no—
recoveryTokenRefstring | nullno—
scopestring | nullno—
stepUpAssuranceLevelstring | nullno—
subjectUserIdstring (uuid)no—
zkAttestationstring | nullno—

AttestPasskeyEnvelopeResponse

PropertyTypeRequiredDescription
credentialIdstring | nullno—
enrolledByDeviceRegistrationIdstring (uuid) | nullno—
outcomestring | nullno—

AuthHashUpdateRequest

PropertyTypeRequiredDescription
breachCheckstring | nullno—
newAuthDerivationParamsstring | nullno—
newAuthHashstring | nullno—
passwordPolicyVersioninteger (int32) | nullno—

BequeathedCredentialItemDto

PropertyTypeRequiredDescription
authTagstring | nullno—
executorKeyRefstring | nullno—
itemIdstring | nullno—
itemNamestring | nullno—
ivstring | nullno—
sealedSecretstring | nullno—

BiometricMismatchAssuranceResponse

PropertyTypeRequiredDescription
assuranceRefstring | nullno—
expiresAtstring (date-time)no—

BiometricMismatchRebindResponse

PropertyTypeRequiredDescription
assuranceRefstring | nullno—
deviceNamestring | nullno—
keysReboundbooleanno—
previousDeviceNamestring | nullno—
previousDeviceStatusstring | nullno—
reestablishedAtstring (date-time)no—

BreakGlassConsentExportEntry

PropertyTypeRequiredDescription
granteestring | nullno—
granteeTypestring | nullno—
holderLabelstring | nullno—
legalBasisstring | nullno—
purposestring | nullno—
recordedAtstring | nullno—
scopestring[] | nullno—
statusstring | nullno—
windowEndstring | nullno—
windowStartstring | nullno—

BreakGlassConsentExportResponse

PropertyTypeRequiredDescription
articlestring | nullno—
entriesBreakGlassConsentExportEntry[] | nullno—
generatedAtstring (date-time)no—
ownerUserIdstring (uuid)no—
recordstring | nullno—

BreakGlassConsentListResponse

PropertyTypeRequiredDescription
consentsBreakGlassConsentResponse[] | nullno—
nextCursorstring (date-time) | nullno—

BreakGlassConsentResponse

PropertyTypeRequiredDescription
consentIdstring | nullno—
granteeIdstring (uuid)no—
granteeLabelstring | nullno—
granteeTypestring | nullno—
holderLabelstring | nullno—
homeRegionstring | nullno—
legalBasisstring | nullno—
legalBasisLabelstring | nullno—
ownerUserIdstring (uuid)no—
purposestring | nullno—
recordedAtstring (date-time)no—
scopeCategoriesstring[] | nullno—
statusstring | nullno—
tenantIdstring (uuid) | nullno—
windowEndstring (date-time) | nullno—
windowStartstring (date-time)no—
withdrawalReasonstring | nullno—
withdrawnAtstring (date-time) | nullno—

BreakGlassGrantedConsentListResponse

PropertyTypeRequiredDescription
consentsBreakGlassConsentResponse[] | nullno—
nextCursorstring (date-time) | nullno—
unreachableRegionsstring[] | nullno—

CancelMergeRewrapRequestBody

Body for the cancel action.

PropertyTypeRequiredDescription
reasonstring | nullnoWhy the task was cancelled, in words a member and an auditor can both read.

ChangePasswordRequest

PropertyTypeRequiredDescription
authHashUpdateAuthHashUpdateRequestno—
authTagstring | nullno—
ivstring | nullno—
kdfKdfParametersRequestno—
wrappedUmkstring | nullno—

ChangePasswordResponse

PropertyTypeRequiredDescription
requestedAtstring (date-time)no—
sagaIdstring (uuid)no—
statusstring | nullno—

CheckpointMergeRewrapRequest

PropertyTypeRequiredDescription
checkpointDatastring | nullno—
deviceIdstring | nullno—
rewrappedItemsinteger (int32)no—

CheckpointRotationRequest

PropertyTypeRequiredDescription
checkpointDatastring | nullno—
rotatedItemsinteger (int32)no—

ClaimMergeRewrapRequest

PropertyTypeRequiredDescription
deviceIdstring | nullno—
leaseMinutesinteger (int32) | nullno—

CompleteKeyRotationRequest

PropertyTypeRequiredDescription
newGenerationEnvelopeRotationEnvelopeRequestno—
passkeyRewrapsRotationPasskeyRewrapRequest[] | nullno—

CompleteMergeRewrapRequest

PropertyTypeRequiredDescription
deviceIdstring | nullno—

CompletePairingRequest

PropertyTypeRequiredDescription
approvedJoinerSigningKeyThumbprintstring | nullno—
wrappedMasterKeystring | nullno—

ConductExecutorRehearsalRequest

PropertyTypeRequiredDescription
depthstring | nullno—
enrolmentIdstring | nullno—

ConfigureEscrowRequest

PropertyTypeRequiredDescription
enrolmentIdstring | nullno—
fingerprintstring | nullno—
sharesConfigureEscrowShareEnvelope[] | nullno—
thresholdinteger (int32)no—
totalSharesinteger (int32)no—
wrappedVaultKeysConfigureEscrowVaultKeyWrap[] | nullno—

ConfigureEscrowShareEnvelope

PropertyTypeRequiredDescription
ciphertextstring (byte) | nullno—
holderIdstring | nullno—
holderTypestring | nullno—
rolestring | nullno—
shareIndexinteger (int32)no—

ConfigureEscrowVaultKeyWrap

PropertyTypeRequiredDescription
aadstring | nullno—
authTagstring (byte) | nullno—
ciphertextstring (byte) | nullno—
noncestring (byte) | nullno—
vaultCategorystring | nullno—

ConfirmPairingRequest

PropertyTypeRequiredDescription
deviceIdstring (uuid)no—
fingerprintConfirmedbooleanno—
sasConfirmationstring | nullno—

CreatePairingSessionRequest

PropertyTypeRequiredDescription
challengestring | nullno—
deviceAIdstring (uuid)no—
deviceAPublicKeystring | nullno—
expiresAtstring (date-time)no—

CreateWrappedUmkEnvelopeRequest

PropertyTypeRequiredDescription
authTagstring | nullno—
ivstring | nullno—
kdfKdfParametersRequestno—
passkeyBindingTokenstring | nullno—
passkeyCredentialIdstring | nullno—
wrappedUmkstring | nullno—

CreateWrappedUmkEnvelopeResponse

PropertyTypeRequiredDescription
createdAtstring (date-time)no—
versioninteger (int32)no—

CredentialedResponderSummary

PropertyTypeRequiredDescription
credentialedAtstring (date-time)no—
responderClassstring | nullno—
responderIdstring (uuid)no—
revokedAtstring (date-time) | nullno—
statusstring | nullno—

CredentialResponderRequest

PropertyTypeRequiredDescription
responderClassstring | nullno—
responderIdstring (uuid)no—
tenantIdstring (uuid) | nullno—

CurrentKeyGenerationResponse

PropertyTypeRequiredDescription
currentGenerationstring | nullno—
pendingRotationSessionIdstring (uuid) | nullno—

DenyEscrowReconstructionRequest

PropertyTypeRequiredDescription
reasonstring | nullno—

DeprovisionApproverResult

PropertyTypeRequiredDescription
approverIdstring (uuid)no—
quorumsRevertedinteger (int32)no—

DeviceChallengeResponse

PropertyTypeRequiredDescription
challengeIdstring (uuid)no—
deviceRegistrationIdstring (uuid)no—
expiresAtstring (date-time)no—
noncestring | nullno—
purposestring | nullno—

DeviceIntegrityResponse

PropertyTypeRequiredDescription
appAttestRiskMetricinteger (int32) | nullno—
appAttestRiskMetricReadAtstring (date-time) | nullno—
changestring | nullno—
deviceRegistrationIdstring (uuid)no—
observedbooleanno—
observedAtstring (date-time) | nullno—
platformstring | nullno—
posturestring | nullno—
postureReasonstring | nullno—
priorVerdictstring | nullno—
reasonstring | nullno—
stalebooleanno—
verdictstring | nullno—

DeviceIntegrityStepUpListResponse

PropertyTypeRequiredDescription
requestsDeviceIntegrityStepUpResponse[] | nullno—

DeviceIntegrityStepUpResponse

PropertyTypeRequiredDescription
bodyDigeststring | nullno—
createdAtstring (date-time)no—
decidedByDeviceRegistrationIdstring (uuid) | nullno—
expiresAtstring (date-time)no—
methodstring | nullno—
pathstring | nullno—
peerProofstring | nullno—
requestingDeviceNamestring | nullno—
requestingDeviceRegistrationIdstring (uuid)no—
statusstring | nullno—
stepUpRequestIdstring (uuid)no—

DeviceKeyExchangeKeyRotationResponse

PropertyTypeRequiredDescription
deviceRegistrationIdstring (uuid)no—
publicKeyFingerprintstring | nullno—
rotatedAtstring (date-time)no—

DeviceRegistrationResponse

PropertyTypeRequiredDescription
deviceIdstring | nullno—
deviceNamestring | nullno—
deviceTypestring | nullno—
idstring (uuid)no—
isActivebooleanno—
lastSeenAtstring (date-time)no—
publicKeystring | nullno—
registeredAtstring (date-time)no—
signingKeyEnrolledAtstring (date-time) | nullno—
signingKeyEnrolmentMethodstring | nullno—
signingKeyThumbprintstring | nullno—
suspectedLostAtstring (date-time) | nullno—
suspectedLostRecoverySessionIdstring (uuid) | nullno—
userIdstring (uuid)no—

DeviceRegistrationResponseCursorResult

PropertyTypeRequiredDescription
hasMorebooleanno—
itemsDeviceRegistrationResponse[] | nullno—
nextCursorstring | nullno—
pageSizeinteger (int32)no—
previousCursorstring | nullno—

DeviceSigningKeyLookupRequest

PropertyTypeRequiredDescription
keyThumbprintstring | nullno—
userIdstring (uuid)no—

DeviceSigningKeyLookupResponse

PropertyTypeRequiredDescription
deviceRegistrationIdstring (uuid) | nullno—
foundbooleanno—
keyThumbprintstring | nullno—
publicJwkstring | nullno—

DeviceSyncStatusResponse

PropertyTypeRequiredDescription
deviceIdstring (uuid)no—
isOnlinebooleanno—
keyGenerationinteger (int32)no—
lastSyncedAtstring (date-time)no—
pendingUpdatesinteger (int32)no—

EakEnrolmentResponse

PropertyTypeRequiredDescription
createdAtstring (date-time)no—
escrowKeyFingerprintstring | nullno—
expiresAtstring (date-time)no—
idstring (uuid)no—
isEnabledbooleanno—
jurisdictionstring | nullno—
revocationReasonstring | nullno—
revokedAtstring (date-time) | nullno—
sharesEakShareCustodySummary[] | nullno—
thresholdinteger (int32)no—
totalSharesinteger (int32)no—
updatedAtstring (date-time) | nullno—
userIdstring (uuid)no—
vaultCategorystring | nullno—

EakRotationDeferralResponse

PropertyTypeRequiredDescription
anchorReferencestring | nullno—
deferralCountinteger (int32)no—
deferredAtstring (date-time)no—
deferredUntilstring (date-time)no—
exposedAtstring (date-time)no—
obligationIdstring (uuid)no—

EakRotationObligationResponse

PropertyTypeRequiredDescription
canDeferbooleanno—
causestring | nullno—
deferredUntilstring (date-time) | nullno—
exposedAtstring (date-time)no—
idstring (uuid)no—
nextDueAtstring (date-time)no—
reSurfaceDaysinteger (int32)no—
sessionIdstring (uuid)no—

EakShareCustodySummary

PropertyTypeRequiredDescription
createdAtstring (date-time)no—
holderOrgIdstring (uuid) | nullno—
holderRolestring | nullno—
holderTypestring | nullno—
idstring (uuid)no—
publicKeyFingerprintstring | nullno—
revokedAtstring (date-time) | nullno—
shareIndexinteger (int32)no—

EmergencyAccessAnchorResponse

PropertyTypeRequiredDescription
actorRefstring | nullno—
anchorIdstring (uuid)no—
blockchainAnchorIdstring | nullno—
configRefstring | nullno—
occurredOnstring (date-time)no—
originInstanceIdstring (uuid)no—
phasestring | nullno—
recordedAtstring (date-time)no—
requesterOrgRefstring | nullno—
requesterRefstring | nullno—
sessionRefstring | nullno—
subjectRefstring | nullno—
urgencystring | nullno—

EmergencyAccessAnchorResponseCursorResult

PropertyTypeRequiredDescription
hasMorebooleanno—
itemsEmergencyAccessAnchorResponse[] | nullno—
nextCursorstring | nullno—
pageSizeinteger (int32)no—
previousCursorstring | nullno—

EmergencyAccessReleaseHistoryResponse

PropertyTypeRequiredDescription
eventsEmergencyAccessReleaseRecordDto[] | nullno—
generatedAtstring (date-time)no—
subjectUserIdstring (uuid)no—

EmergencyAccessReleaseRecordDto

PropertyTypeRequiredDescription
anchorRefstring | nullno—
approvalChainstring[] | nullno—
eventIdstring (uuid)no—
evidenceHashstring | nullno—
fieldsReleasedstring[] | nullno—
grantEndedAtstring (date-time) | nullno—
invokerLabelstring | nullno—
occurredAtstring (date-time)no—
outcomestring | nullno—
releasePathstring | nullno—

EmergencyCardReadResponse

PropertyTypeRequiredDescription
anchorIdstring | nullno—
anchoredHashstring | nullno—
notifiedRecipientCountinteger (int32)no—
occurredAtstring (date-time)no—
readEventIdstring (uuid)no—

EnrolApproverRequest

PropertyTypeRequiredDescription
approverIdstring (uuid)no—
attestationstring | nullno—
credentialPinstring | nullno—
credentialTypestring | nullno—
effectiveFromstring (date-time)no—
effectiveUntilstring (date-time) | nullno—
tenantIdstring (uuid) | nullno—

EnrolDeviceSigningKeyRequest

PropertyTypeRequiredDescription
enrolmentProofstring | nullno—
pairingSessionIdstring (uuid) | nullno—
recoveryEnrolmentTicketstring | nullno—
signingKeyJwkstring | nullno—

EnrolDuressEnvelopeRequest

PropertyTypeRequiredDescription
authTagstring | nullno—
behaviourAcknowledgementVersionstring | nullno—
ivstring | nullno—
kdfKdfParametersRequestno—
manifestAuthTagstring | nullno—
manifestIvstring | nullno—
sealedManifeststring | nullno—
wrappedUmkstring | nullno—

EnrolEakRequest

PropertyTypeRequiredDescription
escrowKeyFingerprintstring | nullno—
expiresAtstring (date-time)no—
jurisdictionstring | nullno—
sharesEnrolEakShareRequest[] | nullno—
thresholdinteger (int32)no—
totalSharesinteger (int32)no—
vaultCategorystring | nullno—

EnrolEakShareRequest

PropertyTypeRequiredDescription
encryptedSharestring (byte) | nullno—
holderOrgIdstring (uuid) | nullno—
holderRolestring | nullno—
holderTypestring | nullno—
publicKeyFingerprintstring | nullno—
shareIndexinteger (int32)no—

EnrolFallbackRecoveryCodeRequest

PropertyTypeRequiredDescription
recoveryCodestring | nullno—

EnrollPasskeyEnvelopeRequest

PropertyTypeRequiredDescription
authTagstring | nullno—
ivstring | nullno—
passkeyBindingTokenstring | nullno—
passkeyCredentialIdstring | nullno—
prfInputstring | nullno—
wrappedUmkstring | nullno—

EnrolRecoveryPhraseEnvelopeRequest

PropertyTypeRequiredDescription
authTagstring | nullno—
ivstring | nullno—
phraseSaltstring | nullno—
wrappedUmkstring | nullno—

EnrolResponderHolderRequest

PropertyTypeRequiredDescription
credentialedClassesstring[] | nullno—
holderRolestring | nullno—
organisationIdstring (uuid)no—
tenantIdstring (uuid) | nullno—

EscrowAuditChainResponse

PropertyTypeRequiredDescription
entriesEscrowAuditEntryDto[] | nullno—
hasMorebooleanno—
headHashstring | nullno—
nextCursorstring | nullno—
pageSizeinteger (int32)no—

EscrowAuditChainVerificationResponse

PropertyTypeRequiredDescription
entriesCheckedinteger (int32)no—
failureReasonstring | nullno—
firstFailureEntryIdstring (uuid) | nullno—
firstFailureIndexinteger (int32) | nullno—
isValidbooleanno—

EscrowAuditEntryDto

PropertyTypeRequiredDescription
actionstring | nullno—
actorIdstring (uuid)no—
blockchainAnchorIdstring | nullno—
enrolmentIdstring (uuid) | nullno—
entryHashstring | nullno—
idstring (uuid)no—
occurredAtstring (date-time)no—
payloadJsonstring | nullno—
previousHashstring | nullno—
requestIdstring (uuid) | nullno—

EscrowEnrolmentStatusResponse

PropertyTypeRequiredDescription
attestationStaleUnverifiedbooleanno—
belowReconstructionThresholdForDisplaybooleanno—
createdAtstring (date-time)no—
displayAvailableHolderCountinteger (int32)no—
enrolmentIdstring | nullno—
fingerprintstring | nullno—
freshnessWindowDaysinteger (int32)no—
holdersEscrowShareHolderSummary[] | nullno—
revocationReasonstring | nullno—
revokedAtstring (date-time) | nullno—
statusstring | nullno—
thresholdinteger (int32)no—
totalSharesinteger (int32)no—
updatedAtstring (date-time) | nullno—
userIdstring (uuid)no—
vaultCategoriesstring[] | nullno—

EscrowReconstructionHolderDto

PropertyTypeRequiredDescription
holderIdstring | nullno—
holderTypestring | nullno—
rolestring | nullno—
shareIndexinteger (int32)no—

EscrowReconstructionJustificationResponse

PropertyTypeRequiredDescription
justificationstring | nullno—
readerRolestring | nullno—
requestIdstring (uuid)no—
statestring | nullno—

EscrowReconstructionLifecycleResponse

PropertyTypeRequiredDescription
accessExpiresAtstring (date-time) | nullno—
accessExtensionChallengeNoncestring | nullno—
accessExtensionCountinteger (int32)no—
accessWindowCeilingstring (date-time) | nullno—
approvalChallengeNoncestring | nullno—
approvalCountinteger (int32)no—
earliestUnlockAtstring (date-time) | nullno—
enrolmentIdstring | nullno—
expiresAtstring (date-time)no—
requestIdstring (uuid)no—
shareSubmissionCountinteger (int32)no—
statusstring | nullno—
updatedAtstring (date-time) | nullno—
zeroizationSignalledAtstring (date-time) | nullno—

EscrowReconstructionMaterialResponse

PropertyTypeRequiredDescription
accessExpiresAtstring (date-time) | nullno—
enrolmentIdstring (uuid)no—
holdersEscrowReconstructionHolderDto[] | nullno—
requestIdstring (uuid)no—
thresholdinteger (int32)no—
totalSharesinteger (int32)no—
vaultKeyWrapsEscrowVaultKeyWrapDto[] | nullno—

EscrowReconstructionRequestResponse

PropertyTypeRequiredDescription
approvalChallengeNoncestring | nullno—
enrolmentIdstring | nullno—
expiresAtstring (date-time) | nullno—
requestIdstring (uuid)no—
requestedAtstring (date-time)no—
statusstring | nullno—

EscrowRequesterClosedRequestDto

PropertyTypeRequiredDescription
expiresAtstring (date-time)no—
requestIdstring (uuid)no—
requestedAtstring (date-time)no—
statusstring | nullno—
subjectUserIdstring (uuid)no—

EscrowRequesterClosedRequestsResponse

PropertyTypeRequiredDescription
requestsEscrowRequesterClosedRequestDto[] | nullno—

EscrowRequesterOpenRequestDto

PropertyTypeRequiredDescription
earliestUnlockAtstring (date-time) | nullno—
expiresAtstring (date-time) | nullno—
homeRegionstring | nullno—
requestIdstring (uuid)no—
requestedAtstring (date-time)no—
statusstring | nullno—
subjectUserIdstring (uuid) | nullno—

EscrowRequesterOpenRequestsResponse

PropertyTypeRequiredDescription
requestsEscrowRequesterOpenRequestDto[] | nullno—

EscrowShareHolderSummary

PropertyTypeRequiredDescription
attestationStaleUnverifiedbooleanno—
hasHsmCustodybooleanno—
holderIdstring | nullno—
holderTypestring | nullno—
rolestring | nullno—
shareIndexinteger (int32)no—

EscrowShareSubmissionDto

PropertyTypeRequiredDescription
holderIdstring | nullno—
rewrapCiphertextBase64string | nullno—
shareIndexinteger (int32)no—
submittedAtstring (date-time)no—

EscrowShareSubmissionsResponse

PropertyTypeRequiredDescription
accessExpiresAtstring (date-time) | nullno—
earliestUnlockAtstring (date-time) | nullno—
requestIdstring (uuid)no—
statusstring | nullno—
submissionsEscrowShareSubmissionDto[] | nullno—

EscrowVaultKeyWrapDto

PropertyTypeRequiredDescription
aadstring | nullno—
authTagBase64string | nullno—
ciphertextBase64string | nullno—
nonceBase64string | nullno—
vaultCategorystring | nullno—

ExecutorBequestItemSummaryResponse

PropertyTypeRequiredDescription
itemIdstring | nullno—
itemNamestring | nullno—
lastRevealedAtstring (date-time) | nullno—
revealCountinteger (int32)no—
statusstring | nullno—

ExecutorBequestSummaryResponse

PropertyTypeRequiredDescription
bequestIdstring (uuid)no—
donorUserIdstring (uuid)no—
itemsExecutorBequestItemSummaryResponse[] | nullno—
releasedAtstring (date-time) | nullno—
statusstring | nullno—
triggerLabelstring | nullno—

ExecutorRehearsalResponse

PropertyTypeRequiredDescription
anchorRefstring | nullno—
assertionstring | nullno—
conductedAtstring (date-time)no—
dataReleasedbooleanno—
depthstring | nullno—
enrolmentIdstring (uuid)no—
gateResultsRehearsalGateResultDto[] | nullno—
isReadybooleanno—
readinessGapCountinteger (int32)no—
readinessPassCountinteger (int32)no—
runTypestring | nullno—
simulatedActorbooleanno—
umkUnwrappedbooleanno—

FallbackRecoveryEnrolmentResponse

PropertyTypeRequiredDescription
enrolledAtstring (date-time)no—

GetRecoveryPhraseEnvelopeResponse

PropertyTypeRequiredDescription
envelopeWrappedUmkEnvelopeDtono—

GetWrappedUmkEnvelopeResponse

PropertyTypeRequiredDescription
currentGenerationstring | nullno—
envelopesWrappedUmkEnvelopeDto[] | nullno—
pendingRotationPendingRotationEnvelopeDtono—

InitiateKeyRotationRequest

PropertyTypeRequiredDescription
deviceIdstring | nullno—
totalItemsinteger (int32)no—
triggerstring | nullno—

InitiateRecoverySessionRequest

PropertyTypeRequiredDescription
configIdstring (uuid) | nullno—
reasonstring | nullno—

IssueAssistedRecoveryAuthorizationRequest

PropertyTypeRequiredDescription
enrolmentIdstring (uuid)no—
proofingEvidenceRefstring | nullno—

IssueDeviceChallengeRequest

PropertyTypeRequiredDescription
purposestring | nullno—

KdfParametersDto

PropertyTypeRequiredDescription
algorithmstring | nullno—
iterationsinteger (int32)no—
saltstring | nullno—

KdfParametersRequest

PropertyTypeRequiredDescription
algorithmstring | nullno—
calibrationModeinteger (int32)no—
iterationsinteger (int32)no—
saltstring | nullno—

KeyCustodyIntegrityDecisionRequest

PropertyTypeRequiredDescription
bodySha256string | nullno—
deviceProofstring | nullno—
methodstring | nullno—
pathstring | nullno—
peerProofstring | nullno—
possessionRefusesUnverifiedbooleanno—
skipIntegritybooleanno—
verifyPossessionbooleanno—

KeyCustodyIntegrityDecisionResponse

PropertyTypeRequiredDescription
evaluatedbooleanno—
indeterminatebooleanno—
outcomestring | nullno—
peerOutcomestring | nullno—
possessionKeyCustodyPossessionVerdictno—
posturestring | nullno—
stalebooleanno—
stepUpDeviceRegistrationIds(string (uuid))[] | nullno—

KeyCustodyPossessionVerdict

PropertyTypeRequiredDescription
deviceRegistrationIdstring (uuid) | nullno—
outcomestring | nullno—
verifiedbooleanno—

KeyRotationObligationResponse

PropertyTypeRequiredDescription
dispositionstring | nullno—
idstring (uuid)no—
removedAtstring (date-time)no—
removedDeviceIdstring (uuid)no—
removedDeviceNamestring | nullno—

KeyRotationSessionResponse

PropertyTypeRequiredDescription
carriedPasskeyCountinteger (int32) | nullno—
checkpointDatastring | nullno—
completedAtstring (date-time) | nullno—
coverageConfirmedbooleanno—
coveredItemCountinteger (int32) | nullno—
deviceIdstring | nullno—
dualKeyWindowExpiresAtstring (date-time)no—
failureReasonstring | nullno—
idstring (uuid)no—
introducedGenerationstring | nullno—
lastCheckpointAtstring (date-time) | nullno—
newGenerationEnvelopeHeldbooleanno—
oldGenerationItemCountinteger (int32) | nullno—
progressPercentagenumber (double)no—
revokedPasskeyCountinteger (int32) | nullno—
rotatedItemsinteger (int32)no—
startedAtstring (date-time)no—
statusstring | nullno—
totalItemsinteger (int32)no—
triggerstring | nullno—
userIdstring (uuid)no—

ListPasskeyUnlockersResponse

PropertyTypeRequiredDescription
itemsPasskeyUnlockerDto[] | nullno—

MergeRewrapTaskResponse

PropertyTypeRequiredDescription
cancellationReasonstring | nullno—
caseReferencestring | nullno—
checkpointDatastring | nullno—
claimedByDeviceIdstring | nullno—
completedAtstring (date-time) | nullno—
expiresAtstring (date-time)no—
handoverAlgorithmstring | nullno—
handoverEnvelopestring | nullno—
handoverPostedbooleanno—
leaseExpiresAtstring (date-time) | nullno—
mergeSessionIdstring (uuid)no—
remainingItemsinteger (int32)no—
retiringUserIdstring (uuid)no—
rewrappedItemsinteger (int32)no—
statusstring | nullno—
survivingUserIdstring (uuid)no—
survivorKeyRefstring | nullno—
taskIdstring (uuid)no—
totalItemsinteger (int32)no—

NotifyDevicesRequest

PropertyTypeRequiredDescription
perDeviceWrappedKeyMaterialmap<string, string> | nullno—

NotifyDevicesResponse

PropertyTypeRequiredDescription
devicesNotifiedinteger (int32)no—
notifiedDeviceIds(string (uuid))[] | nullno—
skippedDeviceFingerprintsstring[] | nullno—
unmatchedDeviceFingerprintsstring[] | nullno—

OpenDeviceIntegrityStepUpRequest

PropertyTypeRequiredDescription
bodyDigeststring | nullno—
methodstring | nullno—
pathstring | nullno—

OpenMergeRewrapTaskRequest

PropertyTypeRequiredDescription
caseReferencestring | nullno—
mergeSessionIdstring (uuid)no—
retiringUserIdstring (uuid)no—
survivingUserIdstring (uuid)no—
totalItemsinteger (int32)no—
workWindowDaysinteger (int32) | nullno—

PairingSessionResponse

PropertyTypeRequiredDescription
completedAtstring (date-time) | nullno—
createdAtstring (date-time)no—
deviceAIdstring (uuid)no—
deviceBIdstring (uuid) | nullno—
deviceBPublicKeystring | nullno—
expiresAtstring (date-time)no—
isExpiredbooleanno—
joinedAtstring (date-time) | nullno—
joinerFriendlyNamestring | nullno—
joinerProvenancestring | nullno—
joinerSigningKeyApprovedAtstring (date-time) | nullno—
joinerSigningKeyThumbprintstring | nullno—
pairingSessionIdstring (uuid)no—
statusstring | nullno—
timeRemainingstring (date-span) | nullno—
wrappedMasterKeystring | nullno—

PasskeyUnlockerDeviceDto

PropertyTypeRequiredDescription
deviceNamestring | nullno—
isActivebooleanno—
registrationIdstring (uuid)no—

PasskeyUnlockerDto

PropertyTypeRequiredDescription
credentialIdstring | nullno—
enrolledAtstring (date-time)no—
enrolledByDevicePasskeyUnlockerDeviceDtono—
isPrimarybooleanno—

PasswordChangeSagaStatusResponse

PropertyTypeRequiredDescription
isOpenbooleanno—
retryAfterSecondsinteger (int32)no—

PendingKeyRotationResponse

PropertyTypeRequiredDescription
queuedAtstring (date-time)no—
rotationSessionIdstring (uuid)no—
wrappedKeyMaterialstring | nullno—

PendingMergeRewrapTasksResponse

PropertyTypeRequiredDescription
tasksMergeRewrapTaskResponse[] | nullno—

PendingRotationEnvelopeDto

PropertyTypeRequiredDescription
envelopeWrappedUmkEnvelopeDtono—
keyGenerationstring | nullno—
passkeyEnvelopesWrappedUmkEnvelopeDto[] | nullno—
rotationSessionIdstring (uuid)no—

PostMergeHandoverRequest

PropertyTypeRequiredDescription
algorithmstring | nullno—
handoverEnvelopestring | nullno—
survivorKeyRefstring | nullno—

PostRewrappedEscrowShareRequest

PropertyTypeRequiredDescription
holderIdstring | nullno—
rewrapCiphertextBase64string | nullno—
shareIndexinteger (int32)no—

ProblemDetails

PropertyTypeRequiredDescription
detailstring | nullno—
instancestring | nullno—
statusinteger (int32) | nullno—
titlestring | nullno—
typestring | nullno—

ProtectionStatusResponse

PropertyTypeRequiredDescription
alternatePassphraseChangedAtstring (date-time) | nullno—
alternatePassphraseProvisionedbooleanno—
backupVaultChangedAtstring (date-time) | nullno—
backupVaultLastReviewedAtstring (date-time) | nullno—
backupVaultPresentbooleanno—
behaviourAcknowledgedAtstring (date-time) | nullno—
behaviourAcknowledgementVersionstring | nullno—

ProvisionRegistrationEnvelopeRequest

PropertyTypeRequiredDescription
authTagstring | nullno—
ivstring | nullno—
kdfKdfParametersRequestno—
wrappedUmkstring | nullno—

ProvisionRegistrationEnvelopeResponse

PropertyTypeRequiredDescription
requestedAtstring (date-time)no—
sagaIdstring (uuid)no—
statusstring | nullno—

RebindAfterBiometricMismatchRequest

PropertyTypeRequiredDescription
assuranceRefstring | nullno—
authTagstring | nullno—
deviceIdstring | nullno—
deviceNamestring | nullno—
deviceTypestring | nullno—
ivstring | nullno—
kdfKdfParametersRequestno—
publicKeystring | nullno—
revokePreviousDevicebooleanno—
wrappedUmkstring | nullno—

RecordBreakGlassConsentRequest

PropertyTypeRequiredDescription
granteeIdstring (uuid)no—
granteeLabelstring | nullno—
granteeTypestring | nullno—
holderLabelstring | nullno—
legalBasisstring | nullno—
purposestring | nullno—
scopeCategoriesstring[] | nullno—
tenantIdstring (uuid) | nullno—
windowEndstring (date-time) | nullno—
windowStartstring (date-time)no—

RecordEmergencyCardReadRequest

PropertyTypeRequiredDescription
channelstring | nullno—
disclosureLevelstring | nullno—
instanceIdstring (uuid)no—
nominatedContactUserIds(string (uuid))[] | nullno—
occurredAtstring (date-time) | nullno—
responderTypestring | nullno—
subjectUserIdstring (uuid)no—

RecoveryRewrapRequest

PropertyTypeRequiredDescription
authHashUpdateAuthHashUpdateRequestno—
authTagstring | nullno—
ivstring | nullno—
kdfKdfParametersRequestno—
wrappedUmkstring | nullno—

RecoveryRewrapResponse

PropertyTypeRequiredDescription
recoveryEnrolmentTicketstring | nullno—
requestedAtstring (date-time)no—
sagaIdstring (uuid)no—
statusstring | nullno—

RecoverySessionResponse

PropertyTypeRequiredDescription
absoluteExpiresAtstring (date-time)no—
canExtendbooleanno—
configIdstring (uuid) | nullno—
effectiveDeadlinestring (date-time)no—
expiresAtstring (date-time)no—
extensionCountinteger (int32)no—
extensionsRemaininginteger (int32)no—
idstring (uuid)no—
initiatedAtstring (date-time)no—
statusstring | nullno—
userIdstring (uuid)no—

RegisterDeviceRequest

PropertyTypeRequiredDescription
deviceFingerprintstring | nullno—
deviceNamestring | nullno—
deviceTypestring | nullno—
publicKeystring | nullno—

RehearsalGateResultDto

PropertyTypeRequiredDescription
detailstring | nullno—
gatestring | nullno—
passedbooleanno—

RekeyMajorityTransitionRequest

PropertyTypeRequiredDescription
authTagstring | nullno—
ivstring | nullno—
kdfKdfParametersRequestno—
transitionIdstring (uuid)no—
wrappedUmkstring | nullno—

RekeyMajorityTransitionResponse

PropertyTypeRequiredDescription
keyGenerationstring | nullno—
rekeyedAtstring (date-time)no—
transitionIdstring (uuid)no—
versioninteger (int32)no—

ReleaseExecutorBequestRequest

PropertyTypeRequiredDescription
bequestIdstring (uuid)no—
estateGrantIdstring (uuid)no—

ReleaseExecutorBequestResponse

PropertyTypeRequiredDescription
availableItemCountinteger (int32)no—
bequestIdstring (uuid)no—
releasedAtstring (date-time) | nullno—
statusstring | nullno—

ReleaseMergeRewrapRequest

PropertyTypeRequiredDescription
deviceIdstring | nullno—
reasonstring | nullno—

RequestEscrowReconstructionRequest

PropertyTypeRequiredDescription
enrolmentIdstring | nullno—
justificationstring | nullno—
requesterPublicKeyJwkstring | nullno—
requestingOrgIdstring (uuid)no—
resolveHereOnlybooleanno—
subjectUserIdstring (uuid) | nullno—
vaultCategorystring | nullno—

ResponderHolderListResponse

PropertyTypeRequiredDescription
holdersResponderHolderResponse[] | nullno—
nextCursorstring (date-time) | nullno—

ResponderHolderResponse

PropertyTypeRequiredDescription
createdAtstring (date-time)no—
credentialedClassesstring[] | nullno—
credentialedRespondersCredentialedResponderSummary[] | nullno—
enrolmentAdminIdstring (uuid)no—
holderIdstring | nullno—
holderRolestring | nullno—
organisationIdstring (uuid)no—
revokedAtstring (date-time) | nullno—
statusstring | nullno—
tenantIdstring (uuid) | nullno—

RespondToPairingRequest

PropertyTypeRequiredDescription
challengeSolutionstring | nullno—
deviceBIdstring (uuid)no—
deviceBPublicKeystring | nullno—
deviceBSigningKeyJwkstring | nullno—
deviceFriendlyNamestring | nullno—
deviceProvenancestring | nullno—

RevealAllBequeathedCredentialsResponse

PropertyTypeRequiredDescription
bequestIdstring (uuid)no—
itemsRevealedBequeathedCredentialResponse[] | nullno—

RevealedBequeathedCredentialResponse

PropertyTypeRequiredDescription
authTagstring | nullno—
executorKeyRefstring | nullno—
itemIdstring | nullno—
itemNamestring | nullno—
ivstring | nullno—
revealCountinteger (int32)no—
revealedAtstring (date-time)no—
sealedSecretstring | nullno—

RevokeEmergencyAccessBySignedLinkRequest

PropertyTypeRequiredDescription
expiresAtUnixinteger (int64)no—
sessionIdstring (uuid)no—
signaturestring | nullno—
userIdstring (uuid)no—

RevokeEmergencyAccessBySignedLinkResponse

PropertyTypeRequiredDescription
alreadyEndedbooleanno—
endedAsstring | nullno—
endedAtstring (date-time) | nullno—
revokedbooleanno—

RevokeEscrowEnrolmentRequest

PropertyTypeRequiredDescription
reasonstring | nullno—

RevokeSharedCredentialWrapRequest

PropertyTypeRequiredDescription
householdIdstring (uuid)no—
sharedCredentialIdstring | nullno—

RevokeWipeAttestationRequest

PropertyTypeRequiredDescription
reasonstring | nullno—

RewrapSharedCredentialRequest

PropertyTypeRequiredDescription
householdIdstring (uuid)no—
recipientsSharedCredentialRecipientWrapDto[] | nullno—
sharedCredentialIdstring | nullno—

RewrapSharedCredentialResponse

PropertyTypeRequiredDescription
generationinteger (int32)no—
recipientCountinteger (int32)no—
updatedAtstring (date-time)no—

RewrapWrappedUmkEnvelopeRequest

PropertyTypeRequiredDescription
authTagstring | nullno—
ivstring | nullno—
kdfKdfParametersRequestno—
postRecoveryBypassbooleanno—
wrappedUmkstring | nullno—

RewrapWrappedUmkEnvelopeResponse

PropertyTypeRequiredDescription
updatedAtstring (date-time)no—
versioninteger (int32)no—

RotateApproverPinRequest

PropertyTypeRequiredDescription
attestationstring | nullno—
credentialPinstring | nullno—
tenantIdstring (uuid) | nullno—

RotateDeviceKeyExchangeKeyRequest

PropertyTypeRequiredDescription
publicKeystring | nullno—

RotationEnvelopeRequest

PropertyTypeRequiredDescription
authTagstring | nullno—
ivstring | nullno—
kdfKdfParametersRequestno—
wrappedUmkstring | nullno—

RotationPasskeyRewrapRequest

PropertyTypeRequiredDescription
authTagstring | nullno—
ivstring | nullno—
passkeyCredentialIdstring | nullno—
prfInputstring | nullno—
wrappedUmkstring | nullno—

SealExecutorBequestRequest

PropertyTypeRequiredDescription
estateGrantIdstring (uuid)no—
executorUserIdstring (uuid)no—
itemsBequeathedCredentialItemDto[] | nullno—
triggerLabelstring | nullno—

SealExecutorBequestResponse

PropertyTypeRequiredDescription
bequestIdstring (uuid)no—
createdAtstring (date-time)no—
executorUserIdstring (uuid)no—
itemCountinteger (int32)no—
statusstring | nullno—

SecureWipeDeviceRequest

PropertyTypeRequiredDescription
attesterClassstring | nullno—
attesterLabelstring | nullno—
confirmationAcknowledgedbooleanno—
signatureAlgorithmstring | nullno—
signatureThumbprintstring | nullno—
wipeStandardClaimedstring | nullno—

SetAlternatePassphraseStatusRequest

PropertyTypeRequiredDescription
behaviourAcknowledgementVersionstring | nullno—
provisionedbooleanno—

SetBackupVaultStatusRequest

PropertyTypeRequiredDescription
lastReviewedAtstring (date-time) | nullno—
presentbooleanno—

SetBreakGlassConsentHolderLabelRequest

PropertyTypeRequiredDescription
holderLabelstring | nullno—

SharedCredentialRecipientWrapDto

PropertyTypeRequiredDescription
authTagstring | nullno—
ivstring | nullno—
recipientKeyRefstring | nullno—
recipientUserIdstring (uuid)no—
wrappedSecretstring | nullno—

SharedCredentialWrapForRecipientResponse

PropertyTypeRequiredDescription
authTagstring | nullno—
generationinteger (int32)no—
ivstring | nullno—
recipientKeyRefstring | nullno—
sharedCredentialIdstring | nullno—
wrappedSecretstring | nullno—

SignalUnlockResolutionRequest

PropertyTypeRequiredDescription
duressChannelstring | nullno—
kindstring | nullno—

SignalUnlockResolutionResponse

PropertyTypeRequiredDescription
statusstring | nullno—

SubmitDeviceIntegrityAssertionRequest

PropertyTypeRequiredDescription
assertionObjectstring | nullno—
keyIdstring | nullno—
noncestring | nullno—
platformstring | nullno—

SubmitDeviceIntegrityAttestationRequest

PropertyTypeRequiredDescription
attestationObjectstring | nullno—
integrityTokenstring | nullno—
keyIdstring | nullno—
noncestring | nullno—
platformstring | nullno—

UpdateBreakGlassConsentScopeRequest

PropertyTypeRequiredDescription
scopeCategoriesstring[] | nullno—

UpsertUserPrivateKeyEnvelopeRequest

PropertyTypeRequiredDescription
algostring | nullno—
ciphertextstring | nullno—
ivstring | nullno—
keyEpochinteger (int32)no—

UserPrivateKeyEnvelopeResponse

PropertyTypeRequiredDescription
algostring | nullno—
ciphertextstring | nullno—
ivstring | nullno—
keyEpochinteger (int32)no—

VerifyBiometricMismatchFallbackRequest

PropertyTypeRequiredDescription
recoveryCodestring | nullno—

WipeAttestationResponse

PropertyTypeRequiredDescription
algorithmstring | nullno—
attestationDigeststring | nullno—
attestationIdstring (uuid)no—
attesterClassstring | nullno—
attesterLabelstring | nullno—
deviceIdstring (uuid)no—
deviceIdentifierstring | nullno—
deviceNamestring | nullno—
isRevokedbooleanno—
revocationReasonstring | nullno—
revokedAtstring (date-time) | nullno—
signatureAlgorithmstring | nullno—
signatureThumbprintstring | nullno—
statementstring | nullno—
wipeStandardClaimedstring | nullno—
wipedAtstring (date-time)no—

WrappedUmkEnvelopeDto

PropertyTypeRequiredDescription
authTagstring | nullno—
ivstring | nullno—
kdfKdfParametersDtono—
keyGenerationstring | nullno—
kindstring | nullno—
manifestAuthTagstring | nullno—
manifestIvstring | nullno—
passkeyCredentialIdstring | nullno—
sealedManifeststring | nullno—
wrappedUmkstring | nullno—

WrapSharedCredentialRequest

PropertyTypeRequiredDescription
householdIdstring (uuid)no—
recipientsSharedCredentialRecipientWrapDto[] | nullno—
sharedCredentialIdstring | nullno—

WrapSharedCredentialResponse

PropertyTypeRequiredDescription
createdAtstring (date-time)no—
generationinteger (int32)no—
recipientCountinteger (int32)no—
wrapIdstring (uuid)no—

Built with ❤️ for developers · Service status