Keeping the Authenticator and your Server in Sync
Your server and the user’s credential manager hold separate passkey records and they are not synchronized automatically. If they differ, the account chooser may offer a passkey that the server no longer accepts. The user can complete local device authentication before the login fails. The stale entry may also remain available on later attempts until the credential manager updates it. Where the platform and credential provider support it, signalling can reduce that gap. It is a progressive, best-effort lifecycle capability rather than a UI flow or authoritative source of truth; unsupported integrations must continue to work without it. On the web the stale credential surfaces through Conditional UI, which offers whatever the credential manager holds regardless of what your server still accepts.Support (August 2026): Chrome and Edge 132+ on desktop, Chrome 144+ on Android, Safari 26 (iOS 26, macOS 26). Firefox has no implementation. Current Android WebView can expose Signal methods when its WebAuthn/Credential Manager integration and app-to-site association are configured; Chromium added WebView Signal request support in March 2026, so use method-level feature detection rather than a blanket WebView exclusion. For native apps see the native Signal API.
The three signals
1
On a failed login: signal the unknown credential
- When an assertion arrives for a credential your server does not recognize, call
signalUnknownCredential({ rpId, credentialId }). - This carries no user identifier and no credential list, so it is safe to call when the user is not authenticated.
- Google Password Manager hides rather than deletes the passkey, so it can be restored if the signal was sent in error.
2
On a successful login: reconcile the full list
- Call
signalAllAcceptedCredentials({ rpId, userId, allAcceptedCredentialIds })with every credential ID your server currently accepts for that user. - The provider may hide or remove passkeys missing from the list. If it supports restoration, credentials included again in a later complete list may be unhidden.
3
After the user deletes a passkey in settings
- Call
signalAllAcceptedCredentialsagain from your passkey management screen so the provider can hide or remove the credential immediately, rather than waiting until the user’s next login to receive the updated list.
4
After a profile change
- Call
signalCurrentUserDetails({ rpId, userId, name, displayName })so the account chooser shows current information. - Note that if the user has manually edited the name in Google Password Manager, their edit wins and your signal will not override it.
Why server-side Revocation still needs Client Cleanup
Revoking the credential in authoritative server state makes it unusable immediately: every later assertion from it must be rejected. The server may retain an inactive record for audit. What revocation cannot do is remove the stale entry from the user’s locally installed credential manager, because your backend has no direct channel to the user’s password manager. Client-side cleanup can happen only when the user’s client runs again. Signal an unknown credential only after the server confirms that the submitted credential is unknown. Reconcile the complete accepted list on a documented authenticated schedule, including after authoritative credential-set changes and selected refresh points. The schedule should account for capability, coalescing and rate limits; revocation itself must never wait for signalling. On the web the reconcile call issignalAllAcceptedCredentials, and the list it hides against is allAcceptedCredentialIds.
Error handling
Signal methods can reject with:SecurityError(DOMException): the relying party domain is not validTypeError: acredentialId,userIdor list entry is not valid base64url
error.name only. Message strings are not part of the contract.
Acceptance criteria
Low user reach does not mean low reliability importance. Signalling does not itself create or promote passkeys, but it reduces stale credential choices and repeated post-verification failures across login and management flows.
The Signal API is intentionally privacy-preserving and opportunistic. Acceptance can verify the relying party’s trigger, payload and error handling, but must never require confirmation that a credential provider updated, hid or removed a passkey.
References
- Relevant criteria: W3.2-AC01–AC12: Web Authentication Level 3: Signal Credential Changes to the Authenticator defines method inputs, privacy semantics, complete-list safety, opportunistic behavior and the meaning of a resolved promise.
- Relevant criteria: W3.2-AC01–AC09 and W3.2-AC11–AC12: Chrome for Developers: Keep passkeys consistent with credentials on your server supports capability checks, lifecycle triggers, payload construction, metadata updates and warnings against incomplete lists.
- Relevant criteria: W3.2-AC02–AC12: Corbado: WebAuthn Signal API supports stale-credential and metadata use cases, authenticator availability, non-blocking integration and privacy-preserving provider uncertainty.
Further reading
- Signal API and Signal API on Android, Chrome for Developers
- Web Authentication Level 3, signal methods, W3C
- WebAuthn Signal API explained, Corbado blog