Build a cancellation transaction
Builds an unsigned transaction that cancels a withdrawal request, for the customer's wallet to sign.
POST/
A solver queue request can be canceled only at expiredCancelable, because a solver may fulfill it until its deadline; before then the build returns 409 CONFLICT. An operator redemption that allows cancellation can be canceled while pending, which leaves the customer holding the intermediate token, not the original shares. Requires earn.manage. Cancellation stays available without production access and while Earn is disabled; a suspended organization still cannot authenticate.
Requires an API key with the earn.manage 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 cancellation for the customer's wallet to sign. A solver queue request becomes cancelable at expiredCancelable; an operator redemption that allows cancellation can be canceled while pending.
-
withdrawalRequestId·string· required · min length 1 · max length 128 · exampleearn_vault_withdrawal_request_3c905ad2-c92c-4258-9675-1899c41569b9 -
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 cancellation transaction-
data·object· required-
transaction·object· requiredA cancellation for the customer's wallet to sign.
-
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 -
withdrawalRequestId·string· required · exampleearn_vault_withdrawal_request_3c905ad2-c92c-4258-9675-1899c41569b9 -
action·string· required · alwayscancel -
mechanism·string· required · one ofsolverQueue,operatorRedemption -
requestAddress·string· requiredProvider request account address.
-
-
-
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.manageaction: 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.