> ## 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.

# SMS OTP Signer

> Configure an SMS OTP recovery signer for wallet recovery.

<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/device-signer) or the [V1 migration guide](/wallets/guides/migrate-to-v1).
</Warning>

Use an SMS OTP signer as a **recovery signer** to let users regain access to their wallets when their operational signer is no longer available — for example, when they switch to a new device. The user verifies ownership of their phone number via a one-time password delivered by SMS or optionally WhatsApp, which authorizes the enrollment of a new operational signer.

<Note>
  SMS OTP is a recovery signer, not an operational signer. It is not intended for authorizing day-to-day transactions. The code examples below show how to configure it as the initial signer at wallet creation time, which sets up phone-based recovery for the wallet.
</Note>

For a conceptual overview, see [SMS OTP](/wallets/v0/concepts/wallet-signers#sms-otp) in the Wallet Signers guide. To learn how to register operational signers on a 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: "phone",
            phone: "+1234567890"
        },
    });
    ```
  </Tab>

  <Tab title="Node.js">
    ```typescript theme={null}
    import { CrossmintWallets, createCrossmint } from "@crossmint/wallets-sdk";

    const crossmint = createCrossmint({
        apiKey: "<your-server-api-key>",
    });
    const crossmintWallets = CrossmintWallets.from(crossmint);

    const wallet = await crossmintWallets.createWallet({
        chain: "base",
        signer: {
            type: "phone",
            phone: "+1234567890"
        },
    });
    ```
  </Tab>

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

    const { getOrCreateWallet } = useWallet();

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

  <Tab title="REST">
    <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": "phone",
                      "phone": "+1234567890"
                  }
              }
          }'
      ```

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

      const payload = {
          chainType: "evm",
          config: {
              adminSigner: {
                  type: "phone",
                  phone: "+1234567890"
              }
          }
      };

      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": "phone",
                  "phone": "+1234567890"
              }
          }
      }
      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>
