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

# Withdrawals

> Move money back out of the company balance — to your bank or a crypto address

Money in the [company balance](/companies/wallet-funding/company-wallet) is never locked in. A company admin can withdraw the **available balance** (what isn't committed to in-flight card fundings) any time:

* **Bank** — the default. Save your company bank account once (US ACH, or an international wire with IBAN + SWIFT) and request the transfer. Our team executes it by hand, usually within **1-3 business days**; the balance is held while the request is open and every admin is emailed as it progresses (`requested → processing → completed`).
* **Other methods** — two self-serve rails that complete in minutes:
  * **Bank via Coinbase** — a hosted Coinbase cashout. You confirm the sale with your own Coinbase account (bank linked there); Agentcard sends the USDC the moment you confirm, and Coinbase pays your bank by ACH. Coinbase's sell fee applies; Agentcard adds none.
  * **Crypto address** — USDC on Base, sent straight from the pool to an address you provide. No intermediary and no extra account; this is the mirror of funding the pool by USDC deposit.

<Note>
  Withdrawals are **admin-only**, require an active subscription (the same one that unlocks the live pool), and the self-serve rails re-verify the admin's phone with a one-time code when the last verification is older than 60 days — the same check funding uses. Every withdrawal emails all company owners and admins. There is a \$10,000 rolling 24-hour limit per company; contact us if you need more.
</Note>

## From the dashboard

**Company balance → Withdraw.** One dialog, a rail picker at the top: **Bank** (pick or add a saved company account, enter the amount) or **Other methods** (Coinbase cashout or a crypto address). Coinbase withdrawals open a tab where you confirm the cashout — keep the dashboard open; it tracks the withdrawal to completion by itself. In-flight withdrawals show on the Company balance page with their status, and the movement feed shows every withdrawal alongside deposits and card spend.

Test mode has the same button against the test balance: no real money, no confirmations, instant.

## From the CLI

The self-serve rails are scriptable from the `agent-cards` CLI:

```bash theme={null}
# USDC to your own address on Base
agent-cards companies balance withdraw --org org_123 --amount 250 --to 0xYourTreasury...

# Bank cashout via Coinbase (prints the confirmation link, then watches until it lands)
agent-cards companies balance withdraw --org org_123 --amount 250 --bank

# Test mode
agent-cards companies balance withdraw --org org_123 --amount 50 --to 0x... --test
```

## From the API

Programmatic withdrawals use your company credentials (a client-credentials token) and cover the self-serve rails: the crypto rail completes in one call; the Coinbase rail returns an `offramp_url` a human must open to confirm. (The manual bank rail is dashboard-only for now — it exists for the humans wiring money, not for automation.)

```bash theme={null}
curl -X POST https://api.agentcard.sh/api/v1/wallet/withdrawals \
  -H "Authorization: Bearer $ORG_TOKEN" \
  -H "Idempotency-Key: payout-2026-07-14" \
  -H "Content-Type: application/json" \
  -d '{ "amount_cents": 25000, "rail": "address", "destination_address": "0xYourTreasury..." }'
```

```json theme={null}
{
  "id": "wd_1a2b3c...",
  "object": "withdrawal",
  "status": "completed",
  "rail": "address",
  "amount_cents": 25000,
  "usdc_amount": "250.00",
  "destination_address": "0xYourTreasury...",
  "tx_hash": "0xabc...",
  "livemode": true,
  "created_at": "2026-07-14T18:00:00.000Z"
}
```

`GET /api/v1/wallet/withdrawals` lists them (newest first, `starting_after` pagination), `GET /api/v1/wallet/withdrawals/{id}` polls one, and `POST /api/v1/wallet/withdrawals/{id}/cancel` abandons one that hasn't sent yet. Test credentials withdraw from the mock pool — the inverse of `test-fund`.

A self-serve withdrawal moves through `created → sending → sent → completed`; the Coinbase rail adds `awaiting_provider` (waiting for your confirmation) before the send and can end `expired` if nobody confirms within the window. `failed` with a `tx_hash` on the Coinbase rail means the transfer left the pool but missed Coinbase's settlement window — the USDC is in the confirming user's own Coinbase account, not lost. Manual bank withdrawals move through `requested → processing → completed` (or `rejected`, which releases the hold).

## Your users' withdrawals

Your **users** can move money out too — their own spendable balance, not the company pool. From your app, use the [Withdrawals API](/companies/api/reference/wallet-withdraw): save a bank destination per user, request withdrawals, and poll the list to reflect statuses in your UI. Users connected over MCP get the same via the [withdraw](/companies/mcp/tools/withdraw) and [create\_withdrawal\_recipient](/companies/mcp/tools/create_withdrawal_recipient) tools, and the personal dashboard has a Withdraw button with the same rails.

Two things to know:

* Only what a user can actually **spend** is withdrawable. Money you allocate to users under the company-funded flow is yours, not theirs — it never leaves through a user withdrawal.
* You can switch user withdrawals off for your whole organization from the dashboard — **Settings → General → User withdrawals** (admins and owners). While off, the user endpoints return `withdrawals_disabled`. It never affects withdrawals from your own company balance.

## Events

| Event                         | Fires when                                                            |
| ----------------------------- | --------------------------------------------------------------------- |
| `wallet.withdrawal.initiated` | A withdrawal reserved pool funds                                      |
| `wallet.withdrawal.completed` | The money is out (bank cashout confirmed, or the on-chain send mined) |
| `wallet.withdrawal.failed`    | Terminal failure — `tx_hash` tells you whether funds moved            |

## What about earnings?

Withdrawals draw on the balance you **hold**. [Earnings](/companies/wallet-funding/company-wallet) you're **owed** accrue separately and land in your balance as monthly payouts — once a payout lands, it's withdrawable like any other deposit.
