Submit a withdrawal request
Submits a withdrawal request transaction signed by the customer's wallet.
POST/
SDP checks every signature against the exact built message, records the request before broadcast, then sends it. Idempotency-Key is required: a retry with the same key returns the original request, and each built transaction can be submitted once. Reusing a key with a different body, or submitting one build under a second key, returns 409 CONFLICT. An expired build can still be submitted late. If its reservation was released or replaced, SDP accepts it only once the exact signed transaction is finalized as successful, so after a 409 CONFLICT retry the same bytes and key until that shows. A late operator redemption whose original cycle already closed is refused for operator reconciliation, so it cannot claim a newer request at the same address. A transaction that recovery finds finalized as failed returns 400 TRANSACTION_FAILED; build a new one. A recovery RPC outage returns 503 PROVIDER_UNAVAILABLE: retry the original bytes and key. An unresolved 16-signature history window returns 503 and needs support to reconcile. An expired operator redemption build whose creation history is unavailable also returns 503: keep and retry the original signed intent rather than signing a replacement.
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.
-
Idempotency-Key·string· required · pattern^[\x20-\x7e]{1,255}$· exampleidempotency_example_12345Idempotency key for safely retrying mutating requests. 1-255 printable ASCII characters; echoed back on the response.
Request body
application/json · required
Submit the signed bytes back. Requires the Idempotency-Key header; a retry with the same key resolves the original movement or withdrawal request instead of acting twice.
-
transactionId·string· required · min length 1 · max length 128 · exampleearn_external_wallet_transaction_e7a88258-1d19-48f3-8d0e-81fefa4bf3b3The built transaction being submitted; single-use.
-
signedTransaction·string· required · min length 1 · max length 1700 · pattern^[A-Za-z0-9+/]+={0,2}$· exampleAUyx/sEc49/1l6jxo3nbViPAIUqdrXCo8Qx5SfDvIbtUI0zex3Bi6Cyhhn1QTVU8zWDzXTRyIX2aCmq9v7yk5AOAAQABAvSV602SJ67iQCUGLwHzVtPnlMbZqL79wnV/nb+Mi9SJBUpTWpkpIQZNJOhxYNo4fHw1td28kruB5B+oQEEFRI0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAtzZHAtZXhhbXBsZQA=Base64 wire bytes of the signed transaction. They must be byte-for-byte the built message with only signatures added.
Responses
-
200The recorded withdrawal request-
data·object· required-
withdrawalRequest·object· requiredAny of:
-
mechanism: "solverQueue"
-
withdrawalRequestId·string· required · exampleearn_vault_withdrawal_request_3c905ad2-c92c-4258-9675-1899c41569b9 -
positionId·string· required · exampleearn_position_2f8b6b04-7147-487e-b760-b1caa4fbcb8b -
provider·string· required · exampleveda -
providerReference·string· requiredThe strategy's onchain address.
-
ownerAddress·string· required · example9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWMThe customer's wallet address.
-
requestAddress·string· requiredProvider request account address.
-
status·string· required · one ofcreating,pending,fulfillable,expiredCancelable,cancelling,fulfilled,cancelled,closedOrUnknown,failedThe request's status. Only
fulfilled,cancelledandfailedare final. Keep tracking every other status,closedOrUnknownincluded: SDP resolves it from a finalized close event. -
assetMint·string· required · min length 32 · max length 44 · pattern^[1-9A-HJ-NP-Za-km-z]{32,44}$· example2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXoBase58 Solana mint address.
-
shareMint·string· required · min length 32 · max length 44 · pattern^[1-9A-HJ-NP-Za-km-z]{32,44}$· example2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXoBase58 Solana mint 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.
-
quotedAssets·string· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example25Expected payout at request creation, in
assetMintunits. Not a settled amount. -
shareDecimals·integer· required · min 0 · max 38 -
assetDecimals·integer· required · min 0 · max 38 -
nonce·string | null· required -
creationTimestamp·string | null· required · pattern^\d+$ -
creationSignature·string | null· requiredThe request-creation transaction. Its confirmation does not prove a payout.
-
cancelSignature·string | null· requiredThe cancellation transaction, once one is submitted.
-
closingSignature·string | null· requiredProvider-authenticated fulfillment or cancellation transaction, when known.
-
assetsPaid·string | null· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example25The payout SDP observed at fulfillment, in
assetMintunits; null until then. -
failureReason·string | null· required -
fulfilledAt·string | null· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
cancelledAt·string | null· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
createdAt·string· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
updatedAt·string· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
replayed·boolean -
mechanism·string· required · alwayssolverQueue -
intermediateMint·any· required -
intermediateAmount·any· required -
discountBps·integer· required · min 0 · max 10000 -
maturityTimestamp·string· required · pattern^\d+$ -
deadlineTimestamp·string· required · pattern^\d+$
-
-
mechanism: "operatorRedemption"
-
withdrawalRequestId·string· required · exampleearn_vault_withdrawal_request_3c905ad2-c92c-4258-9675-1899c41569b9 -
positionId·string· required · exampleearn_position_2f8b6b04-7147-487e-b760-b1caa4fbcb8b -
provider·string· required · exampleveda -
providerReference·string· requiredThe strategy's onchain address.
-
ownerAddress·string· required · example9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWMThe customer's wallet address.
-
requestAddress·string· requiredProvider request account address.
-
status·string· required · one ofcreating,pending,fulfillable,expiredCancelable,cancelling,fulfilled,cancelled,closedOrUnknown,failedThe request's status. Only
fulfilled,cancelledandfailedare final. Keep tracking every other status,closedOrUnknownincluded: SDP resolves it from a finalized close event. -
assetMint·string· required · min length 32 · max length 44 · pattern^[1-9A-HJ-NP-Za-km-z]{32,44}$· example2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXoBase58 Solana mint address.
-
shareMint·string· required · min length 32 · max length 44 · pattern^[1-9A-HJ-NP-Za-km-z]{32,44}$· example2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXoBase58 Solana mint 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.
-
quotedAssets·string· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example25Expected payout at request creation, in
assetMintunits. Not a settled amount. -
shareDecimals·integer· required · min 0 · max 38 -
assetDecimals·integer· required · min 0 · max 38 -
nonce·string | null· required -
creationTimestamp·string | null· required · pattern^\d+$ -
creationSignature·string | null· requiredThe request-creation transaction. Its confirmation does not prove a payout.
-
cancelSignature·string | null· requiredThe cancellation transaction, once one is submitted.
-
closingSignature·string | null· requiredProvider-authenticated fulfillment or cancellation transaction, when known.
-
assetsPaid·string | null· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example25The payout SDP observed at fulfillment, in
assetMintunits; null until then. -
failureReason·string | null· required -
fulfilledAt·string | null· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
cancelledAt·string | null· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
createdAt·string· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
updatedAt·string· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
replayed·boolean -
mechanism·string· required · alwaysoperatorRedemption -
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.
-
discountBps·any· required -
maturityTimestamp·any· required -
deadlineTimestamp·any· required
-
-
-
-
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. -
503Service UnavailableSame fields as
400.