Constructing Encrypted PII Messages for Exchanges via Fireblocks

🚧

Early Access feature

This feature is currently in Early Access. For more information about participating in Early Access, contact your Customer Success Manager.

Introduction

For institutions using Fireblocks to transact with major exchanges like Binance and Bitstamp, correctly constructing and transmitting Personally Identifiable Information (PII) is critical for ensuring regulatory compliance and the successful processing of transactions. Sending PII requires a robust security model that goes beyond standard transport-layer encryption.

This guide provides a practical, compliance-aware walkthrough for developers and compliance officers on how to structure the PII payload, handle the necessary encryption, and correctly format the transaction.extraParameters object in the Fireblocks API. It breaks down each field and explains the specific data requirements based on key global jurisdictions.

📘

Note for Compliance Officers

This document details the technical data structure for compliant PII transmission. The core obligation is to ensure your institution has a robust AML/CFT program that includes counterparty due diligence, risk-based transaction monitoring, and adherence to the specific data requirements of all relevant jurisdictions.


Core concept: End-to-end encryption of PII

It is critical to understand that you must never send raw, unencrypted PII in an API call. The piiData object detailed in this guide represents the plaintext data structure that must be encrypted before it is submitted to the Fireblocks API.

Fireblocks documentation indicates that PII encryption is a manual implementation step that developers must handle. This ensures a secure, end-to-end model where only the intended recipient (in this case, the specific exchange entity) can decrypt and access the sensitive user data.


Exchange PII data encryption guide (RSA-only model)

We only support RSA-only encryption for the transmission of PII data. Exchanges do not accept hybrid encryption (RSA + AES). Using hybrid encryption will result in failed Travel Rule submissions or empty compliance data.

RSA-only encryption model

This method encrypts the entire PII data payload directly with the recipient exchange's RSA public key:

  1. Direct RSA Encryption: Serialize the PII data to JSON and encrypt the whole payload using RSA-OAEP with SHA-256.
  2. Single Encrypted Blob: The result is a single base64-encoded string containing the encrypted PII data.
  3. Send in API Call: Pass this encrypted blob in the piiData field of the Fireblocks transaction request.

Production usage: Encryption & Transaction creation

In production, you must fetch the public key from Fireblocks before encrypting the PII data.

Example: RSA-only encryption utility

import * as forge from 'node-forge';

/**
* EXAMPLE: Encrypts each PII field individually using RSA-only encryption
*
* This is a simplified example showing how you could implement individual field encryption.
* Each developer should customize this approach based on their specific needs.
*
* @param piiData - PII data object to encrypt field by field
* @param publicKey - RSA public key in PEM format
* @returns Promise<any> - Data with each field encrypted individually
*/
export async function encryptPiiFieldsIndividually(piiData: any, publicKey: string): Promise<any> {
 /**
  * Implementation approach:
  * 1. Takes the original piiData object
  * 2. Recursively walks through each field
  * 3. Encrypts each string value separately using RSA encryptWithRSAOnly()
  * 4. Returns the same object structure but with encrypted values
  *
  * Note: This is an EXAMPLE implementation. Developers should customize
  * this logic based on their specific requirements and data structures.
  */
  // Simple recursive function to encrypt string values
 async function encryptPrimitives(obj: any): Promise<any> {
   // Encrypt all primitive values except null/undefined
   if (obj === null || obj === undefined) {
     return obj;
   }
  
   if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') {
     return await encryptWithRSAOnly(obj, publicKey);
   }
  
   if (Array.isArray(obj)) {
     return Promise.all(obj.map(item => encryptPrimitives(item)));
   }
  
   if (typeof obj === 'object') {
     const result: any = {};
     for (const [key, value] of Object.entries(obj)) {
       result[key] = await encryptPrimitives(value);
     }
     return result;
   }
  
   return obj;
 }

 const result = JSON.parse(JSON.stringify(piiData)); // Deep clone
  if (result.extraParameters?.piiData?.data) {
   result.extraParameters.piiData.data = await encryptStrings(result.extraParameters.piiData.data);
 } else {
   return await encryptStrings(result);
 }
  return result;
}

Example: Creating an exchange Fireblocks transaction with RSA-only encryption

import { FireblocksSDK } from "fireblocks-sdk";
import { encryptWithRSAOnly } from './encryptWithRSAOnly';
import { piiData } from './piiPayload';

const fireblocksSDK = new FireblocksSDK(privateKey, apiKey, baseUrl);

async function getExchangePublicKey() {
  try {
    const credentialsResponse = await fireblocksSDK.getExchangeAccountsCredentialsPublicKey({
      // Specify exchange exchange account ID
    });
    return credentialsResponse.publicKey;
  } catch (error) {
    console.error('Failed to get exchange public key:', error);
    throw error;
  }
}

async function createExchangeTransaction() {
  // 1. Get exchange's public key from Fireblocks
  const publicKey = await getExchangePublicKey();

  // 2. RSA-only encrypt each PII field individually
  const encryptedPiiData = await encryptPiiFieldsIndividually(piiData, publicKey);

  // 3. Build the Fireblocks transaction request
  const transactionRequest = {
    operation: "TRANSFER",
    source: { type: "VAULT_ACCOUNT", id: "1" },
    destination: { type: "EXCHANGE_ACCOUNT", id: "exchange_account_id" },
    amount: "100",
    assetId: "BTC",
    extraParameters: {
      piiData: encryptedPiiData
    }
  };

  // 4. Send the transaction
  const result = await fireblocksSDK.createTransaction(transactionRequest);
  console.log('Exchange transaction created:', result.id);
  return result;
}

createExchangeTransaction()
  .then(() => console.log("PII transaction sent successfully to exchange."))
  .catch(console.error);

Real-world PII data example 1: Binance compact French withdrawal scenario

This example illustrates a common real-world scenario where minimal required information is provided for a withdrawal.

  • Scenario: A user is making a withdrawal from their exchange account to another beneficiary, where the user is an individual located in France.
    • Transaction Type: Withdrawal
    • Jurisdiction: France (FR)
    • Relationship: ThirdParty
    • Entity: Individual

Example: Before encryption (Compact PII data)

{
  "extraParameters": {
    "piiData": {
      "type": "exchange-service-travel-rule",
      "typeVersion": "1.0.0",
      "data": {
        "beneficiary": {
          "participantRelationshipType": "ThirdParty",
          "entityType": "Individual",
          "names": [
            {
              "primaryName": "John",
              "nameType": "Latin",
              "secondaryName": "Doe"
            }
          ],
          "postalAddress": {
            "country": "BE"
          }
        },
        "beneficiaryVASP": {
          "vaspCode": "BINANCE"
        },
        "transactionData": {
          "withdraw": {
            "isAddressVerified": true
          }
        },
        "originatingVASP": {
          "vaspCountry": "FR"
        }
      }
    }
  }
}

Example: After encryption (Compact encrypted data)

{
  "extraParameters": {
    "piiData": {
      "type": "exchange-service-travel-rule",
      "typeVersion": "1.0.0",
      "data": {
        "beneficiary": {
          "participantRelationshipType": "DkGFzfPCLi3SNl6BrrS1C4X/DmuqfVvU83iczY+pDgamI3FUTmzghoGvtjERSH6uqKo3h9gwAWQN8mYV7PGdgkV7cnSS6/H4CNJWV7BlN63RU7DmsmVdHoGbA0F7GnriQvKlnTFPU/CCXJDcsaXG7cHa5VtST8rw+acw73fnUpwUnGMLnw0QOUoYrvu6eGo+BX1aZu+Ve0hrhJTcYXXfnvekkXWCLxDu8AYltJSy4YgzsFNvHb3JyOOuPvJg3qka2NfVrzRXv+7pQy6c4eyErfBJZ6T8i/WXsu9gVZXuOC24wtZi99pP2XGz9ogW2hv9edmEUTitZXneWm26sbtwN9jBPVh4ZRLfGg9wxV1fN/g6MPVbil7Ilu6olO9gRlPj2GUyFIfNPFAziqGEw7CEFvPlQuLv5n2/Pbh98jS/sGANwjKZhXBKyy79WLs/HDVZw6E99+Vxf786HdmIc4MEyj+AELhqcdp8uF0D1/xA+hDFiDpcZjV3JASX9b8EPOaxix9P7TdPepoFoZo4fJFQtaXvAunnsYiG2bE/NareEjLZvqcHadeaCdy29sXCmxeaj1v5hL5GZJFFkBEUa9QLcle0YXQQa3ukkc1W0tChIeGwSEY/qNW/FZ5jg3Pqm8gpdwGzd0gZk/JO8YDIthtTRdgm7zjydIxVZGChTO/h4WM=",
          "entityType": "CvnHs/CzrfdTpGukJXmJH+88n2cW9C0Ezc6HtJtDzN6+e7dk+GoGrK/ia9Kptncrh7Q+6AVHR3pmrJFH10Y8kwxLoNOmJkPtNDJLoVPDSxAn4So7Jw0mA+OGXu8J1e/b1v9u4g3/2L5373MURnsrMydU0vt77YaBZgmZo0dtukLE4kGTnW2lUKexdeRs6NR99r+VQNYG38XGi2/OAjwvBPIAxfmaXBoNMCVda0JZkjlweezwIGL8theV+RMPtQBm8mUsBpbcIiBLAFA4/pQgCKVHZuUMkfaSXh6zPBga6hQu4N0fhLxTj1VwW1Mocd373ifUAn5mziMB4tunObI6jy91s0zunmIajZeHqxIvxci1sMEI6RXnuzKfbkadUzM9cyUMjnzkrQk5q5VuurxfZRqFHuw9Ikq8dNUavAetwgJipUi2aTVh0+uVgZ84QKusJ08LqD3N4k6eghZwIDUkCFXNZnK1reK+oIqGcbs8y0r+Vmr1zh5GukA55+yqRJXu/YxAlS3HIwp+HnhSvM8Wz1O5/PgCHm2iRcP3+pCYWJltkPoKPzynurAN6I1tGSak7+AiPwiJsd5sqdNylR5eFR4N28U61vYhk4nebsvvI5J+7M9+f25hs4hDloV+bmj0wzN3QnCRS3RyaPg91fdCo2iTR5PTuLvjVJ0GX/h1674=",
          "names": [
            {
              "primaryName": "SpDXvmGFXH3qe0jAVZeinBniH18VBPsAqnLz+SxidNd9Hh6XKbs10cHMPoda4Yga3dDLXSZTRMb9hJPbsYlanFgWpcIW6rq4KGeK/Q9LiN1gVSGwZrXMD2Jx/3+hPVcSUqYqGiirZpoeQqJUTzmJvglRCWDDNbE88jFcQ+XEvj0v9tC1rrHrxrowe1QaxFeOt8HMl2PjGVzUGCD9QdRsG0DbBa4To49EsvXl6qCMr11pioCWzAVgYxRJU5HlfikbsU00dxXTVVaHAFGfGgeTSBBVpNLTvUuk7Q4CW4TIa9PiDYiZsT9KW3X0tjXLs0xflrUXMXUWDC3bVfEMcFtM75YyOFrMY4IhGfyND6o+4MyeqC7LmYc09o9wmheiRS/l3J77SNc8w7tlqoSgvVVb45TDpBtf611SQ8GnCQ9rTg9rKROwPXA58micxFKrgVVYfY+E0uo90kzs/Hfw0OohrC/3vS6d3ocXAEp8FEtmCvyRxK+xgTv3obIzL6eVqI2TBDkkyjT3gGBrbS0a8GPZSKUw9W0cNnYjxZ/rxF1xBUG1gg+cE7St2yNwQ9m3gcneoB8U3AA5y/f5Zw7iz5ekAmMdrUFWf5ENNodNNv66KVNQLwpSIWeHiVkr5mqEIooAJDaFDaYKw6A2GRJzU+ZQ7ca3rOumleUq6kXfQcCmpr4=",
              "nameType": "UFvT9EbXqfGJGH3UPsXtRbwyi9VDb3JgEyGXDM6x4Pkk/R8nlfEVnKFSmt0LSU1Vnzl/k8pjMsLcap33RDENMWTRAfjasnqDK7uZCNO8m37SBZiTLmTYrX3k5V4hF0p6SQqvltPV4cye4AwALxZKtc95jzsfJUxgylaXbmuR8+W8RoHZrhid4YCFmarpC8xCz0fcrWrbRtfV/wuv4wHotkX7SQJj0pf31xsRjfDYIV6Fo0tlnhI1JTdVh+ztE9e76OcRdlpM2Fk7UM42+CXUSvvO3iP4E1ot5K7O+u+3a8pcVWNbAIycLlz79fz2LFXiQ7jc63Yg/sG/P2yQqk/ivDT/ZWjSoCNlB8oi7VDpL2ir0Xwh1+D6I9n6f1G4jc0Fkqr0DP00P93jpmBQzqPi2V7TBrnIwxPnQeEzj1SXE0ENMbj2P/PGeinGW34h6/0WFKyyOubMqLnvG5lPUusFPA7NFY7NdS/1OAU/y4J52R9YFWkW9o2jdn9G3iLbjNKx8g0yRbnT0sTXql9E+VCv2HPYS1Wuoqo/S1LhG6j0y9ugUCS1+advbxHm0/4ZD5zJ4+5FHIlH8s5+CJ7/FGFsRRN/R2jAW9GSqdzczzYm4X24l8cn4xHRWR2XO0jqlYmoH8sBMrZVgfvJnDy4KotlthZT5ooIOQJY+58x6gXnUL0=",
              "secondaryName": "KjXjKySekOb13IvuP4ainsMzGCmxK9CUeVI6VMLp3MYxz1zFbZBq95v8Ly5TBoH+RL176yioR5o4l0NHEgL8+vjjSeau/o9cHRZK16VjrGmF2MmpuFeD4NPN9IAsD8M+xeq2X06EK5ns9ebuGCADAiEGIEbBfnjZcJpUhnlllTptbuzBoeaK/k1545XMA30f6SuR+6hGxDBX6rX+vYJOvEBhSfK9km1mJ2y89it38QY2eRcDD8Li4nuLPaKrqzWGcN+Lp8KrII604D9ewUj/a9LfefrZBB5H+gL0XI2h7rVfiYNBJghXakfunS595nBNTjbxz5spuDxE7k0EqhW6t2N70FzyNVUjmxo0nFCSRViONXuiyhddZfRcIeTXJf1hXp0/cujqvOkbdrl2yPXl2pZ0/XZaCHfx76unLaLHUcFKCVpib5FXi5i7C6Gd+8QuBliUiUAdWUJGpcqQLkz7/zALdZLqISZ5WLyKENIt/Rdo/GzQ35CZVCe9TtIIIEHq0wmMArCB73KFzMrrJStefPA4tNtbWM4iwPmahoSWFYl96pIclGNdRdFNTF1jM4VgfboB27YG/6YFJMcWYJvXR5gkbeYUgRRe/q/B7iFvGKdNIrCe34iCGEZ8/hNs+ljBFmcxEbOiFjoAg3sOe3WKnpLaI5jaFyel4Jar7XkKAxg="
            }
          ],
          "postalAddress": {
            "country": "o9MZlFzz76bKfw3giyekwbhpZo3Nn1+o/NTzFQnSWaozIKa9xoAiOE8IvmU9tkT3yZLYOeaX6F6Am2hyzpers9lMHr2Ha1pOFnreQUKE9x2fEFZyAXv625Hz8Ja+ZeywlkbAok1atpc7+JC8GD7quErQwC/qgZ8yzW926JyQ38sZPHY+W0IM2sc7S0KoL77Yu5+gixQPbiUdMfYjimuRRwW+4NzsSOWUcZdQ+NB/khz/7CDc9q6tqYFuHg17sFo6QO2rQSpcgfzDrqmdCX0ZnSRBf5FZG2I0tHA2t24UuRJJGNIU66jr9b4h2pJFWpE+UwSmx8skyI+0DCk4P8gxhS6ZhQ93TGpSgpI5rWW7pJLLzlmEeVF5bm7zYQg2eu0HTUi3DEyUHfW0g/LpGEfLCudwSXRjGUUXI7tSV6BxC4EY7T5pt6RkNrnTdjSo8B4azdv06BqVjYzeJFwXL7Zo4khoaQETQf3PiTlwMQw/WQox/65IfpKfM1KhHtPFCiG1v358q2FO/S0yV6hcKNVRNfrZXG5v32DDZ8S/K8Cs0+XBEBl8OxHo581uahVKONzb2VwBGTxcXouWHVLEq928wDKnhAPvUmFMkHtkpmdSxOWr0qoMUD9WQFvkYqm9RXeczoN/RTsAqMSr1InoqfmqU9TZBCdjiMDnhe4ggAvFKkU="
          }
        },
        "beneficiaryVASP": {
          "vaspCode": "VTiePIZHqIn6q17/SWZ8fdpWga72UvaVjvwBs2PQ/R5DyN6GwDOC6msAFr3+1h/14PwFfawmWXpWu6xmKm7iyUHpMmmnnPlUKSjlNeb+k2QVTHPXYT6eboT3V8gav47mIBfv+XMm2AtXfLRGpWF5or6Q929QqxXgOOl89xwdYxRFnboSB/T9coZ2lonf15F/n+8XEMmE/g77iGwlY5pIi7VmAhi0MIJthRgxIXbuB5yzL1MtaPQr5a4tTY9J0WR6MlMjkeGODV0VyVX90aajDgTv4ocB0TLwGkC4GRTLBsdyGD3jkpp0Lion5ip+BT0MhYg2xvshef/GJ4cob2bZy+10GAdWUbid2n66HQUJjIyPuPtAZLzf/hZiL5dsgykRz/FpT291eoTeQ0V6RIYLBGSqSPkc+n56Pqum0c47Oan5078R9/k5YLpTX9DD464m5pHSPPh/sg5TeBydd31bHJy0EfwGMJPCK4yjaTlK2At6vLzhJ+BZ6au8oWoDvbCbS2bh1jJh5x/V/4HAkv/h7woGb3OY+z/GazfFEhCBAC4WdvGExHqbQhbhcOlbZr3Wt6b3Vx1U06u+acwLUwt3P9yuufAvQkjxYp60nSKKJxjj0Vnk/Qjf1vCXab8y7siEXthVO1MqTsozGtgCqzHw8aNtg7rEAykSd8AHyyjRqz8="
        },
        "transactionData": {
          "withdraw": {
            "isAddressVerified": "g6y8yN5t+5GrJfFkhqrOz5dfJjTRiIO2qYH+OXsRNaTrtoJjPwda7OOnAmuSp2yBdRFTPKxgcWzBo5fofQvOyl64RdrWmtKFkWBDAtJUzoIE5s6yk5qp+wi5+gNdo4bHmrKaJXaOsaKrO+o+kfg0ySt8K1qrsZK7AFa+yqwabUmiDwRdElromyDpACv2n2ol/1W2Oh87nAHIW8fUWsEiuI8nM83X5Do6ZlsUGjTXRhIVVuu4Yd9Jkeld1OSe2iSETFb2XEy0ml5viU5H31AJ1RQaNCvBVpzu/1fe6YgB05MQjTiL01/kn2cT3PlZ5WaKZxXQuuoNAR0y5eeJPiwfdBCCrL7Z8KJpsCRspRBXxXoUFkN56XUfBHaRwoeA4flSLfpmfKYSNcATUr13sd/fH7n6wk6mU8Zl0CJJkoWQaUCk0cM54wxWGeRtgSqPAteBsAw2olBpRrK5fIvi5YWd7ez88CtlIZwfsAI7WaMtZMTTlC8E9BdRhJVjX4neadpVfNYoiVPLiEzfo9gK5jqyeuFgYG1fAhWYvKVk+rw2Csn5iqO/AXhkEQht1riw4BnrfymFGJY8+9hrz+KTUZndG1Xw5GbFlEuitqg9yRGCUdhJVALoSeJ71YCMFIWPoq/3IRogFTqEBtzkP4N9ohUBlZVxPXZhZFc+Axe6SsaH+Wo="
          }
        },
        "originatingVASP": {
          "vaspCountry": "ppyFQ37QrH2GUityQet2+PMZdkqbgxv3tM7hiokv0TLUjZikj6TT/8jaDXumx2itIDKYr+N7zhvPtM9cm9mMWTjo2D7m3LOPNXu0uRPOCNWOQAACOlx21rC5Sc+yUazLq7e8kyi2wlF3ngH9DIjlVeQ6aGZk5q6HEWm4pvuqOaLA6h4qLsLB5VLg4ygEOw0Lqmc04Y5pKRkrB8f4MrAQtzUjwaQabUXheeAncakIKlRGYfOWYnyqKjJ+X7WD2dK95nNHahORltLeZkPVpHz7ERNqlDtRWlplbBT08PZ0pv3IVWxkFDPc1UB5NVGl0PhkdLSmCLvQe8DwmeBMZzC8o0Ks+vLlmJZbcbjYFmosaH5ZlbJh01Azs1xLaYqhNF/NwFSbYqL5vm7GsKS6wXgKCDJkikyIXG1UavKhL2HdrOIXOv07E/ox0pH7Sn8rs3p6aVM5s0fQKV5nRaM9s5ixbC3VAX5uVKG0mBSu9G//Q/RrjUXCdcaKD4lKw9hzmX1linKJCnCjEjwaDpRtPXledumNFt7CWn+dcvjG7xhOro/EeTpTcT1IqcPw+D0NnZLddNyx/xrJC5YMU3yZ7tKHLsvVZyotC6UTTjBQJUCLt0rpEvd7stZtpp/Nn5i1KeSwYbXIaEMthNZQaO63gMi8od/R0LCcYeEHInZ5qYhD1n0="
        }
      }
    }
  }
}

Real-world PII data example 2: Bitstamp compact deposit scenario

This example demonstrates a common real-world scenario where minimal required information is provided for a withdrawal.

  • Scenario: A user is making a withdrawal from their exchange account to another beneficiary, where the user is an individual located in France.
    • Transaction Type: Deposit
    • Relationship: ThirdParty
    • Entity: Individual

Example: Before encryption (Compact PII data)

{
  "piiData": {
    "type": "exchange-service-travel-rule",
    "typeVersion": "1.0.0",
    "data": {
      "originator": {
        "participantRelationshipType": "ThirdParty",
        "entityType": "Individual",
        "names": [
          {
            "primaryName": "John",
            "nameType": "Latin",
            "secondaryName": "Doe"
          }
        ],
        "dateOfBirth": "1.1.2000.",
        "postalAddress": {
          "streetName": "Oak street",
          "buildingNumber": "23",
          "city": "Boston",
          "postalCode": "02108",
          "country": "US"
        }
      },
      "originatorVASP": {
        "vaspCode": "9bfe73a6-d38e-4d14-8089-8d5a06ac7ec0"
      }
    }
  }
}

Example: After encryption (Compact encrypted data)

{
  "piiData": {
    "type": "exchange-service-travel-rule",
    "typeVersion": "1.0.0",
    "data": {
      "originator": {
        "participantRelationshipType": "UIQ+McWqzwP0DFpWd2Sm3vfduvK6N/S6lWlihgoGTE0AkBGbmqkMzgsES6rqOl5fcliHVYOh/9CdTn3tNCQXKr8yCGnBiiY9rF9ANSECbmJkm5b0h1i1Amdqna3il995Q0Lit2Zq2an5SP0vglj/3fd5F9BRehQOoBhW9+p5gYWxB3ICukdVHO0L+YLtzrR3nY0L8LESmipZ95wmJii9puiULgeEV8Xe58MyK/DHHuerzjlpvA2T18qp/p/y0aHnSFuWlGQum0BhWZ3xIOb8g/pwHszYaBzSo2tfOYg8Gc10/7emg98mlLybVdKtioKu2Jsdjj0v6BHzlp8O05UmGXecpWc0LWRCUENOV4ui+YF9dBMY/MArJNVd5E5eIuT7VmayQ7eEpsyX/ymJCPLwDUFnL9Ibl0SW4/Y17Nmz+jjTrWqXroyUgqTuYFZZNf6IRHx89/Jr7d5LlfFRHzwgDiolPRM6gfC8/5hgc1JZzk9kh1ym75SRgIVnGKADwCz8rtwfxMRIK+X91l7bn5nNb19oEoiX8hfQi+o2VSX1gUhIZQjyPz4FFdfDsyF90WQdZrCxn8irf9fNrstxQZcJicYTXnxvSFMHnqWF8P459qatcTAWpujsQnHAaXPa5Oc/fMX3Sst/t4f/onKAa/s/t0sfOwlaaGFHwMZpBgUMeDI=",
        "entityType": "c1WbvG7ievrsGv06wb7dghictBBkSJv5E76e+mXeUeO6NXOZuTzL1PiJoqUAM0h9o2fup01V+uIQWqavYmPbiooFofAGaLNhKC1kK4I39xuG7w9hEYQwh5+5J0J6yLOkVe5+pJD1d56fuV6RW7kikIpcTmINSwBMMNVfdhcFei4paBxNLuICMafMM1YzHHxa844qDpP0L0YYSz3rfJQ8Fj6UFGsg+EXqMwxSSWD9tOO8w5yfzc264BndN8byU0c7cXJtgRTkTXppCcMJtXzvRRYCQ/1mYNqcaOOgXlv4XkUfe2+/+PhSzMw7mI2rhkMwxLOpchiNDmhtglvK7kVW+3jbebzvgfhPyVWcjVweWjtgWAznfhX62U8mWWfLWMhJX++8IInh5bZfdnBAzp6hRDK7u1cxRUeBwMvdvy1rPXmUnNpsgLEXwb1WNGH3MhCbDKSo4e0J0E9/SooV4ZZJDaMcpF48rEfBy5I1GEBGzZcJBuOO1FkwqUH8Y160+1FPMe/vdy9Lee7C0r7u2ztQmU4z5m07k30mizQJly3u8bEAVpktoGuc9ujpYG35K15gybOCb7ll6+5Lzl5n4YKqM1Gfk8GSRdNlxD1MaVgKtwajIvpWTSZn416znBQWcEW1Tnezf15c5G9OM/B7LKiDhJ9OMI1fYZvGFf3Nk6A27oY=",
        "names": [
          {
            "primaryName": "JnR/jKh5u+x1BTUT5j/H6S83firFCO7gYEfVe+BBA0K7Ng3KoPA54VUt/6oXAoXQP0JZIeli3sffmnPB74XC99OTjbSyEFm2V2hGff3rAJAJ9b15PhFSDS0AbQKAV+BZeucy/nl5gOyh7mo/eEqSzEjfclj1zAYQsfDbuiMATl85vgsFqb4Nt+EwmmyiWPcUUXmsFg/eHJsNi/F0U3jsyGhD3djcloJF88GKV8dfF2XteQYMkegbLlBLPwXx5Ey+9v1fsx9FcB6oN8eu4yMISuxF86KPXMHgX59ZD2Rgd218d2gx3Fdnm0AeHq0+Sc5tJ+/URRYvMhF59+ubnIb3cIqOyslkLAngYtwK3M6aUAxpTs6tIbrBDd1QMFZDLugHgwXaTV1tRxY7bCM75VUmi0TIJnF3T5kgPtEAaiia1VbH+amxYHk7q7V1jVeevJv+TpwSZ4eiBBpx6pZEVP4iHgTnqFHgzjtX9MdQaG76LEED6HQjeIs3ikFNrpxn1YZMkaTFnuP5NiUELN823gSYVtIyUC/Z4gjxRD3X+tOrGcUq+ntYP9zj7ievPsc4JGHHF3H/tfFqbC2xHLD4cTkeLanOgpGkJkAX39EUqmxwmmyp2JRPXcly0PE++RRY6TjvX6JCbeFRrr4ycFq6sIT0p3LdfNqAjm0gyqqBwnYgEXY=",
            "nameType": "AUZXCG+yLWovnc574QwAsz3g0Yb0TnH5C41oODS2J0buSDBrdjXWoyCH3L5a+43lWBGKjqDEO5IlbNpffwRXN2yoLG6KS4z2amFDzt8wKmq5WBqZRC6RcM5AVWsqDRv+HT/44CmIXJlHDKZC3h1AGPQ0Efh6YbhTpdtIxXddzFi+PlhApnkXtyUa7KhWQQ+kQ4H+WifDFu2oSJ/2CXkpT76Sbj6O3glrBa7JRg0lIRNgV8+Xcph/8Ws3mTthkYYgac15YzO023qf3aU1N8BOyEwQuyyZUc64BTzK242uv3c170hSU2DSLAgDEJ8F4UW1w9zTp+DW/uSe7oe8l/rUSN/58QFYK+MAPAdGVA44j++sF8IuzImbXXI6ku/t8XXUFr/ToD7Vf5wgKRbujwEbiXNnGDyVDwiQWQaP20lKlhJjeYijEnWbUHslIiY4KSUQv5XYYnc7tWSt1Iy7D8XPtvO1Vp0Hg2hOGSqlwGHIN5DQY9h1QAAguSBsWf34f7J+PnSUI8mK3itmgx46/OGrYwuKwAeM15eL/afLItPJyqtvu/zAtOgo90MwK+/z2b8VJFzxyt0e1tr8c1XqfX+9y4Ohp4AMrvgaWKaNfdqVbWUjMVndWbh9SYABGyh2jC+azjlkxG3G/M8ncj9EVYs+NFCjFj878QZCovF0S409zek=",
            "secondaryName": "SJUSYKA5w5XAeS0Oz/wmhMsGqvZ2J94iJ7jXUC2BIbf+1rtzlD5B4x77fxWXGh96dDgQ6Cr+COVz7ebvSStefJDRbu65jFDcQRC0y6cnfaeU9DrERrmcbobA1LWm0/xkGhYQIEZnGaxoxYZOn8r65PD4l7Mua7g4low3lhjBGkzsNbtrp5zlGoh8QhYXpzpj0Z7oMGEcCmesx0Tq/lb4Mp7Uhc+4/njT0rFk5Ogw9G0y8VD3UEFSxhThwT8FnKwdksyNHDuTm+sJ17ozd2dN47mka8tSMEp7NWayT5rTj5CMM+P8MOV3D1EEODOaBMo6XULCsApgzDOdtXDnjCMwWJqNzYNts16fqWktzpBy6Z8iB+IDPqMbpoE1GPLSvd6RIgcjocp8uJ0wWOXxVNXV1pH0I5jOPEcM/4Q3LA/kH/3Stjdvbyx7alYkRP4shuUP9ZWUdAPwAklRrtgdSaItOhm9wuuRzTzIu8OlFBsfd53kpiYKZN3FrzeQ/XeQNwvqj5yTH7BSadyG89vXyt/JObPjK87VtY2Tk8EWOnRtCIoZ8YQXnONMaYheJgje26i/ZYI1jUTneL7OgBwkePzRBgRgsISQ7NVgIqbZInEmLuaH7dpUT5pyAB4lFQD70vR79R5+S3iEx4UbcN9CtPYlmLVXw8SsuMQ4z1SI4zIm258="
          }
        ],
        "dateOfBirth": "rvku0/k2oXk51TcqHmWJRXGNtdEtU0ruluSIOj0XytFfuQPRUomhekaGJtm2GSR9WgEa+KS4hrwtZ+87TgL45tIvEXkANurXFtIaI2thsiSfWDGqCHaFi5n/cLCUesnThU8GGvgrzlucZIWH6eQMkbVSn3HVZmuUbIDMbfieL4NI1l+T63Q6vbxRtMzfzJMDI3hiRn+7LS5BG0uLNsJ7r2cc2NR5hFht6nfKKiLn2SIL+ndoWYzVKy7vDEeNT6frbMeICCGdJVSxX+vLdhSAx29qYlQ+75iPJ4bMi5PPuJd7yp8l/14AUbYkBqjC+9tTu2zEKH0UPm1IqxHdpMpN+OJ05J+9tMOL3S/jRahqk45P/0rDuWBkyvRRsANw6Ajn/rIplw05QJA1H4k/wbT0gYU6iVF7chXA7xFS2897TtSISsKzHy3ux9sFRbeyWs2jTicuNNllECYtgs98LrAbKEewFyJ4r3vNJdNOirte1xAIUD8/BAYGKUb+74f/Yb32DlgOe8+emGtrTQZbyzqjNrnXVulONXaS0DQJ6wRMMtyOwothBZg49Jw9hjqQPMpNRU4Icpd05mmMkKkJJ8uEuDUWA5CZYHrsmYTTysxdrYUDa+BNwgL7V3zp9geZHbdoEyaPGTSFNQKiC/WL5NC4O9r+sM55QHRBRoc63+zt58U=",
        "postalAddress": {
          "streetName": "HILYP3i4FW252ELMopPjbC9t2U91+cXyfCCsaJwHkx01L/qlL8UX+h8YAuY0zsW8WEv7H9h0ZRDKqDZRdQ5zeL9hLgQUnWNoSi3ACIQR1qsa7oMoVNfhWn0tgTSKYuvkWYIuSGV5J4vwBJysNXPbtzft4bBxR2VW+nP0kxiDqslkF1mxa5phy1uoJZHauTAZIxpoatFmBTAEldSpa5IxoVrWQj4fYjQiYPAjAF46ssLVQZwK2EGnexFlc6oH2XAZtTw38XthOt7aWpPrJpLFl7iQgpVPhALfINQwgff6Y3o3XQhY2Jr/IW6P11mOUd/FrpjIo8jwrnk/5i2S52z2fotgXS7mjinm6HvqCDaUCujX+3Bo967wmm1ENAaH5Bg3OssCA+k/VXI7o7fAQ7fLUfnZcLxxKR/8108DN+Q1UrULeyk5f2IA+xTztxQHbnUCRMYfJO3nP91odKF3xkBnms/OVlNBcTRB4dBr8I0CdmmKv/3/4WU1BoHnlwMN29bPagXAVp2mHcj+J2HSoN3viC/Om0QITmD2hToX1smpBg1UQYTX3URu6uJEWiUqQZft4q9DSMgyXT6/rBskpTPGuWR1J+ULWXF2Id1ULzrRgPuszxx+a4SK8iXtWFeMGh+Y3o3SDoqXyVcigqDYJpIzuomJzVgzowrUBbwdmL3sFAM=",
          "buildingNumber": "flSWDJwwX8yDTOYbG0+D7PNQQm84plW7n12yP1gTVTL0dNt5DlWqgGCs8fXfVKH1uqCc73s7jqmX+uMej0Grb7Cm33fp330+113OnjZUnCxLRI2jXls6PFBKO/poRMyUQql/waDIfnM4bJ230cu26Ki5B0D0mDrMEkb9IIkILp+7E4lkttWmZDAez/CG4eO3PJ8NiYr15YAm4O5VCJYbgHLSHC/11+pOiinMHzySrTrDM6D/gmZ1TnqD51Y9CbgS6VWIlwOOjwSGpUEc4rUXDTedoYxr440KYLdbDpl4mBB0Fckz+UuyRxoTzyfOBYcWMdBYIm8EeMq3g2aQFfP8u326v1vmVIrKG4m+dITy/H8XZ7GJVpVm95NAtblRxQPNXSIieSQZyuKP4WHU3XlaSvP9GK519mNHPAsApOZpLLH+RPnqnCXMGcr/ZQ5tvRQWvOkO5N4HQjeVUHvrCZ5lJo8aYXFN0qKMi2T/icCm58YPHGEKj7gQM18ZtYh5SJCH+VAVbBt2c+49sCKX+A8BLeVEvfYkgIF8qCNQlal/6+LSMmMzv0MO/751CpnqpGLvEsqfx9/lgaSvxZ3RSJ2Ac1faBMAhiKP8DMoLeTNm4ooKjFBRzoP69JUPeKPZ+N7TvhoyJgL7Z/6HQ+Hs2dwsTW6W/tBwpRyxvBOjOJgwey4=",
          "city": "W8NUxiw2sMgIR5tCM75oTyaI//HTejVm/ZtYf8eec15C9J4TrUSqKKZ9By9A44nMLTQEkwF6uGNS1msS24fq48I6X2dV219icb1WR/r/+wW8HAFi0qjofqYV4hslIhF3lfVLP4R79i9uDYwMhLYcRxMFCXDMTe6zEg0b+qav/7y/6XS6DzUeHUpZhnDjQ65kNpQoAyNiw+1vXaqZCJf+fIlbSDxLGaLAZe5ue26wishv3rmqQdrALmdz5VlMG5tDrz3FakK/vup4SMMsKJHYmFCQnq+3lssB8gHsf/6swa/FMTKVEY6dOTeelcQzawfUu7O/Q1Rkb7O0ht8LquyxNgXIt2MSn3hvEucI5w/e1ZSLkf/mI+RmTsqAccR18mQRL4KAlgYtkWWBAr240k1svWfsG1F2BxcvLaqZiGOY99mjLjY3zkTWDyKHJOb5+DvdedyVaJkIoFAnuCL/iAP3U7vrmYnuFCmnlu2TsqWp2UDD59VhDo8xMl8sAuiqrRZnUDMrqMKOOAvHOvJUKWDG7iV7u8RnYO3vqMLCsIx7bVzpYs8pydCUaNesVrZYOkUGiUoCGcSQyy5O5XcfBzqo1UEY9lfkEvYDKIOOjpt4xZCc62faJv3NH0g+4w+4Fjzyozks+PgjyA0roqp+iaVSRSGeg6x/YDuvkY9W/yaOHGg=",
          "postalCode": "jycssk3S7asgoMs2mqT9HDTGQjcbEbnKWF5OFMbekXIjG98dexKySSzODLTYBfAbGcWTpA3oH+PxUzHeyZY8NJ6RNhvHjhmacsoDp+Yt9aHl9htJfwDHvkpB42sJb90suPZ3gJIOOLs2Ac1oesjKv7pdotqMZ+3YAT0xunzSAFNGrU00WW9jSZ7qavzq84QzrkhjrnlxvrKaon4C/D136kxNopcorrF3SYxRG+bD3pFbEahfnDl5pW8+uZelUIdqn95iDHWgy3Wtkh6T1jIi21rBItZ9sXmfas7x4Lp81Pw/0sid817y11pydGlK3k9rbbxPYem+zclV9QMLW4qQMZBgKaHGAvpjBdtx+OmtlibJMxKZStWCo0oJof+BZOo5LS+FKRDFCFM2sP49xnsFMjRjuPjYfAupHEoQ4rx5x9RJLED8glix+ozeyMCWN9ybW4j03qzu0hY7kk+rOCpH8C2bQaxZkDXxO+iiFhdN92/CSoQsx0dtffWe322slEuZulcXUTZ/Htk7WsQZgnqNbc77Pffrrj8ralVPY3UEnqwjtfVHkx/R1ChJNvUOHCb+VZR37iYM924iXnaZRhF0htRyNDm/VKNT8wnJgEOU0sK6QhYJTz1IOsms0M/r8/tE4EtTuIlXFHeM/ekm0a15sGDzwPmfw6y6GWhWqFVWz2A=",
          "country": "cC8LkS0FvsXXe1p04SeEqim35LDfW46Unhb6xXQbg8OBWsMSjDxA2xwOiYuRu33HfTObf3o5CHiHL96iJXp8Ou1IWs07s8kr80U1DpThBbe90a0vk0CfQLk1TYN5k/SGz8x6cyUyqPSqOGWOVFBcvqgCWJ0C8upZT1U1jYLW+um7dqiC84a32othiZkHiwyMnY6AlwG/kcIsrXxNpmoH7MH9mGxXqHg9y1reL9f8HWw9N48OBKeHHU83DiFqnR5ZvSMWRlyQko+wVh/a4gLkfWNtKcWysTnhw6dU85rXoz+CUJdjdDCYUmn40EYF/hQixj9hTOvY/aNv2Uh2IjQWDhify3iel5UGHMv0bi7amWrPkh+37rtmyteZM9oYRRusgKgTW9M2/Gm4kq/f8IarCGOcgLeXbxT1qnjAbCZXNiflC1nKVmLFqnH10SL+l/KDdIJLQZK4JX8oM22W6hP49ALqkPp5ONyNHGoJtUVgk9lbWGSMmp+U2Niye7TlC7G1XpCsJlt6zfYUsUG3tOrkJM6LsOlXHf0rrH6wLF4j7APCahQ3Ax9WvC/lFarY11tEm1mf+VwBT6LwljA1gOWmMHAI1jHDrcNaNKl7mSF4NzLaZdw7ktHqYL2wm78XKKPaI8Exi0kGrwpgdohw8FnByK/eioAr9RRfvAbFxXR+lhI="
        }
      },
      "originatorVASP": {
        "vaspCode": "Qx/d5nSqgW3i/MllXNJ/k6uaQvNZJ3r/egre0TjzsEtR8lILIe9fh3HTd5cAT68Gl5T2K+tjeMAR9hUfRe4sMtybpsUV5Z/yEclIqMg9L90Jqtmx8irLHvzaOS+3o1SoWEiFbn6p5lXPkElCHaj3ruVCXBqw0+rXUXCbVFgG6NFKJ4ZvkaJsxO2+n9h9JDEpGRqTR3KpRudfwxiC7afC03xUrkh0OYeegZ5YlrEMDrUGjKG3lFjjbGZL0JAywh/RnA6fG4dXW9VuD+0/x0XtZpG/6YSUVmQJnwAEhfGZnk2CboL34XQUpsKA+/naLP44UNjkbhsC6y4VPg5WdAv5/S4sTdKj5Wx/RUhDKissldSEdxHKSfogbESvllZxctqA68sliuiB6y8Pj10WDNruoTU5N+kwOa/9asLhDOrYykclvtNNwGUgG4yg2jSz1N/pr2J8BOqzRV6jQRjKeHgrtSnglgZS59/isjz/TjNR4AHHJbaH6wsJl0VAQMCuphv/zaVZwBU81M9uUxHyg1wV2HT6nKTf8H8U6mWuH/SwuLMYa8seS9f4yH4GbAoGLkLObVwGtbxvTH3mcgPPzQqzOujmhEO1OeftUXgnBHjns4mUnvV+TireHTMtZMv0MR8tG3Bff8pg/zymrlaLKzjfONALN2kQ+c4QO7lIO6S7WOo="
      },
      "beneficiaryVASP": {
        "vaspCountry": "fVJdps6ZNAOhABTF6lAF7hui3dGL4ijQfNinhE70UAEBVoy5r5CQ98f0iu5wjkDk8lxmskDBf2ltHVzFk90RMG5VHQASWMLXwv6NU+xp0k2tp1AFRUX3CdmsWgtoTRAMPHCmJLvwIJGkNBZDGWx84kbzIwosZ0mKfjvrm7UnHGBTSa+aisJ+DglQsBp6MxCxgQLbDx+6+MwTarrt7FQ5l5CwUEs9+3yabQWrHLjmrwHtYEGAlIjtkm0FDKskqkpysEwC7BPt5drL8UTq2GdH9UMU93a6LixJZlZpARZPWEEwPu+v0BjcIfFCBDcG+Vo+3u3lQjaJ8wm2hdIdF8Rbjg7vb1b+IFHN6Gnk4Y7zxZ/lJkKO17RxntNGXCesymKodwXKNXZt0mJMegmyXQpG1srfiRCZ7pFf3HcuKsbiXEkvd+V+//60rkGJGxFoQ4FZcbJqD4dKA3E4cVmdMDPq6EzzO/d0s4X1DyXQ8+6HuQ9Ai7YgvaPQIrYIRKWntG8tEDKCrEyQN+7WQzejmYU3sQe4+M2okH7gBoe8o3GpNmqPE/JxUO2t5tdbLieiySa+vX3T6N2DBc8003miuUMXMDfX8Jf0gi7Ynp8PXamtIj2T3ovbwTDGokdZ3PC0tsrKBHbwAiLxfk7K5S9BXObMGnHgIvpv2H1lydJjrI4XYf4="
      }
    }
  }
}

Mandatory properties per jurisdiction for Binance transactions

The mandatory properties vary from jurisdiction to jurisdiction. To simplify mapping and usage, see the following resource:


Mandatory fields for Bitstamp transactions

Deposits to and withdrawals from Bitstamp use mandatory fields instead of mandatory properties per jurisdiction:


Final checklist for developers

Before deploying your integration, ensure you have completed the following:

  • Select a cryptographic library/SDK: Choose and integrate a library that can perform hybrid encryption (RSA-OAEP + AES-256-GCM) using a counterparty's public key.
  • Implement public key retrieval: Implement the logic to securely fetch the recipient's public key from the Fireblocks API before each transaction.
  • Map PII fields: Ensure your system correctly maps your customer data to the fields required by the piiData object structure.
  • Handle jurisdictional logic: Implement logic to determine the required PII based on the transaction amount and the jurisdictions of both VASPs.
  • Encrypt the payload: Confirm that all sensitive fields within the piiData object are correctly encrypted.
  • Test with Sandbox: Use the sandbox environments provided by Fireblocks to test your implementation thoroughly.
  • Confirm data accuracy: Work with your compliance team to ensure the plaintext PII being sent for encryption is accurate and matches the KYC records on file.