diff --git a/dist/services/QrCodeDataService.d.ts b/dist/services/QrCodeDataService.d.ts
index 5ea7dcc6a447755dbf447c219cc4dd1ec3a92b2d..32ddcbe4fe61a7e6d2eab0394a8b36b4ab783882 100644
--- a/dist/services/QrCodeDataService.d.ts
+++ b/dist/services/QrCodeDataService.d.ts
@@ -1,5 +1,9 @@
-import { KeyDataPair, MessageData, DocumentData } from "../types";
+import { KeyDataPair, MessageData, DocumentData, SealHeadData, SealIndexObject } from "../types";
 declare const _default: {
+    encodeSealHead: (sealHeadData: SealHeadData) => string;
+    decodeSealHead: (binary: string | ArrayBuffer | Uint8Array) => SealHeadData;
+    encodeSealIndexObject: (indexObjectData: SealIndexObject) => string;
+    decodeSealIndexObject: (binary: string | ArrayBuffer | Uint8Array) => SealIndexObject;
     encodeDocumentData: (documentData: DocumentData) => string;
     decodeDocumentData: (binary: string | ArrayBuffer | Uint8Array) => DocumentData;
     encodeEmailData: (emailData: MessageData) => string;
diff --git a/dist/services/QrCodeDataService.js b/dist/services/QrCodeDataService.js
index b019c4eda6e11dfb26902f428b03cece1fa410a8..ce102d4dab66909348be5a23c1d791ad6fdf67cf 100644
--- a/dist/services/QrCodeDataService.js
+++ b/dist/services/QrCodeDataService.js
@@ -16,6 +16,8 @@ const DocumentDataMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.Docu
 const EmailDataMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.EmailData_V1;
 const KeyDataMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.KeyData_V1;
 const WrapperDataMessage = qrcode_data_pb_1.vereign.protobuf.qrcode_data.WrapperData;
+const SealIndexObjectMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.SealIndexObject_V1;
+const SealHeadMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.SealDocumentHeadData_V1;
 const EMAIL_DATA_V1 = "EmailData_V1";
 const DOCUMENT_DATA_V1 = "DocumentData_V1";
 const encodeEmailData = (emailData) => {
@@ -111,7 +113,33 @@ const encodeDocumentData = (documentData) => {
     const wrappedDataBuffer = WrapperDataMessage.encode(wrappedDataMessage).finish();
     return (0, common_1.arrayBufferToBase64)(wrappedDataBuffer);
 };
+const encodeSealHead = (sealHeadData) => {
+    const sealHeadDataMessage = SealHeadMessageV1.fromObject(sealHeadData);
+    const buffer = SealHeadMessageV1.encode(sealHeadDataMessage).finish();
+    return (0, common_1.arrayBufferToBase64)(buffer);
+};
+const decodeSealHead = (binary) => {
+    const sealHeadDataMessage = SealHeadMessageV1.decode((0, common_1.ensureUint8Array)(binary));
+    return SealHeadMessageV1.toObject(sealHeadDataMessage, {
+        bytes: String,
+    });
+};
+const encodeSealIndexObject = (indexObjectData) => {
+    const sealIndexDataMessage = SealIndexObjectMessageV1.fromObject(indexObjectData);
+    const buffer = SealIndexObjectMessageV1.encode(sealIndexDataMessage).finish();
+    return (0, common_1.arrayBufferToBase64)(buffer);
+};
+const decodeSealIndexObject = (binary) => {
+    const sealIndexDataMessage = SealIndexObjectMessageV1.decode((0, common_1.ensureUint8Array)(binary));
+    return SealIndexObjectMessageV1.toObject(sealIndexDataMessage, {
+        bytes: String,
+    });
+};
 exports.default = {
+    encodeSealHead,
+    decodeSealHead,
+    encodeSealIndexObject,
+    decodeSealIndexObject,
     encodeDocumentData,
     decodeDocumentData,
     encodeEmailData,
diff --git a/dist/types.d.ts b/dist/types.d.ts
index 5c87d616e6f3c51e6f9dacbbda27da3f5569969d..3d93da6f5e571838365c100760584174d99ee32d 100644
--- a/dist/types.d.ts
+++ b/dist/types.d.ts
@@ -147,3 +147,16 @@ export interface DocumentStatusObject {
     timestamp: number;
     sealHash: string;
 }
+export interface SealHeadData {
+    key: string;
+    data: string;
+    ipfsIndexCid: string;
+}
+export interface SealIndexObject {
+    sealKey: string;
+    sealTailCid: string;
+    chain: string;
+    block: string;
+    transactionId: string;
+    hashBatchId: string;
+}
diff --git a/src/services/QrCodeDataService.ts b/src/services/QrCodeDataService.ts
index 38f08f62c5900570b75e84ab7de181a16aaf1032..0b441156907a594537e6ac2ad19653d88ece8821 100644
--- a/src/services/QrCodeDataService.ts
+++ b/src/services/QrCodeDataService.ts
@@ -1,4 +1,10 @@
-import { KeyDataPair, MessageData, DocumentData } from "../types";
+import {
+  KeyDataPair,
+  MessageData,
+  DocumentData,
+  SealHeadData,
+  SealIndexObject,
+} from "../types";
 import { vereign } from "../generated/qrcode_data_pb";
 
 import {
@@ -13,6 +19,9 @@ const DocumentDataMessageV1 = vereign.protobuf.qrcode_data.DocumentData_V1;
 const EmailDataMessageV1 = vereign.protobuf.qrcode_data.EmailData_V1;
 const KeyDataMessageV1 = vereign.protobuf.qrcode_data.KeyData_V1;
 const WrapperDataMessage = vereign.protobuf.qrcode_data.WrapperData;
+const SealIndexObjectMessageV1 =
+  vereign.protobuf.qrcode_data.SealIndexObject_V1;
+const SealHeadMessageV1 = vereign.protobuf.qrcode_data.SealDocumentHeadData_V1;
 
 const EMAIL_DATA_V1 = "EmailData_V1";
 const DOCUMENT_DATA_V1 = "DocumentData_V1";
@@ -179,7 +188,50 @@ const encodeDocumentData = (documentData: DocumentData): string => {
   return arrayBufferToBase64(wrappedDataBuffer);
 };
 
+const encodeSealHead = (sealHeadData: SealHeadData): string => {
+  const sealHeadDataMessage = SealHeadMessageV1.fromObject(sealHeadData);
+  const buffer = SealHeadMessageV1.encode(sealHeadDataMessage).finish();
+
+  return arrayBufferToBase64(buffer);
+};
+
+const decodeSealHead = (
+  binary: string | Uint8Array | ArrayBuffer
+): SealHeadData => {
+  const sealHeadDataMessage = SealHeadMessageV1.decode(
+    ensureUint8Array(binary)
+  );
+
+  return SealHeadMessageV1.toObject(sealHeadDataMessage, {
+    bytes: String,
+  }) as SealHeadData;
+};
+
+const encodeSealIndexObject = (indexObjectData: SealIndexObject): string => {
+  const sealIndexDataMessage =
+    SealIndexObjectMessageV1.fromObject(indexObjectData);
+  const buffer = SealIndexObjectMessageV1.encode(sealIndexDataMessage).finish();
+
+  return arrayBufferToBase64(buffer);
+};
+
+const decodeSealIndexObject = (
+  binary: string | Uint8Array | ArrayBuffer
+): SealIndexObject => {
+  const sealIndexDataMessage = SealIndexObjectMessageV1.decode(
+    ensureUint8Array(binary)
+  );
+
+  return SealIndexObjectMessageV1.toObject(sealIndexDataMessage, {
+    bytes: String,
+  }) as SealIndexObject;
+};
+
 export default {
+  encodeSealHead,
+  decodeSealHead,
+  encodeSealIndexObject,
+  decodeSealIndexObject,
   encodeDocumentData,
   decodeDocumentData,
   encodeEmailData,
diff --git a/src/types.ts b/src/types.ts
index 37557bcac0643e7d58c18078e23d25ad41ad734d..6b0fdc1c9636b639415a48996097f04a0f57544f 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -172,3 +172,18 @@ export interface DocumentStatusObject {
   timestamp: number;
   sealHash: string;
 }
+
+export interface SealHeadData {
+  key: string;
+  data: string;
+  ipfsIndexCid: string;
+}
+
+export interface SealIndexObject {
+  sealKey: string;
+  sealTailCid: string;
+  chain: string;
+  block: string;
+  transactionId: string;
+  hashBatchId: string;
+}
diff --git a/vereign/protobuf/qrcode_data.proto b/vereign/protobuf/qrcode_data.proto
index 7f14d6af429b5c662685f5665d934d51e9dd3b4c..b3b296978cf592eb1e48865b20448efdd9fe84de 100644
--- a/vereign/protobuf/qrcode_data.proto
+++ b/vereign/protobuf/qrcode_data.proto
@@ -73,3 +73,23 @@ message DocumentData_V1 {
   int32 documentPages = 5;
   IpfsData_V1 ipfs = 6;
 }
+
+/**
+ * Reference 
+ * https://community.vereign.com/t/seal-blockchain-status-storage-for-documents-and-beyond/371/6
+ * Step 14
+ */ 
+ message SealDocumentHeadData_V1 {
+  bytes key = 1;
+  bytes data = 2;
+  string ipfsIndexCid = 3;
+}
+
+message SealIndexObject_V1 {
+  bytes sealKey = 1;
+  string sealTailCid = 2;
+  string chain = 3;
+  string block = 4;
+  string transactionId = 5;
+  string hashBatchId = 6;
+}