Skip to main content
POST
Request a withdrawal

How it works

Requests a withdrawal from the user’s spendable balance. Two rails:
  • bank (default) — pays a saved destination by ACH or international wire. Pass the recipient_id from saved destinations; if the user has none yet, save one first.
  • address — sends USDC on Base to destination_address (a 0x address the user provides). Agentcard-managed addresses are rejected (internal_destination).
Both rails are processed manually by the Agentcard team, usually within 1-3 business days — set that expectation in your UI. The response comes back in requested; the status then walks requestedprocessingcompleted (or rejected), and the user is emailed when the request is received and again when it is sent.
  • Amounts range from 2.00to2.00 to 10,000.00 per request.
  • Open requests hold the balance: they count against the user’s spendable balance until they complete or are rejected, so a user can never over-request. insufficient_funds returns available_cents — the balance net of holds — for a helpful retry message.
  • Only what the user can actually spend is withdrawable. Money your company allocated to a user under the company-funded flow is not.
  • You can switch user withdrawals off for your whole organization from the dashboard (Settings → General → User withdrawals); while off, these endpoints return withdrawals_disabled.
Track progress with list withdrawals.

Authorizations

Authorization
string
header
required

A platform access token. Get one on the Create an access token endpoint by exchanging your client_id + client_secret, then send it as Authorization: Bearer <token>. Tokens live one hour.

Body

application/json
user_id
string
required

The connected user's id.

amount_cents
integer
required

Amount in USD cents, 200 to 1000000.

rail
enum<string>
default:bank
Available options:
bank,
address
recipient_id
string

Bank rail: the saved destination to pay (wrec_...).

destination_address
string

Address rail: a 0x-prefixed address on Base to receive USDC. Agentcard-managed addresses are rejected.

Response

The withdrawal, in requested.

A withdrawal request. Both rails are processed manually: the status walks requestedprocessingcompleted (or rejected), and the user is emailed at each step.

object
enum<string>
Available options:
withdrawal
id
string

Withdrawal id (wd_...).

user_id
string
status
enum<string>
Available options:
requested,
processing,
completed,
rejected
rail
enum<string>

bank pays a saved recipient by wire; address sends USDC on Base to the supplied address.

Available options:
bank,
address
amount_cents
integer
destination_address
string | null

Set on the address rail: the Base address receiving USDC.

failure_code
string | null

Set when rejected, e.g. rejected_by_ops.

completed_at
string<date-time> | null
created_at
string<date-time>
recipient
object | null

The saved bank destination, when the rail is bank.