Build a withdrawal request transaction
Builds an unsigned withdrawal request transaction for a position, for the customer's wallet to sign.
POST/
A solver queue request escrows shares; an operator redemption converts shares into an intermediate token that the operator settles later. Neither transaction pays the customer. Save the withdrawalRequestId the submit returns and track the request until it is fulfilled, canceled, or failed.
Requires an API key with the earn.execute action.
Headers
-
x-project-id·string· min length 1 · exampleprj_exampleRequired for dashboard sessions. API keys use their assigned project.
Request body
application/json · required
Build a keyed asynchronous withdrawal request. A solver request escrows shares; an operator redemption converts them into the provider's intermediate token, or delegates intermediate the owner already holds. Neither action pays assets.
Any of:
-
object
-
positionId·string· required · min length 1 · max length 128 · exampleearn_position_2f8b6b04-7147-487e-b760-b1caa4fbcb8bThe position's ID, from the positions list or the deposit submit response.
-
shares·string· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example10Shares to place in the withdrawal request, in share units.
-
mechanism·string· alwayssolverQueueSelects the solver queue, which is also the default when omitted. Operator redemptions must set
mechanismexplicitly. -
discountBps·integer· required · min 0 · max 10000 · example25Discount offered to a solver, in basis points. It must stay inside the live queueAsset minimum and maximum.
-
deadlineSeconds·integer· required · greater than 0 · max 7776000 · example86400Solver window after maturity, in seconds. It must stay inside the live queueAsset minimum and maximum.
-
feePayer·string· min length 32 · max length 44 · pattern^[1-9A-HJ-NP-Za-km-z]{32,44}$· example3nMFwZXwY1s1M5s8vYAHqd4wGs4iSxXE4LRoUMMYqEgFPay for this transaction from a wallet your backend controls instead of the customer's. The named address becomes the fee payer: it pays the network fee, funds any share-account rent, and must sign alongside the customer. Co-sign on your backend before you submit. The build returns 400, naming the fee payer, when it cannot pay. Sending the customer's own address keeps the default: the customer pays and signs alone.
-
-
object
-
positionId·string· required · min length 1 · max length 128 · exampleearn_position_2f8b6b04-7147-487e-b760-b1caa4fbcb8bThe position's ID, from the positions list or the deposit submit response.
-
shares·string· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example10Shares to place in the withdrawal request, in share units.
-
mechanism·string· required · alwaysoperatorRedemptionSelects an operator redemption, which takes no solver discount or deadline.
-
feePayer·string· min length 32 · max length 44 · pattern^[1-9A-HJ-NP-Za-km-z]{32,44}$· example3nMFwZXwY1s1M5s8vYAHqd4wGs4iSxXE4LRoUMMYqEgFPay for this transaction from a wallet your backend controls instead of the customer's. The named address becomes the fee payer: it pays the network fee, funds any share-account rent, and must sign alongside the customer. Co-sign on your backend before you submit. The build returns 400, naming the fee payer, when it cannot pay. Sending the customer's own address keeps the default: the customer pays and signs alone.
-
-
object
-
positionId·string· required · min length 1 · max length 128 · exampleearn_position_2f8b6b04-7147-487e-b760-b1caa4fbcb8bThe position's ID, from the positions list or the deposit submit response.
-
intermediateAmount·string· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example2000Intermediate token the owner already holds outside any request (such as a cancelled request's wYLDS) to redeem at par, in that token's units. Send instead of
shares, never with it. -
mechanism·string· required · alwaysoperatorRedemptionSelects an operator redemption, which takes no solver discount or deadline.
-
feePayer·string· min length 32 · max length 44 · pattern^[1-9A-HJ-NP-Za-km-z]{32,44}$· example3nMFwZXwY1s1M5s8vYAHqd4wGs4iSxXE4LRoUMMYqEgFPay for this transaction from a wallet your backend controls instead of the customer's. The named address becomes the fee payer: it pays the network fee, funds any share-account rent, and must sign alongside the customer. Co-sign on your backend before you submit. The build returns 400, naming the fee payer, when it cannot pay. Sending the customer's own address keeps the default: the customer pays and signs alone.
-
Responses
-
200Unsigned withdrawal request transaction-
data·object· required-
transaction·object· requiredAny of:
-
mechanism: "solverQueue"
-
transactionId·string· required · exampleearn_external_wallet_transaction_e7a88258-1d19-48f3-8d0e-81fefa4bf3b3 -
transaction·string· requiredBase64 wire bytes of the unsigned transaction. Add every required signature without changing the message, then submit through SDP. The blockhash bounds when the network can first accept it; retain the original signed bytes for recovery.
-
lastValidBlockHeight·string· required · example361186610Last block height at which the network can first accept this transaction. This is a block height, not a slot or timestamp.
-
sponsored·boolean· required · examplefalseAlways false: SDP does not pay an external wallet's fees. The customer's wallet pays, or the
feePayeryou name. -
ownerAddress·string· required · example9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWMThe customer's wallet address.
-
feePayer·string· example3nMFwZXwY1s1M5s8vYAHqd4wGs4iSxXE4LRoUMMYqEgFThe
feePayeryour build request named. When present, the transaction needs the fee payer's signature as well as the customer's: co-sign on your backend before you submit, or the submit refuses it. When omitted, the customer signs alone and pays the fee. -
provider·string· required · examplekamino -
providerReference·string· required · example7uib8xGAwkaPz4ZGCA6t8sSEid5Yp9ty13PHUweTypxThe strategy's onchain address at the provider. It identifies the instrument; never send funds to it.
-
tokenMint·string· required · example4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU -
shareMint·string· required · examplehXm2xSRF5PLKGMrTvAWqKhR76MuJX5dAabeSChkjqu2 -
positionId·string· required · exampleearn_position_2f8b6b04-7147-487e-b760-b1caa4fbcb8b -
action·string· required · alwaysrequest -
mechanism·string· required · alwayssolverQueue -
requestAddress·string· requiredProvider request account address.
-
shares·string· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example25Positive decimal string with at least one non-zero digit; never a float.
-
assets·string· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example25Positive decimal string with at least one non-zero digit; never a float.
-
discountBps·integer· required · min 0 · max 10000 -
maturityTimestamp·string· required · pattern^\d+$ -
deadlineTimestamp·string· required · pattern^\d+$
-
-
mechanism: "operatorRedemption"
-
transactionId·string· required · exampleearn_external_wallet_transaction_e7a88258-1d19-48f3-8d0e-81fefa4bf3b3 -
transaction·string· requiredBase64 wire bytes of the unsigned transaction. Add every required signature without changing the message, then submit through SDP. The blockhash bounds when the network can first accept it; retain the original signed bytes for recovery.
-
lastValidBlockHeight·string· required · example361186610Last block height at which the network can first accept this transaction. This is a block height, not a slot or timestamp.
-
sponsored·boolean· required · examplefalseAlways false: SDP does not pay an external wallet's fees. The customer's wallet pays, or the
feePayeryou name. -
ownerAddress·string· required · example9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWMThe customer's wallet address.
-
feePayer·string· example3nMFwZXwY1s1M5s8vYAHqd4wGs4iSxXE4LRoUMMYqEgFThe
feePayeryour build request named. When present, the transaction needs the fee payer's signature as well as the customer's: co-sign on your backend before you submit, or the submit refuses it. When omitted, the customer signs alone and pays the fee. -
provider·string· required · examplekamino -
providerReference·string· required · example7uib8xGAwkaPz4ZGCA6t8sSEid5Yp9ty13PHUweTypxThe strategy's onchain address at the provider. It identifies the instrument; never send funds to it.
-
tokenMint·string· required · example4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU -
shareMint·string· required · examplehXm2xSRF5PLKGMrTvAWqKhR76MuJX5dAabeSChkjqu2 -
positionId·string· required · exampleearn_position_2f8b6b04-7147-487e-b760-b1caa4fbcb8b -
action·string· required · alwaysrequest -
mechanism·string· required · alwaysoperatorRedemption -
requestAddress·string· requiredProvider request account address.
-
shares·string· required · max length 128 · pattern^\d+(\.\d+)?$· example10Position shares the request burns, in share units; "0" when it redeems intermediate the owner already holds.
-
assets·string· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example25Positive decimal string with at least one non-zero digit; never a float.
-
intermediateMint·string· required · min length 32 · max length 44 · pattern^[1-9A-HJ-NP-Za-km-z]{32,44}$· example2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXoBase58 Solana mint address.
-
intermediateAmount·string· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example25Positive decimal string with at least one non-zero digit; never a float.
-
-
-
-
meta·object· requiredResponse metadata.
-
requestId·string· required · min length 1 · examplereq_exampleRequest identifier for tracing.
-
timestamp·string· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
-
-
400Bad Request-
error·object· requiredStandard error payload.
-
code·string· requiredMachine-readable error code.
-
message·string· requiredHuman-readable error message.
-
details·objectOptional error details for debugging.
*·any
-
-
meta·object-
requestId·string· min length 1 · examplereq_exampleRequest identifier for tracing.
-
-
-
401UnauthorizedSame fields as
400. -
403Forbidden. Requires theearn.executeaction: an API key must hold it (a module'smanageorexecutealso covers itsread), and a signed-in member's organization role must include it. Without it the error is INSUFFICIENT_PERMISSIONS anderror.details.actionnames the action. Any other 403 names its own reason.Same fields as
400. -
404Not FoundSame fields as
400. -
409ConflictSame fields as
400. -
429Too Many RequestsSame fields as
400. -
500Internal Server ErrorSame fields as
400. -
501The provider does not support this operation.-
error·object· requiredStandard error payload.
-
code·string· required -
message·string· requiredHuman-readable error message.
-
details·objectOptional error details for debugging.
*·any
-
-
meta·object-
requestId·string· min length 1 · examplereq_exampleRequest identifier for tracing.
-
-
-
503Service UnavailableSame fields as
400.