diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py
index 39a44c77c358c3366755fead15c37c3dc570b6b4..d5df0457af71fff462b9551913c3d031f55241f4 100644
--- a/inventory_provider/routes/classifier.py
+++ b/inventory_provider/routes/classifier.py
@@ -295,6 +295,35 @@ def _link_interface_info(r, hostname, interface):
     return ifc_info
 
 
+def get_link_info_response_body(
+        source_equipment: str,
+        interface: str,
+        ims_source_equipment: str,
+        ims_interface: str,
+        r: Redis) -> dict:
+    result = {
+        'interface': _link_interface_info(r, source_equipment, interface)
+    }
+
+    bundle_members = r.get(
+        f'netconf-interface-bundles:{source_equipment}:{interface}')
+    if bundle_members:
+        result['interface']['bundle_members'] = \
+            json.loads(bundle_members.decode('utf-8'))
+    else:
+        result['interface']['bundle_members'] = []
+
+    result.update(
+        get_interface_services_and_loc(
+            ims_source_equipment,
+            ims_interface,
+            r
+        )
+    )
+
+    return result
+
+
 @routes.route("/link-info/<source_equipment>/<path:interface>",
               methods=['GET'])
 @routes.route("/nokia-link-info/<source_equipment>/<path:interface>",
@@ -302,7 +331,7 @@ def _link_interface_info(r, hostname, interface):
 @routes.route("/juniper-link-info/<source_equipment>/<path:interface>",
               methods=['GET'])
 @common.require_accepts_json
-def get_juniper_link_info(source_equipment: str, interface: str) -> Response:
+def handle_link_info_request(source_equipment: str, interface: str) -> Response:
     """
     Handler for /classifier/juniper-link-info that
     returns metadata about an IP interface.
@@ -328,35 +357,50 @@ def get_juniper_link_info(source_equipment: str, interface: str) -> Response:
     result = _ignore_cache_or_retrieve(request, cache_key, r)
 
     if not result:
-        result = {
-            'interface': _link_interface_info(r, source_equipment, interface)
-        }
+        result = get_link_info_response_body(
+            source_equipment,
+            interface,
+            ims_source_equipment,
+            ims_interface, r)
 
-        bundle_members = r.get(
-            f'netconf-interface-bundles:{source_equipment}:{interface}')
-        if bundle_members:
-            result['interface']['bundle_members'] = \
-                json.loads(bundle_members.decode('utf-8'))
-        else:
-            result['interface']['bundle_members'] = []
+        result = json.dumps(result)
+        # cache this data for the next call
+        r.set(cache_key, result.encode('utf-8'))
+
+    return Response(result, mimetype="application/json")
 
-        result.update(
-            get_interface_services_and_loc(
-                ims_source_equipment,
-                ims_interface,
-                r
-            )
-        )
 
-        # don't want to report related services for bundle members, just the
-        # aggregate
-        # if result['interface']['bundle']:
-        #     result['related-services'] = []
+@routes.route("/epipe-sap-info/<source_equipment>/<service_id>/<vpn_id>", methods=['GET'])
+@common.require_accepts_json
+def handle_epipe_sap_info_request(source_equipment: str, service_id: str, vpn_id: str) -> Response:
+
+    r = common.get_current_redis()
+
+    ims_source_equipment = get_ims_equipment_name(source_equipment, r)
+
+    cache_key = \
+        f'classifier-cache:epipe_sap:{source_equipment}:{service_id}:{vpn_id}'
+    
+    print(f'cache_key: {cache_key}')
+
+    result = _ignore_cache_or_retrieve(request, cache_key, r)
+
+    if not result:
+        info_to_interface_key = f'ims:epipe-sapid_mappings:{source_equipment}:{service_id}:{vpn_id}'
+        raw_interface = r.get(info_to_interface_key)
+        if raw_interface:
+            raw_interface = raw_interface.decode('utf-8')
+            ims_interface = get_ims_interface(raw_interface)
+            result = get_link_info_response_body(
+                source_equipment,
+                raw_interface,
+                ims_source_equipment,
+                ims_interface, r)
 
         result = json.dumps(result)
         # cache this data for the next call
         r.set(cache_key, result.encode('utf-8'))
-
+    
     return Response(result, mimetype="application/json")