---
title: "Create a new WAAS for a user given an identifier"
method: POST
path: "/environments/{environmentId}/waas/create"
tags: ["Waas"]
---

# Create a new WAAS for a user given an identifier

`POST /environments/{environmentId}/waas/create`

Creates a new WAAS wallet for a user given an email or userId. If an email is provided and it is not associated with an existing user this call will also create a new user.

## Path parameters

- `environmentId` string, required

## Request body

- CreateUserWaasWalletsRequest
  - `identifier` string, required — Identifier for the user. Must be either an email, phone number, user id, external user id, or username from a supported social provider
  - `type` 'email' | 'id' | 'externalUserId' | 'phoneNumber' | 'socialUsername' | 'socialAccountId', required
  - `chains` WaasChainEnum[], required — The chains to create the wallet for
  - `smsCountryCode` SmsCountryCode
    - `isoCountryCode` string, required
    - `phoneCountryCode` string, required
  - `socialProvider` 'emailOnly' | 'magicLink' | 'apple' | 'bitbucket' | 'coinbasesocial' | 'discord' | 'epicgames' | 'facebook' | 'farcaster' | 'github' | 'gitlab' | 'google' | 'instagram' | 'linkedin' | 'microsoft' | 'twitch' | 'twitter' | 'blocto' | 'banxa' | 'coinbaseOnramp' | 'cryptoDotCom' | 'dynamic' | 'alchemy' | 'zerodev' | 'telegram' | 'turnkey' | 'coinbaseWaas' | 'sms' | 'spotify' | 'tiktok' | 'line' | 'steam' | 'shopify' | 'zksync' | 'kraken' | 'blockaid' | 'passkey' | 'okta' | 'sendgrid' | 'resend' — The 'turnkey' value is deprecated and will be removed in a future version.

## Response `200`

Wallet already exists for the user

- UserResponse
  - `user` User
    - `id` string, required
    - `projectEnvironmentId` string, required
    - `verifiedCredentials` JwtVerifiedCredential[]
      - `address` string — Valid blockchain wallet address, must be an alphanumeric string without any special characters
      - `chain` string
      - `refId` string
      - `signerRefId` string
      - `email` string, email
      - `id` string, required
      - `name_service` NameServiceData
        - `avatar` string
        - `name` string
      - `public_identifier` string — This is used to publicly identify a verified credential in a human-friendly way. For example, this will be the email address if credential format=email.
      - `wallet_name` string
      - `wallet_provider` 'browserExtension' | 'custodialService' | 'walletConnect' | 'qrCode' | 'deepLink' | 'embeddedWallet' | 'smartContractWallet'
      - `wallet_properties` union
        - TurnkeyWalletProperties
          - `turnkeySubOrganizationId` string
          - `turnkeyPrivateKeyId` string
          - `turnkeyHDWalletId` string
          - `isAuthenticatorAttached` boolean — Whether or not the wallet has an authenticator (passkey, api key, etc) attached to it.
          - `turnkeyUserId` string
          - `isSessionKeyCompatible` boolean
          - `version` 'V1' | 'V2' | 'V3'
          - `ecdsaProviderType` 'zerodev_signer_to_ecdsa' | 'zerodev_multi_chain'
          - `entryPointVersion` 'v6' | 'v7'
          - `kernelVersion` 'v2_4' | 'v3_0' | 'v3_1' | 'v3_2' | 'v3_3'
        - HardwareWalletProperties
          - `hardwareWallet` 'ledger'
        - CoinbaseMpcWalletProperties
          - `claimed` boolean — Dynamic pregenerated this wallet and stored the passcode
          - `source` 'dynamic' | 'user'
        - SmartWalletProperties
          - `entryPointVersion` 'v6' | 'v7'
          - `kernelVersion` 'v2_4' | 'v3_0' | 'v3_1' | 'v3_2' | 'v3_3'
          - `ecdsaProviderType` 'zerodev_signer_to_ecdsa' | 'zerodev_multi_chain'
        - WaasWalletProperties
          - `keyShares` WalletKeyShareInfo[]
            - `id` string, required
            - `backupLocation` string, required
            - `passwordEncrypted` boolean, required
            - `externalKeyShareId` string
          - `thresholdSignatureScheme` 'TWO_OF_TWO' | 'TWO_OF_THREE' | 'THREE_OF_FIVE'
          - `derivationPath` string — The derivation path for the wallet
          - `settings` WaasWalletSettings
            - `hasDeniedDelegatedAccess` boolean
            - `shouldRefreshOnNextSignOn` boolean
            - `reshareOnNextSignOn` 'TWO_OF_TWO' | 'TWO_OF_THREE' | 'THREE_OF_FIVE'
            - `revokeOnNextSignOn` boolean
          - `version` 'V1' | 'V2' | 'V3'
      - `format` 'blockchain' | 'email' | 'oauth' | 'passkey' | 'phoneNumber' | 'externalUser', required
      - `oauth_provider` 'emailOnly' | 'magicLink' | 'apple' | 'bitbucket' | 'coinbasesocial' | 'discord' | 'epicgames' | 'facebook' | 'farcaster' | 'github' | 'gitlab' | 'google' | 'instagram' | 'linkedin' | 'microsoft' | 'twitch' | 'twitter' | 'blocto' | 'banxa' | 'coinbaseOnramp' | 'cryptoDotCom' | 'dynamic' | 'alchemy' | 'zerodev' | 'telegram' | 'turnkey' | 'coinbaseWaas' | 'sms' | 'spotify' | 'tiktok' | 'line' | 'steam' | 'shopify' | 'zksync' | 'kraken' | 'blockaid' | 'passkey' | 'okta' | 'sendgrid' | 'resend' — The 'turnkey' value is deprecated and will be removed in a future version.
      - `oauth_username` string
      - `oauth_display_name` string, nullable
      - `oauth_account_id` string, nullable
      - `phoneNumber` string — This field contains the phone number in the country. This could also contain the area code within a country.
      - `phoneCountryCode` string — This field contains the phone international country code. See https://countrycode.org/
      - `isoCountryCode` string — ISO-3166 two-character country code. See https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes
      - `oauth_account_photos` string[]
      - `oauth_emails` string[]
      - `oauth_metadata` object — This object contains JSON metadata for a social-based verified credential. It may contain data about the user that does not fit into the other structured fields, and could include arbitrary fields about the user from the oauth provider's API.
      - `previous_users` Uuid[] — This will only be provided in the responses for GET /users/{userId}.Previous user IDs that owned this verified credential and was tranfered to the current user ID.
      - `embedded_wallet_id` string, nullable
      - `wallet_additional_addresses` WalletAdditionalAddress[]
        - `address` string, required — An address associated with a wallet.
        - `publicKey` string — The public key associated with the address.
        - `type` 'ordinals' | 'payment' | 'cosmos' | 'evm' | 'ton', required
      - `lastSelectedAt` string, date-time — This timestamp indicates the last time this verified wallet was either connected to the user account or selected to become the primary wallet on the account.
      - `signInEnabled` boolean, required — This indicates if the user can sign in with this credential
      - `verifiedAt` string, date-time — This timestamp indicates the last time this verified credential was verified.
    - `lastVerifiedCredentialId` string
    - `sessionId` string
    - `alias` string, nullable
    - `country` string, nullable — Standard ISO 3166-1 alpha-2 two-letter country code
    - `email` string, email, nullable
    - `firstName` string, nullable
    - `jobTitle` string, nullable
    - `lastName` string, nullable
    - `phoneNumber` string, nullable
    - `policiesConsent` boolean, nullable
    - `tShirtSize` string, nullable
    - `team` string, nullable
    - `username` string, nullable
    - `firstVisit` string, date-time
    - `lastVisit` string, date-time
    - `newUser` boolean
    - `metadata` object
    - `mfaBackupCodeAcknowledgement` 'pending' | 'complete', nullable
    - `btcWallet` string, nullable
    - `kdaWallet` string, nullable
    - `ltcWallet` string, nullable
    - `ckbWallet` string, nullable
    - `kasWallet` string, nullable
    - `dogeWallet` string, nullable
    - `emailNotification` boolean, nullable
    - `discordNotification` boolean, nullable
    - `newsletterNotification` boolean, nullable
    - `lists` string[] — Access lists evaluated by Dynamic when considering access for the user.
    - `scope` string — A whitespace-separate list of permissions associated with the JWT token issued. This conforms to the JWT standard for scope claims: https://datatracker.ietf.org/doc/html/rfc8693#section-4.2
    - `missingFields` ProjectSettingsKyc[]
      - `name` string, required
      - `required` boolean, required
      - `enabled` boolean, required
      - `unique` boolean, required
      - `verify` boolean, required
      - `type` 'standard' | 'custom'
      - `validationRules` CustomFieldValidationRules — Optional validation rules for the custom field
        - `unique` boolean — If this field must be unique for every user in the environment
        - `regex` string — The regex pattern that the text field must match
        - `validOptions` CustomFieldValidValue[] — The dropdown options for the select field
          - `label` string, required
          - `key` string
        - `checkboxText` string — The text that will be displayed for the checkbox field
      - `validationType` 'text' | 'checkbox' | 'select'
      - `label` string
      - `position` number
    - `walletPublicKey` string
    - `wallet` string
    - `chain` 'ETH' | 'EVM' | 'FLOW' | 'SOL' | 'ALGO' | 'STARK' | 'COSMOS' | 'BTC' | 'ECLIPSE' | 'SUI' | 'SPARK' | 'TRON' | 'APTOS' | 'TON' | 'STELLAR'
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
    - `sessions` Session[]
      - `id` string
      - `createdAt` string, date-time
      - `ipAddress` string, nullable
      - `userAgent` string, nullable
      - `revokedAt` string, date-time, nullable
    - `wallets` Wallet[]
      - `id` string, required
      - `name` string, required
      - `chain` 'ETH' | 'EVM' | 'FLOW' | 'SOL' | 'ALGO' | 'STARK' | 'COSMOS' | 'BTC' | 'ECLIPSE' | 'SUI' | 'SPARK' | 'TRON' | 'APTOS' | 'TON' | 'STELLAR', required
      - `publicKey` string, required — Valid blockchain wallet address, must be an alphanumeric string without any special characters
      - `provider` 'browserExtension' | 'custodialService' | 'walletConnect' | 'qrCode' | 'deepLink' | 'embeddedWallet' | 'smartContractWallet', required
      - `properties` union
        - TurnkeyWalletProperties
          - `turnkeySubOrganizationId` string
          - `turnkeyPrivateKeyId` string
          - `turnkeyHDWalletId` string
          - `isAuthenticatorAttached` boolean — Whether or not the wallet has an authenticator (passkey, api key, etc) attached to it.
          - `turnkeyUserId` string
          - `isSessionKeyCompatible` boolean
          - `version` 'V1' | 'V2' | 'V3'
          - `ecdsaProviderType` 'zerodev_signer_to_ecdsa' | 'zerodev_multi_chain'
          - `entryPointVersion` 'v6' | 'v7'
          - `kernelVersion` 'v2_4' | 'v3_0' | 'v3_1' | 'v3_2' | 'v3_3'
        - HardwareWalletProperties
          - `hardwareWallet` 'ledger'
        - CoinbaseMpcWalletProperties
          - `claimed` boolean — Dynamic pregenerated this wallet and stored the passcode
          - `source` 'dynamic' | 'user'
        - SmartWalletProperties
          - `entryPointVersion` 'v6' | 'v7'
          - `kernelVersion` 'v2_4' | 'v3_0' | 'v3_1' | 'v3_2' | 'v3_3'
          - `ecdsaProviderType` 'zerodev_signer_to_ecdsa' | 'zerodev_multi_chain'
        - WaasWalletProperties
          - `keyShares` WalletKeyShareInfo[]
            - `id` string, required
            - `backupLocation` string, required
            - `passwordEncrypted` boolean, required
            - `externalKeyShareId` string
          - `thresholdSignatureScheme` 'TWO_OF_TWO' | 'TWO_OF_THREE' | 'THREE_OF_FIVE'
          - `derivationPath` string — The derivation path for the wallet
          - `settings` WaasWalletSettings
            - `hasDeniedDelegatedAccess` boolean
            - `shouldRefreshOnNextSignOn` boolean
            - `reshareOnNextSignOn` 'TWO_OF_TWO' | 'TWO_OF_THREE' | 'THREE_OF_FIVE'
            - `revokeOnNextSignOn` boolean
          - `version` 'V1' | 'V2' | 'V3'
      - `lastSelectedAt` string, nullable
    - `chainalysisChecks` ChainalysisCheck[]
      - `id` string, required
      - `createdAt` string, date-time, required
      - `result` 'OK' | 'BLOCKED' | 'FAILED', required
      - `walletPublicKey` string, required — Valid blockchain wallet address, must be an alphanumeric string without any special characters
      - `response` string, required
    - `oauthAccounts` OAuthAccount[]
      - `id` string
      - `provider` 'emailOnly' | 'magicLink' | 'apple' | 'bitbucket' | 'coinbasesocial' | 'discord' | 'epicgames' | 'facebook' | 'farcaster' | 'github' | 'gitlab' | 'google' | 'instagram' | 'linkedin' | 'microsoft' | 'twitch' | 'twitter' | 'blocto' | 'banxa' | 'coinbaseOnramp' | 'cryptoDotCom' | 'dynamic' | 'alchemy' | 'zerodev' | 'telegram' | 'turnkey' | 'coinbaseWaas' | 'sms' | 'spotify' | 'tiktok' | 'line' | 'steam' | 'shopify' | 'zksync' | 'kraken' | 'blockaid' | 'passkey' | 'okta' | 'sendgrid' | 'resend' — The 'turnkey' value is deprecated and will be removed in a future version.
      - `accountUsername` string
    - `mfaDevices` MFADevice[]
      - `type` 'totp' | 'passkey' | 'email'
      - `verified` boolean — Whether or not the user has a verified this MFA Device
      - `id` string
      - `createdAt` string, date-time — The date and time the MFA device was created
      - `verifiedAt` string, date-time, nullable — The date and time the MFA device was verified
      - `default` boolean — Whether or not this is the default MFA device for the user
      - `alias` string — The optional alias for the MFA device

## Other responses

- `201` — Successfully created new wallet for the user
- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `422` — Unprocessable Entity
- `500` — Internal Server Error

---

[API](https://skmtc.net/dynamic/apis/dashboard-api.md) · [All operations](https://skmtc.net/dynamic/apis/dashboard-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/dynamic/dashboard-api/versions/aac826315d90/schema)
