---
title: "Withdraw from account balance"
method: POST
path: "/withdraw"
---

# Withdraw from account balance

`POST /withdraw`

## Request

- Base URL: `https://laso.finance`
- URL: `https://laso.finance/withdraw`
- Auth: API key in header `Authorization`

Initiate a withdrawal from the user's account balance. The USDC is sent on Solana to the `solana_address` you supply; the destination is never inferred, so the address is required.

This is an asynchronous operation. A successful call answers `202 Accepted`: the withdrawal is created in a `pending` state and sent within a few minutes. Poll the returned `status_url` (`GET /get-withdrawal-status?withdrawal_id=...`) until `state` reaches a terminal value rather than treating the 202 as completion.

This draws only on the Laso account balance, never on the managed agent wallet. USDC sitting in the agent wallet is moved with `agentWalletTransfer` instead. When the account balance is too low but the agent wallet holds funds, the 400 response says so and reports both figures.

An agent's withdrawal counts against the account's spend limits, the same as its payments and wallet sends: it must be under the per-payment limit and fit in what is left of the rolling 24-hour limit. Otherwise it is refused with 403 and `code` `agent_spend_limit` or `agent_daily_limit`, and nothing is withdrawn. Do not split it into smaller withdrawals to get under a limit; tell your human.

Requires a Bearer token from `/auth` or `/get-card`.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `amount` number, required: Amount to withdraw in USD
  - `solana_address` string, required: Solana wallet address that receives the USDC. Must be a valid base58 Solana address.

## Response `202`

Withdrawal accepted. The withdrawal is recorded in a `pending` state and the USDC is sent on Solana within a few minutes, so this response reports that the request was accepted, not that it settled. Poll `status_url` (also returned in the `Location` header) until `withdrawal.state` reaches a terminal value.

- object
  - `success` boolean
  - `status_url` string, uri: Absolute URL to poll for this withdrawal's state. Always present, including on an idempotent replay, so prefer it over the `Location` header.
  - `withdrawal` WithdrawalRecord: A withdrawal record.
    - `id` string
    - `amount` number
    - `state` 'pending'
    - `solana_address` string: The Solana address the USDC will be sent to.
    - `timestamp` number
    - `timestamp_readable` string

## Other responses

- `400`: Invalid amount, missing or invalid `solana_address` (`code: invalid_solana_address`), or insufficient funds
- `401`: Missing or invalid Bearer token
- `403`: Account is frozen. The response includes a `frozen_message` field explaining why.
- `404`: Account balance not found
- `409`: A request with this `Idempotency-Key` is still being processed (`code: idempotency_key_in_progress`). Wait a moment and retry with the same key.
- `422`: The `Idempotency-Key` was already used for a different request body or route (`code: idempotency_key_reused`). Use a new key.

---

[API](https://skmtc.dev/laso/apis/laso-finance-x402-api.md) · [All operations](https://skmtc.dev/laso/apis/laso-finance-x402-api/llms.txt) · [OpenAPI document](https://skmtc.dev/laso/apis/laso-finance-x402-api/revisions/ff8ce20b49ba?raw)
