Prepare passkey deletion
Delete passkeys from your vault and prepare a short-lived token that lets the browser signal local passkey removal.
Delete by explicit Passlock passkey IDs:
POST https://api.passlock.dev/v2/{tenancyId}/passkeys/delete HTTP/1.1Authorization: Bearer {apiKey}Accept: application/jsonContent-Type: application/json
{ "passkeyIds": ["passkey_123", "passkey_456"]}Or delete every passkey for one application user:
POST https://api.passlock.dev/v2/{tenancyId}/passkeys/delete HTTP/1.1Authorization: Bearer {apiKey}Accept: application/jsonContent-Type: application/json
{ "userId": "tenant-user-id"}HTTP/1.1 202 AcceptedContent-Type: application/json
{ "_tag": "PreparedPasskeyDeletion", "deletePasskeysToken": "opaque-random-token", "expiresAt": 1770123593000, "warnings": []}The request must include exactly one selector: passkeyIds or userId. Empty passkeyIds lists are invalid. Missing passkeys are returned as warnings when they do not prevent deletion.
Browser exchange
Section titled “Browser exchange”Send only deletePasskeysToken to your frontend, then call @passlock/browser’s deletePasskeys helper. The browser helper exchanges the token with:
POST https://api.passlock.dev/v2/{tenancyId}/passkeys/delete/exchange HTTP/1.1Accept: application/jsonContent-Type: application/json
{ "deletePasskeysToken": "opaque-random-token"}HTTP/1.1 200 OKContent-Type: application/json
{ "_tag": "PasskeyDeletionInstructions", "instructions": [ { "rpId": "example.com", "userId": "MTVkMTFmdHM1Yzg0bDN0anpieG9w", "credentialId": "bW9wN3IzenE0enJ5OXVnZXoxOWF4" } ], "warnings": []}Server helper
Section titled “Server helper”Prefer @passlock/server where possible:
import { Passlock } from "@passlock/server";
const passlock = new Passlock({ tenancyId, apiKey });
const result = await passlock.deletePasskeys({ passkeyIds: ["passkey_123"],});