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

# Submit a Withdrawal

> Submits a co-signed transaction for broadcast. Path param is the withdrawalDetailId from prepare, not the config id. No authentication required (rate-limited).

<Info>
  **Note:** When using the production environment at [moonpay.hel.io](http://app.hel.io), set your API endpoint to `api.hel.io/v1`. For the development environment, use `api.dev.hel.io/v1`.
</Info>

<Warning>
  The path parameter is **`withdrawalDetailId`** (returned by prepare), not `withdrawalConfigId`.
</Warning>

<Tip>
  Pass `signedTx` in the format matching `prepared.kind` from prepare: base64 co-signed transaction for `raw` on Solana, JSON signature payload for `userop` on EVM, or EIP-712 signature for `hypercore`. If the quote was re-quoted after you signed, submit returns `409` — fetch the new quote, re-sign, and resubmit.
</Tip>


## OpenAPI

````yaml POST /v1/withdraw/{withdrawalDetailId}/submit
openapi: 3.0.0
info:
  title: Helio Open API
  description: |-
    API schema and definitions for Helio API. <br/> 
          The API is using two types of Authentication, for dashboard endpoints we use <b>JSON Web Token (JWT)</b> that is generated by self custodial wallet signing a message from API.</br> 
          We also support authentication with <b>API Key and Secret</b> which can be generated on <a href='https://hel.io'>Helio dashboard</a>.
  version: 1.0.0
  contact: {}
servers:
  - description: Helio API (Mainnet)
    url: https://api.hel.io
  - description: Helio API (Devnet)
    url: https://api.dev.hel.io
security: []
tags:
  - name: Webhooks
  - name: Exports
  - name: Currencies
    description: >-
      Supported currencies endpoint, includes fiat and digital assets
      </br><i>Authentication: </i><b>None</b>
externalDocs:
  description: Helio product documentation
  url: https://docs.hel.io/
paths:
  /v1/withdraw/{withdrawalDetailId}/submit:
    post:
      tags:
        - Withdrawals
      summary: Submit a Withdrawal
      description: >-
        Submits a co-signed transaction for broadcast. Path param is the
        `withdrawalDetailId` from prepare (not the config id). No authentication
        required (rate-limited). Submit is idempotent for records already past
        `QUOTED`.
      operationId: WithdrawalSubmitController_submit
      parameters:
        - name: withdrawalDetailId
          in: path
          required: true
          description: The per-request withdrawal detail ID returned by prepare.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitWithdrawalDto'
      responses:
        '200':
          description: Withdrawal submitted successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubmitWithdrawalEntity'
        '401':
          description: >-
            Invalid or expired quote token, or signed transaction verification
            failed.
        '404':
          description: Withdrawal detail not found.
        '409':
          description: >-
            Quote has been refreshed (for example after a re-quote) or a
            concurrent submit race occurred. Re-fetch the quote, re-sign, and
            resubmit.
      security: []
components:
  schemas:
    SubmitWithdrawalDto:
      type: object
      required:
        - token
        - signedTx
      properties:
        token:
          type: string
          description: JWT from the prepare response.
        signedTx:
          type: string
          description: >-
            Signed payload for the lane returned by prepare. For `raw` on
            Solana: base64 co-signed VersionedTransaction. For `userop` on EVM:
            JSON with `signature` and optional `authorization`. For `hypercore`:
            EIP-712 signature over `typedData`.
    SubmitWithdrawalEntity:
      type: object
      properties:
        withdrawalDetailId:
          type: string
        txHash:
          type: string
          nullable: true
          description: On-chain transaction signature. Null only if broadcast was rejected.
        state:
          $ref: '#/components/schemas/WithdrawalState'
        broadcastAck:
          $ref: '#/components/schemas/BroadcastAck'
    WithdrawalState:
      type: string
      enum:
        - QUOTED
        - SUBMITTING
        - SUBMITTED
        - BRIDGING
        - COMPLETED
        - FAILED
        - FAILED_EXPIRED
        - EXPIRED
        - REFUNDED_BY_PROVIDER
    BroadcastAck:
      type: string
      nullable: true
      enum:
        - acknowledged
        - unacknowledged
        - rejected
      description: >-
        `acknowledged` = confirmed; `unacknowledged` = sent, keep polling;
        `rejected` = terminal failure.

````