Skip to main content
POST
Moves available balance out to an address on your withdrawal whitelist. Egress is fee-free: only the network cost is deducted — there is no platform markup.
Withdrawals move real funds and every request needs a fresh MFA factor (passkey, TOTP, or emailed code). Without one, the call fails with VERIFICATION_FAILED — status 400 when the factor is missing, 401 when it is wrong or already used, 403 when TOTP is not enrolled, 429 after too many attempts.
Cookie-authenticated writes also need an Origin header. Any non-GET request that carries the liddie_access session cookie is checked against the allowed dashboard origins; a bare cURL that sends only the cookie is rejected with 403 {"ok":false,"error":{"code":"CSRF_ORIGIN_MISMATCH","message":"Forbidden"}} before the handler runs. The snippet below is shown for shape — from a browser the dashboard sends the origin for you; from a script, prefer an API key where the endpoint accepts one.
The example request omits the MFA fields, so the server rejects it with VERIFICATION_FAILED.

Authorization

Dashboard-only (JWT session). Roles: merchant_admin / merchant_member / super_admin, with team permission withdrawals:manage. The merchant account must be active. The body must additionally carry a fresh MFA factor (passkey / TOTP / emailed code); request an email code via Send withdrawal email code. Rate limit: 10/min. Calling with an API key fails with 401 {"error":"Invalid or expired token"} — the key is not a JWT.

Parameters

string
required
Ticker of the balance to withdraw from, e.g. LTC, USDT_TRC20.
string
required
Decimal string. Must be ≤ your available ledger balance (the balance recorded for your account on the platform); the amount is atomically reserved.
string
required
Destination address. Must already be on your withdrawal whitelist for that currency.
string
Destination tag / memo for chains that use one (e.g. XRP). Part of the whitelist identity (currency, address, destinationTag).
string
The single-use emailed code.
string
A 6-digit code from your authenticator app — an alternative to emailCode. Backup codes are not accepted here: the field is validated against ^[0-9]{6}$ and backup codes are 16 hexadecimal characters. They work only at login (POST /2fa/validate). If you have lost your authenticator, request an emailed code instead.
object
WebAuthn assertion, used together with challengeKey.
string
Accompanies passkeyResponse.
  • address must be on your whitelist for that currency.
  • amount (decimal string) must be ≤ your available ledger balance; the amount is atomically reserved.
  • The network fee is deducted from the amount sent (netToDestination in the response); no platform fee.
  • Without MFA: 400 VERIFICATION_FAILED. With a wrong or reused factor the same code arrives as 401, 403 or 429.
  • If your account has any whitelisted IP, the request must come from one of them, or it is refused with 403 IP_NOT_WHITELISTED before the MFA factor is checked (so the code is not spent). An empty IP list imposes no restriction.

Response

200 OK with the accepted withdrawal inside the standard envelope. Every money value is an exact decimal string.
200 OK
string
The withdrawal id. Use it to find the row again in List withdrawals.
string
Echoed back from the request.
string
The gross amount debited from your balance, as an exact decimal string.
string
The network fee withheld. Liddie adds no markup on egress.
string
What actually arrives at the destination: amount minus networkFee.
string
The destination address the withdrawal was accepted for.
string
Present only when the request carried one (XRP).
string
queued on acceptance. Processing is asynchronous — the row advances to completed with a txHash once broadcast and verified on-chain.
The withdrawal is handled in the background after it is accepted. Track the row via List withdrawals — its status advances to completed with a txHash once broadcast and verified.

Errors

These fire AFTER the MFA factor is verified, so an emailed code is already spent by the time you see one. Request a fresh code before retrying — do not resend the same body.

See also