> ## Documentation Index
> Fetch the complete documentation index at: https://www.dynamic.xyz/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Passkeys

> Implement passkey authentication in Unity.

<Warning>
  Passkey registration and authentication only work on native devices (iOS/Android), not in the Unity Editor.
</Warning>

## Register a passkey

```csharp theme={"system"}
await DynamicSDK.Instance.Passkeys.RegisterPasskey();
```

## List passkeys

```csharp theme={"system"}
List<UserPasskey> passkeys = await DynamicSDK.Instance.Passkeys.GetPasskeys();

foreach (var pk in passkeys)
{
    Debug.Log($"Passkey: {pk.Id}, created: {pk.CreatedAt}");
}
```

## Authenticate with passkey (MFA)

```csharp theme={"system"}
var result = await DynamicSDK.Instance.Passkeys.AuthenticatePasskeyMFA(
    new MfaCreateToken { SingleUse = true });

string token = result?.MfaToken ?? result?.Jwt;
```

## Delete a passkey

```csharp theme={"system"}
await DynamicSDK.Instance.Passkeys.DeletePasskey(new DeletePasskeyRequest
{
    CredentialId = passkey.CredentialId,
    PasskeyId = passkey.Id,
});
```

## Complete example

```csharp theme={"system"}
using DynamicSDK.Core;
using UnityEngine;
using System.Collections.Generic;

public class PasskeyManager : MonoBehaviour
{
    private List<UserPasskey> _passkeys = new List<UserPasskey>();
    
    public async void RegisterNewPasskey()
    {
        try
        {
            await DynamicSDK.Instance.Passkeys.RegisterPasskey();
            Debug.Log("Passkey registered successfully!");
            
            // Refresh passkey list
            await LoadPasskeys();
        }
        catch (System.Exception ex)
        {
            Debug.LogError($"Passkey registration failed: {ex.Message}");
        }
    }
    
    public async void LoadPasskeys()
    {
        try
        {
            _passkeys = await DynamicSDK.Instance.Passkeys.GetPasskeys();
            
            Debug.Log($"Found {_passkeys.Count} passkey(s):");
            foreach (var pk in _passkeys)
            {
                Debug.Log($"  ID: {pk.Id}");
                Debug.Log($"  Created: {pk.CreatedAt}");
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError($"Failed to load passkeys: {ex.Message}");
        }
    }
    
    public async void AuthenticateWithPasskey()
    {
        try
        {
            var result = await DynamicSDK.Instance.Passkeys.AuthenticatePasskeyMFA(
                new MfaCreateToken { SingleUse = true });
            
            string token = result?.MfaToken ?? result?.Jwt;
            
            if (!string.IsNullOrEmpty(token))
            {
                Debug.Log("Passkey authentication successful!");
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError($"Passkey authentication failed: {ex.Message}");
        }
    }
    
    public async void DeletePasskey(UserPasskey passkey)
    {
        try
        {
            await DynamicSDK.Instance.Passkeys.DeletePasskey(new DeletePasskeyRequest
            {
                CredentialId = passkey.CredentialId,
                PasskeyId = passkey.Id,
            });
            
            Debug.Log("Passkey deleted successfully!");
            
            // Refresh passkey list
            await LoadPasskeys();
        }
        catch (System.Exception ex)
        {
            Debug.LogError($"Failed to delete passkey: {ex.Message}");
        }
    }
}
```

## Next steps

* [MFA](/docs/unity/mfa) - Multi-factor authentication with TOTP
* [Authentication](/docs/unity/authentication) - Other authentication methods
