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

# Submit a withdrawal

> Submit a user's signed withdrawal request.

Submit a user's signed withdrawal request.

> [!NOTE]
>
> Use a Broker API Key and pass the target user's wallet in X-User-Wallet-Address. The gateway checks that the wallet belongs to your Broker. See [Broker API Key and signing](https://dexbuilder.mintlify.site/en/api-reference/common/broker-authentication.md).

## Usage notes

* `r`, `v`, and `s` are the user's signature components. `timestamp` is in milliseconds and must equal the value returned by [Get withdrawal signing data](https://dexbuilder.mintlify.site/en/api-reference/dexbuilder/withdraw-sign-data.md).
* `to_address` is optional; if provided, it must equal the bound `address` and match the signing-data request.
* `Idempotency-Key` is required. Retrying with the same key for the same user returns the first successful response. `success=true` means accepted; query [Get withdrawal status](https://dexbuilder.mintlify.site/en/api-reference/dexbuilder/withdraw-status.md) for the final state.


## OpenAPI

````yaml openapi/dexbuilder-en.yaml POST /api/v4/dexbuilder/withdraw/submit
openapi: 3.0.3
info:
  title: DexBuilder Platform Broker API
  version: 1.0.0
  description: >-
    DexBuilder Platform Broker API for asset configuration, user queries,
    deposits, and withdrawals. See the shared gateway documentation for
    authentication and wallet verification.
servers:
  - url: https://api.dexbuilder.com
security: []
paths:
  /api/v4/dexbuilder/withdraw/submit:
    post:
      tags:
        - Withdrawal
      summary: Submit a withdrawal
      description: Submit a signed withdrawal request. Supports Idempotency-Key.
      operationId: dexBuilderWithdrawSubmit
      parameters:
        - $ref: '#/components/parameters/SubUserWalletAddr'
        - $ref: '#/components/parameters/IdempotencyKey'
        - $ref: '#/components/parameters/DeviceType'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PerpWithdrawSubmitRequest'
      responses:
        '200':
          description: Accepted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvelopeWithdrawSubmit'
        '400':
          $ref: '#/components/responses/OpenAPIBadRequest'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          $ref: '#/components/responses/GatewayUnauthorized'
        '403':
          $ref: '#/components/responses/ProjectAccessDenied'
      security:
        - BrokerAPIKey: []
          Timestamp: []
          Signature: []
components:
  parameters:
    SubUserWalletAddr:
      name: X-User-Wallet-Address
      in: header
      required: true
      description: >-
        Target user's wallet address. The gateway verifies that the user belongs
        to the current Broker.
      schema:
        type: string
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      description: >-
        Idempotency key, maximum 128 characters; UUID recommended. Retrying the
        same submit endpoint for the same user with the same key returns the
        first successful response. Reuse the key after a network timeout, but
        never reuse it for a different request.
      schema:
        type: string
        maxLength: 128
      example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
    DeviceType:
      name: x-perp-device-type
      in: header
      required: true
      description: >-
        DexBuilder device type: 1 Android, 2 iOS, 3 WEB. A missing or invalid
        value returns INVALID_DEVICE_TYPE. Required only on the platform
        endpoints that specify this header.
      schema:
        type: string
        enum:
          - '1'
          - '2'
          - '3'
      example: '3'
  schemas:
    PerpWithdrawSubmitRequest:
      type: object
      properties:
        r:
          type: string
          description: r component of the signature over sign_data.data, as 0x hex
        v:
          type: integer
          description: Signature v as an integer, such as 27 or 28
        s:
          type: string
          description: s component of the signature, as 0x hex
        chain:
          $ref: '#/components/schemas/OpenAPIChainId'
        token_address:
          type: string
          description: Token contract
        address:
          type: string
          description: User wallet; must match the sign_data request
        token_amount:
          type: string
          description: Withdrawal amount
        to_address:
          type: string
          description: >-
            Optional. If provided, it must equal the bound signing wallet
            address; third-party withdrawal destinations are not supported.
        timestamp:
          type: integer
          format: int64
          description: Must equal the timestamp in the sign_data response
        token_symbol:
          type: string
          description: Token symbol
      required:
        - r
        - v
        - s
        - timestamp
        - chain
        - token_address
        - address
        - token_amount
        - token_symbol
    EnvelopeWithdrawSubmit:
      allOf:
        - $ref: '#/components/schemas/EnvelopeBase'
        - type: object
          properties:
            data:
              $ref: '#/components/schemas/PerpWithdrawSubmitResponse'
    ErrorEnvelope:
      allOf:
        - $ref: '#/components/schemas/EnvelopeBase'
        - type: object
          required:
            - label
          properties:
            label:
              type: string
              description: Stable machine-readable error label
            data:
              nullable: true
              description: Usually null on error
    OpenAPIChainId:
      type: string
      enum:
        - base
        - bsc
        - ethereum
        - solana
        - arbitrum
      description: 'Network identifier: base, bsc, ethereum, solana, or arbitrum.'
      example: ethereum
    EnvelopeBase:
      type: object
      properties:
        code:
          type: integer
          example: 0
          description: Business code; 0 indicates success
        message:
          type: string
          example: success
          description: Human-readable message; success responses use success
        reason:
          type: string
          description: Error reason identifier; usually empty on success
        trace_id:
          type: string
          description: Trace ID to provide when requesting support
    PerpWithdrawSubmitResponse:
      type: object
      properties:
        event_id:
          type: string
          description: Withdrawal event UUID for GET /withdraw/status
        success:
          type: boolean
          description: Whether the request was accepted
  responses:
    OpenAPIBadRequest:
      description: 'Invalid request: parameters, body, user identity, or business validation'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          examples:
            invalidArgument:
              summary: Invalid parameter
              value:
                label: INVALID_ARGUMENT
                message: invalid argument
            userNotFound:
              summary: User not found
              value:
                label: USER_NOT_FOUND
                message: User not found
            missingHeader:
              summary: Missing required header
              value:
                label: MISSING_REQUIRED_HEADER
                message: invalid headers
    GatewayUnauthorized:
      description: Invalid Broker API Key, signature, or timestamp
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          examples:
            invalidKey:
              summary: Invalid API Key
              value:
                label: INVALID_KEY
                message: Invalid key provided
                code: 401
                trace_id: abc123
            invalidSignature:
              summary: Invalid signature
              value:
                label: INVALID_SIGNATURE
                message: Invalid signature
                code: 401
                trace_id: abc123
    ProjectAccessDenied:
      description: Project not bound, or Broker and API Key do not match
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            code: 40300801
            reason: P_DEX_BUILDER_IN_PROJECT_ACCESS_DENIED
            label: PROJECT_ACCESS_DENIED
            message: project access denied
            data: null
  securitySchemes:
    BrokerAPIKey:
      type: apiKey
      in: header
      name: KEY
      description: Broker API Key
    Timestamp:
      type: apiKey
      in: header
      name: Timestamp
      description: Unix timestamp in seconds
    Signature:
      type: apiKey
      in: header
      name: SIGN
      description: Hexadecimal HMAC-SHA512 signature generated with the Broker Secret Key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.