Dynamic Users API

The Users API from Dynamic — 8 operation(s) for users.

OpenAPI Specification

dynamic-xyz-users-api-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Dashboard Allowlists Users API
  description: Dashboard API documentation
  version: 1.0.0
servers:
- url: https://app.dynamicauth.com/api/v0
- url: https://app.dynamic.xyz/api/v0
- url: http://localhost:3333/api/v0
tags:
- name: Users
paths:
  /users/{userId}:
    put:
      deprecated: true
      operationId: updateUserLegacy
      tags:
      - Users
      summary: Update a user (deprecated - use /environments/{environmentId}/users/{userId} instead)
      parameters:
      - $ref: '#/components/parameters/userId'
      requestBody:
        description: User new fields data
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InternalUpdatableUserFields'
        required: true
      responses:
        '200':
          description: Successful response of a user
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
    get:
      deprecated: true
      operationId: getUserLegacy
      tags:
      - Users
      summary: Get a user by Id (deprecated - use /environments/{environmentId}/users/{userId} instead)
      parameters:
      - $ref: '#/components/parameters/userId'
      responses:
        '200':
          description: Successful response of a user
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Not found
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
    delete:
      deprecated: true
      operationId: deleteUserLegacy
      tags:
      - Users
      summary: Delete user (deprecated - use /environments/{environmentId}/users/{userId} instead)
      parameters:
      - $ref: '#/components/parameters/userId'
      responses:
        '204':
          description: successful operation
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Not found
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
  /environments/{environmentId}/users/{userId}:
    put:
      operationId: updateUser
      tags:
      - Users
      summary: Update a user
      parameters:
      - $ref: '#/components/parameters/environmentId'
      - $ref: '#/components/parameters/userId'
      requestBody:
        description: User new fields data
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InternalUpdatableUserFields'
        required: true
      responses:
        '200':
          description: Successful response of a user
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
    get:
      operationId: getUser
      tags:
      - Users
      summary: Get a user by Id
      parameters:
      - $ref: '#/components/parameters/environmentId'
      - $ref: '#/components/parameters/userId'
      responses:
        '200':
          description: Successful response of a user
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Not found
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
    delete:
      operationId: deleteUser
      tags:
      - Users
      summary: Delete user
      parameters:
      - $ref: '#/components/parameters/environmentId'
      - $ref: '#/components/parameters/userId'
      responses:
        '204':
          description: successful operation
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Not found
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
  /oauthAccounts/{oauthAccountId}/accessToken:
    get:
      operationId: getUserOauthAccessToken
      tags:
      - Users
      summary: Get the access token for a user OAuth account
      parameters:
      - $ref: '#/components/parameters/oauthAccountId'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserOauthAccessTokenResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Not found
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
  /environments/{environmentId}/users:
    post:
      operationId: createUser
      summary: Creates a new user
      tags:
      - Users
      parameters:
      - $ref: '#/components/parameters/environmentId'
      requestBody:
        description: User new fields data
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InternalBulkUpdateUserFields'
        required: true
      responses:
        '201':
          description: Successfully created new user
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
    get:
      operationId: getEnvironmentUsers
      tags:
      - Users
      summary: Get all users for an environment
      parameters:
      - $ref: '#/components/parameters/environmentId'
      - in: query
        name: filter
        required: false
        style: form
        schema:
          $ref: '#/components/schemas/UserSearchFilterParams'
      - in: query
        name: orderBy
        required: false
        schema:
          $ref: '#/components/schemas/orderBy'
      - in: query
        name: offset
        schema:
          type: integer
          minimum: 0
          default: 0
        description: The number of items to skip before starting to collect the result set
        required: false
      - in: query
        name: limit
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 20
        description: The numbers of items to return
        required: false
      - in: query
        name: includeSessions
        required: false
        schema:
          type: boolean
        description: When true, we will return the most recent list of sessions for each user in the list.
      responses:
        '200':
          description: List of users
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UsersResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
  /users/{userId}/sessions/revoke:
    post:
      deprecated: true
      operationId: revokeUserSessionsLegacy
      description: This endpoint is deprecated. Use /environments/{environmentId}/users/{userId}/sessions/revoke instead.
      summary: Revoke sessions by user ID
      tags:
      - Users
      parameters:
      - $ref: '#/components/parameters/userId'
      responses:
        '204':
          description: Successful empty response
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/ForbiddenWithErrorAndPayload'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
  /environments/{environmentId}/users/{userId}/sessions/revoke:
    post:
      operationId: revokeUserSessions
      summary: Revoke sessions by user ID
      tags:
      - Users
      parameters:
      - $ref: '#/components/parameters/environmentId'
      - $ref: '#/components/parameters/userId'
      responses:
        '204':
          description: Successful empty response
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/ForbiddenWithErrorAndPayload'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
  /environments/{environmentId}/users/{userId}/sessions:
    get:
      operationId: getUserSessions
      summary: Get all sessions for a user by user ID
      tags:
      - Users
      parameters:
      - $ref: '#/components/parameters/environmentId'
      - $ref: '#/components/parameters/userId'
      - in: query
        name: limit
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 100
        description: The number of sessions to return
        required: false
      - in: query
        name: offset
        schema:
          type: integer
          minimum: 0
          default: 0
        description: The number of sessions to skip before starting to collect the result set
        required: false
      - in: query
        name: revoked
        schema:
          type: boolean
        description: Filter sessions by revoked status. If true, only revoked sessions are returned. If false, only non-revoked sessions are returned. If not provided, all sessions are returned.
        required: false
      responses:
        '200':
          description: Successful response with list of sessions
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/ForbiddenWithErrorAndPayload'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
  /environments/{environmentId}/users/bulk:
    post:
      operationId: bulkCreateUser
      summary: Creates many new users
      tags:
      - Users
      parameters:
      - $ref: '#/components/parameters/environmentId'
      - name: upsert
        in: query
        required: false
        description: Update user data if user already exists
        schema:
          type: boolean
      requestBody:
        description: User new fields data
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/InternalUserFields'
              minItems: 1
              maxItems: 50
        required: true
      responses:
        '201':
          description: Successfully completed bulk user request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkUserCreateResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
      - bearerAuth: []
components:
  schemas:
    UserOauthAccessTokenResponse:
      type: object
      required:
      - accessToken
      properties:
        accessToken:
          type: string
    UnprocessableEntity:
      type: object
      properties:
        error:
          type: string
          example: Resources already exists for this Object
        code:
          $ref: '#/components/schemas/UnprocessableEntityErrorCode'
        payload:
          $ref: '#/components/schemas/UnprocessableEntityErrorPayload'
      required:
      - error
    ProjectSettingsKyc:
      type: object
      properties:
        name:
          type: string
        required:
          type: boolean
        enabled:
          type: boolean
        unique:
          type: boolean
        verify:
          type: boolean
        type:
          $ref: '#/components/schemas/KycFieldType'
        validationRules:
          $ref: '#/components/schemas/CustomFieldValidationRules'
        validationType:
          $ref: '#/components/schemas/CustomFieldType'
        label:
          type: string
        position:
          type: number
      required:
      - name
      - required
      - enabled
      - unique
      - verify
    ThresholdSignatureScheme:
      type: string
      enum:
      - TWO_OF_TWO
      - TWO_OF_THREE
      - THREE_OF_FIVE
    OptionalNullableNonEmptyStringWith255MaxLength:
      type: string
      pattern: ^$|^(?=\S)[\p{L}\p{N} _.,:!?&%@\/+-]+(?<=\S)$
      example: An example name
      nullable: true
      maxLength: 255
    ChainalysisCheck:
      type: object
      properties:
        id:
          $ref: '#/components/schemas/uuid'
        createdAt:
          type: string
          format: date-time
        result:
          $ref: '#/components/schemas/ChainalysisCheckResultEnum'
        walletPublicKey:
          $ref: '#/components/schemas/WalletPublicKey'
        response:
          type: string
      required:
      - id
      - createdAt
      - result
      - walletPublicKey
      - response
    NotFound:
      type: object
      required:
      - error
      - code
      properties:
        error:
          type: string
          example: Not Found
        code:
          type: string
          example: not_found
    WaasWalletSettings:
      type: object
      properties:
        hasDeniedDelegatedAccess:
          type: boolean
        shouldRefreshOnNextSignOn:
          type: boolean
        reshareOnNextSignOn:
          $ref: '#/components/schemas/ThresholdSignatureScheme'
        revokeOnNextSignOn:
          type: boolean
    InternalUserFields:
      allOf:
      - $ref: '#/components/schemas/InternalUpdatableUserFields'
      - type: object
        properties:
          emailVerifiedAt:
            type: string
            format: date-time
            description: 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:
            $ref: '#/components/schemas/updatableEmailOrEmptyString'
          wallets:
            type: array
            items:
              $ref: '#/components/schemas/CreateWalletRequest'
          oauthAccounts:
            type: array
            items:
              $ref: '#/components/schemas/CreateUserOauthRequest'
    emailOrEmptyString:
      type: string
      pattern: ^$|(^([!#-'*+\/-9=?A-Z^-~-]+(\.[!#-'*+\/-9=?A-Z^-~-]+)*|"([]!#-[^-~ \t]|([\t -~]))+")@([!#-'*+\/-9=?A-Z^-~-]+(\.[!#-'*+\/-9=?A-Z^-~-]+)*|[\t -Z^-~]*)$)
      example: hello-world@foobar.com
      maxLength: 255
    WalletKeyShareInfo:
      type: object
      required:
      - id
      - backupLocation
      - passwordEncrypted
      properties:
        id:
          $ref: '#/components/schemas/uuid'
        backupLocation:
          type: string
        passwordEncrypted:
          type: boolean
        externalKeyShareId:
          $ref: '#/components/schemas/uuid'
    User:
      allOf:
      - $ref: '#/components/schemas/BaseUser'
      - type: object
        properties:
          walletPublicKey:
            type: string
          wallet:
            type: string
          chain:
            $ref: '#/components/schemas/ChainEnum'
          createdAt:
            type: string
            format: date-time
          updatedAt:
            type: string
            format: date-time
          sessions:
            type: array
            items:
              $ref: '#/components/schemas/Session'
          wallets:
            type: array
            items:
              $ref: '#/components/schemas/Wallet'
          chainalysisChecks:
            type: array
            items:
              $ref: '#/components/schemas/ChainalysisCheck'
          oauthAccounts:
            type: array
            items:
              $ref: '#/components/schemas/oAuthAccount'
          mfaDevices:
            type: array
            items:
              $ref: '#/components/schemas/MFADevice'
    ecdsaValidatorOptions:
      type: string
      enum:
      - zerodev_signer_to_ecdsa
      - zerodev_multi_chain
    UnprocessableEntityErrorPayload:
      type: object
      description: Contains information which the integrating client of this API can use to tailor an experience to a customer to fix the underlying issue that triggered this error.
      properties:
        email:
          type: string
          format: email
          example: joe@email.com
        loginProvider:
          $ref: '#/components/schemas/ProviderEnum'
        embeddedWalletName:
          type: string
        embeddedSocialSigninProvider:
          $ref: '#/components/schemas/ProviderEnum'
        mergeConflicts:
          $ref: '#/components/schemas/MergeConflicts'
        additionalMessages:
          type: array
          items:
            type: string
    JwtVerifiedCredentialFormatEnum:
      type: string
      enum:
      - blockchain
      - email
      - oauth
      - passkey
      - phoneNumber
      - externalUser
    MergeUserConflict:
      type: object
      description: Contains a merge conflict between two users with different values for the same user field data
      required:
      - field
      - fromUser
      - currentUser
      properties:
        field:
          $ref: '#/components/schemas/ProjectSettingsKyc'
        fromUser:
          $ref: '#/components/schemas/MergeUser'
        currentUser:
          $ref: '#/components/schemas/MergeUser'
    UserSearchFilterParams:
      type: object
      properties:
        filterValue:
          type: string
        filterColumn:
          $ref: '#/components/schemas/UserFilterableFieldsEnum'
        filterSocialProvider:
          $ref: '#/components/schemas/ProviderEnum'
        chain:
          $ref: '#/components/schemas/ChainEnum'
    CreateUserOauthRequest:
      type: object
      required:
      - provider
      - accountId
      properties:
        provider:
          $ref: '#/components/schemas/ProviderEnum'
        accountId:
          $ref: '#/components/schemas/NonEmptyStringWith255MaxLength'
        emails:
          type: array
          items:
            $ref: '#/components/schemas/emailOrEmptyString'
        displayName:
          $ref: '#/components/schemas/OptionalNonEmptyStringWith255MaxLength'
        username:
          $ref: '#/components/schemas/OptionalNonEmptyStringWith255MaxLength'
        photos:
          type: array
          items:
            type: string
        profile:
          type: object
    ForbiddenWithErrorAndPayload:
      type: object
      properties:
        error:
          $ref: '#/components/schemas/ErrorMessageWithCode'
        payload:
          $ref: '#/components/schemas/ForbiddenErrorPayload'
    BulkUserCreateResponse:
      type: object
      properties:
        created:
          type: array
          items:
            $ref: '#/components/schemas/User'
        updated:
          type: array
          items:
            $ref: '#/components/schemas/User'
        failed:
          type: array
          items:
            type: object
            properties:
              user:
                $ref: '#/components/schemas/User'
              error:
                type: string
                example: Resources already exists for this Object
              code:
                $ref: '#/components/schemas/UnprocessableEntityErrorCode'
        total:
          type: integer
    UserResponse:
      type: object
      properties:
        user:
          $ref: '#/components/schemas/User'
    UserFilterableFieldsEnum:
      type: string
      enum:
      - all
      - id
      - walletPublicKey
      - email
      - alias
      - firstName
      - lastName
      - phoneNumber
      - jobTitle
      - wallet
      - username
      - accountId
    InternalServerError:
      type: object
      properties:
        error:
          type: string
          example: Internal Server Error
    oAuthAccount:
      type: object
      properties:
        id:
          $ref: '#/components/schemas/uuid'
        provider:
          $ref: '#/components/schemas/ProviderEnum'
        accountUsername:
          type: string
    btcWalletString:
      type: string
      description: BTC wallet address
      pattern: ^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,59}$
      example: 3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5
      nullable: true
    ProviderEnum:
      type: string
      description: The 'turnkey' value is deprecated and will be removed in a future version.
      enum:
      - 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
    MfaBackupCodeAcknowledgement:
      type: string
      nullable: true
      enum:
      - pending
      - complete
    KycFieldType:
      type: string
      enum:
      - standard
      - custom
    NameServiceData:
      type: object
      properties:
        avatar:
          type: string
        name:
          type: string
    ltcWalletString:
      type: string
      description: LTC wallet address
      pattern: ^[LM3][a-km-zA-HJ-NP-Z1-9]{26,53}$
      example: LUttH43tQ4x4qniCKr1Rqo8ESeXFPdv9ax
      nullable: true
    InternalUpdatableUserFields:
      type: object
      description: User fields that can be updated on dashboard or through the rest API which do not involve any uniqueness checks or further verification
      properties:
        alias:
          $ref: '#/components/schemas/OptionalNonEmptyStringWith255MaxLength'
        firstName:
          $ref: '#/components/schemas/OptionalNonEmptyStringWith255MaxLength'
        lastName:
          $ref: '#/components/schemas/OptionalNonEmptyStringWith255MaxLength'
        jobTitle:
          $ref: '#/components/schemas/OptionalNonEmptyStringWith255MaxLength'
        phoneNumber:
          $ref: '#/components/schemas/OptionalNonEmptyStringWith255MaxLength'
        metadata:
          type: object
        mfaBackupCodeAcknowledgement:
          $ref: '#/components/schemas/MfaBackupCodeAcknowledgement'
        tShirtSize:
          $ref: '#/components/schemas/OptionalNonEmptyStringWith255MaxLength'
        team:
          $ref: '#/components/schemas/OptionalNonEmptyStringWith255MaxLength'
        policiesConsent:
          type: boolean
        country:
          $ref: '#/components/schemas/CountryCode'
        username:
          $ref: '#/components/schemas/Username'
        btcWallet:
          $ref: '#/components/schemas/btcWalletString'
        kdaWallet:
          $ref: '#/components/schemas/kdaWalletString'
        ltcWallet:
          $ref: '#/components/schemas/ltcWalletString'
        ckbWallet:
          $ref: '#/components/schemas/ckbWalletString'
        kasWallet:
          $ref: '#/components/schemas/kasWalletString'
        dogeWallet:
          $ref: '#/components/schemas/dogeWalletString'
        emailNotification:
          type: boolean
        discordNotification:
          type: boolean
        newsletterNotification:
          type: boolean
    MergeConflicts:
      type: object
      description: Contains information needed for the SDK to surface merge conflicts when attempting to merge information from one user to another
      required:
      - fromUser
      - conflicts
      properties:
        fromUser:
          $ref: '#/components/schemas/SdkUser'
        conflicts:
          type: array
          items:
            $ref: '#/components/schemas/MergeUserConflict'
    InternalBulkUpdateUserFields:
      allOf:
      - $ref: '#/components/schemas/InternalUpdatableUserFields'
      - type: object
        properties:
          id:
            $ref: '#/components/schemas/uuid'
          emailVerifiedAt:
            type: string
            format: date-time
            description: 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:
            $ref: '#/components/schemas/updatableEmailOrEmptyString'
          wallets:
            type: array
            items:
              $ref: '#/components/schemas/CreateWalletRequest'
          oauthAccounts:
            type: array
            items:
              $ref: '#/components/schemas/CreateUserOauthRequest'
    WalletProperties:
      anyOf:
      - $ref: '#/components/schemas/TurnkeyWalletProperties'
      - $ref: '#/components/schemas/HardwareWalletProperties'
      - $ref: '#/components/schemas/CoinbaseMpcWalletProperties'
      - $ref: '#/components/schemas/SmartWalletProperties'
      - $ref: '#/components/schemas/WaasWalletProperties'
    MFADevice:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/MFADeviceType'
        verified:
          type: boolean
          description: Whether or not the user has a verified this MFA Device
        id:
          $ref: '#/components/schemas/uuid'
        createdAt:
          type: string
          format: date-time
          description: The date and time the MFA device was created
        verifiedAt:
          type: string
          format: date-time
          description: The date and time the MFA device was verified
          nullable: true
        default:
          type: boolean
          description: Whether or not this is the default MFA device for the user
        alias:
          type: string
          description: The optional alias for the MFA device
    NonEmptyStringWith255MaxLengthAndSpecialChars:
      type: string
      pattern: ^(?=\S)[\p{L}\p{N}a-zA-Z _.,:!?&%@\/+\-'()\[\]*]+(?<=\S)$
      maxLength: 255
      example: An example name
    EmbeddedWalletVersionEnum:
      type: string
      enum:
      - V1
      - V2
      - V3
    CountryCode:
      type: string
      nullable: true
      description: Standard ISO 3166-1 alpha-2 two-letter country code
      pattern: ^[A-Z]{2}$
      example: US
      maxLength: 255
    CoinbaseMpcWalletProperties:
      type: object
      properties:
        claimed:
          type: boolean
          description: Dynamic pregenerated this wallet and stored the passcode
        source:
          $ref: '#/components/schemas/PasswordSourceTypeEnum'
    Username:
      type: string
      nullable: true
      description: Alphanumeric with slugs and underscores username
      pattern: ^$|^[\p{L}\p{N}_-]{3,20}$
      example: johndoe
      maxLength: 255
    ckbWalletString:
      type: string
      description: CKB wallet address
      pattern: ^(ckb1q|ckt1q)[0-9a-z]{25,111}$
      example: ckt1q9876543210abcdefghijklmnopqrstuvwxyz
      nullable: true
    CreateWalletRequest:
      required:
      - publicWalletAddress
      - chain
      - walletName
      - walletProvider
      type: object
      properties:
        publicWalletAddress:
          $ref: '#/components/schemas/WalletPublicKey'
        chain:
          $ref: '#/components/schemas/ChainEnum'
        walletName:
          $ref: '#/components/schemas/NonEmptyStringWith255MaxLength'
        walletProvider:
          $ref: '#/components/schemas/WalletProviderEnum'
        additionalWalletAddresses:
          type: array
          items:
            $ref: '#/components/schemas/WalletAdditionalAddress'
    Unauthorized:
      type: object
      properties:
        error:
          type: string
          example: No jwt provided!
    dogeWalletString:
      type: string
      description: DOGE wallet address
      pattern: ^D[a-zA-Z0-9_.-]{33}$
      example: DPcy35vmuk8GXcfu1vgFFEeij3BuYYJQKB
      nullable: true
    SmartWalletProperties:
      type: object
      properties:
        entryPointVersion:
          $ref: '#/components/schemas/ProviderEntryPointVersionEnum'
        kernelVersion:
          $ref: '#/components/schemas/ProviderKernelVersionEnum'
        ecdsaProviderType:
          $ref: '#/components/schemas/ecdsaValidatorOptions'
    ChainEnum:
      type: string
      enum:
      - ETH
      - EVM
      - FLOW
      - SOL
      - ALGO
      - STARK
      - COSMOS
      - BTC
      - ECLIPSE
      - SUI
      - SPARK
      - TRON
      - APTOS
      - TON
      - STELLAR
    UsersResponse:
      type: object
      properties:
        count:
          type: integer
        users:
          type: array
          items:
            $ref: '#/components/schemas/User'
    ForbiddenErrorPayload:
      type: object
      properties:
        walletPublicKey:
          $ref: '#/components/schemas/WalletPublicKey'
        email:
          type: string
          format: email
    updatableEmailOrEmptyString:
      type: string
      description: 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.
      pattern: ^$|(^([!#-'*+\/-9=?A-Z^-~-]+(\.[!#-'*+\/-9=?A-Z^-~-]+)*|"([]!#-[^-~ \t]|([\t -~]))+")@([!#-'*+\/-9=?A-Z^-~-]+(\.[!#-'*+\/-9=?A-Z^-~-]+)*|[\t -Z^-~]*)$)
      example: hello-world@foobar.com
      maxLength: 255
    PasswordSourceTypeEnum:
      type: string
      enum:
      - dynamic
      - user
    WalletAdditionalAddress:
      type: object
      description: An additional address associated with a wallet.
      required:
      - address
      - type
      properties:
        address:
          type: string
          description: An address associated with a wallet.
        publicKey:
          type: string
          description: The public key associated with the ad

# --- truncated at 32 KB (51 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/dynamic-xyz/refs/heads/main/openapi/dynamic-xyz-users-api-openapi.yml