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

# Passkey Signer

> Configure a passkey signer for wallet creation using WebAuthn biometrics.

<Warning>
  **You are viewing docs for the previous version of the Wallets SDK.** We recommend upgrading to V1.
  See the [updated version of this page](/wallets/guides/signers/passkey) or the [V1 migration guide](/wallets/guides/migrate-to-v1).
</Warning>

Use a passkey signer to let users access their wallets and authorize transactions using biometric authentication — Face ID, Touch ID, fingerprint, or Windows Hello — or their password manager's unlock mechanism. Passkeys are built on the <a href="https://www.w3.org/TR/webauthn-3/" target="_blank">WebAuthn</a> standard and are synchronized across devices by providers such as Apple Keychain, Google Password Manager, 1Password, and Dashlane.

Every transaction signed with a passkey requires the user to authenticate, making this one of the most secure operational signer options.

For a conceptual overview, see [Passkey](/wallets/v0/concepts/wallet-signers#passkey) in the Wallet Signers guide. To learn how to register additional operational signers on an existing wallet, see [Registering a signer](/wallets/v0/guides/signers/registering-a-signer).

## Configuration

<Tabs>
  <Tab title="React">
    ```typescript theme={null}
    import { useWallet } from '@crossmint/client-sdk-react-ui';

    const { getOrCreateWallet } = useWallet();

    const wallet = await getOrCreateWallet({
        chain: "base",
        signer: {
            type: "passkey",
        },
    });
    ```
  </Tab>

  <Tab title="REST">
    When using a passkey as the recovery signer (admin signer) via REST, you must provide the credential details from your passkey registration flow (WebAuthn). The `id` is the credential identifier, `name` is a human-readable label for the passkey, and `publicKey.x` / `publicKey.y` are the public key coordinates from the registration response. In the browser, you can implement this registration flow using a WebAuthn helper library such as [`@simplewebauthn/browser`](https://www.npmjs.com/package/@simplewebauthn/browser).

    <CodeGroup>
      ```bash cURL theme={null}
      curl --request POST \
          --url https://staging.crossmint.com/api/2025-06-09/wallets \
          --header 'Content-Type: application/json' \
          --header 'X-API-KEY: <x-api-key>' \
          --data '{
              "chainType": "evm",
              "config": {
                  "adminSigner": {
                      "type": "passkey",
                      "id": "cWtP7gmZbd98HbKUuGXx5Q",
                      "name": "hgranger",
                      "publicKey": {
                          "x": "38035223810536273945556366218149112558607829411547667975304293530457502824247",
                          "y": "91117823763706733837104303008228095481082989039135234750508288790583476078729"
                      }
                  }
              }
          }'
      ```

      ```js Node.js theme={null}
      const url = 'https://staging.crossmint.com/api/2025-06-09/wallets';

      const payload = {
          chainType: "evm",
          config: {
              adminSigner: {
                  type: "passkey",
                  id: "cWtP7gmZbd98HbKUuGXx5Q",
                  name: "hgranger",
                  publicKey: {
                      x: "38035223810536273945556366218149112558607829411547667975304293530457502824247",
                      y: "91117823763706733837104303008228095481082989039135234750508288790583476078729"
                  }
              }
          }
      };

      const options = {
          method: 'POST',
          headers: {
              'X-API-KEY': '<x-api-key>',
              'Content-Type': 'application/json'
          },
          body: JSON.stringify(payload)
      };

      try {
          const response = await fetch(url, options);
          const data = await response.json();
          console.log(data);
      } catch (error) {
          console.error(error);
      }
      ```

      ```python Python theme={null}
      import requests

      url = "https://staging.crossmint.com/api/2025-06-09/wallets"

      payload = {
          "chainType": "evm",
          "config": {
              "adminSigner": {
                  "type": "passkey",
                  "id": "cWtP7gmZbd98HbKUuGXx5Q",
                  "name": "hgranger",
                  "publicKey": {
                      "x": "38035223810536273945556366218149112558607829411547667975304293530457502824247",
                      "y": "91117823763706733837104303008228095481082989039135234750508288790583476078729"
                  }
              }
          }
      }
      headers = {
          "X-API-KEY": "<x-api-key>",
          "Content-Type": "application/json"
      }

      response = requests.post(url, json=payload, headers=headers)

      print(response.json())
      ```
    </CodeGroup>
  </Tab>
</Tabs>
