---
title: "Create withdrawal"
method: POST
path: "/v1/treasury/withdrawals"
tags: ["Treasury"]
---

# Create withdrawal

`POST /v1/treasury/withdrawals`

## Request

- Base URL: `https://api.tesser.xyz`
- URL: `https://api.tesser.xyz/v1/treasury/withdrawals`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/tesser/apis/tesser-api/docs/v1/treasury/withdrawals/post.ts> (a function with typed inputs; its response is checked against the schema)

Create a withdrawal from a managed account or self-custodial wallet to an external bank account.

**Source types:**
- Circle USDC ledger (path A) — `desired.from.network` omitted.
- Self-custodial wallet (path B) — `desired.from.network` populated (e.g., `BASE`).

## Request body

- CreateWithdrawalRequest
  - `organization_reference_id` string: Optional client-supplied identifier.
  - `desired` WithdrawalDesiredOverlayRequest, required: Caller's stated intent for the withdrawal.
    - `from` WithdrawalDesiredFromLeg, required: Source side of the withdrawal.
      - `account_id` string, required: Source account ID.
      - `amount` string, required: Source amount.
      - `currency` string, required: Source currency code.
      - `network` string: Source blockchain network. Required when source is a self-custodial wallet.
    - `to` WithdrawalDesiredToLeg, required: Destination side of the withdrawal.
      - `account_id` string, required: Destination bank account ID.
      - `currency` string, required: Destination currency code.

## Response `201`

Withdrawal created successfully

- WithdrawalResponse
  - `data` Withdrawal, required
    - `id` string, required: Unique withdrawal identifier
    - `workspace_id` string, required: Workspace ID the withdrawal belongs to
    - `organization_reference_id` string, nullable: External reference ID for tracking
    - `direction` 'outbound', required: Resource direction.
    - `desired` WithdrawalDesiredOverlay, required: Caller's stated intent at creation. Frozen, never overwritten.
      - `from` WithdrawalDesiredFromLegResponse, required: Source side.
        - `account_id` string, nullable, required: Account ID.
        - `amount` string, nullable, required: Amount.
        - `currency` string, nullable, required: Currency code.
        - `network` string, nullable, required: Blockchain network.
      - `to` WithdrawalDesiredToLegResponse, required: Destination side.
        - `account_id` string, nullable, required: Account ID.
        - `amount` string, nullable, required: Amount.
        - `currency` string, nullable, required: Currency code.
        - `network` string, nullable, required: Blockchain network.
    - `estimated` WithdrawalEstimatedOverlay, required: Tesser's projection for how the withdrawal will proceed.
      - `from` WithdrawalEstimatedFromLeg, required: Source side.
        - `account_id` string, nullable, required: Account ID.
        - `amount` string, nullable, required: Amount.
        - `currency` string, nullable, required: Currency code.
        - `network` string, nullable, required: Blockchain network.
      - `to` WithdrawalEstimatedToLeg, required: Destination side.
        - `account_id` string, nullable, required: Account ID.
        - `amount` string, nullable, required: Amount.
        - `currency` string, nullable, required: Currency code.
        - `network` string, nullable, required: Blockchain network.
    - `actual` WithdrawalActualOverlay, required: What actually settled. Populated when the withdrawal reaches a terminal state.
      - `from` WithdrawalActualFromLeg, required: Source side.
        - `account_id` string, nullable, required: Account ID.
        - `amount` string, nullable, required: Amount.
        - `currency` string, nullable, required: Currency code.
        - `network` string, nullable, required: Blockchain network.
      - `to` WithdrawalActualToLeg, required: Destination side.
        - `account_id` string, nullable, required: Account ID.
        - `amount` string, nullable, required: Amount.
        - `currency` string, nullable, required: Currency code.
        - `network` string, nullable, required: Blockchain network.
    - `balance_status` 'unreserved' | 'awaiting_funds' | 'reserved', nullable, required: Balance reservation status.
    - `balance_reserved_at` string, date-time, nullable, required: Timestamp when balance was reserved.
    - `steps` WithdrawalStep[], required: Withdrawal execution steps.
      - `id` string, required: Unique step identifier
      - `withdrawal_id` string, required: ID of the parent withdrawal
      - `step_sequence` integer, required: Order of this step in the withdrawal flow (1-based)
      - `step_type` 'transfer' | 'swap', required: Type of step
      - `estimated` WithdrawalStepEstimatedOverlay, required: Planned values for this step.
        - `from` WithdrawalStepEstimatedFromLeg, required: Source side.
          - `account_id` string, nullable, required: Account ID.
          - `amount` string, nullable, required: Amount.
          - `currency` string, nullable, required: Currency code.
          - `network` string, nullable, required: Blockchain network.
        - `to` WithdrawalStepEstimatedToLeg, required: Destination side.
          - `account_id` string, nullable, required: Account ID.
          - `amount` string, nullable, required: Amount.
          - `currency` string, nullable, required: Currency code.
          - `network` string, nullable, required: Blockchain network.
      - `actual` WithdrawalStepActualOverlay, required: Settled values once the step reaches a terminal state. All-null until then.
        - `from` WithdrawalStepActualFromLeg, required: Source side.
          - `account_id` string, nullable, required: Account ID.
          - `amount` string, nullable, required: Amount.
          - `currency` string, nullable, required: Currency code.
          - `network` string, nullable, required: Blockchain network.
        - `to` WithdrawalStepActualToLeg, required: Destination side.
          - `account_id` string, nullable, required: Account ID.
          - `amount` string, nullable, required: Amount.
          - `currency` string, nullable, required: Currency code.
          - `network` string, nullable, required: Blockchain network.
      - `transaction_hash` string, nullable: Blockchain transaction hash
      - `unsigned_transaction` string, nullable: Unsigned transaction bytes for client signing. Present only for Turnkey-signed steps in signature_requested status.
      - `fees` StepFee[], required: Fees associated with this step
        - `fee_amount` string, required: Fee amount.
        - `fee_currency` string, required: Fee currency code.
        - `fee_type` string, required: Fee type (e.g., 'gas', 'provider', 'tesser_fee').
        - `fee_metadata` object: Additional metadata for the fee (JSON object).
      - `provider_key` 'circle_mint' | 'kraken' | 'turnkey' | 'openfx' | 'zuba', nullable: Provider used for this step
      - `status` 'created' | 'signature_requested' | 'signed' | 'submitted' | 'confirmed' | 'completed' | 'failed', required: Current status of this step
      - `status_reasons` StatusReason[], nullable: Reasons for the current status
        - `error_code` string, required
        - `error_message` string, required
      - `created_at` string, date-time, required: Step creation timestamp
      - `updated_at` string, date-time, required: Step last update timestamp
      - `signature_requested_at` string, date-time, nullable: Timestamp when a signature was requested for the step
      - `signed_at` string, date-time, nullable: Timestamp when the step was cryptographically signed
      - `submitted_at` string, date-time, nullable: Timestamp when step was submitted
      - `confirmed_at` string, date-time, nullable: Timestamp when step was confirmed
      - `completed_at` string, date-time, nullable: Timestamp when step completed
      - `failed_at` string, date-time, nullable: Timestamp when step failed
    - `created_at` string, required: ISO 8601 timestamp of creation.
    - `updated_at` string, required: ISO 8601 timestamp of last update.
    - `expires_at` string, nullable, required: ISO 8601 timestamp when the withdrawal expires.

## Other responses

- `400`: Invalid request data
- `401`: Authentication required or invalid credentials
- `500`: Internal server error

---

[API](https://skmtc.dev/tesser/apis/tesser-api.md) - [All operations](https://skmtc.dev/tesser/apis/tesser-api/llms.txt) - [OpenAPI document](https://skmtc.dev/tesser/apis/tesser-api/revisions/14f951e986b1?raw)
