Skip to main content
type
enum<string>
required
Enum options: ACTIVITY_TYPE_SPARK_PREPARE_TRANSFER
timestampMs
string
required
Timestamp (in milliseconds) of the request, used to verify liveness of user requests.
organizationId
string
required
Unique identifier for a given Organization.
parameters
object
required

The parameters object containing the specific intent data for this activity.

A successful response returns the following fields:
activity
object
required
The activity object containing type, intent, and result
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>"
      }
    }
  }
}