diff --git a/integrationExamples/gpt/userId_example.html b/integrationExamples/gpt/userId_example.html
index 5659a208103..d382f84e6b2 100644
--- a/integrationExamples/gpt/userId_example.html
+++ b/integrationExamples/gpt/userId_example.html
@@ -154,6 +154,7 @@
             {
               "name": "merkleId",
               "params": {
+                "endpoint":  "https://test_endpoint/",
                 "vendor": "sdfg",
                 "sv_cid": "dfg",
                 "sv_pubid": "xcv",
diff --git a/modules/merkleIdSystem.js b/modules/merkleIdSystem.js
index 4ab29ec6f68..bcb2b943834 100644
--- a/modules/merkleIdSystem.js
+++ b/modules/merkleIdSystem.js
@@ -6,7 +6,7 @@
  */
 
 import * as utils from '../src/utils.js'
-import {ajax} from '../src/ajax.js';
+import * as ajaxLib from '../src/ajax.js';
 import {submodule} from '../src/hook.js'
 import {getStorageManager} from '../src/storageManager.js';
 
@@ -42,7 +42,7 @@ function setSession(storage, response) {
 
 function constructUrl(configParams) {
   const session = getSession(configParams);
-  let url = ID_URL + `?vendor=${configParams.vendor}&sv_cid=${configParams.sv_cid}&sv_domain=${configParams.sv_domain}&sv_pubid=${configParams.sv_pubid}`;
+  let url = configParams.endpoint + `?vendor=${configParams.vendor}&sv_cid=${configParams.sv_cid}&sv_domain=${configParams.sv_domain}&sv_pubid=${configParams.sv_pubid}`;
   if (session) {
     url = `${url}&sv_session=${session}`;
   }
@@ -54,8 +54,9 @@ function generateId(configParams, configStorage) {
   const url = constructUrl(configParams);
 
   const resp = function (callback) {
-    const callbacks = {
-      success: response => {
+    ajaxLib.ajaxBuilder()(
+      url,
+      response => {
         let responseObj;
         if (response) {
           try {
@@ -72,12 +73,12 @@ function generateId(configParams, configStorage) {
         utils.logInfo('Merkle responseObj with date ' + JSON.stringify(responseObj));
         callback(responseObj);
       },
-      error: error => {
+      error => {
         utils.logError(`${MODULE_NAME}: merkleId fetch encountered an error`, error);
         callback();
-      }
-    };
-    ajax(url, callbacks, undefined, {method: 'GET', withCredentials: true});
+      },
+      {method: 'GET', withCredentials: true}
+    );
   };
   return resp;
 }
@@ -126,10 +127,15 @@ export const merkleIdSubmodule = {
       utils.logError('User ID - merkleId submodule requires a valid sv_pubid string to be defined');
       return;
     }
+
     if (consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies) {
       utils.logError('User ID - merkleId submodule does not currently handle consent strings');
       return;
     }
+    if (typeof configParams.endpoint !== 'string') {
+      utils.logWarn('User ID - merkleId submodule endpoint string is not defined');
+      configParams.endpoint = ID_URL
+    }
 
     if (typeof configParams.sv_domain !== 'string') {
       configParams.sv_domain = merkleIdSubmodule.findRootDomain();
diff --git a/test/spec/modules/merkleIdSystem_spec.js b/test/spec/modules/merkleIdSystem_spec.js
new file mode 100644
index 00000000000..64dfc0d463c
--- /dev/null
+++ b/test/spec/modules/merkleIdSystem_spec.js
@@ -0,0 +1,212 @@
+import * as ajaxLib from 'src/ajax.js';
+import * as utils from 'src/utils.js';
+import {merkleIdSubmodule} from 'modules/merkleIdSystem.js';
+
+import sinon from 'sinon';
+
+let expect = require('chai').expect;
+
+const CONFIG_PARAMS = {
+  endpoint: 'https://test/id',
+  vendor: 'idsv2',
+  sv_cid: '5344_04531',
+  sv_pubid: '11314',
+  sv_domain: 'www.testDomain.com',
+  sv_session: 'testsession'
+};
+
+const STORAGE_PARAMS = {
+  type: 'cookie',
+  name: 'merkle',
+  expires: 10,
+  refreshInSeconds: 10
+};
+
+const MOCK_RESPONSE = {
+  c: {
+    name: '_svsid',
+    value: '123876327647627364236478'
+  }
+};
+
+function mockResponse(
+  responseText,
+  response = (url, successCallback) => successCallback(responseText)) {
+  return function() {
+    return response;
+  }
+}
+
+describe('Merkle System', function () {
+  describe('Merkle System getId()', function () {
+    const callbackSpy = sinon.spy();
+    let sandbox;
+    let ajaxStub;
+
+    beforeEach(function () {
+      sandbox = sinon.sandbox.create();
+      sinon.stub(utils, 'logInfo');
+      sinon.stub(utils, 'logWarn');
+      sinon.stub(utils, 'logError');
+      callbackSpy.resetHistory();
+      ajaxStub = sinon.stub(ajaxLib, 'ajaxBuilder').callsFake(mockResponse(JSON.stringify(MOCK_RESPONSE)));
+    });
+
+    afterEach(function () {
+      utils.logInfo.restore();
+      utils.logWarn.restore();
+      utils.logError.restore();
+      ajaxStub.restore();
+    });
+
+    it('getId() should fail on missing vendor', function () {
+      let config = {
+        params: {
+          ...CONFIG_PARAMS,
+          vendor: undefined
+        },
+        storage: STORAGE_PARAMS
+      };
+
+      let submoduleCallback = merkleIdSubmodule.getId(config, undefined);
+      expect(submoduleCallback).to.be.undefined;
+      expect(utils.logError.args[0][0]).to.exist.and.to.equal('User ID - merkleId submodule requires a valid vendor to be defined');
+    });
+
+    it('getId() should fail on missing vendor', function () {
+      let config = {
+        params: {
+          ...CONFIG_PARAMS,
+          vendor: undefined
+        },
+        storage: STORAGE_PARAMS
+      };
+
+      let submoduleCallback = merkleIdSubmodule.getId(config, undefined);
+      expect(submoduleCallback).to.be.undefined;
+      expect(utils.logError.args[0][0]).to.exist.and.to.equal('User ID - merkleId submodule requires a valid vendor to be defined');
+    });
+
+    it('getId() should fail on missing sv_cid', function () {
+      let config = {
+        params: {
+          ...CONFIG_PARAMS,
+          sv_cid: undefined
+        },
+        storage: STORAGE_PARAMS
+      };
+
+      let submoduleCallback = merkleIdSubmodule.getId(config, undefined);
+      expect(submoduleCallback).to.be.undefined;
+      expect(utils.logError.args[0][0]).to.exist.and.to.equal('User ID - merkleId submodule requires a valid sv_cid string to be defined');
+    });
+
+    it('getId() should fail on missing sv_pubid', function () {
+      let config = {
+        params: {
+          ...CONFIG_PARAMS,
+          sv_pubid: undefined
+        },
+        storage: STORAGE_PARAMS
+      };
+
+      let submoduleCallback = merkleIdSubmodule.getId(config, undefined);
+      expect(submoduleCallback).to.be.undefined;
+      expect(utils.logError.args[0][0]).to.exist.and.to.equal('User ID - merkleId submodule requires a valid sv_pubid string to be defined');
+    });
+
+    it('getId() should warn on missing endpoint', function () {
+      let config = {
+        params: {
+          ...CONFIG_PARAMS,
+          endpoint: undefined
+        },
+        storage: STORAGE_PARAMS
+      };
+
+      let submoduleCallback = merkleIdSubmodule.getId(config, undefined).callback;
+      submoduleCallback(callbackSpy);
+      expect(callbackSpy.calledOnce).to.be.true;
+      expect(utils.logWarn.args[0][0]).to.exist.and.to.equal('User ID - merkleId submodule endpoint string is not defined');
+    });
+
+    it('getId() should handle callback with valid configuration', function () {
+      let config = {
+        params: CONFIG_PARAMS,
+        storage: STORAGE_PARAMS
+      };
+
+      let submoduleCallback = merkleIdSubmodule.getId(config, undefined).callback;
+      submoduleCallback(callbackSpy);
+      expect(callbackSpy.calledOnce).to.be.true;
+    });
+  });
+
+  describe('Merkle System extendId()', function () {
+    const callbackSpy = sinon.spy();
+    let sandbox;
+    let ajaxStub;
+
+    beforeEach(function () {
+      sandbox = sinon.sandbox.create();
+      sinon.stub(utils, 'logInfo');
+      sinon.stub(utils, 'logWarn');
+      sinon.stub(utils, 'logError');
+      callbackSpy.resetHistory();
+      ajaxStub = sinon.stub(ajaxLib, 'ajaxBuilder').callsFake(mockResponse(JSON.stringify(MOCK_RESPONSE)));
+    });
+
+    afterEach(function () {
+      utils.logInfo.restore();
+      utils.logWarn.restore();
+      utils.logError.restore();
+      ajaxStub.restore();
+    });
+
+    it('extendId() get storedid', function () {
+      let config = {
+        params: {
+          ...CONFIG_PARAMS,
+        },
+        storage: STORAGE_PARAMS
+      };
+
+      let id = merkleIdSubmodule.extendId(config, undefined, 'Merkle_Stored_ID');
+      expect(id.id).to.exist.and.to.equal('Merkle_Stored_ID');
+    });
+
+    it('extendId() get storedId on configured storageParam.refreshInSeconds', function () {
+      let config = {
+        params: {
+          ...CONFIG_PARAMS,
+          refreshInSeconds: 1000
+        },
+        storage: STORAGE_PARAMS
+      };
+
+      let yesterday = new Date(Date.now() - 86400000).toUTCString();
+      let storedId = {value: 'Merkle_Stored_ID', date: yesterday};
+
+      let id = merkleIdSubmodule.extendId(config, undefined,
+        storedId);
+
+      expect(id.id).to.exist.and.to.equal(storedId);
+    });
+
+    it('extendId() callback on configured storageParam.refreshInSeconds', function () {
+      let config = {
+        params: {
+          ...CONFIG_PARAMS,
+          refreshInSeconds: 1
+        }
+      };
+
+      let yesterday = new Date(Date.now() - 86400000).toUTCString();
+      let storedId = {value: 'Merkle_Stored_ID', date: yesterday};
+
+      let submoduleCallback = merkleIdSubmodule.extendId(config, undefined, storedId).callback;
+      submoduleCallback(callbackSpy);
+      expect(callbackSpy.calledOnce).to.be.true;
+    });
+  });
+});
