---
title: "Creates many new users"
method: POST
path: "/environments/{environmentId}/users/bulk"
tags: ["Users"]
---

# Creates many new users

`POST /environments/{environmentId}/users/bulk`

## Path parameters

- `environmentId` string, required

## Query parameters

- `upsert` boolean

## Request body

- InternalUserFields[]
  - `alias` string
  - `firstName` string
  - `lastName` string
  - `jobTitle` string
  - `phoneNumber` string
  - `metadata` object
  - `mfaBackupCodeAcknowledgement` 'pending' | 'complete', nullable
  - `tShirtSize` string
  - `team` string
  - `policiesConsent` boolean
  - `country` string, nullable — Standard ISO 3166-1 alpha-2 two-letter country code
  - `username` string, nullable — Alphanumeric with slugs and underscores username
  - `btcWallet` string, nullable — BTC wallet address
  - `kdaWallet` string, nullable — KDA wallet address
  - `ltcWallet` string, nullable — LTC wallet address
  - `ckbWallet` string, nullable — CKB wallet address
  - `kasWallet` string, nullable — KAS wallet address
  - `dogeWallet` string, nullable — DOGE wallet address
  - `emailNotification` boolean
  - `discordNotification` boolean
  - `newsletterNotification` boolean
  - `emailVerifiedAt` string, date-time — When provided, the user email will be marked as verified in our system and the user will be allowed to sign in with that email. When social is enabled and the social provider has a verified email, we will automatically associate that social with the existing user.
  - `email` string — If email is trusted and verified, please provide a emailVerifiedAt timestamp. This will ensure that a user signing in with this email can access the correctly-created user account.
  - `wallets` CreateWalletRequest[]
    - `publicWalletAddress` string, required — Valid blockchain wallet address, must be an alphanumeric string without any special characters
    - `chain` 'ETH' | 'EVM' | 'FLOW' | 'SOL' | 'ALGO' | 'STARK' | 'COSMOS' | 'BTC' | 'ECLIPSE' | 'SUI' | 'SPARK' | 'TRON' | 'APTOS' | 'TON' | 'STELLAR', required
    - `walletName` string, required
    - `walletProvider` 'browserExtension' | 'custodialService' | 'walletConnect' | 'qrCode' | 'deepLink' | 'embeddedWallet' | 'smartContractWallet', required
    - `additionalWalletAddresses` 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
  - `oauthAccounts` CreateUserOauthRequest[]
    - `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', required — The 'turnkey' value is deprecated and will be removed in a future version.
    - `accountId` string, required
    - `emails` EmailOrEmptyString[]
    - `displayName` string
    - `username` string
    - `photos` string[]
    - `profile` object

## Response `201`

Successfully completed bulk user request

- BulkUserCreateResponse
  - `created` 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
  - `updated` 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
  - `failed` object[]
    - `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[]
              - …
            - `thresholdSignatureScheme` 'TWO_OF_TWO' | 'TWO_OF_THREE' | 'THREE_OF_FIVE'
            - `derivationPath` string — The derivation path for the wallet
            - `settings` WaasWalletSettings
              - …
            - `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[]
              - …
            - `thresholdSignatureScheme` 'TWO_OF_TWO' | 'TWO_OF_THREE' | 'THREE_OF_FIVE'
            - `derivationPath` string — The derivation path for the wallet
            - `settings` WaasWalletSettings
              - …
            - `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
    - `error` string
    - `code` 'email_cannot_be_null' | 'exchange_cannot_be_enabled' | 'transfer_amount_too_small' | 'transfer_address_not_whitelisted' | 'invalid_scopes' | 'unknown_transfer_error' | 'transfer_mfa_required' | 'transfer_mfa_failed' | 'invalid_transfer_funds' | 'invalid_transfer_currency' | 'invalid_exchange_provider' | 'invalid_transfer_network' | 'invalid_email' | 'email_already_exists' | 'allowlist_already_exists' | 'allowlist_entry_already_exists' | 'reassign_wallet_error' | 'reassign_wallet_confirm' | 'members_cannot_delete_themself' | 'username_already_exists' | 'wrong_email_verification_token' | 'wrong_sms_verification_token' | 'invalid_email_verification' | 'invalid_sms_verification' | 'invalid_verification' | 'invalid_position' | 'too_many_sms_verification_attempts' | 'too_many_email_verification_attempts' | 'too_many_verification_attempts' | 'organization_name_already_exists' | 'project_name_already_exists' | 'wallet_not_deployed' | 'email_verification_required' | 'phone_verification_required' | 'invite_address_required' | 'provider_not_available' | 'forbidden_unlink_request' | 'invalid_unlink_request' | 'too_many_api_tokens' | 'lock_timeout' | 'lock_too_many_attempts' | 'nft_token_gating_not_supported_for_chain' | 'empty_chain_name' | 'no_enabled_email_provider' | 'no_enabled_sms_provider' | 'invalid_key_export_url' | 'invalid_dynamic_props' | 'too_many_requests' | 'too_many_organizations_for_user' | 'too_many_projects_for_organization' | 'email_associated_with_different_provider' | 'user_has_already_account_with_email' | 'user_has_already_account_with_phone_number' | 'other_verify_failure' | 'email_tied_to_embedded_wallet' | 'invalid_invite' | 'social_account_already_exists' | 'invalid_email_address' | 'invalid_gate' | 'conflicting_embedded_wallet_providers' | 'invalid_user' | 'invalid_cors_origins' | 'invalid_mobile_deeplink_urls' | 'unauthorized_mobile_deeplink_url' | 'invalid_private_key_format' | 'invalid_embedded_wallet_settings' | 'wallet_not_support_passkey' | 'recovery_email_unavailable_or_invalid' | 'connect_error' | 'invalid_wallet_name' | 'invalid_wallet_address' | 'email_recovery_disabled' | 'no_compatible_wallet_service_enabled' | 'missing_aa_project_id' | 'linked_embedded_wallet' | 'invalid_mpc_environment' | 'invalid_regex' | 'repeated_options' | 'missing_phone_number_or_email' | 'duplicate_exists' | 'mfa_device_not_found' | 'mfa_invalid_code' | 'mfa_invalid_request' | 'invalid_phone' | 'gate_exists' | 'invalid_embedded_wallet_chains_configuration' | 'merge_accounts_confirmation' | 'merge_accounts_invalid' | 'invalid_wallet_id' | 'unable_to_fetch_balances' | 'cannot_switch_to_unique' | 'custom_field_data_not_unique' | 'metadata_size_exceeded' | 'invalid_custom_hostname' | 'blocked_user_cannot_transfer_wallet' | 'feature_not_enabled_in_suborg' | 'invalid_username' | 'invalid_external_auth' | 'invalid_chain_address_match' | 'invalid_update' | 'cannot_delete_last_project' | 'no_hd_wallet_found' | 'wallet_account_exists_for_chain' | 'too_many_embedded_wallets_for_user' | 'too_many_embedded_wallets_per_chain_for_user' | 'invalid_session_public_key' | 'custom_field_not_unique' | 'invalid_aa_project_configuration' | 'no_v1_embedded_wallet_found' | 'embedded_wallet_address_already_linked' | 'key_share_already_backed_up' | 'invalid_key_shares_length' | 'wallet_service_connection_error' | 'no_global_wallet_found' | 'invalid_metadata_value' | 'max_passkeys_per_user' | 'passkey_not_found' | 'cannot_delete_passkey_linked_to_embedded_wallet' | 'cannot_delete_last_sign_in_verified_credential'
  - `total` integer

## Other responses

- `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/revisions/aac826315d90/schema)
