Submit a deposit
Submits a deposit transaction signed by the customer's wallet.
POST/
SDP checks that the signed bytes match the built transaction and that every required signature is valid (the customer's, plus your fee payer's when the build named one), records the movement, then broadcasts. Idempotency-Key is required: a retry with the same key returns the original movement with replayed: true, 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. Submit the original signed bytes even after the blockhash expires, since the wallet may already have broadcast them. After an uncertain response, retry with the same key and body, then read the movement; never replace a signed transaction whose outcome is unknown.
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 deposit-
data·object· required-
deposit·object· requiredOne recorded external-wallet vault movement.
-
settlementOutcome·string· one ofdelivered,cancelled -
movementId·string· required · exampleearn_movement_a6aed3f5-4f89-4dc6-9d4b-0864021bd80d -
positionId·string· required · exampleearn_position_2f8b6b04-7147-487e-b760-b1caa4fbcb8b -
provider·string· required · examplekamino -
providerReference·string· required · example7uib8xGAwkaPz4ZGCA6t8sSEid5Yp9ty13PHUweTypx -
direction·string· required · one ofdeposit,withdrawal -
status·string· required · one ofrequested,submitted,confirmed,finalized,failedThe movement's status.
requestedmeans SDP recorded the signed transaction but has not yet seen it on the network.confirmedis optimistic and can still be rolled back; onlyfinalizedandfailedare final. -
settlement·string· required · one ofatomic,provider_orderHow the movement settles.
atomiccompletes in one transaction, so you may show it as done atconfirmedwhile SDP tracks finality.provider_orderpays out later through the provider, so chain confirmation alone is not payout: the movement staysconfirmeduntil the provider completes it, and onlyfinalizedmeans it is done. -
signature·string· requiredThe transaction signature, for explorers.
-
ownerAddress·string· required · example9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWMThe customer's wallet address.
-
amount·string· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example25Requested quantity, denominated in
denomination. -
denomination·string· required · example4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDUToken mint for a deposit; share mint for a withdrawal.
-
tokenMint·string· required · example4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDUThe position's deposit-token mint. Show
tokenAmountin these units;amountanddenominationcarry the onchain quantity, which is shares on a withdrawal. -
tokenAmount·string | null· required · max length 128 · pattern^(?=.*[1-9])\d+(\.\d+)?$· example25Quantity in
tokenMintunits. Kamino deposits and all withdrawals require a finalized observation; null beforehand or when the actual debit/payout cannot be observed. Other deposits report their fixed input amount. -
failureReason·string | null· required -
createdAt·string· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
confirmedAt·string | null· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
settledAt·string | null· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
replayed·booleanTrue when the idempotency key already produced this movement and nothing was re-sent.
-
-
-
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.