diff --git a/lib/partner-listener/index.js b/lib/partner-listener/index.js
index def26e8..573d83a 100644
--- a/lib/partner-listener/index.js
+++ b/lib/partner-listener/index.js
@@ -13,6 +13,7 @@ const routerInquiry = require('./routers/inquiry');
 const routerPay = require('./routers/pay');
 const routerTopup = require('./routers/topup');
 const routerTrxStatus = require('./routers/trx-status');
+const routerProductTree = require('./routers/product-tree');
 
 const app = express();
 
@@ -49,6 +50,7 @@ app.use('/inquiry', routerInquiry);
 app.use('/pay', routerPay);
 app.use('/topup', routerTopup);
 app.use('/trx-status', routerTrxStatus);
+app.use('/product-tree', routerProductTree);
 app.use('/', routerTopup);
 
 app.use((req, res) => {
diff --git a/lib/partner-listener/routers/product-tree.js b/lib/partner-listener/routers/product-tree.js
new file mode 100644
index 0000000..650e048
--- /dev/null
+++ b/lib/partner-listener/routers/product-tree.js
@@ -0,0 +1,53 @@
+const MODULE_NAME = 'PARTNER-LISTENER.ROUTERS.PRODUCT-TREE';
+
+const axios = require('axios').default;
+const express = require('express');
+const urlJoin = require('url-join');
+
+const coreUrl = require('komodo-sdk/core-url');
+const logger = require('tektrans-logger');
+
+const getFromBodyQsParams = require('../../get-from-body-qs-params');
+
+const CORE_ENDPOINT = urlJoin(coreUrl, '/product-tree');
+
+const router = express.Router();
+module.exports = router;
+
+const mainHandler = async (req, res) => {
+    const { xid } = res.locals;
+
+    const terminalName = getFromBodyQsParams(req, 'terminal_name');
+    const password = getFromBodyQsParams(req, 'password');
+
+    try {
+        const result = await axios.get(CORE_ENDPOINT, {
+            params: {
+                terminal_name: terminalName,
+                password,
+            },
+        });
+
+        if (!result) {
+            const e = new Error(`${MODULE_NAME} B7555411: Invalid result from CORE`);
+            throw e;
+        }
+
+        result.httpgetx_xid = xid;
+        res.json(result);
+    } catch (e) {
+        logger.warn(`${MODULE_NAME} 5AA99A06: Exception`, {
+            xid,
+            eCode: e.code,
+            eMessage: e.message || e,
+        });
+
+        res.json({
+            xid,
+            ts: new Date(),
+            error: e.message || e,
+        });
+    }
+};
+
+router.get('/', mainHandler);
diff --git a/package-lock.json b/package-lock.json
index 05f1545..aece717 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,7 @@
         "request": "^2.88.0",
         "tektrans-logger": "^1.2.3",
         "uniqid": "^5.3.0",
+        "url-join": "^5.0.0",
         "uuid": "^3.3.3"
       },
       "devDependencies": {
@@ -2113,6 +2114,11 @@
         "macaddress": "^0.2.8"
       }
     },
+    "node_modules/komodo-sdk/node_modules/url-join": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
+      "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="
+    },
     "node_modules/kuler": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
@@ -4194,9 +4200,12 @@
       }
     },
     "node_modules/url-join": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
-      "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz",
+      "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==",
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      }
     },
     "node_modules/util-deprecate": {
       "version": "1.0.2",
@@ -6305,6 +6314,11 @@
           "requires": {
             "macaddress": "^0.2.8"
           }
+        },
+        "url-join": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
+          "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="
         }
       }
     },
@@ -7919,9 +7933,9 @@
       }
     },
     "url-join": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
-      "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz",
+      "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA=="
     },
     "util-deprecate": {
       "version": "1.0.2",
diff --git a/package.json b/package.json
index b811e74..309f62f 100644
--- a/package.json
+++ b/package.json
@@ -37,6 +37,7 @@
     "request": "^2.88.0",
     "tektrans-logger": "^1.2.3",
     "uniqid": "^5.3.0",
+    "url-join": "^5.0.0",
     "uuid": "^3.3.3"
   }
 }