https://wurkapi.fun. For the CLI workflow, follow Withdraw to a wallet.
Each route also has an
/api/agent alias, for example /api/agent/withdraw/quote. All requests require a JSON object, with no query parameters or unknown fields. Monetary values in responses are decimal strings. HTTP success is 200; raw responses contain ok:true. SDK 0.7.1 returns the decoded fields directly, and CLI 0.7.1 wraps them in data.
Authenticate the exact request
Follow free wallet authentication. An unauthenticated valid body returns HTTP402 with accepts:[], a sign-in-with-x extension, and a PAYMENT-REQUIRED header. This is a free authentication challenge. Check the origin, exact path or alias, POST method, purpose, body binding, and signing chain before signing the advertised message unchanged.
Retry that exact request with SIGN-IN-WITH-X. Proofs are single-use, expire within five minutes, and must be refreshed for each attempt, including after an admitted error. Solana uses its mainnet chain and Base uses eip155:8453; Robinhood cannot sign these requests. The wallet must already belong to the account. See account access for registration.
Do not send X-API-Key to quote, confirm, or individual status, even alongside a valid proof. History accepts exactly one of X-API-Key or SIGN-IN-WITH-X. Authentication does not spend external wallet funds; confirmation debits the quoted platform balance.
POST /withdraw/quote
This example uses a registered Base signer to withdraw its account’s Base USDC to that signing wallet:
amount field. The quote uses the full available balance of that asset/network, rounded down to 9 decimals for SOL or 6 for the other withdrawal assets. It does not reserve funds or swap/bridge a balance. Later credits remain available after confirmation of the quoted amount; an insufficient balance at confirmation rejects the request.
Solana destinations must be on-curve owner wallets. Token payouts require the associated token account for the returned mint; supply the owner wallet rather than the ATA. EVM addresses are normalized to lowercase; invalid addresses, the zero address, the payout token contract, and the payout sender are rejected.
For EVM payouts, the net amount must also be positive. Use the returned fee, not a fixed percentage or a previous quote’s fee.
Quote response
Illustrative Base response; destination, amounts, IDs, and timestamps are examples:
A matching reusable quote must have more than five seconds remaining. At most ten unused, unexpired quotes can be held per account. If another EVM fee quote is being calculated,
WITHDRAWAL_QUOTE_BUSY returns 429 with a retry delay. Use a fresh SIWX proof after waiting.
POST /withdraw
quoteId is the exact returned UUID. idempotencyKey must be 8–128 characters matching [A-Za-z0-9._:-]. Sign with the same wallet and signing network that requested the quote. The request has no amount or destination override.
Confirmation checks quote expiry and available balance, validates any required Solana ATA, reserves the gross amount, and queues the withdrawal. A Solana token ATA must be initialized, unfrozen, and owned by the expected destination wallet for the exact mint. A quote can be used for only one withdrawal.
Keep the key associated with its original quote. Reusing a key for another quote returns 409 WITHDRAWAL_REQUEST_CONFLICT. Reconfirming a recorded quote with its original key returns its current receipt with replayed:true, even after quote expiry, without another debit. Use a fresh proof. An unused expired quote returns 409 WITHDRAWAL_QUOTE_EXPIRED.
Confirmation and status response
withdrawId identifies the withdrawal. The quote ID, destination, and amounts preserve its quoted terms. tx is the transaction ID or null. finalityStatus applies to EVM withdrawals and is pending, finalized, or review; it is omitted from Solana individual receipts. replayed:true identifies a repeat confirmation of a recorded request; an ordinary status read returns false.
New Solana confirmations share a 15-second account cooldown across assets. ATA-check failures can consume it. EVM confirmations have a 30-second cooldown per payout network. An outstanding withdrawal can also block a new one: Solana checks the same asset; EVM checks the same payout network, including withdrawals undergoing review.
POST /withdraw/status
404 WITHDRAWAL_NOT_FOUND means no recorded request was found for that account/key at read time; an earlier request may still be in progress.
Check EVM finality in addition to status. A transaction ID, successful HTTP read, or successful CLI exit does not establish finalization. Read balances and resolve failed/uncertain outcomes before authorizing a replacement. Refund history covers job refunds rather than withdrawal reversals.
POST /withdraws
History is a free read using eitherX-API-Key or fresh SIWX. It includes supported Solana, Base, and Robinhood withdrawals, including website requests; unused quotes do not appear. The signer network does not filter the results.
{} is valid. Only these two fields are supported; there is no asset or network filter. Numbers must be JSON integers, not strings. The SIWX challenge binds the supplied body before pagination defaults are applied.
History response
id is the composite network:asset:withdrawId. createdAt can be null for legacy data. explorerUrl is null without a transaction. History always includes finalityStatus; it is null for Solana. This history does not include the agent’s original quote or idempotency key.
Follow nextOffset, retain the same limit, and stop when it is null. total counts all withdrawals across the supported networks, including when the requested page is empty. New activity can shift offset pages; deduplicate by id.
All credentials and pages share a ten-second withdrawal-history cooldown per account. Empty pages and admitted failed reads also consume it. Honor the HTTP Retry-After header; CLI errors expose error.retryAfterSeconds. Earnings, swap history, and job refund history have their own endpoint contracts: earnings, swaps, and refunds.
Errors and recovery
Ordinary errors use this shape;details is present only when supplied by that error:
402 is the authentication challenge described above, rather than this error envelope. HTTP 429 responses include Retry-After; respect it even when details is absent.
For SDK integrations, quote and confirmation require a durable
financeStore and explicit wallet access. Retain that store: FINANCE_QUOTE_NOT_FOUND or FINANCE_QUOTE_MISMATCH is a local recovery problem, not evidence that a server withdrawal failed. See the Node.js SDK and the installed @wurk/[email protected] README.