Enum options:
ACTIVITY_TYPE_SPARK_PREPARE_TRANSFERTimestamp (in milliseconds) of the request, used to verify liveness of user requests.
Unique identifier for a given Organization.
The parameters object containing the specific intent data for this activity.
Show details
Show details
transfer field
Show details
Show details
Leaves being transferred.
Show item details
Show item details
Operators that will receive Feldman shares of the per-leaf tweak. Order must match the operators’ numeric IDs in the Spark operator config - share index is the 1-based position in this list.
Show item details
Show item details
The activity object containing type, intent, and result
Show activity details
Show activity details
curl --request POST \
--url https://api.turnkey.com/public/v1/submit/spark_prepare_transfer \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header "X-Stamp: <string> (see Authorizations)" \
--data '{
"type": "ACTIVITY_TYPE_SPARK_PREPARE_TRANSFER",
"timestampMs": "<string> (e.g. 1746736509954)",
"organizationId": "<string> (Your Organization ID)",
"parameters": {
"signWith": "<string>",
"transfer": {
"transferId": "<string>",
"leaves": [
{
"leafId": "<string>",
"oldLeafDerivation": {
"identity": "<object>",
"signingLeaf": {
"leafId": "<string>"
},
"deposit": "<object>",
"staticDeposit": {
"index": "<number>"
},
"htlcPreimage": "<object>"
},
"newLeafDerivation": {
"identity": "<object>",
"signingLeaf": {
"leafId": "<string>"
},
"deposit": "<object>",
"staticDeposit": {
"index": "<number>"
},
"htlcPreimage": "<object>"
},
"refundSignature": "<string>",
"directRefundSignature": "<string>",
"directFromCpfpRefundSignature": "<string>"
}
],
"threshold": "<number>",
"operatorRecipients": [
{
"operatorId": "<string>",
"encryptionPublicKey": "<string>"
}
],
"receiverPublicKey": "<string>"
}
}
}'
import { Turnkey } from "@turnkey/sdk-server";
const turnkeyClient = new Turnkey({
apiBaseUrl: "https://api.turnkey.com",
apiPublicKey: process.env.API_PUBLIC_KEY!,
apiPrivateKey: process.env.API_PRIVATE_KEY!,
defaultOrganizationId: process.env.ORGANIZATION_ID!,
});
const response = await turnkeyClient.apiClient().sparkPrepareTransfer({
signWith: "<string> (A Spark wallet account address identifying the wallet.)",
transfer: { // transfer field,
transferId: "<string> (Spark transfer identifier (UUID).)",
leaves: [{ // Leaves being transferred.,
leafId: "<string> (Leaf identifier (UUID).)",
oldLeafDerivation: { // oldLeafDerivation field,
identity: { /* object */ } // identity field,
signingLeaf: { // signingLeaf field,
leafId: "<string> (Unique identifier for the Spark signing leaf.)",
},
deposit: { /* object */ } // deposit field,
staticDeposit: { // staticDeposit field,
index: 0 // Index used to derive the static deposit key.,
},
htlcPreimage: { /* object */ } // htlcPreimage field,
},
newLeafDerivation: { // newLeafDerivation field,
identity: { /* object */ } // identity field,
signingLeaf: { // signingLeaf field,
leafId: "<string> (Unique identifier for the Spark signing leaf.)",
},
deposit: { /* object */ } // deposit field,
staticDeposit: { // staticDeposit field,
index: 0 // Index used to derive the static deposit key.,
},
htlcPreimage: { /* object */ } // htlcPreimage field,
},
refundSignature: "<string> (Client-produced CPFP refund signature (hex-encoded), passed through verbatim into the per-operator SendLeafKeyTweak. Empty omits the field from the operator package.)",
directRefundSignature: "<string> (Client-produced direct refund signature (hex-encoded). Passed through verbatim.)",
directFromCpfpRefundSignature: "<string> (Client-produced direct-from-CPFP refund signature (hex-encoded). Passed through verbatim.)",
}],
threshold: 0 // Feldman VSS threshold for reconstructing the per-leaf tweak scalar.,
operatorRecipients: [{ // Operators that will receive Feldman shares of the per-leaf tweak. Order must match the operators' numeric IDs in the Spark operator config - share index is the 1-based position in this list.,
operatorId: "<string> (Spark operator identifier (UUID).)",
encryptionPublicKey: "<string> (Operator's ECIES encryption pubkey (hex-encoded compressed secp256k1 point).)",
}],
receiverPublicKey: "<string> (Recipient's identity pubkey (hex-encoded compressed secp256k1 point). Each leaf's new_priv is ECIES-encrypted to this key and embedded in the per-operator package for claim-time delivery.)",
}
});
{
"activity": {
"id": "<activity-id>",
"status": "ACTIVITY_STATUS_COMPLETED",
"type": "ACTIVITY_TYPE_SPARK_PREPARE_TRANSFER",
"organizationId": "<organization-id>",
"timestampMs": "<timestamp> (e.g. 1746736509954)",
"result": {
"activity": {
"id": "<string>",
"organizationId": "<string>",
"status": "<string>",
"type": "<string>",
"intent": {
"sparkPrepareTransferIntent": {
"signWith": "<string>",
"transfer": {
"transferId": "<string>",
"leaves": [
{
"leafId": "<string>",
"oldLeafDerivation": {
"identity": "<object>",
"signingLeaf": {
"leafId": "<string>"
},
"deposit": "<object>",
"staticDeposit": {
"index": "<number>"
},
"htlcPreimage": "<object>"
},
"newLeafDerivation": {
"identity": "<object>",
"signingLeaf": {
"leafId": "<string>"
},
"deposit": "<object>",
"staticDeposit": {
"index": "<number>"
},
"htlcPreimage": "<object>"
},
"refundSignature": "<string>",
"directRefundSignature": "<string>",
"directFromCpfpRefundSignature": "<string>"
}
],
"threshold": "<number>",
"operatorRecipients": [
{
"operatorId": "<string>",
"encryptionPublicKey": "<string>"
}
],
"receiverPublicKey": "<string>"
}
}
},
"result": {
"sparkPrepareTransferResult": {
"operatorPackages": [
{
"operatorId": "<string>",
"encryptedPackage": "<string>"
}
],
"transferUserSignature": "<string>",
"newLeafPublicKeys": [
{
"leafId": "<string>",
"publicKey": "<string>"
}
]
}
},
"votes": "<array>",
"fingerprint": "<string>",
"canApprove": "<boolean>",
"canReject": "<boolean>",
"createdAt": "<string>",
"updatedAt": "<string>"
}
}
}
}