https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/API-Management-blog-posts.xml SAP Community - API Management 2026-02-12T12:10:03.552503+00:00 python-feedgen API Management blog posts in SAP Community https://community.sap.com/t5/integration-blog-posts/introducing-ai-powered-anomaly-insights-amp-recommendations-in-sap/ba-p/14286013 Introducing AI-Powered Anomaly Insights & Recommendations in SAP Integration Suite 2025-12-08T13:14:27.158000+01:00 shruthiarjun https://community.sap.com/t5/user/viewprofilepage/user-id/316812 <P><STRONG>Introduction</STRONG></P><P>SAP Integration Suite offers <A href="https://community.sap.com/t5/integration-blog-posts/api-anomaly-detection-in-sap-integration-suite/ba-p/13726636" target="_blank">API Anomaly Detection</A> that involves monitoring and identifying abnormalities in time series data related to APIs, enabling API Owners detect unexpected patterns or deviations from the norm, ensuring optimal performance and business continuity. Traditionally, resolving these anomalies has been time-consuming involving manual activities around impact assessment, root cause analysis &amp; identification of mitigation plans. &nbsp;</P><P>That’s about to change!</P><P><STRONG>What’s New</STRONG></P><P>SAP Integration Suite now brings AI-powered anomaly insights and intelligent recommendations to help you move from detection to resolution faster than ever. It improves troubleshooting efficiency and reduces manual investigation time. This feature leverages advanced machine learning models to identify anomalies and AI models to suggest actionable steps to fix them—empowering API Owners &amp; developers to stay ahead of issues.</P><P>Note : The feature is in the process of getting updated in our global Data centres. Check&nbsp;<A href="https://me.sap.com/notes/3463620" target="_blank" rel="noopener noreferrer">this</A>&nbsp;Note for information about regional availability.</P><P>Note : The availability of the Anomaly Detection &amp; Intelligent Recommendations feature is dependent on your SAP Integration Suite service plan. Check&nbsp;<A href="https://me.sap.com/notes/2903776" target="_blank" rel="noopener noreferrer">this</A>&nbsp;note for information about the various plans and supported features.</P><P><STRONG>Key Benefits</STRONG></P><UL><LI><STRONG>Detailed Insights &amp; Causes: </STRONG>Ready to use analysis of the Anomaly, its impact and the probable root cause(s)</LI><LI><STRONG>Intelligent Recommendations:</STRONG> Get context-aware suggestions for quick resolution</LI><LI><STRONG>Reduced Downtime:</STRONG> Minimize business impact with faster troubleshooting</LI><LI><STRONG>Continuous Learning:</STRONG> Recommendations improve over time as the system learns from user feedback</LI></UL><P><STRONG>Feature Overview</STRONG></P><P>To assist API Owners who have enabled Anomaly Detection in their tenants with faster resolution of Anomalies, we introduce AI-driven analysis of the Anomalies.</P><P>When an Anomaly is detected, an advanced AI-model generates comprehensive insights on the event around the system state, clients involved, the intensity of the Anomaly etc. &nbsp;It also then highlights the potential root causes for the Anomaly, which gives clarity on where the corrections/resolutions must be applied. Finally, it also provides a set of recommendations that the API Owners &amp; developers can apply – both within &amp; outside APIM systems - to resolve the issue at hand &amp; also prevent future events.</P><P><STRONG><EM>Enablement</EM></STRONG></P><P>As an API Administrator of an SAP Integration Suite – API Management tenant, one could enable this new extension by just selecting an additional check box under Anomaly Detection settings. If you are switching on Anomaly Detection for the first time, then the check box is selected by default. You need to accept the Generative AI usage terms before starting to use the feature.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2025-12-08 171536.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349729i73E2EDB5B43970D2/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2025-12-08 171536.png" alt="Screenshot 2025-12-08 171536.png" /></span></P><P><STRONG><EM>Anomaly Analysis</EM></STRONG></P><P>In the event of an Anomaly, if the Intelligent Recommendations has been enabled on the tenant, you will see three new tabs under the Anomaly details – Insights, Causes &amp; Recommendations.</P><P><STRONG>Insights</STRONG>: Delivers an in-depth analysis of unusual API traffic patterns, the system state during the anomaly, and its potential impact on API performance and stability.</P><P><STRONG>Causes</STRONG>: Highlights the likely factors behind the anomaly by examining API usage trends, traffic variations, and underlying system conditions.</P><P><STRONG>Recommendations</STRONG>: Offers practical steps and configuration adjustments to resolve the issue, enhance API performance, and implement preventive measures to avoid similar anomalies in the future.</P><P>In the example below, an API Traffic surge Anomaly has been detected. Observe how each of the tabs helps in getting clarity on the event itself &amp; also quickly identify what could be done next.</P><P>For each of the generated content, feedback could be provided that helps the AI model learn over time &amp; improve accuracy.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2025-12-08 172235.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349733iDF7BA78F631AFA38/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2025-12-08 172235.png" alt="Screenshot 2025-12-08 172235.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2025-12-08 172431.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349734i812BEF1DC06332AA/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2025-12-08 172431.png" alt="Screenshot 2025-12-08 172431.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2025-12-08 172407.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/349735i6D11067F983A10D6/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2025-12-08 172407.png" alt="Screenshot 2025-12-08 172407.png" /></span></P><P><STRONG>Summary</STRONG></P><P>Instead of spending hours diagnosing issues, API owners can now rely on AI-driven guidance to resolve problems efficiently. This means less manual effort, fewer disruptions, and more time for innovation. More information could be found in our help documentation <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/enabling-anomaly-detection" target="_blank" rel="noopener noreferrer">here</A>.</P><P>Enable anomaly detection and intelligent recommendations in your SAP Integration Suite – API Management tenant and experience smarter, faster ways to work with your APIs. Do give this a try &amp; let us know what you think.</P> 2025-12-08T13:14:27.158000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/part-1-governance-in-developer-hub-empowering-administrators-with-control/ba-p/14286606 Part 1: Governance in Developer Hub: Empowering Administrators with Control and Flexibility 2025-12-17T06:08:15.318000+01:00 Kasturi https://community.sap.com/t5/user/viewprofilepage/user-id/25297 <P><STRONG>Overview</STRONG></P><P>Governance lies at the heart of every well-managed Developer Hub. It ensures that access, visibility, and subscription processes remain secure, compliant, and aligned with organizational policies.</P><P>Developer Hub offers integrated governance features that enable administrators to oversee and manage essential developer activities, such as user registration and product subscriptions.</P><P>As a Developer Hub administrator (assigned the AuthGroup.API.Admin role collection), you can configure governance levels that best fit your organization’s needs—striking the right balance between openness and control.</P><P><STRONG><EM>Note</EM></STRONG><EM>: This three-part series will guide you through the full spectrum of governance in Developer Hub. In <A href="https://community.sap.com/t5/blogs/blogworkflowpage/blog-id/technology-blog-sap/article-id/187009" target="_blank"><STRONG><U>Part 2</U></STRONG></A>, we will extend these foundational concepts by setting up an external governance workflow for more advanced approval scenarios. In <A href="https://community.sap.com/t5/blogs/blogworkflowpage/blog-id/technology-blog-sap/article-id/187014" target="_blank"><STRONG><U>Part 3</U></STRONG></A>, we will take this a step further and demonstrate how to implement external governance using SAP Integration Suite and SAP Build Process Automation, enabling a fully integrated and automated approval experience.</EM></P><P><STRONG>Understanding Governance Levels in Developer Hub</STRONG></P><P>Developer Hub’s governance framework is divided into two main areas: <STRONG>Access Governance</STRONG> and <STRONG>Subscription Governance</STRONG>.</P><UL><LI><STRONG>Access Governance:&nbsp;</STRONG>Access governance determines who can see, register for, and access APIs within your Developer Hub.<UL class="lia-list-style-type-circle"><LI><STRONG>Site Visibility Governance:&nbsp;</STRONG>Control how visible your Developer Hub catalog is to users. For detailed steps, see<A title="Manage Access" href="https://help.sap.com/docs/integration-suite/sap-integration-suite/manage-access-ad1b441676334f5c83e99f31d75a2304?q=Manage+Access" target="_blank" rel="noopener noreferrer"> <EM>Manage Access</EM><EM>.</EM></A></LI><LI><STRONG>User Registration Governance:&nbsp;</STRONG>Require administrator approval for new user registrations to ensure only authorized developers gain access. See<A title="Managing the Access Request of the Users" href="https://help.sap.com/docs/integration-suite/sap-integration-suite/managing-access-request-of-users-e0ef2837ac684e47b3a2a7a24923e58e?q=Manage+Access" target="_blank" rel="noopener noreferrer"> Managing the Access Request of the Users</A><EM>.</EM></LI><LI><STRONG>Product Visibility Governance:&nbsp;</STRONG>Define which users can access specific API products using custom role collections. See <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/restricting-access-to-api-products-using-custom-role-attribute-0495246a844d439a930a8a813df61240" target="_blank" rel="noopener noreferrer"><EM>Restricting Access to API Products Using Custom Role Attribute</EM></A><EM>.</EM></LI></UL></LI><LI><STRONG>Subscription Governance:&nbsp;</STRONG>Subscription governance defines how API product subscriptions are managed. Administrators can choose to let external systems handle approval workflows by enabling <STRONG>external governance</STRONG><SPAN>, ensuring that subscription decisions align with enterprise workflows and approval processes. See </SPAN><EM>Manage Product Subscriptions.</EM></LI></UL><P><STRONG>Manage Product Subscriptions</STRONG></P><P>Subscriptions are how developers gain access to API products in Developer Hub. Administrators can configure how these subscriptions are approved—either <STRONG>automatically within the Developer Hub</STRONG> or <STRONG>through an external approval process</STRONG>—to ensure proper governance, control, and secure API access.</P><P><STRONG>Managing Governance for&nbsp;Internal and External API Products</STRONG></P><P>Governance works differently depending on whether your APIs are managed inside or outside the SAP ecosystem.</P><P>&nbsp;SAP Managed Products are products that contain APIs managed within SAP Integration Suite. All APIs inside these products are created, published, and governed using SAP’s native capabilities—including automated or manual subscription approvals, user registration controls, and end-to-end lifecycle management.</P><P>Externally Managed Products are products that contain APIs managed outside SAP Integration Suite, even though the product itself is published through the platform. These APIs originate from external systems or services, and therefore require external governance mechanisms, to handle subscription requests and validations that cannot be governed directly within the platform.</P><P><STRONG>Governance for SAP-Managed Products&nbsp;</STRONG></P><P>For APIs managed within <STRONG>SAP API Management</STRONG>, subscription approvals occur through Developer Hub based on the configured settings. The credentials to access these APIs are generated by SAP API Management.</P><P><STRONG>Governance for Externally Managed Products</STRONG></P><P>For APIs managed outside SAP:</P><UL><LI>The content administrator (AuthGroup.Content.Admin) can import external APIs, package them into products, and publish them in Developer Hub.</LI><LI>The product must be marked as subscribable by selecting the <EM>Allow Subscription</EM> checkbox.</LI></UL><P>Depending on your setup, you can choose between:</P><UL><LI><STRONG>Governance Only:</STRONG> To track developer-product relationships.</LI><LI><STRONG>Governance + Credential Distribution:</STRONG> To also share API credentials automatically upon approval.</LI></UL><P><STRONG>Note:</STRONG> Developers cannot subscribe directly to these products within SAP.<BR />External administrators can manually share API keys from their external gateways after approval.</P><P><STRONG>Configuration Requirements Summary</STRONG></P><P>To ensure smooth external governance:</P><UL><LI>Governance option set to <STRONG>Manage Approval Outside Developer Hub</STRONG></LI><LI>Product marked as <STRONG>Allow Subscription</STRONG><STRONG> (applicable only for externally managed products.)</STRONG></LI><LI>&nbsp;All SPI and destination configurations completed</LI><LI>External system properly integrated with Developer Hub API</LI></UL><P><STRONG>Note</STRONG>:&nbsp; You cannot remove or modify products with pending or approved subscriptions.<BR />To apply configuration updates, bring the product into draft mode, make changes, and republish it.</P><P><STRONG>&nbsp;</STRONG><STRONG>Conclusion</STRONG></P><P>Developer Hub’s governance capabilities provide the flexibility and control modern enterprises need to manage their API ecosystems effectively.</P><P>Whether your organization prefers internal governance through SAP systems or external workflows via custom integrations, Developer Hub empowers administrators to tailor governance processes that align with their business policies—ensuring secure, compliant, and well-managed API access across your developer community.</P><P>&nbsp;</P><P><STRONG>Related Topics: </STRONG></P><P><A href="https://community.sap.com/t5/blogs/blogworkflowpage/blog-id/technology-blog-sap/article-id/187009" target="_blank"><U>Part 2: Setting Up an External Governance Workflow</U></A></P><P><A href="https://community.sap.com/t5/blogs/blogworkflowpage/blog-id/technology-blog-sap/article-id/187014" target="_blank"><U>Part 3 Configuring External Governance</U></A></P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P> 2025-12-17T06:08:15.318000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/part-2-setting-up-an-external-governance-workflow/ba-p/14286676 Part 2: Setting Up an External Governance Workflow 2025-12-17T06:08:29.647000+01:00 Kasturi https://community.sap.com/t5/user/viewprofilepage/user-id/25297 <P>Organizations that require more sophisticated approval flows can configure <STRONG>external governance</STRONG>.<BR />This setup allows subscription requests raised within Developer Hub to be reviewed, approved, or rejected through an external system (such as SAP Build Process Automation, any other custom workflow, or an custom application).</P><P>Before we dive into the implementation details, it is helpful to revisit the foundations covered in the earlier parts of this series.<BR />In <STRONG><U>Part 1</U></STRONG>, we explored the importance of governance within Developer Hub and how administrators can configure built-in governance levels to balance openness with control.</P><P><STRONG>Step 1: Enable External Governance in Developer Hub</STRONG></P><OL><LI>Logon to Developer Hub.</LI><LI>Navigate <STRONG>to Admin Center</STRONG>&nbsp;&gt;&nbsp;<STRONG>Manage Governance Settings, </STRONG>click on the <STRONG>Subscriptions</STRONG> tab, and choose <STRONG>Edit</STRONG>.</LI><LI>Now, select the option <STRONG>Manage Approval Outside Developer Hub </STRONG>and choose<STRONG> Save</STRONG>.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kasturi_2-1765267783780.png" style="width: 873px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/350038i5090000EAED7DAB7/image-dimensions/873x495?v=v2" width="873" height="495" role="button" title="Kasturi_2-1765267783780.png" alt="Kasturi_2-1765267783780.png" /></span></P><P>This redirects all future subscription requests to your external governance system for approval.</P><P><STRONG>Note:</STRONG> Enabling this setting alone isn’t enough—several prerequisites must be completed for the setup to function correctly. Make sure you first complete all prerequisite steps and only then update the governance settings.</P><P><STRONG>Step 2: Implement the Service Provider Interface (SPI)</STRONG></P><P>The <STRONG>customer subaccount administrator</STRONG> must implement the <STRONG>Service Provider Interface (SPI)</STRONG>, which handles the redirection of subscription requests to your external system.<BR />This could be a workflow, backend service, or UI application that processes approvals.</P><P>SPI specifications, including interface details and parameters, are available on the <STRONG>SAP Business Accelerator Hub</STRONG>.</P><P>&nbsp;<STRONG>Recommendation</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">Use <STRONG>SAP Integration Suite API Management</STRONG> for implementing the Service Provider Interface<STRONG> (</STRONG>SPI), and <STRONG>SAP Build Process Automation</STRONG> for designing your external approval workflow. For step-by- step instruction, see <U>Part 3: Implementing External Governance Using SAP Integration Suite and SAP Build Process Automation (add blog link).</U></P><P><STRONG>Step 3: Create a Destination in SAP BTP Cockpit</STRONG></P><P>Once the SPI is in place, create a <STRONG>destination</STRONG> in your SAP BTP subaccount that points to the SPI endpoint.<BR />This destination should include:</P><UL><LI>The SPI service URL</LI><LI>Authentication credentials (e.g., OAuth2, Basic Auth)</LI></UL><P>This setup ensures Developer Hub can securely send subscription requests to your external system.</P><OL><LI>In your web browser, log on to SAP BTP Cockpit and navigate to your source subaccount.</LI><LI>Choose the <STRONG>Connectivity &gt;</STRONG>&nbsp;<STRONG>Destinations</STRONG> tab in the left-hand pane.</LI><LI>Choose <STRONG>Create</STRONG> and in the <STRONG>Create New Destination</STRONG> popup, select <STRONG>From Scratch</STRONG> to create a new destination manually.</LI><LI>In <STRONG>Destination Details</STRONG> section, fill in all the required details according to the descriptions provided in the table and choose <STRONG>Create</STRONG>.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kasturi_3-1765267783794.png" style="width: 903px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/350039i896E1D9BF61491CA/image-dimensions/903x475?v=v2" width="903" height="475" role="button" title="Kasturi_3-1765267783794.png" alt="Kasturi_3-1765267783794.png" /></span></P><P><STRONG>Note: </STRONG>Use the credentials provided by the customer sub-account administrator. Supported authentication methods include OAuth 2.0, Client Certificate, and Basic authentication.</P><TABLE><TBODY><TR><TD><P><STRONG>Fields</STRONG></P></TD><TD><P><STRONG>Details</STRONG></P></TD></TR><TR><TD><P>Name</P></TD><TD><P>Enter DeveloperHub_Governance_SPI as the destination name.</P></TD></TR><TR><TD><P>Type</P></TD><TD><P>Enter HTTP as the supported type.</P></TD></TR><TR><TD><P>Description</P></TD><TD><P>Enter a brief description stating the purpose of creating a new destination in the Description field.</P></TD></TR><TR><TD><P>URL</P></TD><TD><P>Enter the external governance application URL.</P><P>Since, in this use case, you are using the API proxy as the SPI implementation in SAP Build, enter the API proxy connectivity link in the Destination URL field and provide the corresponding authentication details.</P></TD></TR><TR><TD><P>Proxy Type</P></TD><TD><P>Internet</P></TD></TR><TR><TD><P>Authentication</P></TD><TD><P>Select the authentication type depending on your requirement.</P><OL><UL><LI>Basic: User provides a simple username and password based authentication.</LI><LI>Client Certificate: The user provides the Key Store Source, Key Store Location, and Key Store Password. The server verifies the certificate to grant access.</LI><LI>OAuth2ClientCredentials: Used when third-party services need to access resources without sharing the user’s password. A backend service authenticating with a resource server to access an API using Client ID, Client Secret, and Token Service URL. The token URL should correspond to the customer governance application when OAuth2 is being used.</LI></UL></OL></TD></TR></TBODY></TABLE><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;You can also do a <STRONG>Check Connection</STRONG> to verify whether you've added the destination correctly.</P><P><STRONG>Step 5: Update Developer Hub with Governance Decisions</STRONG></P><P>After the external administrator approves or rejects a subscription request, that decision must be communicated back to Developer Hub.</P><P>The external governance system does this by calling the API <A href="https://help.sap.com/docs/link-disclaimer?site=https%3A%2F%2Fapi.sap.com%2Fapi%2FDevPortal_ExternalGovernance_CF%2Foverview" target="_blank" rel="noopener noreferrer"><STRONG>Developer Hub - External Governance (CF)</STRONG></A> published on SAP Business Accelerator Hub, using credentials tied to the <STRONG>AuthGroup.External.Reviewer</STRONG> role collection.</P><P>Once the decision is received, Developer Hub updates the subscription status accordingly.</P><P><STRONG>When Governance Takes Effect</STRONG></P><P>Once all prerequisites are fulfilled and <STRONG>Manage Approval Outside Developer Hub</STRONG> is enabled:</P><UL><LI>New subscription requests are automatically routed to the external approval system.</LI><LI>Approvals and rejections are reflected in Developer Hub based on feedback from the external workflow.</LI></UL><P class="lia-indent-padding-left-60px" style="padding-left : 60px;"><span class="lia-unicode-emoji" title=":warning:">⚠️</span><STRONG>Caution:</STRONG><BR />If prerequisites aren’t configured correctly, subscription requests will fail. Always verify your setup before enabling external governance.</P><P><STRONG>How the External Subscription Process Works</STRONG></P><OL><LI><STRONG>Developer Submits a Subscription Request</STRONG></LI><UL><LI>The developer subscribes to an API product from the Developer Hub catalog.</LI><LI>The request is automatically sent to the external approval system.</LI></UL><LI><STRONG>External Administrator Reviews the Request</STRONG></LI><UL><LI>The external admin (using a workflow, e.g., SAP Build Process Automation) reviews and approves or rejects the request.</LI><LI>They can view API details in Developer Hub or via APIs on SAP Business Accelerator Hub.</LI></UL><LI><STRONG>Developer Receives the Decision</STRONG></LI></OL><UL><LI>If approved, the developer receives a confirmation email containing a link to the application with the subscribed product.</LI></UL><OL><UL><LI>If rejected, they receive a rejection email, and the pending subscription is deleted.</LI><LI>Developers can monitor request status under <STRONG>My Workspace → Subscriptions → Pending Approval.</STRONG></LI></UL></OL><P><STRONG>Configuration Requirements Summary</STRONG></P><P>To ensure smooth external governance:</P><UL><LI>Set the governance option to <STRONG>Manage Approval Outside Developer Hub</STRONG></LI><LI>Select the <STRONG>Allow Subscription </STRONG>option for the product.</LI><LI>&nbsp;Complete all the Service Provider Interface (SPI) and destination configurations</LI><LI>Integrate the external system properly using the Developer Hub API</LI></UL><P><STRONG>Note</STRONG>: ️ You cannot remove or modify products with pending or approved subscriptions.<BR />To apply configuration updates, bring the product into draft mode, make changes, and republish it.</P><P><STRONG>Conclusion</STRONG></P><P>Developer Hub’s governance capabilities provide the flexibility and control modern enterprises need to manage their API ecosystems effectively.</P><P>Whether your organization prefers <STRONG>internal governance</STRONG> through SAP systems or <STRONG>external workflows</STRONG> via custom integrations, Developer Hub empowers administrators to tailor governance processes that align with their business policies—ensuring secure, compliant, and well-managed API access across your developer community.</P><P>&nbsp;</P> 2025-12-17T06:08:29.647000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/part-3-implementing-external-governance-in-developer-hub-using-sap/ba-p/14286965 Part 3: Implementing External Governance in Developer Hub Using SAP Integration Suite and SAP Build 2025-12-17T06:08:57.959000+01:00 Kasturi https://community.sap.com/t5/user/viewprofilepage/user-id/25297 <P>In <A href="https://community.sap.com/t5/blogs/blogworkflowpage/blog-id/technology-blog-sap/article-id/187006" target="_blank"><STRONG><U>Part 1</U></STRONG></A>, we explored the importance of governance within Developer Hub and how administrators can configure built-in governance levels to balance openness with control.<BR />In <A href="https://community.sap.com/t5/blogs/blogworkflowpage/blog-id/technology-blog-sap/article-id/187009" target="_blank"><STRONG><U>Part 2</U></STRONG></A>, we walked through how to set up an external governance workflow, enabling subscription requests to be processed through systems such as SAP Build Process Automation.</P><P>Building on these foundations, Part 3 focuses on how to implement the Service Provider Interface (SPI) using SAP Integration Suite – API Management and how to design and manage your approval workflow with SAP Build Process Automation. This combined approach ensures a streamlined, standardized, and well-governed integration between Developer Hub subscription flows and your organization’s external approval mechanisms.</P><P>Before we dive into the implementation details, it is helpful to revisit the foundations covered in the earlier parts of this series.</P><P><STRONG>Recommended Workflow:</STRONG></P><OL><LI>Set up the External Workflow in SAP Build</LI></OL><P class="lia-indent-padding-left-60px" style="padding-left : 60px;">Leverage SAP Build Process Automation to design the external governance workflow. For more information on SAP Build Process Automation, see <A href="https://help.sap.com/docs/link-disclaimer?site=https%3A%2F%2Flearning.sap.com%2Fproducts%2Fsap-build%2Fprocess-automation" target="_blank" rel="noopener noreferrer">SAP Process Automation | SAP Learning</A>.</P><P class="lia-indent-padding-left-60px" style="padding-left : 60px;">Sample workflow to review the applications</P><P class="lia-indent-padding-left-60px" style="padding-left : 60px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kasturi_0-1765271077927.png" style="width: 917px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/350082i35FD0D92F11ACC27/image-dimensions/917x550?v=v2" width="917" height="550" role="button" title="Kasturi_0-1765271077927.png" alt="Kasturi_0-1765271077927.png" /></span></P><P class="lia-indent-padding-left-60px" style="padding-left : 60px;">On click of approve/reject call the Developer Hub API to inform about the decision. You can find the API details here: <A href="https://api.sap.com/api/DevPortal_ExternalGovernance_CF/resource/Governance_Decision" target="_blank" rel="noopener noreferrer">Developer Hub - External Governance (CF)&nbsp;-Governance Decision</A></P><P class="lia-indent-padding-left-60px" style="padding-left : 60px;">Sample workflow to invalidate the credentials when they were shared with Developer Hub</P><P class="lia-indent-padding-left-60px" style="padding-left : 60px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kasturi_1-1765271821735.png" style="width: 858px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/350086iF48B67F5DD6B7A6A/image-dimensions/858x550?v=v2" width="858" height="550" role="button" title="Kasturi_1-1765271821735.png" alt="Kasturi_1-1765271821735.png" /></span></P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;">On click of <STRONG>Submit</STRONG> the credentials can be deleted in Developer Hub by calling the API: <A href="https://api.sap.com/api/DevPortal_ExternalGovernance_CF/resource/Deletion_Confirmation" target="_self" rel="noopener noreferrer">Developer Hub - External Governance (CF) - Deletion Confirmation</A></P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;">Note: If you don’t have any externally managed API products, you can skip this step.</P><H3 id="toc-hId-1895642922"><FONT size="4">Obtain Credentials from Workflow</FONT></H3><P>Create a service instance and a service key of SAP Build Process Automation Service in SAP BTP Cockpit to obtain the credentials. For more information, see <A href="https://help.sap.com/docs/build-process-automation/sap-build-process-automation/create-service-instance?locale=en-US" target="_blank" rel="noopener noreferrer">Create a Service Instance</A> and <A href="https://help.sap.com/docs/build-process-automation/sap-build-process-automation/create-service-key-for-sap-build-process-automation-instance" target="_blank" rel="noopener noreferrer">Create a Service Key for the SAP Build Process Automation Instance | SAP Help Portal</A>.</P><P><FONT size="5"><STRONG><FONT size="4">1. Create the API proxy that acts as your SPI implementation for SAP Build&nbsp;</FONT> &nbsp;&nbsp;</STRONG></FONT></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><STRONG>Prerequisite</STRONG>:</P><UL><LI>Create an API provider</LI></UL><P class="lia-indent-padding-left-60px" style="padding-left : 60px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kasturi_4-1765272613646.png" style="width: 1181px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/350097i820F8F2E078D2E1C/image-dimensions/1181x466?v=v2" width="1181" height="466" role="button" title="Kasturi_4-1765272613646.png" alt="Kasturi_4-1765272613646.png" /></span></P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;">a). Log on to the SAP Integration Suite.<BR />b). Navigate to the API Configuration Page.<BR />From the side navigation pane, choose <STRONG>Configure → APIs</STRONG>.</P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;"><STRONG>c). Create a New API Proxy.</STRONG><BR />Click <STRONG>Create</STRONG> to start defining your API proxy.</P><UL><LI>Discover the policy template</LI></UL><P>Navigate to the <STRONG>Discover</STRONG> tab and search for the <STRONG>SAP API Management Governance</STRONG> &lt;Link&gt; package. Open the package and go to <STRONG>Artifacts</STRONG>. Select the template <STRONG>Developer Hub Governance with SAP Build Process Automation</STRONG> and, under <STRONG>Actions</STRONG>, choose <STRONG>Copy</STRONG>.</P><P><STRONG>Steps to create an API</STRONG><STRONG>&nbsp;</STRONG></P><OL><LI>Log on to the SAP Integration Suite.<BR />Access your Integration Suite environment with administrator privileges.</LI><LI>Navigate to the API <STRONG>Configuration</STRONG> Page.<BR />From the side navigation pane, choose <STRONG>Configure → APIs</STRONG>.</LI><LI>Click <STRONG>Create</STRONG> to start defining your API proxy.</LI></OL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kasturi_5-1765272919769.png" style="width: 936px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/350099iCD3DB50CAB4B7FDF/image-dimensions/936x283?v=v2" width="936" height="283" role="button" title="Kasturi_5-1765272919769.png" alt="Kasturi_5-1765272919769.png" /></span></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">4. Select the <STRONG>Provider</STRONG> method and fill in the required details.</P><P class="lia-indent-padding-left-60px" style="padding-left : 60px;">From the dropdown, choose the API Provider you created for SAP Build Process Automation in the prerequisite steps. Then enter the <STRONG>API Name</STRONG>, <STRONG>Title</STRONG>, and <STRONG>API Base Path</STRONG>.</P><P class="lia-indent-padding-left-60px" style="padding-left : 60px;"><STRONG>Note:</STRONG> In the <STRONG>URL</STRONG> field, enter: /workflow/rest/v1/workflow-instances.</P><P class="lia-indent-padding-left-60px" style="padding-left : 60px;">Fields such as <STRONG>API State</STRONG> and <STRONG>Host Alias</STRONG> will populate automatically. Set the <STRONG>Service Type</STRONG> to <STRONG>REST</STRONG>.</P><P>&nbsp;</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kasturi_6-1765272919778.png" style="width: 925px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/350100i0E2F5B8E1328FDCB/image-dimensions/925x504?v=v2" width="925" height="504" role="button" title="Kasturi_6-1765272919778.png" alt="Kasturi_6-1765272919778.png" /></span>5. Review your configurations and choose <STRONG>Create</STRONG>.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">. Now, go to the <STRONG>Policies</STRONG> tab, click on <STRONG>Policy Template </STRONG>and choose<STRONG> Import.&nbsp;</STRONG></P><P><STRONG>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</STRONG>To call the SAP Build workflow, import this policy template and update the following script:</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Script Name: <STRONG>setVariables</STRONG></P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;"><STRONG>js</STRONG><STRONG>governanceWorkflowDefinitionId</STRONG>: The workflow ID for the governance approval/rejection process.</P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;"><STRONG>keyInvalidationWorkflowDefinitionId</STRONG>: The workflow ID for the key invalidation request.</P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;"><STRONG>keyInvalidationResponse</STRONG>:</P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;">Set to <STRONG>200</STRONG> if you want Developer Hub to immediately proceed with application deletion once the workflow request is created.</P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;">Set to <STRONG>202</STRONG> if you want Developer Hub to wait for confirmation before deleting the application.</P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;">In the top-right corner of the API details page, click the <STRONG>⋯</STRONG> <STRONG>(More options)</STRONG> button. From the dropdown menu, select <STRONG>Deploy</STRONG>.</P><P><STRONG>2.&nbsp; Add the API Proxy URL to the Destination in SAP BTP Cockpit</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">After implementing the Service Provider Interface (SPI), the customer subaccount administrator creates a destination in their SAP BTP subaccount pointing to the SPI endpoint.</P><OL class="lia-list-style-type-lower-alpha"><LI>In your web browser, log on to SAP BTP Cockpit and navigate to your source subaccount.</LI><LI>Choose the <STRONG>Connectivity &gt;</STRONG>&nbsp;<STRONG>Destinations</STRONG> tab in the left-hand pane.</LI><LI>Choose <STRONG>Create</STRONG> and in the <STRONG>Create New Destination</STRONG> popup, select <STRONG>From Scratch</STRONG> to create a new destination manually.</LI><LI>In <STRONG>Destination Details</STRONG> section, fill in all the required details according to the descriptions provided in the table and choose <STRONG>Create</STRONG>.</LI></OL><P class="lia-indent-padding-left-60px" style="padding-left : 60px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kasturi_7-1765272919786.png" style="width: 840px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/350098i668E4F8D723F8873/image-dimensions/840x442?v=v2" width="840" height="442" role="button" title="Kasturi_7-1765272919786.png" alt="Kasturi_7-1765272919786.png" /></span></P><P class="lia-indent-padding-left-90px" style="padding-left : 90px;"><STRONG>Note: </STRONG>Use the credentials provided by the customer sub-account administrator. Supported authentication methods include OAuth 2.0, Client Certificate, and Basic authentication.</P><TABLE width="928px"><TBODY><TR><TD width="114.167px"><P><STRONG>Fields</STRONG></P></TD><TD width="812.708px"><P><STRONG>Details</STRONG></P></TD></TR><TR><TD width="114.167px"><P>Name</P></TD><TD width="812.708px"><P>Enter DeveloperHub_Governance_SPI as the destination name.</P></TD></TR><TR><TD width="114.167px"><P>Type</P></TD><TD width="812.708px"><P>Enter HTTP as the supported type.</P></TD></TR><TR><TD width="114.167px"><P>Description</P></TD><TD width="812.708px"><P>Enter a brief description stating the purpose of creating a new destination in the Description field.</P></TD></TR><TR><TD width="114.167px"><P>URL</P></TD><TD width="812.708px"><P>Enter the external governance application URL.</P><P>Since, in this use case, you are using the API proxy as the SPI implementation in SAP Build, enter the API proxy connectivity link in the Destination URL field and provide the corresponding authentication details.</P></TD></TR><TR><TD width="114.167px"><P>Proxy Type</P></TD><TD width="812.708px"><P>Internet</P></TD></TR><TR><TD width="114.167px"><P>Authentication</P></TD><TD width="812.708px"><P>Choose <STRONG>OAuth2ClientCredentials.</STRONG></P><P>Fetch the Client ID, Client Secret, and Token Service URL from the workflow credentials. Refer to the “Obtain Credentials from Workflow” section for details. The token URL should correspond to the customer governance application when OAuth2 is being used.</P></TD></TR></TBODY></TABLE><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">You can also do a <STRONG>Check Connection</STRONG> to verify whether you've added the destination correctly.</P><P><STRONG>3. Enable External Governance in Developer Hub</STRONG></P><OL class="lia-list-style-type-lower-alpha"><LI>Logon to Developer Hub.</LI><LI>Navigate <STRONG>to Admin Center</STRONG>&nbsp;&gt;&nbsp;<STRONG>Manage Governance Settings, </STRONG>click on the <STRONG>Subscriptions</STRONG> tab, and choose <STRONG>Edit</STRONG>.</LI><LI>Now, select the option <STRONG>Manage Approval Outside Developer Hub </STRONG>and choose<STRONG> Save</STRONG>.</LI></OL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Kasturi_8-1765272919790.png" style="width: 804px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/350101iA468E29D25A9740C/image-dimensions/804x456?v=v2" width="804" height="456" role="button" title="Kasturi_8-1765272919790.png" alt="Kasturi_8-1765272919790.png" /></span></P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; This redirects all future subscription requests to your external governance system for approval.</P><P>&nbsp;</P><P><STRONG>&nbsp;</STRONG></P><DIV class="">&nbsp;</DIV><P>&nbsp;</P> 2025-12-17T06:08:57.959000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/streaming-in-sap-api-management-extended-guide/ba-p/14294841 Streaming in SAP API Management: Extended Guide 2025-12-21T13:24:57.654000+01:00 Bhavani_Baisani https://community.sap.com/t5/user/viewprofilepage/user-id/177497 <UL class="lia-list-style-type-square"><LI><H3 id="toc-hId-1896505834"><SPAN>&nbsp;Why Streaming Matters</SPAN></H3></LI></UL><P><SPAN>By default, APIM buffers request/response payloads so policies can operate on the full message. Non-streamed payloads are limited to ~10 MB. When payloads exceed the buffer, APIM returns a fault. Streaming lifts this buffer by passing data through without payload modifications, allowing up to ~500 MB per direction (subject to connection stability).</SPAN></P><H4 id="toc-hId-1829075048"><SPAN>Key Limits</SPAN></H4><UL><LI><SPAN>Non-streamed request/response: up to 10 MB</SPAN></LI><LI><SPAN>&nbsp;Streamed request/response: up to ~500 MB</SPAN></LI><LI><SPAN>&nbsp;Header limits: Request headers ~18 KB; Response headers ~25 KB</SPAN></LI><LI><SPAN>&nbsp;Resource files (XSL/JS/Python) ~15 MB (design-time)</SPAN></LI></UL><P><SPAN>Note: When streaming is enabled, policies that read or transform the payload are bypassed and may fail on large payloads.</SPAN></P><UL class="lia-list-style-type-square"><LI><H3 id="toc-hId-1503478824"><SPAN>&nbsp;Properties Explained</SPAN></H3></LI></UL><P><SPAN>request.streaming.enabled (ProxyEndpoint &amp; TargetEndpoint):<BR />false: buffer requests; payload policies operate.<BR />true: stream request payload to target; payload-reading policies in ProxyEndpoint request flow are bypassed.</SPAN></P><P><SPAN>response.streaming.enabled (ProxyEndpoint &amp; TargetEndpoint):<BR />false: buffer responses; payload policies operate.<BR />true: stream response payload back to client; payload-reading policies in ProxyEndpoint response flow are bypassed.</SPAN></P><UL class="lia-list-style-type-square"><LI><H3 id="toc-hId-1306965319"><SPAN>&nbsp;Configure via UI (APIM Portal)</SPAN></H3></LI></UL><P><SPAN>Steps:<BR />1. Go to Develop → APIs → select your proxy.<BR />2. Open Proxy Endpoint tab → Properties → Add:<BR />&nbsp;&nbsp; • Name: request.streaming.enabled, Value: true<BR />&nbsp;&nbsp; • Name: response.streaming.enabled, Value: true<BR />3. Open Target Endpoint tab → Properties → Add same properties.<BR />4. Save and redeploy the proxy.</SPAN></P><UL class="lia-list-style-type-square"><LI><H3 id="toc-hId-1110451814"><SPAN>Configure via XML (Proxy &amp; Target Definitions)</SPAN></H3></LI></UL><H4 id="toc-hId-1043021028"><SPAN>Proxy Endpoint sample:</SPAN></H4><P><SPAN>&lt;?xml version='1.0' encoding='UTF-8' standalone='yes'?&gt;<BR />&lt;ProxyEndPoint default='true'&gt;<BR />&nbsp; &lt;name&gt;default&lt;/name&gt;<BR />&nbsp; &lt;base_path&gt;/my/api&lt;/base_path&gt;<BR />&nbsp; &lt;properties&gt;<BR />&nbsp;&nbsp;&nbsp; &lt;property&gt;&lt;name&gt;request.streaming.enabled&lt;/name&gt;&lt;value&gt;true&lt;/value&gt;&lt;/property&gt;<BR />&nbsp;&nbsp;&nbsp; &lt;property&gt;&lt;name&gt;response.streaming.enabled&lt;/name&gt;&lt;value&gt;true&lt;/value&gt;&lt;/property&gt;<BR />&nbsp; &lt;/properties&gt;<BR />&lt;/ProxyEndPoint&gt;</SPAN></P><H4 id="toc-hId-846507523"><SPAN>Target Endpoint sample:</SPAN></H4><P><SPAN>&lt;?xml version='1.0' encoding='UTF-8' standalone='yes'?&gt;<BR />&lt;TargetEndPoint&gt;<BR />&nbsp; &lt;name&gt;default&lt;/name&gt;<BR />&nbsp; &lt;url&gt;<A href="https://backend.example.com/v1" target="_blank" rel="noopener nofollow noreferrer">https://backend.example.com/v1</A>&lt;/url&gt;<BR />&nbsp; &lt;properties&gt;<BR />&nbsp;&nbsp;&nbsp; &lt;property&gt;&lt;name&gt;request.streaming.enabled&lt;/name&gt;&lt;value&gt;true&lt;/value&gt;&lt;/property&gt;<BR />&nbsp;&nbsp;&nbsp; &lt;property&gt;&lt;name&gt;response.streaming.enabled&lt;/name&gt;&lt;value&gt;true&lt;/value&gt;&lt;/property&gt;<BR />&nbsp; &lt;/properties&gt;<BR />&lt;/TargetEndPoint&gt;</SPAN></P><UL class="lia-list-style-type-square"><LI><H3 id="toc-hId-520911299"><SPAN>&nbsp;Error 'Screenshots' (Fault Payloads)</SPAN></H3></LI></UL><H4 id="toc-hId-453480513"><SPAN>Non-streamed payload exceeds 10 MB:</SPAN></H4><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Non streamed.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/354437i47501201C1CFE68C/image-size/large?v=v2&amp;px=999" role="button" title="Non streamed.png" alt="Non streamed.png" /></span></SPAN></P><H4 id="toc-hId-256967008"><SPAN>Streaming enabled but payload-transform policy attached:</SPAN></H4><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Streaming.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/354438iDB90C14D99F886B1/image-size/large?v=v2&amp;px=999" role="button" title="Streaming.png" alt="Streaming.png" /></span></SPAN></P><UL class="lia-list-style-type-square"><LI><H3 id="toc-hId--143860585"><SPAN>&nbsp;Policies: What Works / What to Avoid</SPAN></H3></LI></UL><P><SPAN>Works with streaming: Verify API Key, OAuth verification, Access Control, basic header logging (no body read).<BR />Avoid with streaming: JSON↔XML transforms, schema validations, masking/redaction, payload enrichment — these force buffering or fail.</SPAN></P><UL class="lia-list-style-type-square"><LI><H3 id="toc-hId--340374090"><SPAN>&nbsp;Patterns with SAP Cloud Integration (CPI)</SPAN></H3></LI></UL><P><SPAN>Use APIM for pass-through streaming of large payloads. Perform transformations/validations in CPI or backend. For very large datasets, consider paging, split-and-collect, or batch processing.</SPAN></P><H5 id="toc-hId--1123693609"><SPAN>Optional: Streaming + gzip + chunked</SPAN></H5><P><SPAN>Compress the entire payload first, then stream using chunked transfer (Content-Encoding: gzip; Transfer-Encoding: chunked; no Content-Length).</SPAN></P><UL class="lia-list-style-type-square"><LI><H3 id="toc-hId--733401100"><SPAN>&nbsp;Troubleshooting</SPAN></H3></LI></UL><UL><LI><SPAN>TooBigBody: Enable streaming for the affected direction; remove payload-transform policies.</SPAN></LI><LI><SPAN>Policies inconsistent &gt;10 MB: Redesign to avoid body access in streamed flows.</SPAN></LI><LI><SPAN>Timeouts: Adjust TargetEndpoint transport properties (connect.timeout.millis, io.timeout.millis) per backend latency.</SPAN></LI></UL><UL class="lia-list-style-type-square"><LI><H3 id="toc-hId--929914605"><SPAN>&nbsp;FAQs</SPAN></H3></LI></UL><P><SPAN>Q: Can I enable streaming on all proxies?<BR />A: Technically yes, but only enable when required; payload policies will be bypassed.<BR />Q: Maximum streamed size?<BR />A: ~500 MB per request/response direction; ensure stable connections.<BR />Q: Can I transform payload while streaming?<BR />A: Not recommended in APIM; move transforms to CPI/backend.</SPAN></P><UL class="lia-list-style-type-square"><LI><H3 id="toc-hId--1126428110"><SPAN>&nbsp;Pre-deployment Checklist</SPAN></H3></LI></UL><P><SPAN>☐ Identify direction (request/response) needing streaming.<BR />☐ Remove payload-inspecting policies from streamed flows.<BR />☐ Tune timeouts for long streams.<BR />☐ Communicate design impacts to teams (no in-proxy transforms).<BR />☐ Validate with large test payloads.</SPAN></P><H5 id="toc-hId--1909747629"><SPAN>Disclaimer</SPAN></H5><P><SPAN>This content reflects implementation experience and references official SAP Help pages. Always consult SAP Help for the latest guidance and product limits.</SPAN></P><H5 id="toc-hId--2106261134"><SPAN>References</SPAN></H5><P><SPAN>SAP Help: Enable Streaming of Requests and Responses in an API Proxy – <A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/enable-streaming-of-requests-and-responses-in-api-proxy" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/integration-suite/sap-integration-suite/enable-streaming-of-requests-and-responses-in-api-proxy</A></SPAN></P><P><SPAN>SAP Help: Proxy Endpoint Properties – <A href="https://help.sap.com/docs/sap-api-management/sap-api-management/proxy-endpoint-properties" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/sap-api-management/sap-api-management/proxy-endpoint-properties</A></SPAN></P><P><SPAN>SAP Help: Limits in API Management – <A href="https://help.sap.com/docs/sap-api-management/sap-api-management/limits" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/sap-api-management/sap-api-management/limits</A></SPAN></P><P><SPAN>SAP Help (Neo) – Sample streaming configuration – <A href="https://help.sap.com/docs/sap-api-management/sap-api-management-for-neo-environment/enable-streaming-of-requests-and-responses-in-api-proxy" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/sap-api-management/sap-api-management-for-neo-environment/enable-streaming-of-requests-and-responses-in-api-proxy</A></SPAN></P> 2025-12-21T13:24:57.654000+01:00 https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-members/turning-sap-btp-integration-suite-as-a-core-erp-module-for-business-apis/ba-p/14302771 Turning SAP BTP Integration Suite as a core ERP module for Business APIs & Business AI 2026-01-07T12:19:25.663000+01:00 gsimeone https://community.sap.com/t5/user/viewprofilepage/user-id/12834 <H2 id="toc-hId-1767360596" id="toc-hId-1787680127">ERP modernization is not enough</H2><P>Over recent years, SAP clients have concentrated transformation efforts on<SPAN>&nbsp;</SPAN><STRONG>S/4HANA</STRONG><SPAN>&nbsp;</SPAN>to standardize processes, adopt cloud operating models (public, private, hybrid, sovereign), and enable continuous evolution. In parallel, the<SPAN>&nbsp;</SPAN><STRONG>integration backbone</STRONG><SPAN>&nbsp;</SPAN>must evolve from<SPAN>&nbsp;</SPAN><STRONG>SAP PI-PO</STRONG><SPAN>&nbsp;</SPAN>to<SPAN>&nbsp;</SPAN><STRONG>SAP Integration Suite</STRONG>, ensuring your enterprise can operate<SPAN>&nbsp;</SPAN><STRONG>API‑first</STRONG><SPAN>&nbsp;</SPAN>and<SPAN>&nbsp;</SPAN><STRONG>Event‑first</STRONG>, at the speed and scale modern business demands.</P><UL><LI><STRONG>Context:</STRONG><SPAN>&nbsp;</SPAN>SAP PI/PO maintenance aligns with NetWeaver 7.5 lifecycles. But this decision point is not just about end‑of‑maintenance.</LI><LI><STRONG>Imperative:</STRONG><SPAN>&nbsp;</SPAN>Integration modernization is foundational to agility, AI‑enabled processes, and resilient cloud operations across heterogeneous landscapes.</LI></UL><HR /><H2 id="toc-hId-1570847091" id="toc-hId-1591166622">Beyond “middleware”: What SAP Integration Suite really is</H2><P><STRONG>SAP Integration Suite</STRONG><SPAN>&nbsp;</SPAN>is not a one‑to‑one PI-PO replacement. It’s an<SPAN>&nbsp;</SPAN><STRONG>enterprise iPaaS</STRONG><SPAN>&nbsp;</SPAN>on<SPAN>&nbsp;</SPAN><STRONG>SAP BTP</STRONG><SPAN>&nbsp;</SPAN>that unifies:</P><UL><LI><STRONG>Cloud Integration</STRONG><SPAN>&nbsp;</SPAN>for process and data integration</LI><LI><STRONG>API Management</STRONG><SPAN>&nbsp;</SPAN>to design, secure, publish, and govern<SPAN>&nbsp;</SPAN><STRONG>Business APIs</STRONG></LI><LI><STRONG>Event Mesh</STRONG><SPAN>&nbsp;</SPAN>for event‑driven architectures (EDA)</LI><LI><STRONG>Integration Advisor</STRONG><SPAN>&nbsp;</SPAN>and content packages for accelerated build</LI><LI><STRONG>Monitoring and observability</STRONG><SPAN>&nbsp;</SPAN>for end‑to‑end visibility across hybrid landscapes</LI></UL><P>This shift, from “interfaces” to "<STRONG>Business APIs</STRONG>", enables secure, discoverable, measurable, and even monetizable capabilities. It opens a path to<SPAN>&nbsp;</SPAN><STRONG>Composable Architecture</STRONG>, where SAP and non‑SAP modules can be assembled, re‑assembled, and composed to meet changing business needs.</P><P><STRONG>Key benefits:</STRONG></P><UL><LI><STRONG>Speed:</STRONG><SPAN>&nbsp;</SPAN>Faster delivery via reusable APIs, events, and prebuilt content</LI><LI><STRONG>Quality:</STRONG><SPAN>&nbsp;</SPAN>Strong governance, testing patterns, and observability</LI><LI><STRONG>Resilience:</STRONG><SPAN>&nbsp;</SPAN>Decoupling through asynchronous events and queues</LI><LI><STRONG>Scale &amp; Security:</STRONG><SPAN>&nbsp;</SPAN>Unified policy enforcement, rate limiting, and consistent identity/access models</LI></UL><HR /><H2 id="toc-hId-1374333586" id="toc-hId-1394653117">From Monolith to Modular: Real‑Time, Composable Integration</H2><P>For<SPAN>&nbsp;</SPAN><STRONG>Supply Chain</STRONG>,<SPAN>&nbsp;</SPAN><STRONG>Manufacturing</STRONG>, and other data‑intensive domains, real‑time integration is essential. By slicing the SAP monolith into modular building blocks, organizations can distribute, elevate, and govern data across the enterprise and partners ecosystem.</P><UL><LI><STRONG>Decoupled communication</STRONG><SPAN>&nbsp;</SPAN>allows plug‑and‑play assembly of new components and systems.</LI><LI><STRONG>Event‑driven patterns</STRONG><SPAN>&nbsp;</SPAN>(domain events, queues, fan‑out) reduce coupling and improve reliability.</LI><LI><STRONG>Business APIs + events</STRONG><SPAN>&nbsp;</SPAN>become the operating surface for cross‑system processes and innovation.</LI></UL><HR /><H2 id="toc-hId-1177820081" id="toc-hId-1198139612">Preparing for Enterprise AI Agents: Event‑First, API‑First</H2><P>AI is rapidly moving beyond chat into<SPAN>&nbsp;</SPAN><STRONG>agents</STRONG><SPAN>&nbsp;</SPAN>that act, use tools, and orchestrate work across systems. SAP is rolling out agentic capabilities on<SPAN>&nbsp;</SPAN><STRONG>SAP BTP</STRONG>, including<SPAN>&nbsp;</SPAN><STRONG>Joule Studio</STRONG><SPAN>&nbsp;</SPAN>for Enterprise Agents, and secure access to foundation models via<SPAN>&nbsp;</SPAN><STRONG>SAP AI Core</STRONG><SPAN>&nbsp;</SPAN>and<SPAN>&nbsp;</SPAN><STRONG>Generative AI Hub</STRONG>. Capabilities and patterns emerging in the ecosystem include:</P><UL><LI><STRONG>Model Context Protocol (MCP)</STRONG><SPAN>&nbsp;</SPAN>to simplify agent connections to tools and data</LI><LI><STRONG>Agent‑to‑Agent (A2A)</STRONG><SPAN>&nbsp;</SPAN>patterns/protocols for secure, autonomous collaboration</LI><LI><STRONG>AI Adapter</STRONG><SPAN>&nbsp;</SPAN>patterns to link Integration Suite flows with GenAI tasks</LI></UL><P>In this operating model,<SPAN>&nbsp;</SPAN><STRONG>Business APIs</STRONG><SPAN>&nbsp;</SPAN>and<SPAN>&nbsp;</SPAN><STRONG>events</STRONG><SPAN>&nbsp;</SPAN>let agents subscribe to near real‑time signals, trigger actions/approvals, and enrich processes,&nbsp;<STRONG>reusing the IT estate and preserving existing investments</STRONG><SPAN>&nbsp;</SPAN>while modernizing how work gets done.</P><HR /><H2 id="toc-hId-981306576" id="toc-hId-1001626107">A Practical PI-PO to Integration Suite Path</H2><P><STRONG>Treat the transformation as a program</STRONG>, not a lift‑and‑shift. A pragmatic path often includes:</P><OL><LI><P><STRONG>Assessment &amp; Prioritization</STRONG></P><UL><LI>Inventory interfaces (by business process, domain, criticality, volume, latency).</LI><LI>Identify patterns: synchronous APIs, asynchronous events, B2B/EDI, file, IDoc, RFC, REST/SOAP.</LI></UL></LI><LI><P><STRONG>Target Architecture &amp; Design Principles</STRONG></P><UL><LI>Define API‑first and event‑first standards (naming, versioning, domain event taxonomy).</LI><LI>Establish security models (identity, scopes, policies), observability, and SLAs.</LI></UL></LI><LI><P><STRONG>Co‑Existence &amp; Strangler Pattern</STRONG></P><UL><LI>Run PI-PO and Integration Suite side by side.</LI><LI>Gradually redirect traffic to new APIs/events, decommission legacy interfaces incrementally.</LI></UL></LI><LI><P><STRONG>Enablement &amp; Guardrails</STRONG></P></LI><LI><P><STRONG>Cutover &amp; Stabilization</STRONG></P></LI><LI><P><STRONG>Decommissioning &amp; Continuous Evolution</STRONG></P><UL><LI>Retire redundant PI-PO objects; codify lessons learned.</LI><LI>Expand event domains; evolve API products; onboard partners faster.</LI></UL></LI></OL><HR /><H2 id="toc-hId-784793071" id="toc-hId-805112602">Anti‑Patterns to avoid</H2><UL><LI><STRONG>Lift‑and‑shift</STRONG><SPAN>&nbsp;</SPAN>without rethinking business APIs and event domains</LI><LI><STRONG>Point‑to‑point proliferation</STRONG><SPAN>&nbsp;</SPAN>that undermines modularity and reuse</LI><LI><STRONG>No product ownership</STRONG>, leaving integrations to drift without roadmaps or SLAs</LI><LI><STRONG>Limited observability</STRONG>, making troubleshooting slow and costly</LI></UL><HR /><H2 id="toc-hId-588279566" id="toc-hId-608599097">The takeaway</H2><P>The<SPAN>&nbsp;</SPAN><STRONG>ECC to S/4HANA</STRONG><SPAN>&nbsp;</SPAN>journey modernizes the core.<BR />The<SPAN>&nbsp;</SPAN><STRONG>PI-PO to Integration Suite</STRONG><SPAN>&nbsp;</SPAN>journey<SPAN>&nbsp;</SPAN><STRONG>operationalizes Business APIs and events</STRONG>, enabling composable architectures, resilient integrations, and<SPAN>&nbsp;</SPAN><STRONG>AI‑ready</STRONG><SPAN>&nbsp;</SPAN>operating models.</P><P>Organizations that treat integration as a<SPAN>&nbsp;</SPAN><STRONG>business platform<SPAN>&nbsp;</SPAN></STRONG>- rather than a technical migration - will gain a durable advantage in agility, innovation, and speed to value.</P><HR /><H2 id="toc-hId-391766061" id="toc-hId-412085592">Call to Action</H2><P>Are you aligning the<SPAN>&nbsp;</SPAN><STRONG>PI-PO to Integration Suite</STRONG><SPAN>&nbsp;</SPAN>transformation with your<SPAN>&nbsp;</SPAN><STRONG>Cloud ERP</STRONG><SPAN>&nbsp;</SPAN>journey? Start with a portfolio assessment, define API‑first and event‑first standards, and establish a co‑existence plan that drives measurable business outcomes. The sooner you begin, the faster your enterprise will be ready for<SPAN>&nbsp;</SPAN><STRONG>event‑driven</STRONG><SPAN>&nbsp;</SPAN>processes and<SPAN>&nbsp;</SPAN><STRONG>AI agents</STRONG>.</P> 2026-01-07T12:19:25.663000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/asynchronous-logging-in-sap-api-management/ba-p/14294096 Asynchronous Logging in SAP API Management 2026-01-08T13:58:24.166000+01:00 Aishwarya_Pola https://community.sap.com/t5/user/viewprofilepage/user-id/2090996 <P><STRONG>Introduction<BR /></STRONG></P><P>When configuring APIs in SAP API Management, it is as important aspect to configure info logging or error logging and then send it across to the downstream systems like Loggly, ServiceNow etc. which is Synchronous mode by default. Since the default logging in API Proxies takes place in Synchronous mode, the consumer of the API Proxy must wait for all backend calls to finish, which increases the total response time which is a big concern in the Request-Reply pattern.</P><P>This blog explains how to implement&nbsp;true asynchronous logging in SAP API Management. The main objective of this blog is to showcase the approach of implementing Asynchronous logging in APIM and improve the response time which is so critical for Request-Reply Pattern.</P><P><STRONG>Synchronous vs Asynchronous Logging</STRONG></P><P>Before building the necessary Artifacts for enabling Asynchronous logging, let’s understand the behavioral difference:</P><P><STRONG>Synchronous Logging</STRONG></P><P>When a request arrives, the API proxy processes it to the target backend and then directly calls logging systems like Loggly where in the result could be success or failure. If it is success ,the flow moves into the PostFlow of the proxy endpoint. Here, the proxy makes a synchronous call to the logging system. The response is sent to the consumer only after this logging call finishes, which increases the overall response time. If there is a failure, the flow triggers FaultRules where error logging happens synchronously, and the error response is sent only after the logging call completes.</P><P><STRONG>Asynchronous Logging</STRONG></P><P>When a request arrives, the API proxy processes it and immediately sends the response back to the api proxy consumer due to async mode of logging. Logging operations happen separately in the background by queuing messages to JMS for later processing. Background processes handle the actual delivery to Loggly or other logging platforms. If logging fails, it gets retried without impacting the response time.</P><P>Compared to synchronous logging, this approach helps APIs respond faster, keeps logging problems away and perform well even during high traffic.</P><P><STRONG>Architecture Overview</STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aishwarya_Pola_0-1766124000703.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/354055i295441D008924BDA/image-size/large?v=v2&amp;px=999" role="button" title="Aishwarya_Pola_0-1766124000703.png" alt="Aishwarya_Pola_0-1766124000703.png" /></span></STRONG></P><P><STRONG>Implementation Steps:</STRONG></P><P><STRONG>Step 1:Create a proxy endpoint:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aishwarya_Pola_3-1767592671809.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358035iA1CA928D19798EAD/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Aishwarya_Pola_3-1767592671809.png" alt="Aishwarya_Pola_3-1767592671809.png" /></span></P><P>After creating the proxy endpoint, include the following policies:</P><P><STRONG>Step 2: Extract the Control Header</STRONG></P><P>First, we add a header to control when asynchronous logging should be used.</P><P><STRONG>Policy: ExtractVariables-Flag.xml</STRONG></P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;ExtractVariables async="false" continueOnError="false" enabled="true" xmlns="http://www.sap.com/apimgmt"&gt; &lt;! -- Extract AsyncFlag from incoming HTTP header --&gt; &lt;Header name="AsyncFlag"&gt; &lt;Pattern&gt;{AsyncFlag}&lt;/Pattern&gt; &lt;/Header&gt; &lt;IgnoreUnresolvedVariables&gt;false&lt;/IgnoreUnresolvedVariables&gt; &lt;Source&gt;request&lt;/Source&gt; &lt;/ExtractVariables&gt;</code></pre><P>This extracts the&nbsp;<STRONG>AsyncFlag</STRONG>&nbsp;header from the request. When the value is "true", asynchronous logging will be triggered.</P><P><STRONG>Step 3: Prepare the Log Payload</STRONG></P><P>Build the log message containing all the request details you want to capture. This structured JSON format makes it easy to search and analyze logs in Loggly.<BR /><STRONG>Policy: AssignMessage-LogPayload.xml</STRONG></P><pre class="lia-code-sample language-markup"><code>&lt;!-- This policy assigns a log payload JSON to a variable --&gt; &lt;AssignMessage async="false" continueOnError="false" enabled="true" xmlns='http://www.sap.com/apimgmt'&gt; &lt;AssignVariable&gt; &lt;Name&gt;LogPayload&lt;/Name&gt; &lt;Value&gt; { "timestamp":”system.timestamp}", "messageId":"{messageid}", "apiProxy":"{apiproxy.name}", "environment":"{environment.name}", "logLevel":"INFO", "description":"Request received for processing", "syncFlag":"{req.AsyncFlag}", "targetURL":"{target.url}" } &lt;/Value&gt; &lt;/AssignVariable&gt; &lt;IgnoreUnresolvedVariables&gt;false&lt;/IgnoreUnresolvedVariables&gt; &lt;AssignTo createNew="false" type="request"&gt;request&lt;/AssignTo&gt; &lt;/AssignMessage&gt;</code></pre><P>This creates a variable called&nbsp;<STRONG>LogPayload</STRONG>&nbsp;containing a JSON object.</P><P><STRONG>Step 4: Configure the Async Log Request</STRONG></P><P>Prepare the request object that will be used to send logs asynchronously. This step structures how the log data will be transmitted to the logging system.</P><P><STRONG>Policy: AssignMessage-AsyncLogRequest.xml</STRONG></P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;AssignMessage async="false" continueOnError="false" enabled="true" xmlns="http://www.sap.com/apimgmt"&gt; &lt;!-- Assign payload and headers for async log request --&gt; &lt;AssignVariable&gt; &lt;Name&gt;AsyncLogRequest.payload&lt;/Name&gt; &lt;Value&gt;{logPayload}&lt;/Value&gt; &lt;/AssignVariable&gt; &lt;AssignVariable&gt; &lt;Name&gt;AsyncLogRequest.header.Content-Type&lt;/Name&gt; &lt;Value&gt;application/json&lt;/Value&gt; &lt;/AssignVariable&gt; &lt;AssignVariable&gt; &lt;Name&gt;AsyncLogRequest.verb&lt;/Name&gt; &lt;Value&gt;POST&lt;/Value&gt; &lt;/AssignVariable&gt; &lt;IgnoreUnresolvedVariables&gt;false&lt;/IgnoreUnresolvedVariables&gt; &lt;AssignTo createNew="true" type="request"&gt;AsyncLogRequest&lt;/AssignTo&gt;</code></pre><P><STRONG>Step 5: Configure Authentication Credentials</STRONG></P><P>Configure the authentication needed to securely call your SAP Cloud Integration endpoint. Store your cloud integration client credentials and encode them into the proper authorization header format that will be used when sending logs.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aishwarya_Pola_1-1767591980108.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358033i7DC5EAA507B08F9E/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Aishwarya_Pola_1-1767591980108.png" alt="Aishwarya_Pola_1-1767591980108.png" /></span></P><P><STRONG>Step 6: Trigger Asynchronous Logging via Integration Flow and JMS</STRONG></P><P><SPAN>In this step, the API proxy hands over the prepared log payload to an integration endpoint asynchronously, and from there the message is written into a JMS queue. This asynchronous approach ensures that it does&nbsp;not wait for the logging response and no delay to the consumer.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aishwarya_Pola_0-1767591623781.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/358031i51B42497EEE4D35E/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Aishwarya_Pola_0-1767591623781.png" alt="Aishwarya_Pola_0-1767591623781.png" /></span></SPAN></P><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;ServiceCallout async="true" continueOnError="false" enabled="true" xmlns="http://www.sap.com/apimgmt"&gt; &lt;Request clearPayload="true"&gt; &lt;Set&gt; &lt;Headers&gt; &lt;Header name="Content-Type"&gt;application/json&lt;/Header&gt; &lt;Header name="Authorization"&gt;{sapapim.Authorization}&lt;/Header&gt; &lt;/Headers&gt; &lt;Payload contentType="application/json"&gt;{logPayload}&lt;/Payload&gt; &lt;Verb&gt;POST&lt;/Verb&gt; &lt;/Set&gt; &lt;IgnoreUnresolvedVariables&gt;false&lt;/IgnoreUnresolvedVariables&gt; &lt;/Request&gt; &lt;Response&gt;cpi.logresponse&lt;/Response&gt; &lt;Timeout&gt;30000&lt;/Timeout&gt; &lt;HTTPTargetConnection&gt; &lt;URL&gt;https://{cpi-tenant-url}/http/Async_toJMS&lt;/URL&gt; &lt;/HTTPTargetConnection&gt; &lt;/ServiceCallout&gt;</code></pre><P><STRONG>Important:</STRONG>&nbsp;This policy is configured to be executed only when the condition&nbsp;<STRONG>request.header.AsyncFlag = "true"</STRONG>&nbsp;is met. This means asynchronous logging is triggered based on the header value sent in the request.</P><P>Once the integration endpoint receives the log payload, it stores the message in a JMS queue instead of sending it directly to Loggly or another logging system. This is where real asynchronous behavior comes from.</P><P><STRONG>Why JMS helps with asynchronous logging?</STRONG></P><P>JMS queues let the integration flow accept a log message, drop it into a queue, and return immediately. The queue takes responsibility for the message from that point on. A separate consumer reads from the queue later and sends the log to Loggly or any other target system such as service now etc.</P><P>This means the logging process is completely decoupled from the original request. The API response is not tied to how fast Loggly responds or whether it is even available at that moment. The request finishes as soon as the business logic is done, while JMS guarantees that the log will be processed in the background, which is exactly the asynchronous behavior we want.</P><P><STRONG>Conclusion</STRONG></P><P>Asynchronous logging keeps logging out of the API’s critical execution path. The API finishes its business processing and sends the response back to the client right away, while logs are passed in the background to the integration layer and JMS for delivery to Loggly.</P><P>This way, response times stay fast, logging delays or outages don’t affect the API, and you still get all the visibility needed for monitoring and troubleshooting. It’s a practical approach that balances performance, reliability, and observability, making it a good fit for high-volume, enterprise APIs.</P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P> 2026-01-08T13:58:24.166000+01:00 https://community.sap.com/t5/abap-blog-posts/creating-a-rest-api-web-service-in-sap-for-web-app-consumption/ba-p/14278981 Creating a REST API (web service) in SAP for Web App Consumption. 2026-01-08T18:27:24.050000+01:00 Srikanta_Kumar_Gouda https://community.sap.com/t5/user/viewprofilepage/user-id/1459051 <P><STRONG>Step by step process</STRONG> for creating a rest API (Web Service) in sap, which will be consume by<BR />web based application:</P><P>1. Create Table- ZDT_WEB_COMPLAIN</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_0-1763041199392.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340121i769D44F739B384A1/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_0-1763041199392.png" alt="Srikanta_Kumar_Gouda_0-1763041199392.png" /></span></P><P>2.&nbsp;Create SNRO Number range object: ZSNRO_WEB</P><P>Transaction code: SNRO</P><P>Give SNRO name and click on create&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_2-1763041367838.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340127i4E51345D9192E6EE/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_2-1763041367838.png" alt="Srikanta_Kumar_Gouda_2-1763041367838.png" /></span></P><P>enter short text, long text, number length domain, % warning and save.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_1-1763041267557.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340122iC5042BD362A59CB8/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_1-1763041267557.png" alt="Srikanta_Kumar_Gouda_1-1763041267557.png" /></span></P><P>click on Ranges--&gt; click on change intervals--&gt; click on new entries.</P><P>insert the number range and save.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_3-1763041516000.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340135i27694B4A93D9A812/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_3-1763041516000.png" alt="Srikanta_Kumar_Gouda_3-1763041516000.png" /></span></P><P>3. Create request handler class :&nbsp;ZCL_WEBCOMPLAINT_REQHANDLR</P><P>Go to Transaction Code - SE24 and create&nbsp;request handler class.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_4-1763041612509.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340137i195ECA3CCDEE55F0/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_4-1763041612509.png" alt="Srikanta_Kumar_Gouda_4-1763041612509.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_5-1763041700880.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340138i3C6AEFCE48045A67/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_5-1763041700880.png" alt="Srikanta_Kumar_Gouda_5-1763041700880.png" /></span></P><P><SPAN class="">enter the superclass as </SPAN><STRONG><SPAN class="">cl_rest_http_handler</SPAN></STRONG><SPAN class=""> and click on save.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_6-1763041718291.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340139i16C0D354FF4E7548/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_6-1763041718291.png" alt="Srikanta_Kumar_Gouda_6-1763041718291.png" /></span></P><P>Go to method section to see super class methods.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_7-1763041805586.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340140iB1A80FFEEEF8FB4D/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_7-1763041805586.png" alt="Srikanta_Kumar_Gouda_7-1763041805586.png" /></span></P><P>select the <STRONG>get_root_handler</STRONG> and click on redefine. Add the below code in between method and endmethod.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_8-1763041875753.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340141i486DF563A3AC3500/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_8-1763041875753.png" alt="Srikanta_Kumar_Gouda_8-1763041875753.png" /></span><BR /><BR /></P><pre class="lia-code-sample language-abap"><code>DATA(lo_router) = NEW cl_rest_router( ). lo_router-&gt;attach( EXPORTING iv_template = '/webcomplaint' " Unified Name for Reso iv_handler_class = 'ZCL_WEBCOMPLAINT_REQHANDLR' " Object Type Name " it_parameter = " Resource contructor parameters </code></pre><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_10-1763041998349.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340143i9477F4FC23C1B544/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_10-1763041998349.png" alt="Srikanta_Kumar_Gouda_10-1763041998349.png" /></span></P><P><SPAN class=""><SPAN class="">save and activate the class</SPAN></SPAN><SPAN class="">&nbsp;.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_9-1763041913576.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340142i241A191778E3DD78/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_9-1763041913576.png" alt="Srikanta_Kumar_Gouda_9-1763041913576.png" /></span></P><P>4. Create resource provider class:&nbsp;ZCL_WEBCOMPLAINT_REQPROVIDER.</P><P>Go to Transaction Code - SE24 and create&nbsp;request provider class.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_3-1763043027077.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340160i9F4B2A838BDC1E83/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_3-1763043027077.png" alt="Srikanta_Kumar_Gouda_3-1763043027077.png" /></span></P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_0-1763042941293.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340153i71B334504B2352D5/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_0-1763042941293.png" alt="Srikanta_Kumar_Gouda_0-1763042941293.png" /></span></P><P><SPAN class="">enter the superclass as&nbsp;<STRONG> cl_rest_resource&nbsp;</STRONG></SPAN><SPAN class="">&nbsp;and click on save.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_4-1763043198086.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340165i6DCC52EA462C8B7D/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_4-1763043198086.png" alt="Srikanta_Kumar_Gouda_4-1763043198086.png" /></span></P><P>Go to method section to see super class methods.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_5-1763043230879.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340166iC3E1BAF62982A06C/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_5-1763043230879.png" alt="Srikanta_Kumar_Gouda_5-1763043230879.png" /></span></P><P>select the method 'GET' and click on redefine . Add the below code.</P><pre class="lia-code-sample language-abap"><code>DATA : lv_string1 TYPE vbeln, "string, lv_string2 TYPE string, gs_complaint TYPE zdt_web_complain. lv_string1 = mo_request-&gt;get_uri_query_parameter( iv_name = 'DOC_ID' ). CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = lv_string1 IMPORTING output = lv_string1. SELECT SINGLE * FROM zdt_web_complain INTO CORRESPONDING FIELDS OF gs_complaint WHERE doc_id = lv_string1. /ui2/cl_json=&gt;serialize( EXPORTING data = gs_complaint " Data to serialize * COMPRESS = ABAP_FALSE " Skip empty elements * NAME = " Object name * PRETTY_NAME = " Pretty Print property names * TYPE_DESCR = " Data descriptor RECEIVING r_json = lv_string2 " JSON string ). mo_response-&gt;create_entity( )-&gt;set_string_data( iv_data = lv_string2 ). mo_response-&gt;set_header_field( EXPORTING iv_name = 'Content-Type' " Header Name iv_value = 'application/json' " Header Value ). save and activate . similarly redefine the post method and add the below code. METHOD if_rest_resource~post. *CALL METHOD SUPER-&gt;IF_REST_RESOURCE~POST * EXPORTING * IO_ENTITY = * . DATA : lv_string1 TYPE vbeln, "string, lv_string2 TYPE string, lv_response TYPE string, gs_complaint TYPE zdt_web_complain. DATA(lo_entity) = mo_request-&gt;get_entity( ). DATA(lo_response) = mo_response-&gt;create_entity( ). "read string data i.e json DATA(lv_data) = lo_entity-&gt;get_string_data( ). /ui2/cl_json=&gt;deserialize( EXPORTING json = lv_data " JSON string * PRETTY_NAME = " Pretty Print property names CHANGING data = gs_complaint " Data to serialize ). * CATCH CX_SY_MOVE_CAST_ERROR. " CALL FUNCTION 'NUMBER_GET_NEXT' EXPORTING nr_range_nr = '01' object = 'ZSNRO_WEB' quantity = '1' * SUBOBJECT = ' ' * TOYEAR = '0000' * IGNORE_BUFFER = ' ' IMPORTING number = gs_complaint-doc_id * QUANTITY = * RETURNCODE = EXCEPTIONS interval_not_found = 1 number_range_not_intern = 2 object_not_found = 3 quantity_is_0 = 4 quantity_is_not_1 = 5 interval_overflow = 6 buffer_overflow = 7 OTHERS = 8. IF sy-subrc &lt;&gt; 0. * Implement suitable error handling here ENDIF. gs_complaint-createdby = sy-uname. gs_complaint-createdon = sy-datum. gs_complaint-time = sy-uzeit. INSERT INTO zdt_web_complain VALUES gs_complaint. /ui2/cl_json=&gt;serialize( EXPORTING data = gs_complaint " Data to serialize * COMPRESS = ABAP_FALSE " Skip empty elements * NAME = " Object name * PRETTY_NAME = " Pretty Print property names * TYPE_DESCR = " Data descriptor RECEIVING r_json = lv_response ). " JSON string lo_response-&gt;set_string_data( iv_data = lv_response ). ENDMETHOD.</code></pre><P>&nbsp;</P><P><SPAN>save and activate. </SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>similarly redefine the <STRONG>post</STRONG> method and add the below code.</SPAN><SPAN>&nbsp;</SPAN></P><pre class="lia-code-sample language-abap"><code>METHOD if_rest_resource~post. *CALL METHOD SUPER-&gt;IF_REST_RESOURCE~POST * EXPORTING * IO_ENTITY = * . DATA : lv_string1 TYPE vbeln, "string, lv_string2 TYPE string, lv_response TYPE string, gs_complaint TYPE zdt_web_complain. DATA(lo_entity) = mo_request-&gt;get_entity( ). DATA(lo_response) = mo_response-&gt;create_entity( ). "read string data i.e json DATA(lv_data) = lo_entity-&gt;get_string_data( ). /ui2/cl_json=&gt;deserialize( EXPORTING json = lv_data " JSON string * PRETTY_NAME = " Pretty Print property names CHANGING data = gs_complaint " Data to serialize ). * CATCH CX_SY_MOVE_CAST_ERROR. " CALL FUNCTION 'NUMBER_GET_NEXT' EXPORTING nr_range_nr = '01' object = 'ZSNRO_WEB' quantity = '1' * SUBOBJECT = ' ' * TOYEAR = '0000' * IGNORE_BUFFER = ' ' IMPORTING number = gs_complaint-doc_id * QUANTITY = * RETURNCODE = EXCEPTIONS interval_not_found = 1 number_range_not_intern = 2 object_not_found = 3 quantity_is_0 = 4 quantity_is_not_1 = 5 interval_overflow = 6 buffer_overflow = 7 OTHERS = 8. IF sy-subrc &lt;&gt; 0. * Implement suitable error handling here ENDIF. gs_complaint-createdby = sy-uname. gs_complaint-createdon = sy-datum. gs_complaint-time = sy-uzeit. INSERT INTO zdt_web_complain VALUES gs_complaint. /ui2/cl_json=&gt;serialize( EXPORTING data = gs_complaint " Data to serialize * COMPRESS = ABAP_FALSE " Skip empty elements * NAME = " Object name * PRETTY_NAME = " Pretty Print property names * TYPE_DESCR = " Data descriptor RECEIVING r_json = lv_response ). " JSON string lo_response-&gt;set_string_data( iv_data = lv_response ). ENDMETHOD.</code></pre><P>save and activate.</P><P>5. Create SICF service:</P><P>Execute Transaction code SICF.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_6-1763043575157.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340172iFBD1AB77B18E3408/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_6-1763043575157.png" alt="Srikanta_Kumar_Gouda_6-1763043575157.png" /></span></P><P><SPAN class=""><SPAN class="">click on execute.</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_7-1763043591676.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340173i51D16A685E3DB830/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_7-1763043591676.png" alt="Srikanta_Kumar_Gouda_7-1763043591676.png" /></span></P><P>&nbsp;</P><P><SPAN class=""><SPAN class="">give the service element name and press enter.</SPAN></SPAN><SPAN class="">&nbsp;</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_9-1763043616789.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340175i7375CA18CA8E3E75/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_9-1763043616789.png" alt="Srikanta_Kumar_Gouda_9-1763043616789.png" /></span></P><P><SPAN class=""><SPAN class="">enter description and request handler class name [&nbsp;<STRONG><SPAN class="">zcl_webcomplaint_reqhandlr</SPAN></STRONG><SPAN class="">&nbsp;</SPAN> ]and save.&nbsp;</SPAN></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_10-1763043799234.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340177i8F51EE3302DE360C/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_10-1763043799234.png" alt="Srikanta_Kumar_Gouda_10-1763043799234.png" /></span></P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_11-1763043895392.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340179i147691150A570A5B/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_11-1763043895392.png" alt="Srikanta_Kumar_Gouda_11-1763043895392.png" /></span></P><P>on SICF main screen activate the service.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_12-1763043944346.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340180iC89DB21ED47DE514/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_12-1763043944346.png" alt="Srikanta_Kumar_Gouda_12-1763043944346.png" /></span></P><P>now before testing add some record in table, then test the service.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_13-1763043960343.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/340181i5405F611FF2E76A6/image-size/large?v=v2&amp;px=999" role="button" title="Srikanta_Kumar_Gouda_13-1763043960343.png" alt="Srikanta_Kumar_Gouda_13-1763043960343.png" /></span></P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Srikanta_Kumar_Gouda_0-1764241570181.png" style="width: 844px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/345907i79B2C45BD1687039/image-dimensions/844x53/is-moderation-mode/true?v=v2" width="844" height="53" role="button" title="Srikanta_Kumar_Gouda_0-1764241570181.png" alt="Srikanta_Kumar_Gouda_0-1764241570181.png" /></span></P> 2026-01-08T18:27:24.050000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/sap-btp-is-how-to-become-a-sap-integration-suite-consultant-beyond-sap-cpi/ba-p/14302203 SAP BTP - IS - How to become a SAP Integration Suite Consultant beyond SAP CPI - SAP APIM Part I 2026-01-09T11:49:25.429000+01:00 rhviana https://community.sap.com/t5/user/viewprofilepage/user-id/160570 <div class="lia-spoiler-container"><a class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer">Spoiler</a><noscript> (Highlight to read)</noscript><div class="lia-spoiler-border"><div class="lia-spoiler-content"><P>Disclaimer: This isn’t a tutorial about how button click works. No, the audience of this post are engineers with all levels of experience, from Junior up to Senior, which might have fallen into that "I'm SAP CPI". My goal has been to help you move from just obvious to"Architectural Thinking - SAP BTP Integration Suite Consultant". You got the basics, now let's move on.</P></div><noscript><div class="lia-spoiler-noscript-container"><div class="lia-spoiler-noscript-content">Disclaimer: This isn’t a tutorial about how button click works. No, the audience of this post are engineers with all levels of experience, from Junior up to Senior, which might have fallen into that "I'm SAP CPI". My goal has been to help you move from just obvious to"Architectural Thinking - SAP BTP Integration Suite Consultant". You got the basics, now let's move on.</div></div></noscript></div></div><H2 id="toc-hId-1787675107">Introduction</H2><P>In my last entry, I talked about the "Frankenstein Landscape" -&nbsp;<A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-btp-integration-suite-clean-architecture-vs-the-frankenstein-landscape/ba-p/14301527" target="_blank">SAP BTP - Integration Suite: Clean Architecture vs The Frankenstein Landscape.</A></P><P>Today, I’d like to put the spotlight on you and your career and if you are a SAP CPI developer, you might have noticed the hard times of just being good at building Iflows that seems to end.</P><P>This is the first of four posts (the last one a summary because I will not explain SAP CPI, I'm expect that you know already), and we will navigate you through how to stop being “SAP CPI Developer” and become an SAP Integration Suite Consultant - "Generals".</P><P>First we will start with <STRONG>SAP API Management ( APIM )</STRONG>.</P><H3 id="toc-hId-1720244321">Why bother leaving your comfort zone?</H3><P class="lia-align-justify" style="text-align : justify;">I see this all the time: developers treating APIM and CPI like neighbors who don't talk to each other. But here’s the reality.</P><P class="lia-align-justify" style="text-align : justify;">if they don’t work together, your architecture is going to break sooner or later.</P><P class="lia-align-justify" style="text-align : justify;">Growth is uncomfortable, moving away from just "configure adapters, fixing errors and create mappings" to actually thinking about strategy is tough, but you have to do it if you don't want to get stuck in the "trap" mindset.&nbsp;</P><P class="lia-align-center" style="text-align: center;"><STRONG>Carl Jung once said: “Who looks outside, dreams; who looks inside, awakens.”</STRONG></P><P class="lia-align-justify" style="text-align : justify;">In the world of SAP BTP Integration Suite, if you only look at the "outside" - All they perceive is an illusion of integration you are merely dreaming of a perfect integration, but that dream won't survive longer with the digital integration transformation to truly <STRONG>"awaken"</STRONG> as an SAP BTP Integration Suite Consultants, you must look <STRONG>inside&nbsp;</STRONG>at integrations and the components they join in a more profound level. This in-depth knowledge results in more consistent and less brittle integrations.</P><H3 id="toc-hId-1523730816">The "General" vs. The "Soldier" (A quick story)</H3><P>Let me show you a imaginare conversation conversation</P><P class="lia-align-justify" style="text-align : justify;">The following dialogue illustrates a common situation in integration projects when API Management is treated as an afterthought instead of an architectural capability.</P><P class="lia-align-justify" style="text-align : justify;">&nbsp;</P><TABLE border="1" width="100%"><TBODY><TR><TD width="50%"><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1767912334527.png" style="width: 183px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/359548iA864F83C5F738CDA/image-dimensions/183x251/is-moderation-mode/true?v=v2" width="183" height="251" role="button" title="rhviana_0-1767912334527.png" alt="rhviana_0-1767912334527.png" /></span></P><P class="lia-align-center" style="text-align: center;"><STRONG>Enterprise Architect / Solution Architect</STRONG></P></TD><TD width="50%"><P class="lia-align-justify" style="text-align : justify;">We need to migrate 40 APIs from an old platform to SAP BTP APIM, after deep analyses of polices and others comparing with other vendors. we are good to go.</P><P class="lia-align-justify" style="text-align : justify;">How should we handle this ?</P></TD></TR><TR><TD><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_1-1767912334528.png" style="width: 209px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/359549iE7FF3CA1096A18B4/image-dimensions/209x242/is-moderation-mode/true?v=v2" width="209" height="242" role="button" title="rhviana_1-1767912334528.png" alt="rhviana_1-1767912334528.png" /></span></P><P class="lia-align-center" style="text-align: center;"><STRONG>SAP CPI Developer</STRONG></P></TD><TD>Easy. I’ll just build the iFlows in CPI, set up the HTTPS endpoints, and maybe throw in some Basic Auth or OAuth inside the flow. If something fails, I’ll set up an email alert.</TD></TR><TR><TD><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_2-1767912334529.png" style="width: 200px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/359550iB8BD7732D366185B/image-dimensions/200x275/is-moderation-mode/true?v=v2" width="200" height="275" role="button" title="rhviana_2-1767912334529.png" alt="rhviana_2-1767912334529.png" /></span></P><P class="lia-align-center" style="text-align: center;"><STRONG>Enterprise Architect / Solution Architect</STRONG></P></TD><TD><P>Okay... but what if a partner starts spamming our endpoint with 10x more traffic by mistake?</P><P>Is CPI going to tank that hit directly?</P><P>Who’s controlling the gate?</P><P><I>Response - (Awkward silence)</I></P></TD></TR><TR><TD><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_3-1767912334530.png" style="width: 220px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/359551i974EDDB2B48B02E3/image-dimensions/220x272/is-moderation-mode/true?v=v2" width="220" height="272" role="button" title="rhviana_3-1767912334530.png" alt="rhviana_3-1767912334530.png" /></span></P><P class="lia-align-center" style="text-align: center;"><STRONG>SAP BTP - Integration Suite Consultant&nbsp;</STRONG></P></TD><TD><P class="lia-align-justify" style="text-align : justify;">Hold on. We are not trading URLs here; we need to position SAP APIM as the defense in depth. It is our immune defense.</P><P class="lia-align-justify" style="text-align : justify;">We will control the rate limiting and security policy within APIM so no request will get into CPI if not satisfy our requirements. If a call is below age, APIM will cancel it before it hits the system.</P><P class="lia-align-justify" style="text-align : justify;">This reduces CPI to only its strengths: being an orchestrator and a logic, not a firewall.</P><P class="lia-align-justify" style="text-align : justify;">This is also important to clarify: my assets as a member in SAP APIM include the technical API proxy, provider, policy and configuration definition but EAM org-level governance decisions belongs within the overall architectural mandate and organisational governance model.</P></TD></TR></TBODY></TABLE><H2 id="toc-hId-1198134592">Real Talk - "General": My Just Goto Checklist for Migrations</H2><P>The following are several significant factors to keep in mind while moving APIs:</P><UL><LI><STRONG>Separate Responsibility</STRONG>:Security and traffic management will be taken on by the API Management (APIM) layer while the Cloud Platform Integration (CPI) takes care of actual processing logic.</LI><LI><STRONG>Gate Block the Trash</STRONG><SPAN>: When garbage reached your integration flow (iFlow), then it is the last line of defense that am asking you to re-develope.</SPAN></LI><LI><STRONG>Cleaner Contracts</STRONG><SPAN>: Make use of the OpenAPI specs in APIM. Incoming data should not be left to guesswork in terms of CPI.</SPAN></LI><LI><STRONG>Observability</STRONG><SPAN>: Also very important to keep an observability from A-Z of the integration path, I mean from devportal until S/4HANA logs. Make sure there is not a blind spot in your monitoring.</SPAN></LI><LI><STRONG>CPI is NOT a Firewall</STRONG><SPAN> Stop trying to make CPI be a securtiy wall</SPAN></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1767945991533.png" style="width: 701px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/359642i69668936A3C2B293/image-dimensions/701x464/is-moderation-mode/true?v=v2" width="701" height="464" role="button" title="rhviana_0-1767945991533.png" alt="rhviana_0-1767945991533.png" /></span></P><P class="lia-align-center" style="text-align: center;"><STRONG>Image 1 - SAP Integration Suite Consultant</STRONG></P><P>&nbsp;</P><H2 id="toc-hId-1001621087" id="toc-hId-1001621087">Charting New Responsibilities on the possible migration from external vendors: Who Does What?</H2><P class="lia-align-justify" style="text-align : justify;">To witness the transformation from <STRONG>Soldier - SAP CPI</STRONG>&nbsp;to <STRONG>General - SAP BTP Integration Suite Developer</STRONG>, one must reconfigure their mindset, gain governance experience, and, most importantly, understand the clear boundaries of authority for each role.</P><H3 id="toc-hId-934190301">Integration Architect</H3><P class="lia-align-justify" style="text-align : justify;">The Integration Architect projects the technical-specific horizon. They look beyond simple system connectivity to understand how interdependencies affect the global SAP BTP infrastructure.</P><UL><LI><STRONG>Migration Analysis:</STRONG> When migrating from external gateways (API Management external vendor) to SAP BTP - APIM he is responsible for the gap analysis of policies, ensuring that security and traffic rules are successfully mapped and supported by the BTP infrastructure.</LI><LI><STRONG>Traffic &amp; Performance Benchmarking:</STRONG> He compares the processing power and latency overhead of the old platform against SAP BTP APIM to prevent bottlenecks after the "Go-Live".</LI></UL><H3 id="toc-hId-737676796">Solution Architect</H3><P class="lia-align-justify" style="text-align : justify;">Focuses on the business solution design. They ensure the integration makes sense for the end-to-end process, such as <I>Order-to-Cash</I> or <I>Hire-to-Retire</I>.</P><UL class="lia-align-justify" style="text-align : justify;"><LI><STRONG>Information Security:</STRONG> Works alongside the CISO to ensure data privacy (GDPR/LGPD) and sensitivity are respected.</LI><LI><STRONG>Systemic Design:</STRONG> Decides whether a flow should be synchronous or asynchronous, ensuring the backbone (like S/4HANA) is protected from unnecessary overhead.</LI></UL><H3 id="toc-hId-541163291">SAP BTP Integration Suite Consultant</H3><P class="lia-align-justify" style="text-align : justify;">This is the most critical role for the project's success—the <STRONG>Elite Executor</STRONG>. It is vital to understand: you are not the platform owner, nor the one who decides on corporate governance or global licensing. Your mission is high-level execution.</P><UL><LI><STRONG>Technical Security:</STRONG> You implement the orders. You configure OAuth2, X.509 certificates, and message encryption. You don't invent the security rule; you enforce it through technical excellence.</LI><LI><STRONG>Technical Execution:</STRONG> You are the one building the API Providers, creating Proxies, applying policies in APIM, and developing complex iFlows.</LI><LI><STRONG>The "Technical Beacon":</STRONG> You are the eyes on the ground. You signal back to the Architects when a policy is technically unfeasible or when estimated traffic might threaten performance. You provide the reality check from the front lines.</LI></UL><TABLE border="1" width="99.89235737351991%"><TBODY><TR><TD width="16.469321851453174%"><STRONG>Responsibility</STRONG></TD><TD width="26.3724434876211%"><STRONG>Integration Architect</STRONG></TD><TD width="24.219590958019378%"><STRONG>Solution Architect</STRONG></TD><TD width="32.83100107642626%"><STRONG>BTP Integration Consultant</STRONG></TD></TR><TR><TD width="16.469321851453174%"><SPAN><STRONG>Main Focus</STRONG></SPAN></TD><TD width="26.3724434876211%"><SPAN>Governance &amp; Platform</SPAN></TD><TD width="24.219590958019378%"><SPAN>Business Process</SPAN></TD><TD width="32.83100107642626%"><SPAN><STRONG>Project Execution</STRONG></SPAN></TD></TR><TR><TD width="16.469321851453174%"><SPAN><STRONG>Security Role</STRONG></SPAN></TD><TD width="26.3724434876211%"><SPAN>Defines Global Policies</SPAN></TD><TD width="24.219590958019378%"><SPAN>Defines Data Sensitivity</SPAN></TD><TD width="32.83100107642626%"><SPAN><STRONG>Implements</STRONG> (Certs, Policies)</SPAN></TD></TR><TR><TD width="16.469321851453174%"><SPAN><STRONG>APIM Scope</STRONG></SPAN></TD><TD width="26.3724434876211%"><SPAN>Traffic &amp; Capacity Analysis</SPAN></TD><TD width="24.219590958019378%"><SPAN>Endpoint Requirements</SPAN></TD><TD width="32.83100107642626%"><SPAN><STRONG>Configures</STRONG> Proxies &amp; Resources</SPAN></TD></TR><TR><TD width="16.469321851453174%"><SPAN><STRONG>Deliverable</STRONG></SPAN></TD><TD width="26.3724434876211%"><SPAN>Strategic Roadmap</SPAN></TD><TD width="24.219590958019378%"><SPAN>Solution Blueprint</SPAN></TD><TD width="32.83100107642626%"><SPAN><STRONG>Working Integrations</STRONG></SPAN></TD></TR></TBODY></TABLE><H2 id="toc-hId-215567067"><STRONG>Conclusion — Part I</STRONG></H2><P>In this first part, we explored <STRONG>SAP API Management</STRONG> as more than just a proxy. In a clean integration setup, APIM helps control <STRONG>who can access APIs, how traffic is handled, and how contracts are defined</STRONG>, when the decision is use SAP APIM to protecting SAP CPI or expose OADATA services from backend systems.</P><P>Going beyond a CPI-only mindset does not mean changing your role overnight. It means <STRONG>understanding where each tool fits</STRONG> and using the right capability for the right responsibility.</P><P>SAP API Management is not about copying URLs from one platform to another in case of migration from External APIM. It is about <STRONG>setting clear boundaries, when SAP APIM should be in front of</STRONG>&nbsp;SAP CPI ( This definitions not comes from SAP BTP Integration Suite Consultant, comes from high level people and when it comes, if you don't know or have any ideia how to create api proxy, api provider, key value mapping, setup policies ProxyEndpoint Pre - Post Flow or Targetentpoint Pre-Postflow and others, you can not be helpfull because your skill set is tied as SAP CPI.</P><P>In <STRONG>Part II</STRONG>, we will move to<A href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-btp-is-how-to-become-a-sap-integration-suite-consultant-beyond-sap-cpi/ba-p/14303996" target="_self"> <STRONG>event-driven integration</STRONG></A></P><P>Kind regards,</P><P>Viana.</P><H2 id="toc-hId-19053562">References to study</H2><H4 id="toc-hId--417011600">References links compilation:</H4><UL><LI><STRONG><A href="https://developers.sap.com/group.cp-apim-code-1.html" target="_self" rel="noopener noreferrer">Get Started with API Management</A></STRONG></LI><LI><STRONG><A href="https://learning.sap.com/learning-journeys/developing-with-sap-integration-suite" target="_self" rel="noopener noreferrer">Developing with SAP Integration Suite - Unit 3</A></STRONG></LI><LI><A href="https://help.sap.com/docs/sap-api-management/sap-api-management/policies" target="_self" rel="noopener noreferrer"><STRONG>SAP APIM - Policies</STRONG></A></LI><LI><STRONG><A href="https://help.sap.com/docs/sap-api-management/sap-api-management/sap-api-management-in-cloud-foundry-environment" target="_self" rel="noopener noreferrer"><SPAN class="">SAP API Management</SPAN>&nbsp;in the Cloud Foundry Environment</A></STRONG></LI></UL><P><STRONG>After the learn path, check those blogs and try to replicate just to learn.</STRONG></P><P><STRONG>SAP SCN - APIM - Blogs:</STRONG></P><UL><LI><STRONG><A class="" href="https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-members/sap-api-management-apikey-and-response-caching/ba-p/14184042" target="_blank">SAP API Management - APIKey and Response Caching</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/integration-blog-posts/building-an-api-using-sap-api-management/ba-p/14007813" target="_blank">Building an API using SAP API Management</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-api-management-generating-oauth-saml-assertion-for-successfactors-api/ba-p/14140473" target="_blank">SAP API Management- Generating Oauth SAML Assertion for SuccessFactors API call</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/calling-sap-api-management-from-sap-cloud-integration-using-api-proxy-url/ba-p/14276338" target="_blank">Calling SAP API Management from SAP Cloud Integration Using API Proxy URL &amp; OAuth Authorization.</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/integration-blog-posts/supporting-multiple-api-gateways-with-sap-api-management-using-azure-api/ba-p/13680433" target="_blank">Supporting Multiple API Gateways with SAP API Management – using Azure API Management as example</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-api-management-how-to-create-a-cloud-integration-flow-api-provider/ba-p/14082426" target="_blank">SAP API Management - How to create a Cloud Integration Flow API Provider</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/api-masking-api-routing-via-sap-api-management-a-step-by-step-guide/ba-p/13788205" target="_blank">API Masking/ API Routing Via SAP API Management: A Step by Step Guide</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/steps-to-create-api-proxy-in-sap-api-management-with-api-key-verification/ba-p/13573031" target="_blank">Steps to create API proxy in SAP API Management with API key verification policy and consumer subscription to access APIs via API proxy or SAP API Management</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/applying-techncial-user-propagation-to-api-management/ba-p/14191788" target="_blank">Applying 'Techncial User Propagation' to API Management</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/asynchronous-logging-in-sap-api-management/ba-p/14294096" target="_blank">Asynchronous Logging in SAP API Management</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/accessing-sap-btp-core-services-apis-using-sap-cloud-management-service-cis/ba-p/14303030" target="_blank">Accessing SAP BTP Core Services APIs Using SAP Cloud Management Service (CIS)</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/utilising-third-party-oauth-tokens-in-sap-api-management/ba-p/14000285" target="_blank">Utilising Third-Party OAuth Tokens in SAP API Management</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/reusable-apis-in-sap-integration-suite-design-once-use-everywhere/ba-p/14213934" target="_blank">Reusable APIs in SAP Integration Suite : Design Once, Use Everywhere</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/integration-blog-posts/mitigating-owasp-and-other-api-security-threats-with-sap-integration-suite/ba-p/14105741" target="_blank">Mitigating OWASP and Other API Security Threats with SAP Integration Suite, API Management</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-btp-apim-demystified-designing-a-single-api-proxy-with-dynamic-routing/ba-p/14300227" target="_blank">SAP BTP - APIM - Demystified: Designing a Single API Proxy with Dynamic Routing for Multiple Targets</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/secure-on-premise-api-using-sap-api-management-in-sap-integration-suite/ba-p/13524781" target="_blank">Secure On-Premise API using SAP API Management in SAP Integration Suite</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/integration-blog-posts/api-management-unlocking-oauth-strategies/ba-p/13682686" target="_blank">API Management: Unlocking OAuth Strategies</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-api-management-faq/ba-p/13346860" target="_blank">SAP API Management FAQ</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/blog-series-sap-api-management-api-providers-part-1-accelerating/ba-p/13310890" target="_blank">Blog Series - SAP API Management – API Providers: Part 1: Accelerating connectivity through APIs and SAP API Management</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-api-management-policy-management/ba-p/13182049" target="_blank">SAP API Management – Policy Management</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/consuming-sap-on-premise-data-through-sap-api-management/ba-p/13483807" target="_blank">Consuming SAP on-premise data through SAP API Management</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-api-management-discover-integration-flows-from-cpi-tenants-and-auto/ba-p/13441919" target="_blank">SAP API Management: Discover Integration Flows from CPI tenants and auto-generate APIs</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-api-management-traffic-management-concurrentratelimit-example/ba-p/13291352" target="_blank">SAP API Management - Traffic Management: ConcurrentRateLimit example</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-api-management-rate-limiting-api-calls-per-application/ba-p/13338781" target="_blank">SAP API Management - Rate Limiting API calls per application</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-cloud-platform-api-management-api-security-best-practices-blog-series/ba-p/13313891" target="_blank">SAP Cloud Platform API Management - API Security Best Practices Blog Series</A></STRONG><UL><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-1-api-security-best-practices-restrict-access-to-api-based-on-ip/ba-p/13335433" target="_blank">Part 1 - API Security Best Practices - Restrict access to API based on IP Addresses</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-2-api-security-best-practices-rate-limit-api-calls-with-retry-time/ba-p/13338754" target="_blank">Part 2 – API Security Best Practices - Rate limit API calls with Retry time interval</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-3-api-security-best-practices-rate-limiting-for-odata-batch-calls/ba-p/13339208" target="_blank">Part 3 – API Security Best Practices - Rate Limiting for OData Batch calls</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-4-api-security-best-practices-data-masking-of-sensitive-data-in-odata/ba-p/13347037" target="_blank">Part 4 – API Security Best Practices - Data Masking of sensitive data in OData / REST APIs</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-5-api-security-best-practices-json-threat-protection-against-injection/ba-p/13347388" target="_blank">Part 5 – API Security Best Practices – JSON Threat protection against injection attacks</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-6-api-security-best-practices-xml-threat-protection-against-injection/ba-p/13308801" target="_blank">Part 6 – API Security Best Practices – XML Threat protection against injection attacks</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-7-api-security-best-practices-log-all-api-interactions/ba-p/13312360" target="_blank">Part 7 – API Security Best Practices – Log all API interactions</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-8-api-security-best-practices-threat-protection-against-sql-injection/ba-p/13312497" target="_blank">Part 8 - API Security Best Practices - Threat Protection against SQL Injection attacks</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-9-api-security-best-practices-threat-protection-against-xml-external/ba-p/13312688" target="_blank">Part 9 – API Security Best Practices – Threat Protection against XML External Entity (XXE) attacks</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/part-10-api-security-best-practices-raise-alerts-for-threat-detection/ba-p/13312844" target="_blank">Part 10 – API Security Best Practices – Raise alerts for Threat detection</A></STRONG></LI></UL></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-api-management-a-full-overview-2/ba-p/13398765" target="_blank">SAP API Management – a full overview (2)</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/complete-guide-to-understanding-swagger-in-sap-api-management/ba-p/13513690" target="_blank">Complete Guide to Understanding Swagger in SAP API Management</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-api-management-api-proxy-troubleshooting-technique/ba-p/13423998" target="_blank">SAP API Management - API Proxy Troubleshooting Technique</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-cloud-platform-api-management-api-product-permissions/ba-p/13463408" target="_blank">SAP Cloud Platform API Management - API Product Permissions</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-members/expose-sap-cpi-integration-flows-as-apis-using-sap-api-management-a-step-by/ba-p/14256902" target="_blank">Expose SAP CPI Integration Flows as APIs Using SAP API Management: A Step-by-Step Guide</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-api-management-develop-and-manage-api-first-enterprise-microservices/ba-p/13363092" target="_blank">SAP API Management - Develop and manage API-first enterprise microservices with SAP Cloud Platform and API Management - part 1</A></STRONG></LI><LI><STRONG><A class="" href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-api-management-develop-and-manage-api-first-enterprise-microservices/ba-p/13363571" target="_blank">SAP API Management – Develop and manage API-first enterprise microservices with SAP Cloud Platform and API Management – part 2</A></STRONG></LI></UL> 2026-01-09T11:49:25.429000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/integration-suite-api-management-cf-custom-domain-activation-via-self/ba-p/14305592 Integration Suite API Management CF custom domain activation via self-service 2026-01-12T12:04:47.814000+01:00 Jordy_S https://community.sap.com/t5/user/viewprofilepage/user-id/102909 <H2 id="toc-hId-963153506" id="toc-hId-1787767641">Introduction</H2><P><SPAN>In this blog post you will learn how to setup and activate custom domains (<STRONG>standard setup not mTLS</STRONG>) for SAP Integration Suite API management runtime based on Cloud Foundry via de self-service procedure. If you already have a custom domain activate and in the past this was performed by SAP, this is the blog for you.&nbsp;</SPAN></P><P><SPAN>To keep this blog to the point the focus is to provide detailed steps and information for this case. Information about obtaining a certificate, create a virtual host for API Management or updating DNS records are only briefly touched.</SPAN></P><H2 id="toc-hId-766640001" id="toc-hId-1591254136">Prerequisites</H2><P><SPAN>To follow the steps explained please make sure you have or gathered:</SPAN></P><UL><LI><SPAN>Administrator access to the subaccount in which Integration Suite is running. To be able to:</SPAN><UL><LI>Provide required authorizations</LI><LI>Create/Update service keys</LI></UL></LI><LI>SAP Integration Suite, API management is setup and running. Launchpad is accessible.</LI><LI>SAP API management a test API is published and working with the standard SAP domain.</LI><LI>DNS administrator authorization or a contact within the organization authorized to perform the required activity.</LI><LI>Certificate administrator authorization&nbsp;or a contact within the organization authorized to perform the required activity.</LI><LI>A HTTP Client like Postman for executing API calls.<UL><LI>Access to api.sap.com for details on the required API actions</LI></UL></LI></UL><H2 id="toc-hId--19414019" id="toc-hId-1394740631">API Management Service key</H2><P>Before we are able to call any APIs for information and activities with API management it is important a service key is created with specific authorizations:&nbsp;<STRONG>APIManagement.SelfService.Administrator&nbsp;</STRONG>using the plan apiportal-apiaccess. To create an instance you need to navigate towards: Home page Global account-&gt;subaccount for integration suite-&gt;left hand menu Services-&gt;Instances and subscriptions-&gt;create instance with the following details, using the correct Space:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jordy_S_1-1768206966135.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360392iF61717FB852AB3A6/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Jordy_S_1-1768206966135.png" alt="Jordy_S_1-1768206966135.png" /></span></P><P>As a result the output should look like below:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jordy_S_0-1768206576942.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360391i126108BE14E533CA/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Jordy_S_0-1768206576942.png" alt="Jordy_S_0-1768206576942.png" /></span></P><P>This service key is required for all upcoming activities to validate existing virtual hosts and create/update a virtual host for custom domain usage.</P><H2 id="toc-hId--19414019" id="toc-hId-1198227126">APIM virtual host overview</H2><P>Assumption is the service key is created and active. As a first step try to retrieve a token for the service key, my examples are from Postman:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jordy_S_2-1768207795021.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360395i6BAB1FA0195E6DA5/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Jordy_S_2-1768207795021.png" alt="Jordy_S_2-1768207795021.png" /></span></P><P>As noticed you can here also validate when the response is positive the authorization is properly linked.</P><P>After this step is completed you can call the endpoint:</P><UL><LI>{hostname from servicekey URL}<SPAN><EM>/apiportal/operations/1.0/Configuration.svc/VirtualHostRequests</EM> </SPAN></LI></UL><P><SPAN>with the hostname from the service key, with the HTTP GET method this should result in the overview of virtual hosts for the API Management instance. If you currently only have the SAP standard domain this is the only record to be returned.</SPAN></P><H3 id="toc-hId--19414019" id="toc-hId-1130796340">APIM create virtual host (optional)</H3><P>This step is optional and only required if not additional virtual host is already created</P><P>A virtual host for APIM can easily be created calling the endpoint:&nbsp;</P><UL><LI>{hostname from servicekey URL}<SPAN><EM>/apiportal/operations/1.0/Configuration.svc/VirtualHostRequests&nbsp;</EM>including the body as:</SPAN></LI></UL><DIV><DIV><EM>{</EM></DIV><DIV><EM>&nbsp; &nbsp; "accountId": "{accountId}",</EM></DIV><DIV><EM>&nbsp; &nbsp; "virtualHostUrl": "{desired virtual host prefix}",</EM></DIV><DIV><EM>&nbsp; &nbsp; "isDefaultVirtualHostRequest": false,</EM></DIV><DIV><EM>&nbsp; &nbsp; "operation": "CREATE"</EM></DIV><DIV><EM>}</EM></DIV><DIV>To be sure the virtual host is created it should result in a positive response and it should become visible in APIM within the API proxy section, as example below:</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jordy_S_3-1768208904807.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360413iA5DEC419CC85C001/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Jordy_S_3-1768208904807.png" alt="Jordy_S_3-1768208904807.png" /></span><H2 id="toc-hId--412441029" id="toc-hId-805200116">APIM read virtual hosts - available</H2><P>Retrieving all virtual hosts for an APIM instance is handled via the same URL mentioned a couple of times in this blog:&nbsp;</P><UL><LI>{hostname from servicekey URL}<SPAN><EM>/apiportal/operations/1.0/Configuration.svc/VirtualHostRequests&nbsp;</EM></SPAN></LI></UL><P><SPAN>a response looks like:</SPAN></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jordy_S_5-1768209459140.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360417i2AD00F64B31BEEB8/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Jordy_S_5-1768209459140.png" alt="Jordy_S_5-1768209459140.png" /></span><P>Important fields are highlighted which are required to create/update a custom domain for the created virtual host.</P><H2 id="toc-hId--412441029" id="toc-hId-608686611">APIM create keystore for custom domain</H2><P>Compared to SAP Cloud Integration custom domain which is handled via de Custom Domain Manager UI for APIM this is not working in the same concept. This also means the required certificate needs to be created differently and more information is required.&nbsp;For APIM a certificate needs to be bought/requested from the used CA within the company without using an CSR from SAP.&nbsp;&nbsp;<SPAN>In this blog we are using a wildcard certificate which is used for all APIM environments.</SPAN></P><P>The certificate details you need to create a keystore are:</P><UL><LI>private key&nbsp;</LI><LI>public key</LI><LI>certificate chain including root and intermediate certificates</LI></UL><P>Important is that the certificate needs to be in a .pem format. In our case we already get the certificates delivered in .pem format. It is important the the public key part including the certificate chain is created in the following order in which the first entry is at the top:&nbsp;</P><OL><LI>public key client certificate</LI><LI>intermediate certificates (if any is available)</LI><LI>root CA</LI></OL><P>And saved as a .pem file. The exact steps to create the keystore including the required content is described in SAP documentation:&nbsp;<A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/manage-certificates" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/integration-suite/sap-integration-suite/manage-certificates</A>&nbsp;. To create a JAR file we used the JAVA JDK as a download (not required to install) in combination with PowerShell:</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jordy_S_6-1768210407543.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360422iB220054126467B86/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Jordy_S_6-1768210407543.png" alt="Jordy_S_6-1768210407543.png" /></span><P>In PowerShell the following commmands are used:</P><UL><LI>Create JAR keystore:&nbsp;<EM>{location java JDK}\bin\jar -cf customdomain.jar main.pem privateKey.pem</EM></LI><LI>Update JAR keystore with META-INF information: <EM>{location java JDK}\bin\jar -uf customdomain.jar META-INF/descriptor.properties</EM></LI></UL><P>When the creation is successful this keystore needs to be uploaded.</P><H2 id="toc-hId--412441029" id="toc-hId-412173106">APIM upload keystore for custom domain</H2><P>The upload step is very simple. Navigate within SAP Integration Suite overview page towards: <EM>Left hand menu Configure-&gt;APIs-&gt;Tab: Certificates</EM>&nbsp;:</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jordy_S_7-1768211202628.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360427i275B196053048FCB/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Jordy_S_7-1768211202628.png" alt="Jordy_S_7-1768211202628.png" /></span><P>and click the create button with the following setup:</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jordy_S_8-1768211288037.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360430i68E520FC52E66A92/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Jordy_S_8-1768211288037.png" alt="Jordy_S_8-1768211288037.png" /></span><P>Important is to select <EM>Key Store and New Store</EM>. The Store Name and Name value can be anything you like within the boundaries of what SAP allows and in the upload field you need to select the created JAR file. If you select update it will give a warning the create is the approach. In case you select update and you upload a new certificate the already existing one is overwritten with the same name.</P><P>If the upload is going as expected it will be listed in the tab Certificates.</P><H2 id="toc-hId--412441029" id="toc-hId-215659601">APIM activate custom domain</H2><P>If all previous steps are completed successfully, activation can start. Be aware of the following:</P><UL><LI>The used root CA for custom domain needs to be trusted by applications/systems to be able to make a working connection.</LI><LI>Make a decision if the custom domain needs to be the default domain when creating or importing an API proxy. We decided not to use the custom domain as default virtual host.</LI><LI>After custom domain activation you need to<UL><LI>update any existing DNS CNAME records. The target URL will change. However this URL will only be available after the activation is executed via an API call. This target value can be located in field lbHost in the response from the activation when this is positive.</LI><LI>redeploy all API proxies using the custom domain and as a second step all API products. This to make sure the correct certificate is used. This is especially important when the custom domain is already used and the certificate chain is changed.</LI></UL></LI></UL><P>Activation for custom domain is handled via an API call:</P><UL><LI>{hostname from servicekey URL}<SPAN><EM>/apiportal/operations/1.0/Configuration.svc/VirtualHostRequests</EM></SPAN></LI></UL><P><SPAN>With the following content:</SPAN></P><DIV><DIV><EM>{</EM></DIV><DIV><EM>&nbsp; &nbsp; "accountId" : "{accountId from read operation}", &nbsp;</EM></DIV><DIV><EM>&nbsp; &nbsp; "virtualHostUrl": "{full custom domain with virtual host prefix}",</EM></DIV><DIV><EM>&nbsp; &nbsp; "isDefaultVirtualHostRequest" : false,</EM></DIV><DIV><EM>&nbsp; &nbsp; "isForCustomDomain": true,</EM></DIV><DIV><EM>&nbsp; &nbsp; "keyStoreName": "{created during keystore upload}",</EM></DIV><DIV><EM>&nbsp; &nbsp; "keyStoreAlias": "{created during keystore upload}",</EM></DIV><DIV><EM>&nbsp; &nbsp; "operation" : "UPDATE",</EM></DIV><DIV><EM>&nbsp; &nbsp; "virtualHostId":"{virtualHostId from read operation}"</EM></DIV><DIV><EM>}</EM></DIV><DIV><SPAN>A positive response should look like:</SPAN></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Jordy_S_0-1768213184305.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360462iADB82F35C54E89C6/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="Jordy_S_0-1768213184305.png" alt="Jordy_S_0-1768213184305.png" /></span><P>The values in fields virtualHostUrl and lbHost are important for updating the CNAME record in DNS.&nbsp;</P><H2 id="toc-hId--412441029" id="toc-hId-19146096">APIM create/update custom domain DNS CNAME</H2><P>To make sure the custom domain can be reached and is forwarded to the correct endpoint a DNS CNAME record is required for every APIM virtual host activated for custom domain. In our case we already had a CNAME record for our custom domain pointing to the standard SAP domain [</P><DIV><DIV><SPAN>test.apimanagement.eu20.hana.ondemand.com]&nbsp;</SPAN><SPAN>as provided by SAP when they initially handled the custom domain activities for APIM.&nbsp; As mentioned in the previous paragraph the CNAME now needs to be:</SPAN></DIV></DIV><UL><LI>virtualHostUrl value -&gt; lbHost value</LI></UL><P>Be aware in case you use multiple virtual host in an APIM environment the lbHost value might be the same but this is not causing any issues related to call the correct endpoints.</P><P>After it is validated via DNS checkers the CNAME record is updated the first step is to activate 1 API proxy and the linked API product and validate the correct routing and certificates are handled. We decided to edit the API proxy and perform a dummy change and updated the revision with details about the redeployment. Other options are also available.</P><P>In our case we used temporary a testing endpoint specific for the custom domain validation. We also provided this endpoint to application, system and partner contacts for validation purposes and to request them to validate if the root CA is available in the trust store.</P></DIV><DIV><H2 id="toc-hId--215927524" id="toc-hId-169886948">Conclusion</H2><P>The switch from SAP managed custom domains for our organization towards self-service is a logical one. We got confronted with the self-service approach 5 working days prior to the current certificate expiring which gave us clear time contraints. Luckily the creation of the virtual host and retrieval of the overview of virtual hosts was already known for us and the service key already existed.</P><P>Looking at the SAP documentation most steps are stated (high-level) in multiple pages however from our perspective some pieces of documentation raised questions from our end. With a ticket towards SAP we received definitive clarification to get this change done correctly without any disruptions. This is the reason the blog was written.</P><P>Hopefully this blog is giving others the insights and information required to make this working properly within the own organization.</P></DIV></DIV></DIV></DIV><H2 id="toc-hId--412441029" id="toc-hId--26626557">Documentation &amp; Links</H2><P><SPAN>If you like to read more information about custom domains and the setup it requires for other cases I can recommend reading the below helpful information:</SPAN></P><UL><LI><SPAN>Request or update an APIM custom domain:&nbsp;<A href="https://help.sap.com/docs/sap-api-management/sap-api-management/requesting-for-custom-domain-for-virtual-host" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/sap-api-management/sap-api-management/requesting-for-custom-domain-for-virtual-host</A>&nbsp;</SPAN></LI><LI><SPAN>Create a JAR keystore:&nbsp;<A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/manage-certificates" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/integration-suite/sap-integration-suite/manage-certificates</A></SPAN></LI><LI><SPAN>Configure DNS for a custom domain:&nbsp;<A href="https://help.sap.com/docs/custom-domain/custom-domain-service/configure-dns-for-custom-domain" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/custom-domain/custom-domain-service/configure-dns-for-custom-domain</A>&nbsp;</SPAN></LI></UL> 2026-01-12T12:04:47.814000+01:00 https://community.sap.com/t5/integration-blog-posts/sap-integration-suite-q4-2025-feature-highlights/ba-p/14305802 SAP Integration Suite: Q4/2025 Feature Highlights 2026-01-12T18:00:38.146000+01:00 MaiaraEllwanger https://community.sap.com/t5/user/viewprofilepage/user-id/58 <P><SPAN>The fresh batch of features delivered in Q4 2025 brings powerful new tools designed to make your integrations smarter, faster, and more resilient. From AI-powered recommendations that simplify troubleshooting, to streamlined connectivity with top platforms like Amazon Kinesis and Box, these updates are crafted to boost your operational efficiency and keep you ahead of the curve. Read on to explore how these innovations can transform your integration experience.</SPAN></P><H2 id="toc-hId-1787770245">Artificial Intelligence</H2><P><STRONG>AI-based intelligent recommendations for detected API anomalies</STRONG></P><P>This AI enhancement builds on anomaly detection to explain what changed, why it likely happened, and what to do next, cutting triage and speeding recovery. Embedded in API Management, it surfaces guidance alongside alerts with one-click actions and optional “intelligent healing.”</P><P>The included capabilities - <EM>Insights, Causes, and Recommendations</EM> - enable faster response to error spikes, latency surges, and abnormal traffic patterns, improving reliability and operational efficiency for API owners and teams. See how to get started in this <A title="Blog post: Introducing AI-Powered Anomaly Insights &amp; Recommendations in SAP Integration Suite" href="https://community.sap.com/t5/integration-blog-posts/introducing-ai-powered-anomaly-insights-amp-recommendations-in-sap/ba-p/14286013" target="_blank">blog post and review the </A><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/enabling-anomaly-detection" target="_blank" rel="noopener noreferrer">Documentation.</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="intelligent recommendations.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360572i97D9258105959742/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="intelligent recommendations.png" alt="intelligent recommendations.png" /></span></P><H2 id="toc-hId-1591256740">&nbsp;<SPAN>Connectivity and Adapters</SPAN></H2><UL><LI><SPAN><A href="https://hub.sap.com/package/AmazonKinesisAdapterforSAPIntegrationSuite/overview" target="_self" rel="noopener noreferrer">Amazon Kinesis receiver adapter</A>:&nbsp;facilitates and accelerates connectivity to Amazon Kinesis Data Streams, streamlining data communication and enhancing real-time data processing.</SPAN></LI><LI><SPAN><SPAN><A href="https://hub.sap.com/package/BoxAdapterforSAPIntegrationSuite/overview" target="_self" rel="noopener noreferrer">Box receiver adapter</A>:&nbsp;connects SAP Integration Suite to Box and enables you to access components on Box.</SPAN></SPAN></LI><LI><SPAN><SPAN><A href="https://hub.sap.com/package/MicrosoftOneNoteAdapterforSAPIntegrationSuite/overview" target="_self" rel="noopener noreferrer">Microsoft OneNote receiver adapter</A>:&nbsp;automates common business operations by integrating MS OneNote with other business applications. It connects an SAP Integration Suite tenant to a remote system using HTTP protocol.</SPAN></SPAN></LI><LI><SPAN><SPAN><A href="https://hub.sap.com/package/AzureServiceBusAdapterforSAPIntegrationSuite/overview" target="_self" rel="noopener noreferrer">Azure Service Bus adapter</A>:&nbsp;connects SAP Integration Suite to Azure Service Bus.</SPAN></SPAN></LI><LI><SPAN><SPAN><A href="https://hub.sap.com/package/MongoDBAdapterforSAPIntegrationSuite/overview" target="_self" rel="noopener noreferrer">MongoDB receiver adapter</A>:&nbsp;connects SAP Integration Suite to MongoDB.</SPAN></SPAN></LI><LI><SPAN><SPAN><SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/configure-ftp-sender-adapter-used-with-poll-enrich-step-3eca3f8f518540ec98db8c9eb4c67f90" target="_self" rel="noopener noreferrer">Poll Enrich Step in FTP sender adapter</A>:&nbsp;reads (poll) messages from FTP server and adds the content to the original message in the middle of the message processing sequence.</SPAN></SPAN></SPAN></LI></UL><P><STRONG>New data space integration package</STRONG></P><P>The data space integration package helps supply chain partners exchange data securely and self-sovereignly within data spaces. It includes two components: a data space connector for secure, sovereign data exchange, and a decentralized identity wallet for sharing trustworthy, verifiable data. Read all details in the <A href="https://community.sap.com/t5/integration-blog-posts/data-space-integration-package/ba-p/14262165" target="_self">blog post.</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="data space integration BAH.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360573i2157628DD0EE8D49/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="data space integration BAH.png" alt="data space integration BAH.png" /></span></P><H2 id="toc-hId-1394743235"><STRONG>Data Center Availability <span class="lia-unicode-emoji" title=":germany:">🇩🇪</span> <span class="lia-unicode-emoji" title=":italy:">🇮🇹</span> <span class="lia-unicode-emoji" title=":united_arab_emirates:">🇦🇪</span></STRONG></H2><P>Customers can now run SAP Integration Suite in four new data centers: on SAP infrastructure in Frankfurt, Sankt Leon-Rot (both in Germany) and in the United Arab Emirates; and additionally, one in Italy on Amazon Web Services.</P><H2 id="toc-hId-1198229730">Event-driven Integration&nbsp;</H2><P><STRONG>Micro-Integrations</STRONG></P><P>Micro-Integrations are small, event-driven connectors that link applications to an Advanced Event Mesh as on-ramps (event sources) or off-ramps (event targets), avoiding brittle point-to-point ties so changes stay localized and low-risk. By focusing on narrowly defined tasks, they are easier to design, adapt, and scale, delivering high-throughput, real-time streams via pub/sub and letting you add more Micro-Integrations per task as demand grows. Available in the Cloud Console, they provide management and observability for integrations between external systems and event brokers or meshes, resulting in greater agility, faster data distribution, and flexibility to use the best-fit technologies at the source and target. Find more details and the currently available micro-integrations in the <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/small-but-great-introducing-micro-integrations-for-advanced-event-mesh/ba-p/14281037" target="_self">blog post.</A></P><P><STRONG>Event Mesh integration with SAP Cloud ALM for health monitoring</STRONG></P><P>SAP Integration Suite’s Event Mesh now integrates with SAP Cloud ALM Health Monitoring to regularly collect and display broker vitals, such as active connections, message consumers, message queues, spool usage, and broker state, on the CALM dashboard. Customers can customize thresholds for each metric (except broker state), view 14 days of history, and receive warning notifications when values reach 80% (orange) and 90% (red) of the defined thresholds, enabling proactive monitoring and alerts for Event Mesh health. Set up and further details can be found <SPAN><A href="https://support.sap.com/en/alm/sap-cloud-alm/operations/expert-portal/health-monitoring/health-monitoring-setup-configuration/health-monitoring-isem.html" target="_blank" rel="noopener noreferrer">here.</A></SPAN></P><P><STRONG>Migration support from Event Mesh capability to SAP Integration Suite, advanced event mesh</STRONG></P><P>Great news to facilitate your system modernization: SAP provides technical- and process-oriented migration support to help customers move from the Event Mesh capability in SAP Integration Suite to SAP Integration Suite, advanced event mesh, scaling smoothly from basic scenarios to a richer, more powerful event-driven foundation. This includes support for migrating events so applications can communicate asynchronously in real time across distributed landscapes with support for various protocols, enabling teams to start simple, grow confidently, and modernize without disruption.</P><H2 id="toc-hId-1001716225">B2B Integration</H2><P><STRONG>Support for the SFTP adapter and Alerting of failed B2B interchanges in Trading Partner Management</STRONG></P><P>SAP Integration Suite’s Trading Partner Management now supports SFTP (Secure File Transfer Protocol), available in both standard and premium editions and via the SAP BTP Enterprise Agreement. Users can read and write files to their own or trading partners’ SFTP servers and, when defining systems, can choose SFTP sender and receiver adapters.</P><P>Additionally, SAP Integration Suite extends Trading Partner Management by publishing B2B interchange data to SAP Cloud ALM for centralized monitoring and rapid detection of failed transactions. Using SAP Cloud ALM, you can configure granular scenario specific alerts that filter by details such as trading partners or message types to receive targeted notifications and act quickly on issues.</P><H2 id="toc-hId-805202720">Process Integration</H2><P><STRONG>Basic authentication on Edge Integration Cell</STRONG></P><P>SAP Integration Suite’s Edge Integration Cell now supports basic HTTP authentication using a client ID and client secret during temporary connectivity loss to SAP BTP. This enables simple sender authentication for testing with minimal configuration and allows integration flow processing and API artifact invocations using clientId and clientsecret while SAP BTP is unreachable.</P><P><STRONG>Advanced checks in Groovy scripts</STRONG></P><P>SAP Integration Suite’s Cloud Integration designer now offers advanced checks for Groovy scripts, helping developers analyze and prepare custom integration flows for future runtime version upgrades. A new “ensure upgrade readiness” guideline recommends supported libraries and classes and can automatically update scripts to align with upgrade requirements. See all information in the respective <SPAN><A href="https://help.sap.com/docs/integration-suite/sap-integration-suite/groovy-script#use-recommended-libraries-and-proxy-based-classes" target="_blank" rel="noopener noreferrer">documentation.</A></SPAN></P><P><STRONG>Service interface artifact creation In Cloud Integration</STRONG></P><P>SAP Integration Suite Cloud Integration now supports creating and editing service interface artifacts directly in the workspace, aligning with an API first outside in development approach and supporting existing Enterprise Services Repository use cases. These artifacts enable proxy generation in ABAP backends for smooth integration into ABAP based systems. The capability is available in the multi cloud environment and allows native creation of service interface artifacts in your Cloud Integration tenant.</P><P><STRONG>Local OData API Access &amp; SAP HANA Support</STRONG></P><P>See details and demo in the video:</P><P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FBw6WGI_rc74%3Fstart%3D335%26feature%3Doembed%26start%3D335&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DBw6WGI_rc74&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FBw6WGI_rc74%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="400" height="225" scrolling="no" title="Whats New in SAP BTP: Top New Features | Joule Studio Agent Builder | Q4 2025" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><P>----</P><UL><LI><SPAN>For a sneak peek into what’s in store for 2026, check out the <A href="https://roadmaps.sap.com/board?PRODUCT=000D3A47875C1EDB98A8A910864AC24B&amp;PRODUCT=73554900100800003241&amp;range=2026Q1-2026Q2#Q1%202026" target="_self" rel="noopener noreferrer">road map explorer and the </A><A href="https://www.sap.com/topics/innovation-guide/h2#integration" target="_blank" rel="noopener noreferrer">SAP TechEd 2025 News Guide</A></SPAN></LI><LI><SPAN>Join the <A href="https://community.sap.com/t5/integration/gh-p/integration&nbsp;" target="_self">integration community and connect with other integration developers!</A></SPAN></LI></UL> 2026-01-12T18:00:38.146000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/use-sap-integration-suite-to-connect-sap-and-aws-services/ba-p/14309752 Use SAP Integration Suite to connect SAP and AWS services 2026-01-20T11:36:09.592000+01:00 claudiacsrosalino https://community.sap.com/t5/user/viewprofilepage/user-id/869685 <H2 id="toc-hId-1787888603">Bridging the gap between SAP and 3rd party systems&nbsp;</H2><P>Everyone already knows that SAP Integration Suite is the election tool to connect your SAP services. But did you know that it is also your tool to integrate <EM>Everything, Everywhere, All</EM> in One Place? (yes, almost like the Oscar award winning movie <span class="lia-unicode-emoji" title=":trophy:">🏆</span>)<STRONG><BR /><BR /><A href="https://discovery-center.cloud.sap/missiondetail/4667/4956/" target="_self" rel="nofollow noopener noreferrer">Use SAP Integration Suite to connect SAP and AWS services</A>&nbsp;</STRONG>is a <STRONG>new official SAP Discovery Center Mission</STRONG> that&nbsp;focus on showcasing how easy it is to integrate not only SAP systems but also <STRONG>non-SAP systems</STRONG> using <STRONG>SAP Integration Suite.</STRONG>&nbsp;<BR /><BR />For this mission, we decided to use the <STRONG>AWS platform</STRONG> as the example of third-party cloud services provider, but the same rational with this set of best practices and capabilities can be used to integrate with other cloud providers. By following the cards provided in the mission, you will see <STRONG>step-by-step</STRONG> how you can start to integrate an application developed with SAP BTP development tools with AWS services, such as <STRONG>S3</STRONG> for image storage and <STRONG>Rekognition</STRONG> for image identification.<BR />You can even use a <STRONG>SAP BTP Trial</STRONG> account to perform the SAP BTP parts of the mission, even though you will always still require also an <STRONG>AWS account</STRONG> to connect with the S3 and Rekognition services (and IAM for user and roles management on the AWS side). Either if you are a&nbsp;<STRONG>technical</STRONG>&nbsp;user or more of a&nbsp;<STRONG>business user</STRONG>&nbsp;interested in rapid application development, cloud integration strategies and/or AI-powered business solution, this mission is for you!<BR /><BR />The following architecture shows the big picture of what the final result of the mission should look like, seamlessly combining the best of both SAP BTP and AWS platforms:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="BTP x AWS - Architecture.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/362734iA7AC31636E4F17BC/image-size/large?v=v2&amp;px=999" role="button" title="BTP x AWS - Architecture.png" alt="BTP x AWS - Architecture.png" /></span></P><P> </P><H2 id="toc-hId-1591375098">Use Case Description</H2><P><SPAN>The use case followed trough out the mission focuses in <STRONG>enabling a Supplier to donate surplus food ingredients</STRONG> through an <STRONG>AI-powered mobile and web application</STRONG> built using <STRONG>SAP Build Apps</STRONG>, a low-code/no-code solution within SAP Business Technology Platform (SAP BTP), seamlessly integrated with AWS capabilities for storage and artificial intelligence–based image recognition. For the integration part, you will leverage and combine different <STRONG>integration capabilities</STRONG> that are part of the <STRONG>SAP Integration Suite</STRONG>. The intended outcome of the use case is to minimize food waste while simplifying the donation process and facilitating redistribution to organizations in need.</SPAN></P><H3 id="toc-hId-1523944312">Solution Components:</H3><UL><LI><STRONG>SAP Build Apps</STRONG>: The low-code/no-code application development service used to create the application (frontend and logic) where the Supplier can donate the surplus ingredients by taking or uploading photos&nbsp;</LI><LI><STRONG>SAP Integration Suite</STRONG>: The secure and centralized integration management service for <STRONG>all</STRONG> your integrations,&nbsp;<SPAN>making them easier to manage, monitor and troubleshoot</SPAN></LI><LI><STRONG>Amazon S3</STRONG>: The Amazon service for simplified and cost-effective image storage capabilities</LI><LI><STRONG>Amazon Rekognition</STRONG>: The Amazon service for AI-powered identification and categorization, in this case used to identify the ingredients in the images taken or uploaded from the application to a S3 bucket</LI></UL><H3 id="toc-hId-1327430807">The Use Case Flow:</H3><OL><LI>A Supplier captures or uploads an image of surplus ingredients through the mobile/web app (developed with <STRONG>SAP Build Apps</STRONG>)</LI><LI>The image is securely stored in <STRONG>Amazon S3</STRONG> via <STRONG>SAP Integration Suite</STRONG> (using <STRONG>Cloud Integration</STRONG>, <STRONG>Pre-built Open Connector</STRONG> and <STRONG>API Management</STRONG> capabilities)</LI><LI>Also via <STRONG>SAP Integration Suite</STRONG>, the app then calls <STRONG>Amazon Rekognition</STRONG> to automatically identify and categorize the ingredient present in the image (using <STRONG>Cloud Integration</STRONG>, <STRONG>Custom Open Connector</STRONG>&nbsp;and <STRONG>API Management</STRONG> capabilities)</LI><LI>The results are sent back to the app and ready for further processing</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="app-preview.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/362711iEE1F86C89248AD57/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="app-preview.png" alt="app-preview.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="sap-integration-suite-open-connectors.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/362707iD7BD30FB2957BF43/image-size/medium?v=v2&amp;px=400" role="button" title="sap-integration-suite-open-connectors.png" alt="sap-integration-suite-open-connectors.png" /></span>&nbsp;&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="sap-is-integration-flow.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/362708i83FD4E1B09A2A96E/image-size/medium?v=v2&amp;px=400" role="button" title="sap-is-integration-flow.png" alt="sap-is-integration-flow.png" /></span></P><H2 id="toc-hId-1001834583">Learning Outcomes</H2><P>By completing this Discovery Center Mission, you'll gain practical experience in:</P><UL><LI>Building low-code applications with SAP Build Apps</LI><LI>Configuring SAP Integration Suite for AWS connectivity</LI><LI>Implementing secure cloud-to-cloud integrations</LI><LI>Leveraging AI services for business process automation</LI><LI>Managing integration flows and monitoring capabilities</LI></UL><H2 id="toc-hId-805321078">Getting Started</H2><P>Once you open and start the&nbsp;<A href="https://discovery-center.cloud.sap/missiondetail/4667/4956/" target="_self" rel="nofollow noopener noreferrer">Mission</A>, you will see in the <STRONG>Project Board</STRONG>&nbsp;the different cards that will guide you step-by-step, divided in 7 columns.<BR /><BR />Make sure you fullfill all the requirements indicated in the <STRONG>SET UP</STRONG> and <STRONG>PREPARE</STRONG> columns. After that, you can start with the <STRONG>EXECUTE</STRONG>&nbsp;columns. You will first explore the Open Connectors capability of SAP Integration Suite (in the <STRONG>Execute - OpenConnectors</STRONG>), followed by the Cloud Integration and API Management capabilities of SAP Integration Suite (in the <STRONG>Execute - Security Material and Integration Flow</STRONG>) and lastly you will get to visually create a simple app screen with SAP Build Apps (in <STRONG>Execute - Build app</STRONG>) .<BR />After finishing the mission, don't forget to <STRONG>mark all the cards as completed</STRONG> and we encourage you to leave your feedback and&nbsp;share your experiences with the rest of the SAP Community.&nbsp;<BR /><BR />And now, for those who saw the movie <EM>Everything Everywhere All at Once</EM>,&nbsp;<STRONG>DON'T</STRONG> "Just be a rock" and start the mission here!&nbsp; -&gt;&nbsp;&nbsp;<EM><A href="https://discovery-center.cloud.sap/missiondetail/4667/4956/" target="_self" rel="nofollow noopener noreferrer">SAP Discovery Center Missions - Use SAP Integration Suite to connect SAP and AWS services&nbsp;</A><BR /></EM></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rocks scene.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363350i5B616CE0996574A0/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="rocks scene.jpg" alt="rocks scene.jpg" /></span><EM><BR /></EM></P> 2026-01-20T11:36:09.592000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/sap-btp-apim-advanced-domain-routing-api-proxy-pattern-for-governing/ba-p/14302866 SAP BTP - APIM - Advanced Domain Routing API-Proxy Pattern for Governing Similar Backend Endpoints 2026-01-20T15:57:09.545000+01:00 rhviana https://community.sap.com/t5/user/viewprofilepage/user-id/160570 <HR /><P><STRONG>Author Note (2026)</STRONG><BR />This article represents an intermediate architectural exploration that preceded the formal definition of the <STRONG>Domain-Centric Routing Pattern (DCRP)</STRONG>.</P><P>While the techniques described here remain valid in constrained scenarios, they have since been consolidated and governed under the DCRP framework to address scalability, governance, and observability at enterprise scale.</P><P>This article is preserved for educational and historical context.</P><HR /><P class=""><STRONG>PEER-REVIEWED ACADEMIC PAPER PUBLISHED</STRONG></P><HR /><P class="">Official DOI: 10.5281/zenodo.18582469<SPAN>&nbsp;</SPAN><STRONG>Published: February 10, 2026</STRONG><SPAN>&nbsp;</SPAN>| Repository: Zenodo (CERN) Status: Open Access, Peer-Reviewed</P><P class="">This Medium article is the foundational disclosure<SPAN>&nbsp;</SPAN><STRONG>(Feb 7, 2026).</STRONG><SPAN>&nbsp;</SPAN>The complete academic paper with validation data, vendor implementations, and 40 references is now available:</P><P class="">Download Full Paper (PDF):<A class="" href="https://zenodo.org/records/18582493" target="_blank" rel="noopener nofollow noreferrer"><SPAN>&nbsp;</SPAN>https://zenodo.org/records/18582469</A></P><P class="">Validation Results:</P><UL><LI>90% reduction in API proxies (40 → 4)</LI><LI>90% reduction in CPI packages (40 → 4)</LI><LI>95% faster deployment (273 min → 14.5 min)</LI><LI>33,000+ messages tested, 68ms latency, 100% success</LI></UL><P class="">Citation:<SPAN>&nbsp;</SPAN><STRONG>Viana, R. L. H. (2026).</STRONG><SPAN>&nbsp;</SPAN>Gateway Domain-Centric Routing: A Vendor-Agnostic Metadata-Driven Architecture for Enterprise API Governance. Zenodo.<SPAN>&nbsp;</SPAN><A class="" href="https://doi.org/10.5281/zenodo.18582492" target="_blank" rel="noopener nofollow noreferrer">https://doi.org/10.5281/zenodo.18582469</A></P><HR /><H4 id="toc-hId-2045846500">Introduction</H4><P class="lia-align-justify" style="text-align : justify;">This article presents an advanced API Management pattern for SAP landscapes, where a single API Proxy represents one business contract and dynamically routes requests to multiple SAP CPI iFlows belonging to the same business process and domain.</P><P class="lia-align-justify" style="text-align : justify;">The goal is not to reduce the number of APIs, but to increase governance, observability, and semantic clarity, while keeping analytics consolidated at the business-domain level.</P><P class="lia-align-justify" style="text-align : justify;">In a previous exploratory article—removed as part of an architectural consolidation and deprecation process—I described how a single API Proxy endpoint can route requests to multiple SAP CPI iFlows within a single package.</P><P class="lia-align-justify" style="text-align : justify;">In that initial exploration, it was not possible to present a clear and structured view of message monitoring within the analytics dashboard. The purpose of this article is therefore to demonstrate how to define custom dimensions, configure Statistics Collector policies, and visualize the results within the SAP API Management analytics dashboard.</P><P class="lia-align-justify" style="text-align : justify;">However, centralizing traffic often creates a visibility vacuum. This point was raised by&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1161523">@MateuszPiotrowski</a>&nbsp;,it was not included in the previous article due to its scope.</P><H2 id="toc-hId-1591167557">Important Note (Read First)</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1769147592727.png" style="width: 765px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364379i355727175EDED3EA/image-dimensions/765x505/is-moderation-mode/true?v=v2" width="765" height="505" role="button" title="rhviana_0-1769147592727.png" alt="rhviana_0-1769147592727.png" /></span></P><P class="lia-align-center" style="text-align: center;">Figure 1 -&nbsp;Outside these constraints, this approach becomes an <STRONG>anti-pattern</STRONG>.</P><H4 id="toc-hId-1652819490">The "Invisible Traffic"&nbsp;</H4><P class="lia-align-justify" style="text-align : justify;">When some business domains over a SAP CPI package, splittled by diferent (iFlows) following the same pattern of endpoint , share a single API Proxy, standard analytics become a "black box." In the default dashboard, all traffic appears under the same Proxy name.&nbsp;</P><P class="lia-align-justify" style="text-align : justify;">In this post, we will bridge this gap. I will demonstrate how to implement using JavaScript Policy and the Statistics Collector policy, we will "unmask" the Domain Routing Proxy traffic, providing full transparency directly within the SAP APIM Analytics Dashboard.</P><H3 id="toc-hId-1327223266">The Strategy - Mapping the iflows with Javascript Policy</H3><P class="lia-align-justify" style="text-align : justify;">To solve the "visibility vacuum," we must capture the iFlow’s identity the moment the request hits the Proxy, the sender, the iflow, the package if needed and others details.</P><H4 id="toc-hId-1259792480">API Domain Routing Proxy - ProxyEndpoint routing:</H4><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_1-1769023616131.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363874iFE7BB52D44B7C37F/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_1-1769023616131.png" alt="rhviana_1-1769023616131.png" /></span></P><P class="lia-align-center" style="text-align: center;">Figure 1 - Routing based on <STRONG>proxy.pathsuffix MatchesPath "/method*"</STRONG></P><P class="lia-align-justify" style="text-align : justify;"><STRONG>What does this routing rule mean?</STRONG></P><P class="lia-align-justify" data-unlink="true" style="text-align : justify;">So the basic path address of the API Proxy is - <STRONG>https://&lt;apimanagementaddress&gt;/megaproxy/v1</STRONG>&nbsp;</P><P class="lia-align-justify" style="text-align : justify;">Any extra call that comes with path <STRONG>/method</STRONG> will generate the routing</P><P class="lia-align-justify" data-unlink="true" style="text-align : justify;">The endpoint&nbsp;<STRONG><A target="_blank" rel="noopener">https://&lt;apimanagementaddress&gt;/megaproxy/v1/method*&nbsp;</A></STRONG></P><P class="lia-align-justify" data-unlink="true" style="text-align : justify;"><STRONG>The target Endpoint properties:</STRONG></P><P class="lia-align-justify" data-unlink="true" style="text-align : justify;">In this case different that was presente in the previous blog, I decide to higher the level of cracking, only using the default as a targetEndpoint but in the end is routing for 4 different endpoints</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1769025221451.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363881i54B97BD362732DA0/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_0-1769025221451.png" alt="rhviana_0-1769025221451.png" /></span></P><P class="lia-align-center" style="text-align: center;">Figure 2 - "Default endpoint" - and properties host and cpi basepath</P><H2 id="toc-hId-805113537">Routing Mechanism&nbsp;</H2><P>The only references that I could find was the SAP but confused to understand -</P><P><A href="https://help.sap.com/docs/sap-api-management/sap-api-management/enable-dynamic-routing" target="_self" rel="noopener noreferrer">SAP Enable-Dynamic-Routing</A></P><P><A href="https://help.sap.com/docs/sap-api-management/sap-api-management/defining-new-target-endpoint-manually" target="_self" rel="noopener noreferrer">Enable Dynamic Routing Manually</A></P><P class="lia-align-justify" style="text-align : justify;">SAP API Management already provides:</P><UL class="lia-align-justify" style="text-align : justify;"><LI><CODE>proxy.pathsuffix</CODE></LI><LI>custom properties in ProxyEndpoint and TargetEndpoint</LI><LI>Conditional flows</LI><LI>JavaScript policies</LI><LI>Dynamic target resolution</LI></UL><P class="lia-align-justify" style="text-align : justify;">Instead of creating multiple target endpoints, the proxy uses:</P><UL class="lia-align-justify" style="text-align : justify;"><LI>A <STRONG>single target</STRONG></LI><LI>Dynamic <CODE>host</CODE> and <CODE>path via properties</CODE></LI><LI>Routing logic based on suffix and context</LI></UL><P class="lia-align-justify" style="text-align : justify;">This is not a hack — it is native SAP API Management functionality that is widely available but rarely explored in depth within the SAP Community. This article formalizes its application as an architectural pattern rather than an implementation trick.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1769240945483.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364786iAED0F69384EEA7B9/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_0-1769240945483.png" alt="rhviana_0-1769240945483.png" /></span></P><P class="lia-align-center" style="text-align: center;">Figure 2 -&nbsp;<SPAN>API Management - API Proxy Design Pattern</SPAN></P><H4 id="toc-hId-866765470">Example: Dynamic Routing Logic (Conceptual)</H4><pre class="lia-code-sample language-javascript"><code>//Routing mechanism function RoutingCpiEndpoint() { var suffix = context.getVariable("proxy.pathsuffix"); if (suffix == null) { suffix = ""; } var targetBase = context.getVariable("target.cpi.host"); var cpipath = context.getVariable("target.cpi.basepath") // Use the + operator for compatibility var finalUrl = targetBase.toString() + cpipath.toString() + suffix.toString(); // Set it back to a context variable so the target can use it context.setVariable("target.url", finalUrl); }</code></pre><H2 id="toc-hId-412086527">Samples of URL's after the groovy:</H2><P>This line is responsable to extract the cpi.path and cpi.host from the Properties Configured in the Target Endpoint:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1769028251096.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363888i3197392609859E32/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_0-1769028251096.png" alt="rhviana_0-1769028251096.png" /></span></P><P class="lia-align-center" style="text-align: center;">Figure 3 - Custom properties in the Target Endpoint</P><P class="lia-align-center" style="text-align: center;"><STRONG>var finalUrl = targetBase.toString() + cpipath.toString() + suffix.toString();</STRONG></P><P>This approach also introduces an additional abstraction layer, as the full backend URL structure remains hidden from the consumer.</P><P>Urls expose to the consumer:</P><UL><LI><SPAN><A target="_blank" rel="noopener">https://&lt;apimaddress&gt;/megaproxy/v1/methoddelete</A></SPAN></LI><LI><SPAN><A target="_blank" rel="noopener">https://&lt;apimaddress&gt;/megaproxy/v1/methodpost</A></SPAN></LI><LI><SPAN><A target="_blank" rel="noopener">https://&lt;apimaddress&gt;/megaproxy/v1/methodput</A></SPAN></LI><LI><SPAN><A target="_blank" rel="noopener">https://&lt;apimaddress&gt;/megaproxy/v1/methodget</A></SPAN></LI></UL><P><SPAN>Url's generate inside the API PROXY:</SPAN></P><UL><LI><SPAN><A target="_blank" rel="noopener">https://&lt;backendfinal endpoint&gt;/http/cpi/methoddelete</A></SPAN></LI><LI><SPAN><A target="_blank" rel="noopener">https://</A><A target="_blank" rel="noopener">&lt;backendfinal endpoint&gt;</A><A target="_blank" rel="noopener">/</A><A target="_blank" rel="noopener">http/cpi/</A><A target="_blank" rel="noopener">methodpost</A></SPAN></LI><LI><SPAN><A target="_blank" rel="noopener">https://</A><A target="_blank" rel="noopener">&lt;backendfinal endpoint&gt;</A><A target="_blank" rel="noopener">/</A><A target="_blank" rel="noopener">http/cpi/</A><A target="_blank" rel="noopener">methodput</A></SPAN></LI><LI><SPAN><A target="_blank" rel="noopener">https://</A><A target="_blank" rel="noopener">&lt;backendfinal endpoint&gt;</A><A target="_blank" rel="noopener">/</A><A target="_blank" rel="noopener">http/cpi/</A><A target="_blank" rel="noopener">methodget</A></SPAN></LI></UL><H4 id="toc-hId-473738460"><SPAN>Test Proposal via postman for methoddelete:</SPAN></H4><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_1-1769028363146.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363889iB6E717AACAEF2E2C/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_1-1769028363146.png" alt="rhviana_1-1769028363146.png" /></span></P><P class="lia-align-center" style="text-align: center;">Figure 3 - Postman test of endpoint /methoddelete</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_4-1769028557321.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363892i0513E1B114B62589/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_4-1769028557321.png" alt="rhviana_4-1769028557321.png" /></span></P><P class="lia-align-center" style="text-align: center;">Figure 4 - CPI Monitoring - Iflow.Template.MethodDelete</P><H2 id="toc-hId-19059517">The Real Innovation: Business-Oriented Analytics</H2><P class="lia-align-justify" style="text-align : justify;">Routing itself is not the primary innovation; the real value lies in achieving clear visibility into API usage and sender-consumer behavior.</P><P class="lia-align-justify" style="text-align : justify;">Enriching the api-proxy , SAP APIM Analytics can show:</P><UL class="lia-align-justify" style="text-align : justify;"><LI>Calls per sender system</LI><LI>Calls per CPI iFlow or another backend system api service</LI><LI>Success vs error rates per process variant</LI><LI>Traffic distribution across the domain</LI></UL><P class="lia-align-justify" style="text-align : justify;">The JavaScript policy enriches SAP API Management analytics by providing clear visibility into endpoint usage, sender system identification, and process execution outcomes (success and failure).</P><pre class="lia-code-sample language-javascript"><code>//Set custom headers with name of Iflow function setCustomHeaders() { var path = context.getVariable("proxy.pathsuffix"); var sourceSystem = context.getVariable("request.header.X-Sender-ID"); var packageName = "sap.scn.package"; var iflowName = "UnknownIflow"; var senderid = sourceSystem ? sourceSystem : "UnknownSender"; if (path === "/methoddelete") { iflowName = "Iflow.Template.MethodDelete"; context.setVariable("custom.senderid", senderid); } else if (path === "/methodget") { iflowName = "Iflow.Template.MethodGet"; context.setVariable("custom.senderid", senderid); } else if (path === "/methodpost") { iflowName = "Iflow.Template.MethodPost"; context.setVariable("custom.senderid", senderid); } else if (path === "/methodput") { iflowName = "Iflow.Template.MethodPut"; context.setVariable("custom.senderid", senderid); } context.setVariable("custom.package_name", packageName); context.setVariable("custom.iflow_name", iflowName); }</code></pre><H4 id="toc-hId--417005645">Custom Metrics Setup:</H4><P>Recorded data is only useful if it can be visualized. You must prepare the ground in the Analytics portal before the policy can successfully register data:</P><UL><LI>Navigate to <STRONG>Analyze &gt; Settings &gt; Custom Metrics/Dimensions</STRONG>.</LI><LI>Add a new dimension named <STRONG>sapcpiIflow</STRONG>.</LI><LI><STRONG>Expert Insight:</STRONG> SAP will prefix these fields as <CODE>custom_sapcpiIflow and custom_senderid</CODE>. This is the exact name you will reference in your policy and search for in your reports.</LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_4-1768919222665.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363394iFF8A848439F20C46/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_4-1768919222665.png" alt="rhviana_4-1768919222665.png" /></span></P><P class="lia-align-center" style="text-align: center;">Figure 5 - Create Custom Dimensions that will be used in Policy Statistic Collector</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_4-1769024287937.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363880iBEE87ACE8ECB384B/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_4-1769024287937.png" alt="rhviana_4-1769024287937.png" /></span>Figure 6 - Create two dimensions, iflowname and senderid.</P><H4 id="toc-hId--613519150">Policy Statistic Collector:</H4><P class="lia-align-justify" style="text-align : justify;">As you can see in the tag Statistic reffering to custom_sapcpiIflow with the reference of custom.iflow_name created by the javascript above as sample.</P><UL><LI>&lt;Statistic name='<STRONG>custom_sapcpiIflow</STRONG>' ref='<STRONG>custom.iflow_name</STRONG>' type='string'&gt;0&lt;/Statistic&gt;</LI><LI>&lt;Statistic name='<STRONG>custom_senderid</STRONG>' ref='<STRONG>custom.senderid</STRONG>' type='string'&gt;0&lt;/Statistic&gt;</LI></UL><pre class="lia-code-sample language-javascript"><code>&lt;!--Specify Stats collector policy to add custom dimensions and measures --&gt; &lt;StatisticsCollector async='false' continueOnError='false' enabled='true' xmlns='http://www.sap.com/apimgmt'&gt; &lt;Statistics&gt; &lt;!-- prepopulated template --&gt; &lt;!-- Uncomment Statistic which needs to be collected and define reference variable--&gt; &lt;Statistic name='custom_sapcpiIflow' ref='custom.iflow_name' type='string'&gt;0&lt;/Statistic&gt; &lt;Statistic name='custom_senderid' ref='custom.senderid' type='string'&gt;0&lt;/Statistic&gt; &lt;/Statistics&gt; &lt;/StatisticsCollector&gt;</code></pre><P class="lia-align-justify" style="text-align : justify;"><STRONG>Add in seguency:</STRONG><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_2-1768918860222.png" style="width: 409px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363385iEE8593FCFE5D31A7/image-dimensions/409x151/is-moderation-mode/true?v=v2" width="409" height="151" role="button" title="rhviana_2-1768918860222.png" alt="rhviana_2-1768918860222.png" /></span></P><P class="lia-align-center" style="text-align: center;">Figure 7 - Those policies should be added in the last step into the Target Endpoint Pre-Flow</P><H2 id="toc-hId--223226641">The Result as&nbsp;<STRONG>SAP CPI as backend</STRONG>:</H2><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_0-1769151333393.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364390i385ECDFA132922FA/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_0-1769151333393.png" alt="rhviana_0-1769151333393.png" /></span></P><P class="lia-align-center" style="text-align: center;">Figure 8 -&nbsp;<SPAN>APIM - Business-Oriented Analytics Dashboard</SPAN></P><P class="lia-align-justify" style="text-align : justify;">Once this configuration is live, you move from a generic chart to a <STRONG>Business Iflow Dashboard</STRONG>. You can now generate</P><UL><LI><STRONG>Volume Tracking:</STRONG> Exactly how many calls are being processed by <STRONG>iFlow A</STRONG> vs. <STRONG>iFlow B</STRONG> or <STRONG>C</STRONG>?</LI><LI><STRONG>Targeted Performance:</STRONG> Which specific iFlow endpoint is experiencing high latency?</LI><LI><STRONG>Error Granularity:</STRONG> Which iFlow is generating the most errors? Instead of seeing "Proxy Errors," you can pinpoint which specific backend integration is failing</LI></UL><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_5-1768919664771.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363401iDCDD96D8F4216FBC/image-size/large?v=v2&amp;px=999" role="button" title="rhviana_5-1768919664771.png" alt="rhviana_5-1768919664771.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1768925971359.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363463i5489C2D79BFCC8B4/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_0-1768925971359.png" alt="rhviana_0-1768925971359.png" /></span></P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_0-1768921883918.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363435iB6D2A241CBEA4ABE/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_0-1768921883918.png" alt="rhviana_0-1768921883918.png" /></span>Image - 8 - Custom Dashboard monitoring SAP APIM</P><H4 id="toc-hId--1006546160">Sender system identifier:<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_0-1768969531212.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363568i7461BE7107D1E33C/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_0-1768969531212.png" alt="rhviana_0-1768969531212.png" /></span></H4><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_2-1768969120636.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363565iE1E83F4A7C59F45C/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_2-1768969120636.png" alt="rhviana_2-1768969120636.png" /></span>Image 9 - Indentifier of Sender System</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_4-1768969238645.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363567i0BB3B879AAD36479/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_4-1768969238645.png" alt="rhviana_4-1768969238645.png" /></span>Image 10 - Indentifier of Sender System - Coke - and which Iflow endpoint</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_1-1768921970489.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363436iB45AE2C7F587D47D/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_1-1768921970489.png" alt="rhviana_1-1768921970489.png" /></span>Image 11 - CPI Iflows</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="rhviana_3-1769149366123.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/364384i8399BFC5B0D28445/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_3-1769149366123.png" alt="rhviana_3-1769149366123.png" /></span></P><P class="lia-align-center" style="text-align: center;">11 - When This Pattern Is Allowed</P><HR /><H5 id="toc-hId--1496462672"><span class="lia-unicode-emoji" title=":pushpin:">📌</span><STRONG>How to Reference This Work</STRONG></H5><P class="lia-align-justify" style="text-align : justify;">When referencing or building upon the architectural concepts discussed in this article, please use the following formal citations:</P><UL class="lia-align-justify" style="text-align : justify;"><LI><P>🧩 <STRONG>DCRP (Domain-Centric Routing Pattern)</STRONG> — introduced by <EM>Ricardo Luz Holanda Viana</EM>, 2026</P></LI><LI><P>🧩 <STRONG>PDCP (Package Domain-Centric Pattern)</STRONG> — introduced by <EM>Ricardo Luz Holanda Viana</EM>, 2026</P></LI></UL><P class="lia-align-justify" style="text-align : justify;">These references apply to the <STRONG>formal architectural patterns</STRONG>, not to individual implementation techniques described for educational purposes.</P><HR /><H5 id="toc-hId--1692976177">© <STRONG>Intellectual Property &amp; Copyright Notice</STRONG></H5><HR /><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;">© 2026 <STRONG>Ricardo Luz Holanda Viana</STRONG><BR /><span class="lia-unicode-emoji" title=":calendar:">📅</span>First published: February 6, 2026<BR /><span class="lia-unicode-emoji" title=":locked:">🔒</span>All rights reserved.</P><P class="lia-align-justify" style="text-align : justify;"><STRONG><span class="lia-unicode-emoji" title=":balance_scale:">⚖️</span>Legal Notice</STRONG><BR />The public disclosure of the architectural patterns described herein constitutes documented <STRONG>prior art</STRONG> for purposes of authorship recognition and architectural attribution as of the stated publication date.</P><HR /><H5 id="toc-hId--1889489682"><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span><STRONG>Usage Terms</STRONG></H5><HR /><P class="lia-align-justify" style="text-align : justify;">These usage terms are intended to <STRONG>protect authorship and naming</STRONG>, not to restrict technical adoption.</P><UL class="lia-align-justify" style="text-align : justify;"><LI>Free to use for <STRONG>educational, research, and non-commercial purposes</STRONG></LI><LI><STRONG>Attribution required</STRONG> when referencing or building upon these architectural patterns</LI><LI><STRONG>Commercial implementations are permitted</STRONG>, provided proper attribution is given</LI></UL><P class="lia-indent-padding-left-30px lia-align-justify" style="padding-left : 30px; text-align : justify;"><span class="lia-unicode-emoji" title=":prohibited:">🚫</span>Use of the names <STRONG>“DCRP™”</STRONG> or <STRONG>“PDCP™”</STRONG> in commercial branding, offerings, or marketing materials requires <STRONG>prior written licensing from the author</STRONG>.</P><P class="lia-align-justify" style="text-align : justify;">This restriction applies <STRONG>solely to the use of the names and trademarks</STRONG>, not to independent implementations of similar architectural concepts.</P><P class="lia-align-justify" style="text-align : justify;"><STRONG><span class="lia-unicode-emoji" title=":locked_with_key:">🔐</span>No Implied License</STRONG><BR />Nothing in this publication shall be construed as granting any license, implied or otherwise, to use the described methodologies as <STRONG>branded commercial products or services</STRONG> without explicit authorization.</P><HR /><H5 id="toc-hId--2086003187"><span class="lia-unicode-emoji" title=":warning:">⚠️</span><STRONG>Disclaimer</STRONG></H5><HR /><P class="lia-align-justify" style="text-align : justify;">This article reflects the author’s personal architectural perspective and does <STRONG>not</STRONG> represent an official SAP position, product, or recommendation.</P><HR /><H2 id="toc-hId--1402307671">Conclusion:</H2><HR /><P class="lia-align-justify" style="text-align : justify;">The Dynamic Routing Proxy extends traditional URL-based routing by introducing a centralized API layer focused on governance and observability.</P><P class="lia-align-justify" style="text-align : justify;">The single API Proxy endpoint, teams gain consolidated visibility into CPI iFlow API's, traffic patterns, and error behavior, all through one unified SAP API Management dashboard.</P><P class="lia-align-justify" style="text-align : justify;">Kind regards,</P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Viana – SAP BTP Integration Suite Architect &amp; Author - (The Commander)&nbsp;</STRONG></P> 2026-01-20T15:57:09.545000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/use-rest-services-in-graph/ba-p/14311245 Use REST services in Graph 2026-01-20T16:41:34.615000+01:00 florian_moritz https://community.sap.com/t5/user/viewprofilepage/user-id/748729 <P>Hello!</P><P>In this part of the tutorial on Graph we will focus on the support of REST services in Graph. For an overview of other parts of this series, check out the <A href="https://community.sap.com/t5/technology-blog-posts-by-sap/information-map-introduction-series-graph-in-sap-integration-suite/ba-p/13614448" target="_self">Information Map</A>.</P><H2 id="toc-hId-1788568963">REST support in Graph</H2><P>Graph enables the use of REST services as data sources for business data graphs (BDGs). Compared to OData data sources, there are some key differences:</P><UL><LI>The<SPAN>&nbsp;</SPAN><EM>metadata</EM><SPAN>&nbsp;</SPAN>that describes the service must be provided separately along with the service endpoint in the OpenAPI format.</LI><LI>OpenAPI does not have the concept of<SPAN>&nbsp;</SPAN><EM>entities</EM><SPAN>&nbsp;</SPAN>like OData does. Instead, it focuses on operations, which are represented as<SPAN>&nbsp;</SPAN><EM>actions and functions</EM><SPAN>&nbsp;</SPAN>in a BDG.</LI></UL><P>We will now explain how these differences are being handled by Graph in more detail:</P><H3 id="toc-hId-1721138177">Metadata for a REST service</H3><P>REST services are commonly described using the OpenAPI format, which outlines the operations and resources available in the service. Unlike OData, which provides a<SPAN>&nbsp;</SPAN><CODE>$metadata</CODE><SPAN>&nbsp;</SPAN>endpoint for accessing service metadata, plain REST services do not have a standard way to access this information. Since Graph requires metadata to work with REST services, users must provide this metadata when setting up a business data graph.</P><P>Graph uses BTP destinations to define access to data sources. To use a REST service as data source, users need to create 2 destinations:</P><UL><LI>a data destination: that points to the actual REST service</LI><LI>a metadata destination: where the OpenAPI metadata document for the REST service can be retrieved</LI></UL><P>Both destinations also need annotations that connect them together, so that Graph can understand which metadata destination belongs to which REST service destination.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="destination-setup.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363424i2AF14413A6F0C34D/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="destination-setup.png" alt="destination-setup.png" /></span></P><H3 id="toc-hId-1524624672">Data Model</H3><P>Graph exposes a unified API endpoint for the OData and GraphQL protocols. Both offer an entity (or type/object) model in which data can be represented. Plain REST as described by OpenAPI does not have a strict entity model, and services are defined as different operations. For example, an operation might be to 'find a pet by name' or 'retrieve pets of a store' in a pet-store service. However, to expose these REST-operations as valid OData in the unified API, Graph transforms them into unbound OData operations (actions &amp; functions) in the BDG. We refer to these also as mirrored operations, similar to mirrored entities. As part of that transformation, some changes are made to the signature of the operations to align with the OData standard. These include:</P><UL><LI>all paths are flattened: for example a<SPAN>&nbsp;</SPAN><CODE>GET /users/pets</CODE><SPAN>&nbsp;</SPAN>is transformed to a<SPAN>&nbsp;</SPAN><CODE>GET users_pets</CODE><SPAN>&nbsp;</SPAN>in the BDG</LI><LI>all methods are standardized to GET and POST, with the underlying method being appended to the operation name: for example a<SPAN>&nbsp;</SPAN><CODE>DELETE /users/pets</CODE><SPAN>&nbsp;</SPAN>becomes a<SPAN>&nbsp;</SPAN><CODE>POST /users_pets__delete</CODE></LI></UL><H2 id="toc-hId-1199028448">Example</H2><P>Having explained the main concepts of REST support in Graph, let's now look at a practical example. We will take the try-out sandbox of this SAP Ariba<SPAN>&nbsp;</SPAN><A href="https://api.sap.com/api/network_catalog_mgmt/overview" target="_self" rel="noopener noreferrer">Network Catalog Management</A><SPAN>&nbsp;</SPAN>REST service and use it in a BDG. You can also download the OpenAPI metadata document for the service there under API Resources / API specification.</P><H3 id="toc-hId-1131597662">Tutorial Setup</H3><P>Before we can use the SAP Ariba service in a BDG, we need to setup the two destinations in SAP BTP.</P><P>Prerequisites:</P><UL><LI>SAP Integration Suite with API Management and Graph enabled</LI><LI>Access to destinations and service instances in SAP BTP cockpit</LI></UL><H4 id="toc-hId-1064166876">Data Destination</H4><P>Open the SAP BTP Cockpit and create a new destination from scratch in the BTP subaccount where you have Graph and SAP Integration Suite. Enter the following details</P><UL><LI>Name:<SPAN>&nbsp;</SPAN><CODE>ariba-network-catalog-mgmt</CODE></LI><LI>URL:<SPAN>&nbsp;</SPAN><CODE><A href="https://sandbox.api.sap.com/ariba/api/network-catalog-mgmt/v1/sandbox" target="_blank" rel="noopener noreferrer">https://sandbox.api.sap.com/ariba/api/network-catalog-mgmt/v1/sandbox</A></CODE></LI></UL><P>Also add these two additional properties to the destination:</P><UL><LI>Key:<SPAN>&nbsp;</SPAN><CODE>Graph.destinationType</CODE><SPAN>&nbsp;</SPAN>with the value:<SPAN>&nbsp;</SPAN><CODE>REST</CODE>. This declares this destination as a REST data destination to Graph.</LI><LI>Key:<SPAN>&nbsp;</SPAN><CODE>URL.headers.apiKey</CODE><SPAN>&nbsp;</SPAN>with the value:<SPAN>&nbsp;</SPAN><CODE>&lt;your sandbox API key&gt;</CODE><SPAN>&nbsp;</SPAN>to add your sandbox API key for authentication purposes (this only applies to this sandbox-example). You can retrieve your API key here:<SPAN>&nbsp;</SPAN><A href="https://api.sap.com/settings" target="_blank" rel="noopener noreferrer">https://api.sap.com/settings</A>.</LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="1-data-destination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363437i993BB8326697EBE8/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="1-data-destination.png" alt="1-data-destination.png" /></span></P><P class="lia-align-center" style="text-align: center;"><EM>data destination in BTP cockpit</EM></P><H4 id="toc-hId-867653371">Metadata Destination</H4><P>Next, we need to define the metadata destination that points to a location where Graph can access the OpenAPI metadata document. This could be done in a number of ways by hosting this file in a file-server/document storage or at a custom service endpoint for example. For sake of keeping this tutorial simple we will only use SAP Integration Suite to make this file available to Graph: we will create an API artifact which returns the content of the OpenAPI metadata file and then create the metadata destination that points towards the endpoint of that API artifact. Note that this is only for the purposes of this tutorial, and not a requirement.</P><H5 id="toc-hId-800222585">Hosting the OpenAPI file with an API artifact (optional, only for the tutorial)</H5><P><SPAN>First we create the API artifact in SAP Integration Suite. Open Integration Suite and go to Design &gt; Integrations and APIs. Choose an existing package or create a new one. In the package click Edit and open the Artifacts tab. Now you can select Add &gt; API in the table menu. Follow the API creation dialog and select&nbsp;</SPAN><CODE>REST API</CODE><SPAN>&nbsp;as API Type,&nbsp;</SPAN><CODE>Create</CODE><SPAN>&nbsp;as Method and then give it the following name:&nbsp;</SPAN><CODE>Ariba-Network-Catalog-OpenAPI</CODE><SPAN>. Open the created API and in the 'Handle Request' lane select the 'Content Modifier' step. In the bottom UI panel you will then see the Message Body tab where we can paste a constant body this API should return. Here, we will paste the JSON content of the OpenAPI specification of the service (available&nbsp;</SPAN><A href="https://api.sap.com/api/network_catalog_mgmt/overview" target="_blank" rel="noopener noreferrer">here</A><SPAN>). If you have other APIs in the tenant you might also want to assign a unique path for this API. To do that select the HTTPS arrow outgoing from the Start participant, and then in the bottom UI panel you can edit the 'Connection' and change the path in the 'Address' field. Here, we are using&nbsp;</SPAN><CODE>/ariba-network-catalog-openapi</CODE><SPAN>. Then save the API artifact and deploy it. You can check the deployment status under Monitor &gt; Integrations and APIs &gt; Manage Integration Content: All. When it is deployed, the OpenAPI document will be available at that endpoint. Copy the endpoint URL for later.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="2-message-body.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363439iCE848016268A2671/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="2-message-body.png" alt="2-message-body.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>constant message body returns the OPenAPI spec JSON</EM></SPAN></P><P>&nbsp;</P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="3-https-connection-address.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363438iE381D2CA0E36C2C4/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="3-https-connection-address.png" alt="3-https-connection-address.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>unique path for this API artifact</EM></SPAN></P><P>&nbsp;</P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="4-monitor.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363440i82A009E49BB720EC/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="4-monitor.png" alt="4-monitor.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>monitoring view of the deployed API artifact, with the endpoint URL</EM></SPAN></P><P><SPAN>To access that endpoint in a destination, we also need the authentication details. Here, we want to authenticate using OAuth client credentials that we obtain from a SAP Process Integration Runtime. For that, go to BTP Cockpit and under Services &gt; Instances and Subscriptions you can find it or create a new one. Then create a Service Key for that instance. We now have a set of client credentials we need for authentication: namely the&nbsp;</SPAN><CODE>clientid</CODE><SPAN>,&nbsp;</SPAN><CODE>clientsecret</CODE><SPAN>&nbsp;and&nbsp;</SPAN><CODE>tokenurl</CODE><SPAN>.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="5-process-integration-runtime.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363441i4FD2784F0DE47366/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="5-process-integration-runtime.png" alt="5-process-integration-runtime.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>process integration runtime with a service key in BTP cockpit</EM>&nbsp;</SPAN></P><H5 id="toc-hId-603709080">Creating the Destination</H5><P>Now we can create the Metadata destination. Enter the following details:</P><UL><LI>Name:<SPAN>&nbsp;</SPAN><CODE>ariba-network-catalog-mgmt-openapi</CODE></LI><LI>URL: the API artifact endpoint URL from above</LI><LI>Authentication:<SPAN>&nbsp;</SPAN><CODE>OAuth2ClientCredentials</CODE></LI><LI>Client ID: <CODE>clientid</CODE><SPAN>&nbsp;</SPAN>from above</LI><LI>Client Secret: <CODE>clientsecret</CODE><SPAN>&nbsp;</SPAN>from above</LI><LI>Token Service URL: <CODE>tokenurl</CODE><SPAN>&nbsp;</SPAN>from above</LI></UL><P>We will also annotate this destination with additional properties, to tell Graph that this is the metadata destination for the previously created<SPAN>&nbsp;</SPAN><CODE>ariba-network-catalog-mgmt</CODE><SPAN>&nbsp;</SPAN>destination:</P><UL><LI>Key:<SPAN>&nbsp;</SPAN><CODE>Graph.destinationType</CODE>, with a value of<SPAN>&nbsp;</SPAN><CODE>OpenAPI</CODE></LI><LI>Key:<SPAN>&nbsp;</SPAN><CODE>Graph.metadataFor</CODE>, with a value of<SPAN>&nbsp;</SPAN><CODE>ariba-network-catalog-mgmt</CODE></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="6-metadata-destination.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363442iA61F1C1F4BBA0F58/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="6-metadata-destination.png" alt="6-metadata-destination.png" /></span></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>metadata destination</EM></SPAN></P><P><SPAN>Now the destination setup is complete and we can create a BDG.</SPAN></P><H3 id="toc-hId-149030137">Creating the BDG with REST data sources</H3><P><SPAN>With the data destination and the metadata destination created, we can now continue to create a BDG with the REST service. The process does not differ much in this case. In Integration Suite under Design &gt; Graph, create a new Business Data Graph with the ID&nbsp;</SPAN><CODE>rest-bdg</CODE><SPAN>. In the list of destinations, you can now see an&nbsp;</SPAN><CODE>ariba-network-catalog-mgmt</CODE><SPAN>&nbsp;entry with the type REST. The info icon shows you more details, for example that Graph has identified which metadata destination belongs to this entry. Just select the entry and continue. When the dialog is finished and we see a preview of the BDG details, we can also change the namespace of the data source from&nbsp;</SPAN><CODE>my.custom</CODE><SPAN>&nbsp;to&nbsp;</SPAN><CODE>my.ariba</CODE><SPAN>&nbsp;(this is optional). Continue by activating the BDG.</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="7-create-bdg.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363448i80A2795CE63CD055/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="7-create-bdg.png" alt="7-create-bdg.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><EM>data source selection when creating a new BDG</EM></P><P>&nbsp;</P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="8-rename-namespace.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363446i47951F418ED1874C/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="8-rename-namespace.png" alt="8-rename-namespace.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><SPAN><EM>editing the namespace of a data source</EM></SPAN></P><P>&nbsp;</P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="9-bdg-overview.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363447iBC70A2F3BA4B08FD/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="9-bdg-overview.png" alt="9-bdg-overview.png" /></span></SPAN></P><P class="lia-align-center" style="text-align: center;"><EM>overview of the activated BDG</EM></P><H3 id="toc-hId--122714737"><SPAN>Making Queries against the BDG</SPAN></H3><P>With the BDG activated, we can now inspect the mirrored operations. Open the BDG in Developer Hub (there is a link on the overview tab of the BDG). You will see the following operations:</P><UL><LI><CODE>GET products</CODE><SPAN>&nbsp;</SPAN>(mirrored from<SPAN>&nbsp;</SPAN><CODE>GET /products</CODE>)</LI><LI><CODE>GET products_</CODE><SPAN>&nbsp;</SPAN>(mirrored from<SPAN>&nbsp;</SPAN><CODE>GET /products/{productid}</CODE>)</LI><LI><CODE>POST products__delete</CODE><SPAN>&nbsp;</SPAN>(mirrored from<SPAN>&nbsp;</SPAN><CODE>DELETE /products/{productid}</CODE>)</LI><LI><CODE>POST products__patch</CODE><SPAN>&nbsp;</SPAN>(mirrored from<SPAN>&nbsp;</SPAN><CODE>PATCH /products/{productid}</CODE>)</LI><LI><CODE>POST products_post</CODE><SPAN>&nbsp;</SPAN>(mirrored from<SPAN>&nbsp;</SPAN><CODE>POST /products</CODE>)</LI></UL><P>The<SPAN>&nbsp;</SPAN><CODE>productid</CODE><SPAN>&nbsp;</SPAN>path parameter here is either transformed into an unbound function path parameter, or an unbound action body parameter in this example. This illustrates the transformation that Graph makes of the mirrored operations into valid OData operations as mentioned earlier. In the try out tab we can see all the parameters of the operation and also give it a go.</P><P><STRONG><CODE>Note: Graph treats all parameters of mirrored operations as required at this time. However, you can set the value to null.</CODE></STRONG></P><DIV class=""><DIV class="">&nbsp;</DIV><DIV class=""><SPAN>This SAP Ariba sandbox API requires an&nbsp;</SPAN><CODE>X_ARIBA_NETWORK_ID</CODE><SPAN>&nbsp;parameter. You can use the value&nbsp;</SPAN><CODE>AN02005777309</CODE><SPAN>&nbsp;for this sandbox. When running the&nbsp;</SPAN><CODE>my.ariba/products</CODE><SPAN>&nbsp;operation, we can see that we get the response from the REST service in a valid OData format.</SPAN></DIV><DIV class="">&nbsp;</DIV><DIV class=""><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="10-developer-hub.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/363450i32300E243B0C78B5/image-size/large?v=v2&amp;px=999" role="button" title="10-developer-hub.png" alt="10-developer-hub.png" /></span></SPAN></DIV><DIV class="lia-align-center" style="text-align: center;"><EM>trying out the mirrored functions in Developer Hub (Graph Navigator)</EM></DIV></DIV><H2 id="toc-hId--25825235">Summary</H2><P>In this tutorial we had a look at how REST services can be used as data sources in a business data graph. With this feature, you can integrate data from REST services alongside data from OData services into a single unified Graph API.</P><P>You can learn more about REST-support in Graph in the documentation:</P><UL><LI><A href="https://help.sap.com/docs/graph/graph/rest-services-as-data-sources" target="_blank" rel="noopener noreferrer">REST services as data sources</A></LI><LI><A href="https://help.sap.com/docs/graph/graph/rest-services" target="_blank" rel="noopener noreferrer">Connect to your business systems: REST services</A></LI></UL><P>--</P><P><STRONG>Florian Moritz</STRONG></P> 2026-01-20T16:41:34.615000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/discover-and-publish-advanced-event-mesh-events-and-apis-in-sap-developer/ba-p/14315626 Discover and Publish Advanced Event Mesh Events and APIs in SAP Developer Hub 2026-01-27T15:16:07.100000+01:00 Kasturi https://community.sap.com/t5/user/viewprofilepage/user-id/25297 <P>In today’s digital economy, event-driven architectures (EDA) enable real-time insights and seamless integration across diverse system landscapes—whether connecting SAP applications or extending integration to third-party solutions. Organizations can now more efficiently discover, publish, and consume events and APIs, empowering both developers and integration architects.</P><P>In this blog, we’ll explore what these capabilities mean in practice, how to connect Advanced Event Mesh with Developer Hub, and how to publish events from business systems into a centralized discovery catalog—bringing event-driven integration patterns into the mainstream of enterprise integration design.</P><P><STRONG>Create a Destination to Connect Advanced Event Mesh with SAP Developer Hub</STRONG></P><P>To enable the discovery and publication of events from Advanced Event Mesh in Developer Hub, the first step is to establish a secure connection between the two services. This connection is configured using a destination in SAP Business Technology Platform (BTP).</P><P>In the following sections, we’ll explain the purpose of this destination and walk through the key configuration details required to set it up successfully.</P><P><STRONG>Why is a Destination Required? </STRONG></P><P>A destination serves as the secure connectivity bridge between Developer Hub and your Advanced Event Mesh (AEM) instance. This connection is essential for Developer Hub to discover EventAPIs within AEM and display them as Events in the central catalog.</P><P><STRONG>Note: </STRONG>In the current release, the destination is used exclusively for the discovery phase of the event lifecycle.</P><P><STRONG>Create the Destination in SAP BTP</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">1. To create the destination, log in to <STRONG>SAP BTP Cockpit</STRONG> and navigate to the <STRONG>source subaccount</STRONG> where Developer Hub is enabled.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">2. From the left navigation pane, go to <STRONG>Connectivity → Destinations</STRONG> and choose <STRONG>Create</STRONG>. Select <STRONG>From Scratch</STRONG> to manually define a new destination.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">3. In the <STRONG>Destination Details</STRONG> section, enter all required information:</P><UL><LI><STRONG>Name</STRONG>: Provide a unique and meaningful name for the destination.</LI><LI><STRONG>Type</STRONG>: Choose <STRONG>HTTP</STRONG> as the destination type.</LI><LI><STRONG>Description</STRONG>: Provide a brief description of the Advanced Event Mesh (AEM) system. This description appears for the AEM business system in Developer Hub.</LI><LI><STRONG>URL</STRONG>: Enter the base URL of your <STRONG>Advanced Event Mesh</STRONG> portal.&nbsp; &nbsp; &nbsp; &nbsp;<SPAN>&nbsp; &nbsp;&nbsp;</SPAN></LI><LI>For authentication, choose <STRONG>BasicAuthentication</STRONG>.<BR /><STRONG>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Username</STRONG>: Enter the username of the technical user. This can be an email address.<BR /><STRONG>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Password</STRONG>: Use an API token generated from the Advanced Event Mesh portal as the password.</LI><LI>When creating the API token, ensure that the following <STRONG>permissions</STRONG> are assigned: a. Read any Application Domain (application_domain:get:*) b. Do anything to any Event API (event_api:*:*) c. Access to Event Portal Designer (event_designer:access).&nbsp;These permissions allow Developer Hub to read event definitions and interact with the Event portal.</LI></UL><UL><LI>Enter the <STRONG>Additional Settings</STRONG>:&nbsp;Choose <STRONG>Internet </STRONG>as the<STRONG> Proxy Type</STRONG>.</LI><LI>Add the following custom property to enable Advanced Event Mesh support in Developer Hub:&nbsp;<STRONG>&nbsp;</STRONG><STRONG>Key:</STRONG> sap.isuite.dh.aem.enabled&nbsp;<STRONG>Value:</STRONG> true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">4. Validate the destination.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">After entering all details, choose <STRONG>Create</STRONG>.<BR />You can optionally use <STRONG>Check Connection</STRONG> to verify that the destination has been configured correctly, and that Developer Hub can successfully connect to Advanced Event Mesh.</P><P><STRONG>What’s Next?</STRONG></P><P>Once the destination is set up, Developer Hub can start discovering events from Advanced Event Mesh. These events can then be reviewed, published, and made available to developers through the central catalog.</P><P>This simple setup step lays the foundation for enabling <STRONG>event-driven integration</STRONG> using SAP Integration Suite.</P><P><STRONG>Discover and Publish Events from Advanced Event Mesh on Developer Hub</STRONG></P><P>Once the destination between <STRONG>Advanced Event Mesh</STRONG> and <STRONG>SAP Developer Hub</STRONG> is in place, you can start making events available to developers by discovering and publishing them in Developer Hub.</P><P>This step is typically performed by a <STRONG>content administrator</STRONG>, who curates events and organizes them into products for easy discovery and reuse.</P><P><STRONG>Before You Begin</STRONG></P><P>To discover and publish events, make sure the following prerequisites are met:</P><UL><LI>You are assigned the <STRONG>AuthGroup.Content.Admin</STRONG> role collection.</LI><LI>EventAPIs are marked as <STRONG>shared</STRONG> in the Advanced Event Mesh portal.</LI></UL><P>Only shared events can be added to products and published in Developer Hub. If an event is not shared, update its settings in the Advanced Event Mesh portal before proceeding.</P><P><STRONG>Discover Events in Developer Hub</STRONG></P><OL><LI>Log on to <STRONG>Developer Hub</STRONG> and navigate to <STRONG>Admin Center → Manage → Content</STRONG>. Here, you’ll see a list of available business systems. Select the <STRONG>Advanced Event Mesh</STRONG><SPAN> business system to discover events exposed from it.</SPAN></LI><LI>Events in Advanced Event Mesh are organized under <STRONG>application domains</STRONG>. When you select an application domain, all events associated with that domain are displayed.</LI><LI>If required, you can enable the option to <STRONG>Show shared events from other domains</STRONG>. This allows you to view and reuse events that have been shared across application domains.</LI></OL><P><STRONG>Understand Event Visibility</STRONG></P><P>Each application domain contains its own set of events:</P><UL><LI><STRONG>Shared events</STRONG> are visible across all application domains.</LI><LI><STRONG>Non-shared events</STRONG> are visible only within their own domain.</LI></UL><P>Only shared events can be added to a product in Developer Hub. This ensures that events intended for broader consumption are clearly identified and reusable.</P><OL><LI>After selecting the relevant events, you can group them into a <STRONG>product</STRONG>. Products help organize events logically and make them easier for developers to discover.</LI><LI>When creating a product, you can include:</LI></OL><UL><LI>Shared events from the current application domain</LI><LI>Shared events from other application domains</LI></UL><P>&nbsp; &nbsp; &nbsp; &nbsp;This flexibility allows you to design products that align with business capabilities rather than technical boundaries.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;">3. Publish the product</P><P>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Once the product details are reviewed, you can choose how to proceed:</P><UL><LI><STRONG>Save as Draft</STRONG><BR />Keeps the product in a draft state. Draft products are not visible in the catalog and can be published later.</LI><LI><STRONG>Publish</STRONG><BR />Makes the product visible in the Developer Hub catalog so developers can discover it.<BR />Published products are discoverable but <STRONG>not yet available for subscription</STRONG>.</LI></UL><P>&nbsp;</P><P><STRONG>What Happens Next?</STRONG></P><P>After publishing, your events are visible in Developer Hub and ready to be explored by developers. This enables teams to quickly understand available event streams and build event-driven applications or integrations using Advanced Event Mesh.</P><P>Together with the destination setup, this completes the core flow for exposing Advanced Event Mesh events through Developer Hub.</P><P>This approach helps organizations promote <STRONG>event reuse</STRONG>, improve discoverability, and simplify adoption of <STRONG>event-driven integration</STRONG> patterns across the landscape.&nbsp;</P><P><STRONG>Final Thoughts</STRONG></P><P>SAP Integration Suite’s Advanced Event Mesh paired with Developer Hub empowers organizations to treat <EM>events as first-class citizens</EM> in integration landscapes.</P><P>By connecting Advanced Event Mesh to Developer Hub and publishing your event sources and APIs, you:</P><UL><LI>Promote transparency of event streams</LI><LI>Enable faster development cycles</LI><LI>Support modern application patterns that rely on real-time business context</LI></UL><P>Whether you’re driving integrations for ERP, CRM, third-party SaaS systems, or custom applications, this capability helps you move from point-to-point communication to a flexible, scalable event-driven architecture.</P><P>&nbsp;</P><P>&nbsp;</P> 2026-01-27T15:16:07.100000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/tms-on-sap-integration-suite-for-api-proxy-transports-in-sap-api-management/ba-p/14301608 TMS on SAP Integration Suite for API proxy transports in SAP API Management 2026-01-28T07:19:29.602000+01:00 Aanand_Arun https://community.sap.com/t5/user/viewprofilepage/user-id/2272004 <P><FONT face="verdana,geneva"><STRONG><FONT size="5">Purpose</FONT></STRONG></FONT></P><P><FONT size="3"><SPAN class="">Moving API proxies between different tenants can be a critical step in your development lifecycle. This article provides a clear, step-by-step guide on how to successfully set up the Transport Management System (TMS) to handle API proxy transports, building on the assumption that you already have TMS configured for your Integrations.&nbsp;</SPAN> </FONT></P><P><FONT face="verdana,geneva"><STRONG><FONT size="5">Prerequisites<BR /></FONT></STRONG><SPAN>Before beginning the setup, ensure the following entitlement is available in both your source (e.g., Development) and destination (e.g., Production) subaccounts:</SPAN></FONT></P><UL><LI><FONT face="verdana,geneva"><SPAN>API Management, API portal</SPAN></FONT></LI></UL><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><FONT face="verdana,geneva"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aananda_0-1763567479656.png" style="width: 1010px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342749iB332AB3B8B7CC6D1/image-dimensions/1010x188?v=v2" width="1010" height="188" role="button" title="Aananda_0-1763567479656.png" alt="Aananda_0-1763567479656.png" /></span></FONT></P><P><FONT face="verdana,geneva"><STRONG><FONT size="5"><FONT size="4">Process<BR /><FONT size="3">Step:1:</FONT></FONT></FONT></STRONG><FONT size="3">&nbsp;</FONT></FONT><FONT face="verdana,geneva" size="3"><SPAN><SPAN class="">Create a service instance for the&nbsp;</SPAN><STRONG><SPAN class="">API Management, API portal</SPAN></STRONG><SPAN class="">&nbsp;entitlement using the&nbsp;<STRONG>apiportal-apiaccess&nbsp;</STRONG></SPAN><SPAN class="">plan. This needs to be done in&nbsp;</SPAN><STRONG><SPAN class="">both</SPAN></STRONG><SPAN class="">&nbsp;your source and destination subaccounts</SPAN></SPAN></FONT></P><P>&nbsp;</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aananda_2-1763567898141.png" style="width: 528px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342753i19AE221357907A98/image-dimensions/528x495?v=v2" width="528" height="495" role="button" title="Aananda_2-1763567898141.png" alt="Aananda_2-1763567898141.png" /></span></P><P><FONT face="verdana,geneva"><STRONG>Step:2:</STRONG> <SPAN class="">For the instances created in Step 1, generate a service key in both the source and destination subaccounts.<SPAN>&nbsp;</SPAN></SPAN><STRONG><SPAN class="">Crucially, ensure you copy and securely store both service keys,</SPAN></STRONG><SPAN class=""><SPAN>&nbsp;</SPAN>as they contain the credentials and URLs required for the following steps</SPAN>.</FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aananda_3-1763568156379.png" style="width: 915px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342756i4757C04A9E6F4538/image-dimensions/915x423?v=v2" width="915" height="423" role="button" title="Aananda_3-1763568156379.png" alt="Aananda_3-1763568156379.png" /></span></P><P><FONT face="verdana,geneva"><STRONG>Step:3:</STRONG> <SPAN class="">In the Connectivity section of the Cockpit for your<SPAN>&nbsp;</SPAN></SPAN><STRONG><SPAN class="">source</SPAN></STRONG><SPAN class=""><SPAN>&nbsp;</SPAN>subaccount, create a new Destination (From Scratch). This destination will allow your source environment to connect and push transports to the destination environment. The details that is used in configuring this destination is from the service key details of destination environment (Production in my case)</SPAN></FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aananda_0-1763568712254.png" style="width: 916px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/342760iA193226BB52111B7/image-dimensions/916x371?v=v2" width="916" height="371" role="button" title="Aananda_0-1763568712254.png" alt="Aananda_0-1763568712254.png" /></span></P><P>&nbsp;</P><TABLE border="1" width="100%"><TBODY><TR><TD width="50%" height="30px"><STRONG>Parameters</STRONG></TD><TD width="50%" height="30px"><STRONG>Values</STRONG></TD></TR><TR><TD width="50%" height="30px"><FONT size="2">Name</FONT></TD><TD width="50%" height="30px"><FONT size="2"><SPAN>APIManagement</SPAN></FONT></TD></TR><TR><TD width="50%" height="30px"><FONT size="2">Authentication</FONT></TD><TD width="50%" height="30px"><FONT size="2">OAuth2ClientCredentials</FONT></TD></TR><TR><TD width="50%" height="30px"><FONT size="2">Type</FONT></TD><TD width="50%" height="30px"><FONT size="2">HTTP</FONT></TD></TR><TR><TD width="50%" height="30px"><FONT size="2">Client ID</FONT></TD><TD width="50%" height="30px"><FONT size="2">From Destination JSON Key File</FONT></TD></TR><TR><TD width="50%" height="30px"><FONT size="2">Client Secret</FONT></TD><TD width="50%" height="30px"><FONT size="2">From Destination JSON Key File</FONT></TD></TR><TR><TD width="50%" height="30px"><FONT size="2">Token Service URL</FONT></TD><TD width="50%" height="30px"><FONT size="2">From Destination JSON key file</FONT></TD></TR><TR><TD height="30px"><FONT size="2">URL</FONT></TD><TD height="30px"><FONT size="2"><SPAN>{{ URL from Destination JSON key File}}/api/1.0/transportmodule/Transport</SPAN></FONT></TD></TR><TR><TD height="30px"><FONT size="2">Token Service URL Type</FONT></TD><TD height="30px"><FONT size="2"><SPAN>Dedicated</SPAN></FONT></TD></TR></TBODY></TABLE><P><FONT face="verdana,geneva"><STRONG>Step:4:&nbsp;</STRONG></FONT><SPAN>Once the destination configuration is complete, you should be able to initiate the transport of API proxies (and API Providers) from your source tenant. A new Transport Request (TR) will be generated and visible in your Cloud Transport Management System.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aanand_Arun_1-1763657889565.png" style="width: 897px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343403iB6ED805514D1DAF9/image-dimensions/897x299?v=v2" width="897" height="299" role="button" title="Aanand_Arun_1-1763657889565.png" alt="Aanand_Arun_1-1763657889565.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aanand_Arun_2-1763658040531.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343404i62A9953EC30EE4AA/image-size/medium?v=v2&amp;px=400" role="button" title="Aanand_Arun_2-1763658040531.png" alt="Aanand_Arun_2-1763658040531.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aanand_Arun_0-1763664901168.png" style="width: 613px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343422i8F2CFCC959D58FA6/image-dimensions/613x115?v=v2" width="613" height="115" role="button" title="Aanand_Arun_0-1763664901168.png" alt="Aanand_Arun_0-1763664901168.png" /></span></P><P><FONT size="3">You should be finding this TR in your Transport Request of Transport Management System.</FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aanand_Arun_1-1763665759073.png" style="width: 935px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343427i09F25A7A081A54CE/image-dimensions/935x145?v=v2" width="935" height="145" role="button" title="Aanand_Arun_1-1763665759073.png" alt="Aanand_Arun_1-1763665759073.png" /></span></P><P><FONT face="verdana,geneva"><STRONG><FONT size="5"><FONT size="4">Problems faced</FONT></FONT></STRONG></FONT></P><P><FONT size="3"><FONT face="verdana, geneva"><STRONG>Configuration Issues</STRONG></FONT></FONT><FONT face="verdana, geneva" size="4"><FONT size="3"><BR />If any of the below errors are encountered when initiating the transport, check the destination configuration in source subaccount / tenant (Step:3).&nbsp;All the above errors are due to incorrect destination configuration. Check if you have the correct destination name, correct URL in destination configured (destination service key URL with path <SPAN>/api/1.0/transportmodule/Transport</SPAN>), correct credentials (destination service key credential)</FONT><STRONG><BR /></STRONG></FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aanand_Arun_0-1763655708084.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343392i6B3D16652A3396DE/image-size/medium?v=v2&amp;px=400" role="button" title="Aanand_Arun_0-1763655708084.png" alt="Aanand_Arun_0-1763655708084.png" /></span><BR /><BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aanand_Arun_1-1763655860258.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343393i5FB2AF17DF582F42/image-size/medium?v=v2&amp;px=400" role="button" title="Aanand_Arun_1-1763655860258.png" alt="Aanand_Arun_1-1763655860258.png" /></span></P><P><FONT size="1 2 3 4 5 6 7"><EM>Transport request has failed as the destination APIManagement is not correctly configured. Details: Destination configuration error in APIManagement . Bad credentials sap apim<BR />Transport request has failed as the destination APIManagement is not correctly configured. Details: Validation failed as destination APIManagement not configured with correct URL<BR /></EM></FONT></P><P>&nbsp;</P><P><FONT face="verdana, geneva" size="3"><FONT size="3"><FONT face="verdana, geneva"><STRONG>Dependency Issues</STRONG></FONT></FONT><BR />If the below error is encountered, then the integration artifact that this API represents / linked is not actually present in destination tenant or subaccount. First transport the corresponding integration artifacts first then transport the API artifact.</FONT></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aanand_Arun_2-1763665964768.png" style="width: 960px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/343428i3121DCAA88267BED/image-dimensions/960x108?v=v2" width="960" height="108" role="button" title="Aanand_Arun_2-1763665964768.png" alt="Aanand_Arun_2-1763665964768.png" /></span></P><P><FONT size="1 2 3 4 5 6 7"><EM><SPAN>The artifact you're attempting to transport could not be found or has encountered an error. Please verify that the artifact exists and try again. If the problem continues, contact SAP Support for assistance</SPAN></EM></FONT></P><P><FONT size="1 2 3 4 5 6 7"><FONT face="verdana, geneva" size="3"><FONT size="3"><FONT face="verdana, geneva"><STRONG>Configuration Issues</STRONG></FONT></FONT><BR />Following error might occur during transport immediately after adding Transport description and clicking Yes. This might be due the special characters in the description provided. Please avoid giving special characters in transport description.<BR /><BR /></FONT></FONT><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aanand_Arun_2-1764866122427.png" style="width: 720px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/348642i9D3224807AF53975/image-dimensions/720x193?v=v2" width="720" height="193" role="button" title="Aanand_Arun_2-1764866122427.png" alt="Aanand_Arun_2-1764866122427.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aanand_Arun_0-1764865113955.png" style="width: 473px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/348633iECF9B8953A9C5E7E/image-dimensions/473x156?v=v2" width="473" height="156" role="button" title="Aanand_Arun_0-1764865113955.png" alt="Aanand_Arun_0-1764865113955.png" /></span></P><P>Similar to adding special characters in integration artifact transport and you encounter the following error.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Aanand_Arun_1-1764865786872.png" style="width: 476px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/348640iC08CFAE3480B9D3E/image-dimensions/476x157?v=v2" width="476" height="157" role="button" title="Aanand_Arun_1-1764865786872.png" alt="Aanand_Arun_1-1764865786872.png" /></span></P><P>This is due to the presence of special characters in Transport description as mentioned in <A href="https://me.sap.com/notes/0003116362" target="_self" rel="noopener noreferrer">this KBA</A>. The characters specified in this KBA are too not accepted in API transports. Better to avoid any special characters in transport description.</P><P><FONT face="verdana,geneva"><FONT size="5"><STRONG>Result</STRONG></FONT></FONT></P><P><FONT face="verdana,geneva">If you have all the pre-requisite complete along with the above steps, we should readily be able to do the API Proxy transports, API Provider transports from source subaccounts to destination subaccounts. Once you click transport from the source, it should create a transport ID and a transport request that can be seen in Cloud TMS with the API details.</FONT></P><P>&nbsp;</P> 2026-01-28T07:19:29.602000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/sap-btp-apim-domain-centric-routing-pattern-dcrp-governing-apis-via-cpi/ba-p/14312788 SAP BTP - APIM - Domain-Centric Routing Pattern (DCRP): Governing APIs via CPI Provider - Part I 2026-01-30T17:58:18.353000+01:00 rhviana https://community.sap.com/t5/user/viewprofilepage/user-id/160570 <H2 id="toc-hId-1788603686">DCRP: Taming Enterprise-Scale SAP Integration API Proxies</H2><P><STRONG>Authorship &amp; Origin - 2026</STRONG></P><P class="lia-align-justify" style="text-align : justify;"><STRONG>DCRP (Domain-Centric Routing Pattern)</STRONG> and <STRONG>PDCP (Package Domain-Centric Pattern)</STRONG> are original architectural patterns developed by <STRONG>Ricardo Luz Holanda Viana</STRONG>, derived from real-world enterprise integration scenarios and governance challenges in SAP BTP Integration Suite landscapes - API Management &amp; Cloud Platform Integration.</P><HR /><P class=""><STRONG>PEER-REVIEWED ACADEMIC PAPER PUBLISHED</STRONG></P><HR /><P class="">Official DOI: 10.5281/zenodo.18582469 <STRONG>Published: February 10, 2026</STRONG> | Repository: Zenodo (CERN) Status: Open Access, Peer-Reviewed</P><P class="">This Medium article is the foundational disclosure <STRONG>(Feb 7, 2026).</STRONG> The complete academic paper with validation data, vendor implementations, and 40 references is now available:</P><P class="">Download Full Paper (PDF):<A class="" href="https://zenodo.org/records/18582493" target="_blank" rel="noopener nofollow noreferrer"> https://zenodo.org/records/18582469</A></P><P class="">Validation Results:</P><UL><LI>90% reduction in API proxies (40 → 4)</LI><LI>90% reduction in CPI packages (40 → 4)</LI><LI>95% faster deployment (273 min → 14.5 min)</LI><LI>33,000+ messages tested, 68ms latency, 100% success</LI></UL><P class="">Citation: <STRONG>Viana, R. L. H. (2026).</STRONG> Gateway Domain-Centric Routing: A Vendor-Agnostic Metadata-Driven Architecture for Enterprise API Governance. Zenodo. <A class="" href="https://doi.org/10.5281/zenodo.18582492" target="_blank" rel="noopener nofollow noreferrer">https://doi.org/10.5281/zenodo.18582469</A></P><HR /><P>&nbsp;</P><H4 id="toc-hId-1850255619">Executive Summary</H4><HR /><P class="lia-align-justify" style="text-align : justify;"><STRONG><SPAN class="">The Problem</SPAN></STRONG><SPAN><STRONG>:</STRONG> Enterprise that contains SAP APIM suffers from "Proxy Sprawl"—where each integration requires a dedicated API proxy, creating a 1:1 relationship that leads to:</SPAN></P><UL><LI><SPAN>Deployment bottlenecks (15 min per proxy) </SPAN></LI><LI><SPAN>Inconsistent security architecture </SPAN></LI><LI><SPAN>Unacceptable technical debt growth </SPAN></LI></UL><P><STRONG><SPAN class="">The Solution</SPAN></STRONG><SPAN><STRONG>:</STRONG> The Domain-Centric Routing Pattern <STRONG>(DCRP)</STRONG> consolidates multiple backend services into a single, domain-based API Proxy using a metadata-driven routing engine (JavaScript + KVM). </SPAN></P><P class="lia-align-justify" style="text-align : justify;"><STRONG><SPAN class="">Impact</SPAN>: </STRONG></P><UL class="lia-align-justify" style="text-align : justify;"><LI><SPAN>Reduces proxies by up to 96% (100 integrations → 4 proxies)</SPAN></LI><LI>Deployment time: 15 min → 30 seconds <SPAN class="">-</SPAN></LI><LI><SPAN>Centralized security, analytics, and traceability </SPAN><SPAN class="">-</SPAN></LI><LI><SPAN>Validated: 4 domains deployed in 8 minutes</SPAN></LI></UL><H5 id="toc-hId-1782824833">My Contribution - Ricardo Viana</H5><P class="lia-align-justify" style="text-align : justify;">Dynamic routing is a native feature in SAP APIM, AWS, and Kong. However, technology alone isn't enough. <STRONG>DCRP provides the governance framework necessary to scale this technology in enterprise environments, including standardized naming conventions, KVM structures +JavaScripts (Brain Logic of the solution), organization, orientation and deployment templates.</STRONG></P><P class="lia-align-justify" style="text-align : justify;"><SPAN><STRONG><SPAN class="">Time Investment:&nbsp;</SPAN></STRONG></SPAN></P><UL class="lia-align-justify" style="text-align : justify;"><LI><SPAN>Executive summary: 90 seconds </SPAN></LI><LI><SPAN>Full technical guide: 30~40 minutes </SPAN></LI></UL><HR /><H3 id="toc-hId-1328145890"><span class="lia-unicode-emoji" title=":direct_hit:">🎯</span>Target Audience &amp; Prerequisites</H3><HR /><P class="lia-align-justify" style="text-align : justify;"><STRONG>Intended for: Integration Architects, Enterprise Architects, Solution Architects, Platform Owners, Governance Teams, and SAP BTP Integration Suite experts with hands-on API Management experience and f<SPAN class="">or anyone passionate about integration</SPAN><SPAN>&nbsp;— junior, senior, or student level.</SPAN></STRONG></P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Technical Prerequisites:</STRONG></P><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;"><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>SAP API Management: Proxy design (ProxyEndpoint/TargetEndpoint), Policy execution flow, KeyValueMap configuration<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>JavaScript in APIM: Context variable manipulation, error handling<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>API Proxy Flow Architecture: PreFlow/PostFlow execution order, when&nbsp;&nbsp;<STRONG>target.url</STRONG>&nbsp;can be modified<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Enterprise Governance: Naming conventions, change management, security policies</P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Complexity Level:</STRONG> Advanced.</P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Not Covered:</STRONG> Basic SAP APIM tutorials, JavaScript fundamentals, beginner proxy creation.</P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Estimated PoC Time: 2 hours (APIM experts) | 1–2 days (Integration Architects new to APIM)</STRONG></P><HR /><H3 id="toc-hId-1131632385">Introduction</H3><HR /><P class="lia-align-justify" style="text-align : justify;">SAP’s official documentation explains how to enable dynamic routing, but it often leaves a gap regarding when, why, and how to govern it at scale. This article aims to bridge that gap by providing a complete framework—from architectural design to hands-on implementation.</P><P class="lia-align-justify" style="text-align : justify;">Building on my previous post about <A href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-btp-apim-advanced-domain-routing-api-proxy-pattern-for-governing/ba-p/14302866" target="_self">Advanced Domain Routing,</A> we will now deep-dive into applying the <STRONG>Domain-Centric Routing Pattern (DCRP)</STRONG> to a real-world scenario:<STRONG> Sales &amp; Distribution (O2C).</STRONG></P><P class="lia-align-justify" style="text-align : justify;">The DCRP Value Proposition:</P><UL class="lia-align-justify" style="text-align : justify;"><LI><STRONG>Consolidation:</STRONG> A single API Proxy manages multiple sources (Salesforce, Microsoft D365, Vendor CRM).</LI><LI><STRONG>Governance:</STRONG> Full request traceability and standardized security without infrastructure sprawl.</LI><LI><STRONG>Scalability:</STRONG> High-performance routing without the overhead of proxy-level versioning.</LI></UL><H3 id="what-to-expect" id="toc-hId-935118880">What to Expect</H3><P>This is<SPAN>&nbsp;</SPAN><STRONG>Part I</STRONG><SPAN>&nbsp;</SPAN>of a four-part series on eliminating integration chaos:</P><UL><LI><STRONG>Part I (This Post)</STRONG>: DCRP Gateway | Solves Proxy Sprawl | Metadata-driven routing (KVM + JavaScript)</LI><LI><STRONG>Part II</STRONG><SPAN>: PDCP Backend | Solves Package Sprawl | Domain consolidation + iFlow DNA naming</SPAN></LI><LI><STRONG>Part III</STRONG><SPAN>: Implementation &amp; Testing | Hands-on guide | JavaScript v8.0 | Postman | GitHub repo</SPAN></LI><LI><STRONG>Part IV</STRONG><SPAN>: Monitoring with SAP Cloud ALM | End-to-end observability | MPL filtering | Dashboards &amp; alerts</SPAN></LI></UL><P class="lia-align-justify" style="text-align : justify;">Let’s explore the architectural rationale and the step-by-step implementation to apply DCRP in your landscape.</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="ChatGPT Image Feb 2, 2026, 05_02_11 AM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368193iC2B7E4BEADCD1FE2/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="ChatGPT Image Feb 2, 2026, 05_02_11 AM.png" alt="ChatGPT Image Feb 2, 2026, 05_02_11 AM.png" /></span><SPAN><SPAN class=""><STRONG>Figure 1 - DCRP - API Proxy Model detailed exploration</STRONG></SPAN></SPAN></P><HR /><H4 id="toc-hId-867688094">1 - The "Sprawl" Problem</H4><HR /><P class="lia-align-justify" style="text-align : justify;">In many enterprise landscapes, it is common to find a 1:1 relationship between services and API Proxies. This leads to what we identify as "Proxy Sprawl": an environment where proxies are created for every individual technical service, regardless of their business domain.</P><P class="lia-align-justify" style="text-align : justify;">Without a central governance authority or standardized naming conventions, these environments quickly become un-governed and unsustainable. As the integration volume grows, the complexity of managing, securing, and monitoring hundreds of individual proxies creates a significant operational bottleneck.</P><P class="lia-align-justify" style="text-align : justify;">This pattern is not theoretical; DCRP was developed as a direct response to these real-world governance gaps. Following extensive architectural validation, this methodology was formalized to provide a repeatable solution for the SAP Integration Community.</P><HR /><P class="lia-align-justify" style="text-align : justify;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_7-1770087527340.png" style="width: 780px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368372i641E467AE92B00C0/image-dimensions/780x499?v=v2" width="780" height="499" role="button" title="rhviana_7-1770087527340.png" alt="rhviana_7-1770087527340.png" /></span></P><P class="lia-align-center" style="text-align: center;">&nbsp;<STRONG>Figure 2 - The Sprawl Problem</STRONG></P><HR /><H4 id="toc-hId-671174589">2 - What is DCRP (Domain Centric Routing Pattern) ?</H4><HR /><P class="lia-align-justify" style="text-align : justify;">The Domain-Centric Routing Pattern (DCRP) is an architectural design pattern that consolidates multiple backend services into a single, business-domain-oriented API Proxy. Residing at the Gateway Layer, DCRP governs how backend services are exposed and routed without necessitating changes to their underlying protocols (REST or SOAP).</P><P class="lia-align-justify" style="text-align : justify;">Instead of organizing APIs into technical silos, DCRP aligns them with the organization's business domains. This approach significantly reduces API fragmentation and maintenance overhead while remaining fully compatible with SAP’s API Product offerings.</P><UL class="lia-align-justify" style="text-align : justify;"><LI><STRONG><SPAN class="">Domain-Centric Organization</SPAN></STRONG><SPAN><STRONG>:</STRONG> </SPAN><SPAN class="">-</SPAN><SPAN> APIs grouped by business domain (Sales, Finance, Logistics) </SPAN><SPAN class="">-</SPAN><SPAN> NOT by technical system (Salesforce, SAP, D365)</SPAN></LI><LI><STRONG>Metadata-Driven Routing</STRONG><SPAN><STRONG>:</STRONG> </SPAN><SPAN class="">-</SPAN><SPAN> KeyValueMap (KVM) stores path → backend mappings </SPAN><SPAN class="">-</SPAN><SPAN> Changes in 30 seconds without redeployment</SPAN></LI><LI><STRONG>Protocol-Agnostic Gateway</STRONG><SPAN><STRONG>:</STRONG> </SPAN><SPAN class="">-</SPAN><SPAN> Supports REST and SOAP backends </SPAN><SPAN class="">-</SPAN><SPAN> No protocol lock-in</SPAN></LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_1-1770048930293.png" style="width: 725px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368196iB1CB866386DF5339/image-dimensions/725x399?v=v2" width="725" height="399" role="button" title="rhviana_1-1770048930293.png" alt="rhviana_1-1770048930293.png" /></span><STRONG>Figure 3 - The three pillars of DCRP</STRONG></P><H5 id="toc-hId-603743803"><SPAN><SPAN class="">2.2 - DCRP Decision Framework</SPAN></SPAN></H5><P class="lia-align-justify" style="text-align : justify;"><SPAN><SPAN class=""><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Use DCRP When</SPAN>: </SPAN></P><UL class="lia-align-justify" style="text-align : justify;"><LI><SPAN><SPAN class="">Domain Density</SPAN>: 10+ APIs in same business domain </SPAN></LI><LI><SPAN><SPAN class="">High Volatility</SPAN>: Integration changes monthly </SPAN></LI><LI><SPAN><SPAN class="">Centralized Governance</SPAN>: Critical security requirements </SPAN></LI><LI><SPAN><SPAN class="">Velocity</SPAN>: Rapid deployment is business-critical </SPAN></LI></UL><P class="lia-align-justify" style="text-align : justify;"><STRONG><SPAN class=""><span class="lia-unicode-emoji" title=":cross_mark:">❌</span>DO<FONT color="#FF0000"> NOT Use</FONT> When</SPAN>: </STRONG></P><UL class="lia-align-justify" style="text-align : justify;"><LI><SPAN>Unrelated services with no business logic connection </SPAN></LI><LI>Only 1-2 services per domain</LI><LI>Fewer than 10 total APIs</LI><LI>Teams lack governance maturity</LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_1-1770049904809.png" style="width: 660px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368203i4B770AFF836BCD0C/image-dimensions/660x325/is-moderation-mode/true?v=v2" width="660" height="325" role="button" title="rhviana_1-1770049904809.png" alt="rhviana_1-1770049904809.png" /></span><STRONG>Figure 4 - <SPAN>CRP Decision Framework: </SPAN><SPAN class="">When</SPAN> <SPAN class="">to</SPAN> <SPAN class="">Use</SPAN><SPAN> vs. </SPAN><SPAN class="">When</SPAN> <SPAN class="">NOT</SPAN> <SPAN class="">to</SPAN> <SPAN class="">Use</SPAN></STRONG></P><H5 id="toc-hId-407230298">2.3 - DCRP Architecture Overview: The Power of Dynamic Routing</H5><P class="lia-align-justify" style="text-align : justify;">The diagram below illustrates how the Domain-Centric Routing Pattern <STRONG>(DCRP)</STRONG> transforms the integration flow. Instead of a fragmented landscape of individual proxies, we consolidate connectivity through a unified, intelligent gateway layer.</P><P class="lia-align-justify" style="text-align : justify;">The Technical Workflow:</P><UL class="lia-align-justify" style="text-align : justify;"><LI><STRONG>Unified Entry Point:</STRONG> Multiple consumer systems—such as Salesforce, Dynamics 365, and Vendor CRMs—connect through a single Sales Domain APIM Proxy.</LI><LI><STRONG>The DCRP Engine:</STRONG> Within the SAP API Management Gateway, the request is processed by the "Brain" of the pattern, which performs a KVM Lookup and executes JavaScript logic to resolve the target backend dynamically.</LI><LI><STRONG>Secure Orchestration:</STRONG> The request is routed via a secure tunnel to the appropriate Cloud Platform Integration (CPI) iFlow.</LI><LI><STRONG>Backend Flexibility:</STRONG> CPI handles the final orchestration with target systems (e.g., S/4HANA, Legacy Systems, or SAP ECC) using protocols like ODATA, SOAP, or HTTPS.</LI><LI><STRONG>Governance at Scale:</STRONG> This model eliminates the need for separate proxies per integration, allowing for centralized monitoring, auditing, and security enforcement through the Analytics Collector and a global Governance Layer.</LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_6-1770086396437.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368369iABAD976F88ACAF8F/image-size/large?v=v2&amp;px=999" role="button" title="rhviana_6-1770086396437.png" alt="rhviana_6-1770086396437.png" /></span><STRONG>Figure 5 - DCRP Architecture Overview end-to-end: Three-CRM Integration Scenario</STRONG></P><H5 id="toc-hId--709486028"><SPAN>2.4 - The Technical Foundation: KVM + JavaScript</SPAN></H5><H5 id="toc-hId--905999533"><STRONG>KeyValueMap (KVM) | The "Memory"</STRONG></H5><P class="lia-align-justify" style="text-align : justify;">The KVM is a simple lookup table that stores your routing rules.</P><UL class="lia-align-justify" style="text-align : justify;"><LI><STRONG>Decoupled Logic:</STRONG> Maps <CODE>cpi-packagename</CODE>,&nbsp;<CODE>iflowname --&gt; super important for the logic ( the combination of httppath&lt;from cpi&gt;:&lt;iflowname&gt; and sapprocess</CODE>.</LI><LI><STRONG>Instant Updates:</STRONG> Change a backend URL in the KVM, and the proxy updates immediately—no deployment needed.</LI><LI><STRONG>Data-Driven:</STRONG> Business rules are stored as configuration, keeping the codebase clean.</LI></UL><P class="lia-align-justify" style="text-align : justify;"><STRONG><SPAN class="">JavaScript Policy&nbsp;</SPAN></STRONG><SPAN><STRONG>| The "Brain":</STRONG> </SPAN></P><P class="lia-align-justify" style="text-align : justify;">The JS policy executes the logic based on what it finds in the "Memory."</P><UL class="lia-align-justify" style="text-align : justify;"><LI><STRONG>Dynamic Routing:</STRONG> It fetches the destination from the KVM and constructs the final URL.</LI><LI><STRONG>Governance:</STRONG> Automatically injects tracking headers like <CODE>X-SenderId</CODE> and <CODE>X-CorrelationId</CODE> for auditing.</LI><LI><STRONG>Fail-Safe:</STRONG> Implements <STRONG>Structured Error Handling</STRONG>, ensuring that if a route is missing, the user gets a clear error message instead of a "silent failure."</LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_2-1770050302565.png" style="width: 636px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368207iCF0F1C1A1E4CD29B/image-dimensions/636x337/is-moderation-mode/true?v=v2" width="636" height="337" role="button" title="rhviana_2-1770050302565.png" alt="rhviana_2-1770050302565.png" /></span><STRONG>Figure 6 - Enginne KVM + JavaScript</STRONG></P><H5 id="toc-hId--1102513038"><SPAN>2.5 - Proxy Sprawl vs DCRP: The Comparison</SPAN></H5><P class="lia-align-justify" style="text-align : justify;">The shift from a traditional 1:1 model to a Domain-Centric approach fundamentally changes how an integration landscape scales. The following comparison highlights the efficiency gains of the DCRP methodology:</P><P class="lia-align-justify" style="text-align : justify;"><SPAN class="">Real Numbers</SPAN><SPAN>: </SPAN></P><UL class="lia-align-justify" style="text-align : justify;"><LI><SPAN>100 integrations across 4 domains </SPAN><SPAN class="">-</SPAN><SPAN> Traditional: <STRONG>100 proxies × 15 min = </STRONG></SPAN><STRONG><SPAN class="">25 hours</SPAN></STRONG></LI><LI><SPAN>DCRP: 4 proxies × 2 min = </SPAN><STRONG><SPAN class="">8 minutes</SPAN>&nbsp;(96% reduction)</STRONG></LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_3-1770050601171.png" style="width: 740px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368211i89A017241D423E43/image-dimensions/740x395?v=v2" width="740" height="395" role="button" title="rhviana_3-1770050601171.png" alt="rhviana_3-1770050601171.png" /></span><STRONG>Figure 7 - Proxy Sprawl vs DCRP Model</STRONG></P><HR /><H3 id="toc-hId--712220529">3 - Implementation: Configuring the DCRP API Proxy</H3><HR /><P class="lia-align-justify" style="text-align : justify;">This section defines the configuration for the ProxyEndpoint, Routing Rules, and Target Endpoint properties required to deploy a domain-centric architecture.</P><H5 id="toc-hId--1495540048">3.1 - The Entry Contract: One API Proxy per Business Domain</H5><P class="lia-align-justify" style="text-align : justify;">DCRP eliminates proxy sprawl by consolidating multiple technical applications into a single entry contract based on the business domain. This ensures each business area, such as Sales or Finance, has exactly one governed API Proxy.</P><H5 id="toc-hId--1692053553">3.2 - Naming Convention Strategy</H5><P class="lia-align-justify" style="text-align : justify;">A standardized naming convention provides immediate architectural context. DCRP uses the following structure:</P><P class="lia-align-justify" style="text-align : justify;"><STRONG><SPAN class="">[Provider]</SPAN>-<SPAN class="">[Pattern]</SPAN>-proxy-domain-<SPAN class="">[BusinessProcess]-[subprocess]</SPAN></STRONG></P><P class="lia-align-justify" style="text-align : justify;">Example: &nbsp;<STRONG>cpi-dcrp-proxy-domain-sales-o2c</STRONG></P><UL class="lia-align-justify" style="text-align : justify;"><LI><STRONG>cpi:</STRONG> Identifies the provider (SAP Cloud Integration)</LI><LI><STRONG>dcrp:</STRONG> Defines the routing methodology.</LI><LI><STRONG>sales:</STRONG> Identifies the business domain/process (O2C).</LI><LI><STRONG>o2c</STRONG>: sap-subprocess</LI></UL><H5 id="toc-hId--1888567058">3.3 Strategic Benefit: Subprocess Segregation</H5><P class="lia-align-justify" style="text-align : justify;">Breaking the naming down to the subprocess level (e.g., <CODE>o2c</CODE> for Order-to-Cash) is a deliberate segregation strategy rather than a simple labeling exercise.</P><P class="lia-align-justify" style="text-align : justify;">By isolating by subprocess, you limit the scope of each API Proxy. This prevents the <STRONG>"Monolithic Proxy" trap</STRONG>, ensuring that updates to one specific flow—such as Warehouse Management—do not risk the stability of the entire Logistics domain.</P><H5 id="toc-hId--2085080563">DCRP Proxy Naming Convention</H5><P><STRONG>Pattern:</STRONG> <CODE>cpi-dcrp-proxy-domain-[Domain]-[Subprocess] - check in the spoiler below:</CODE></P><div class="lia-spoiler-container"><a class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer">Spoiler</a><noscript> (Highlight to read)</noscript><div class="lia-spoiler-border"><div class="lia-spoiler-content"><TABLE><TBODY><TR><TD><STRONG>Domain</STRONG></TD><TD><STRONG>Subprocess</STRONG></TD><TD><STRONG>Technical Proxy Name</STRONG></TD><TD><STRONG>Scope Description</STRONG></TD></TR><TR><TD><SPAN><STRONG>Sales</STRONG></SPAN></TD><TD><SPAN><CODE>o2c</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-sales-o2c</CODE></SPAN></TD><TD><SPAN>Order-to-Cash full lifecycle.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Sales</STRONG></SPAN></TD><TD><SPAN><CODE>crm</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-sales-crm</CODE></SPAN></TD><TD><SPAN>Customer relationship and leads.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Sales</STRONG></SPAN></TD><TD><SPAN><CODE>pri</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-sales-pri</CODE></SPAN></TD><TD><SPAN>Quotes and price conditions.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Sales</STRONG></SPAN></TD><TD><SPAN><CODE>reb</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-sales-reb</CODE></SPAN></TD><TD><SPAN>Bonus and discount agreements.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Sales</STRONG></SPAN></TD><TD><SPAN><CODE>sd</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-sales-sd</CODE></SPAN></TD><TD><SPAN>General sales and distribution.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Finance</STRONG></SPAN></TD><TD><SPAN><CODE>r2r</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-finance-r2r</CODE></SPAN></TD><TD><SPAN>Financial closing and reporting.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Finance</STRONG></SPAN></TD><TD><SPAN><CODE>trs</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-finance-trs</CODE></SPAN></TD><TD><SPAN>Treasury and cash management.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Finance</STRONG></SPAN></TD><TD><SPAN><CODE>ap</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-finance-ap</CODE></SPAN></TD><TD><SPAN>Accounts Payable processes.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Finance</STRONG></SPAN></TD><TD><SPAN><CODE>ar</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-finance-ar</CODE></SPAN></TD><TD><SPAN>Accounts Receivable processes.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Finance</STRONG></SPAN></TD><TD><SPAN><CODE>tax</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-finance-tax</CODE></SPAN></TD><TD><SPAN>Tax compliance and reporting.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Logistics</STRONG></SPAN></TD><TD><SPAN><CODE>le</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-logistics-le</CODE></SPAN></TD><TD><SPAN>Logistics execution and flows.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Logistics</STRONG></SPAN></TD><TD><SPAN><CODE>tm</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-logistics-tm</CODE></SPAN></TD><TD><SPAN>Transportation and freight.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Logistics</STRONG></SPAN></TD><TD><SPAN><CODE>wm</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-logistics-wm</CODE></SPAN></TD><TD><SPAN>Warehouse and bin management.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Logistics</STRONG></SPAN></TD><TD><SPAN><CODE>inv</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-logistics-inv</CODE></SPAN></TD><TD><SPAN>Physical stock and inventory.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Logistics</STRONG></SPAN></TD><TD><SPAN><CODE>mm</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-logistics-mm</CODE></SPAN></TD><TD><SPAN>Material master and movements.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Logistics</STRONG></SPAN></TD><TD><SPAN><CODE>shp</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-logistics-shp</CODE></SPAN></TD><TD><SPAN>Shipping and delivery notes.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Procure</STRONG></SPAN></TD><TD><SPAN><CODE>p2p</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-procurement-p2p</CODE></SPAN></TD><TD><SPAN>Procure-to-Pay lifecycle.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Procure</STRONG></SPAN></TD><TD><SPAN><CODE>srm</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-procurement-srm</CODE></SPAN></TD><TD><SPAN>Supplier portal and relations.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Procure</STRONG></SPAN></TD><TD><SPAN><CODE>crt</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-procurement-crt</CODE></SPAN></TD><TD><SPAN>Legal and operational contracts.</SPAN></TD></TR><TR><TD><SPAN><STRONG>Procure</STRONG></SPAN></TD><TD><SPAN><CODE>clg</CODE></SPAN></TD><TD><SPAN><CODE>cpi-dcrp-proxy-domain-procurement-clg</CODE></SPAN></TD><TD><SPAN>Catalog and item management.</SPAN></TD></TR></TBODY></TABLE></div><noscript><div class="lia-spoiler-noscript-container"><div class="lia-spoiler-noscript-content">DomainSubprocessTechnical Proxy NameScope DescriptionSaleso2ccpi-dcrp-proxy-domain-sales-o2cOrder-to-Cash full lifecycle.Salescrmcpi-dcrp-proxy-domain-sales-crmCustomer relationship and leads.Salespricpi-dcrp-proxy-domain-sales-priQuotes and price conditions.Salesrebcpi-dcrp-proxy-domain-sales-rebBonus and discount agreements.Salessdcpi-dcrp-proxy-domain-sales-sdGeneral sales and distribution.Financer2rcpi-dcrp-proxy-domain-finance-r2rFinancial closing and reporting.Financetrscpi-dcrp-proxy-domain-finance-trsTreasury and cash management.Financeapcpi-dcrp-proxy-domain-finance-apAccounts Payable processes.Financearcpi-dcrp-proxy-domain-finance-arAccounts Receivable processes.Financetaxcpi-dcrp-proxy-domain-finance-taxTax compliance and reporting.Logisticslecpi-dcrp-proxy-domain-logistics-leLogistics execution and flows.Logisticstmcpi-dcrp-proxy-domain-logistics-tmTransportation and freight.Logisticswmcpi-dcrp-proxy-domain-logistics-wmWarehouse and bin management.Logisticsinvcpi-dcrp-proxy-domain-logistics-invPhysical stock and inventory.Logisticsmmcpi-dcrp-proxy-domain-logistics-mmMaterial master and movements.Logisticsshpcpi-dcrp-proxy-domain-logistics-shpShipping and delivery notes.Procurep2pcpi-dcrp-proxy-domain-procurement-p2pProcure-to-Pay lifecycle.Procuresrmcpi-dcrp-proxy-domain-procurement-srmSupplier portal and relations.Procurecrtcpi-dcrp-proxy-domain-procurement-crtLegal and operational contracts.Procureclgcpi-dcrp-proxy-domain-procurement-clgCatalog and item management.</div></div></noscript></div></div><H5 id="toc-hId-2013373228">3.3 - API Proxy Details</H5><P>The proxy serves as the unified entry point for the domain:</P><UL><LI>Name: <STRONG>cpi-dcrp-proxy-domain-sales-o2c</STRONG></LI><LI>Type: REST</LI><LI>Base URL: <A href="https://[tenant].apimanagement.eu20.hana.ondemand.com/sales" target="_self" rel="nofollow noopener noreferrer">https://[tenant].apimanagement.eu20.hana.ondemand.com/sales</A></LI></UL><H5 id="toc-hId-1816859723">3.4 - Endpoint,Routing Configuration, Value Mapping and explanation</H5><P>The Routing Rules act as a gatekeeper, ensuring only authorized paths reach the dynamic engine in this sample we are working only with orders process.</P><P><STRONG>Proxy Endpoint (Proxy Endpoint):</STRONG></P><UL><LI><STRONG>Route Rule Name:</STRONG> orders</LI><LI><STRONG>Condition:</STRONG> proxy.pathsuffix MatchesPath "/orders/**"</LI></UL><P class="lia-align-justify" style="text-align : justify;">Imagine your API is a big office building. This "Condition" is the security guard at the front desk checking the labels on incoming mail.</P><UL><LI><STRONG><CODE>proxy.pathsuffix</CODE></STRONG>: This is the "address" written on the envelope after the main building name.</LI><LI><STRONG><CODE>MatchesPath</CODE></STRONG>: This is the guard asking: <I>"Does this address look like the one I’m looking for?"</I></LI><LI><STRONG><CODE>"/orders/**"</CODE></STRONG>: This is the specific "Department" name. The double stars (<CODE>**</CODE>) mean <I>"I don't care what else is written after 'orders', just as long as it starts with that."</I></LI></UL><H5 id="toc-hId-1788529909">Examples</H5><TABLE><TBODY><TR><TD><STRONG>Incoming Path</STRONG></TD><TD><STRONG>Does it match?</STRONG></TD><TD><STRONG>Why?</STRONG></TD></TR><TR><TD><SPAN><CODE>/orders/123</CODE></SPAN></TD><TD><SPAN><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span><STRONG>Yes</STRONG></SPAN></TD><TD><SPAN>Starts with <CODE>/orders/</CODE>.</SPAN></TD></TR><TR><TD><SPAN><CODE>/orders/list/today</CODE></SPAN></TD><TD><SPAN><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span><STRONG>Yes</STRONG></SPAN></TD><TD><SPAN>Starts with <CODE>/orders/</CODE> (the <CODE>**</CODE> covers the rest).</SPAN></TD></TR><TR><TD><SPAN><CODE>/customers/456</CODE></SPAN></TD><TD><SPAN><span class="lia-unicode-emoji" title=":cross_mark:">❌</span><STRONG>No</STRONG></SPAN></TD><TD><SPAN>It’s looking for "orders," not "customers."</SPAN></TD></TR><TR><TD><SPAN><CODE>/orders</CODE></SPAN></TD><TD><SPAN><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span><STRONG>Yes</STRONG></SPAN></TD><TD><SPAN>It is the exact folder.</SPAN></TD></TR></TBODY></TABLE><P class="lia-align-left" style="text-align : left;">The configuration below:</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_9-1770087697070.png" style="width: 740px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368374iAE3D203A49AEE21D/image-dimensions/740x352?v=v2" width="740" height="352" role="button" title="rhviana_9-1770087697070.png" alt="rhviana_9-1770087697070.png" /></span><STRONG>Figure 8 - Configuring the Route Rule Condition</STRONG></P><P><STRONG>Target Endpoint Properties:</STRONG></P><P>These properties provide the base connectivity for the routing engine:</P><UL><LI>Property Value<UL><LI><STRONG>cpi.host</STRONG> <A href="https://[tenant].cfapps.eu20.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://[tenant].cfapps.eu20.hana.ondemand.com</A></LI><LI><STRONG>cpi.basepath</STRONG> /http/orders</LI></UL></LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_10-1770087752601.png" style="width: 721px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368375iD5FC13FD80F1F716/image-dimensions/721x410?v=v2" width="721" height="410" role="button" title="rhviana_10-1770087752601.png" alt="rhviana_10-1770087752601.png" /></span><STRONG>Figure 9 - The main properties for the Java Script create the SAP CPI endpoint</STRONG></P><H5 id="toc-hId-1592016404">Configuration of Key Value Mapping (KVM)</H5><P>Following the suggested naming convention, you must create one Key-Value Mapping for each SAP CPI package:</P><UL><LI><STRONG>Example Maps</STRONG>: <CODE>cpipackage-nx.procurement.domain.process</CODE>, <CODE>cpipackage-nx.sales.domain.process</CODE>, etc.</LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_11-1770087811371.png" style="width: 772px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368376i2794185DC1EDBD27/image-dimensions/772x419/is-moderation-mode/true?v=v2" width="772" height="419" role="button" title="rhviana_11-1770087811371.png" alt="rhviana_11-1770087811371.png" /></span><STRONG>Figure 10 - API-Proxy vs Key Value Mapping</STRONG></P><P class="lia-align-left" style="text-align : left;"><STRONG>KVM Structure</STRONG>: Each map contains three primary entries:</P><UL><LI><STRONG>packagename</STRONG>: The technical CPI package name (e.g., <CODE>nx.sales.domain.process</CODE>).</LI><LI><STRONG>sapprocess</STRONG>: The business domain description (e.g., <CODE>SAP SD &amp; O2C - Sales Process</CODE>).</LI><LI><STRONG>iflowname</STRONG>: The routing metadata string.</LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_3-1770065969651.png" style="width: 931px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368337i730558D12B829470/image-size/large?v=v2&amp;px=999" role="button" title="rhviana_3-1770065969651.png" alt="rhviana_3-1770065969651.png" /></span><STRONG>Figure 11 - Key Value Mapping Configuration</STRONG></P><H5 id="toc-hId-1395502899"><STRONG>Understanding the <CODE>iflowname</CODE> String</STRONG></H5><P class="lia-align-justify" style="text-align : justify;">The <CODE>iflowname</CODE> entry is the "routing table" for the DCRP. It contains pairs consisting of the <STRONG>Semantic Path Suffix</STRONG> (used by the consumer) and the <STRONG>Technical iFlow Name</STRONG> (the target in CPI). This string is parsed by the JavaScript "Brain," so maintaining the pattern is critical.</P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Example Configuration</STRONG>: <CODE>httppath</CODE>: <CODE>inbound:SO.01.Iflow.Sales.Order.Inbound,tracking:SO.02.Iflow.Sales.Order.Tracking</CODE>.</P><P class="lia-align-justify" style="text-align : justify;">The java script support almost all types of demiliters , but you can't use <STRONG>two dots</STRONG> <STRONG>(:)</STRONG> because this is the separation of http path url from SAP CPI and the Iflow name, between the records you can use any my suggestion is <STRONG>( , )&nbsp;</STRONG></P><pre class="lia-code-sample language-javascript"><code>// Auto-detect delimiter used in KVM string var supportedDelimiters = [',', ';', '|', '/', '\\', '[', ']', '(', ')', '-', '_'];</code></pre><P>It maps the public HTTP URL suffix to the specific CPI technical endpoint:</P><UL><LI><STRONG>inbound</STRONG> <SPAN class="">$\rightarrow$</SPAN> Routes to <CODE>/inbound</CODE>.</LI><LI><STRONG>tracking</STRONG> <SPAN class="">$\rightarrow$</SPAN> Routes to <CODE>/tracking</CODE>.</LI></UL><P><SPAN><SPAN class=""><FONT color="#FF0000"><STRONG>inbound</STRONG></FONT></SPAN></SPAN></P><UL><LI><SPAN><SPAN class="">cpi endpoint: /orders/inbound</SPAN></SPAN></LI></UL><P><SPAN><SPAN class=""><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_5-1770066265324.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368339i0A37D79E90583005/image-size/medium?v=v2&amp;px=400" role="button" title="rhviana_5-1770066265324.png" alt="rhviana_5-1770066265324.png" /></span></SPAN></SPAN></P><H5 id="toc-hId-1198989394"><STRONG><SPAN><SPAN class=""><FONT color="#FF0000">tracking</FONT></SPAN></SPAN></STRONG></H5><UL><LI><SPAN><SPAN class="">cpi endpoint: /orders/tracking</SPAN></SPAN></LI></UL><H5 id="toc-hId-1002475889"><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_7-1770066384526.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368341i6528C4330F96B2E9/image-size/medium?v=v2&amp;px=400" role="button" title="rhviana_7-1770066384526.png" alt="rhviana_7-1770066384526.png" /></span></STRONG></H5><H5 id="toc-hId-805962384"><STRONG>The SAP CPI Packages:</STRONG></H5><P>Following the DCRP methodology, SAP CPI packages are organized as domain-specific containers that house multiple related integration flows.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1770083251421.png" style="width: 301px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368363iDCF12ADE9BCAFE06/image-size/medium?v=v2&amp;px=400" role="button" title="rhviana_0-1770083251421.png" alt="rhviana_0-1770083251421.png" /></span></P><P><STRONG>The Full Configuration of API Proxy</STRONG></P><UL><LI><STRONG>Condition</STRONG>: The Proxy Endpoint validates the path (e.g., <CODE>proxy.pathsuffix MatchesPath "/orders/**"</CODE>).</LI><LI><STRONG>Lookup</STRONG>: The "Brain" extracts the <CODE>iflowname</CODE> string from the KVM.</LI><LI><STRONG>Parsing</STRONG>: The JavaScript splits the string using the <CODE>,</CODE> delimiter to extract individual pairs.</LI><LI><STRONG>Generation</STRONG>: The engine matches the incoming suffix (e.g., <CODE>/inbound</CODE>) and generates the final CPI Target URL.</LI><LI><STRONG>End url: <A target="_blank" rel="noopener">https://&lt;cpi&gt;/orders/inbound</A>&nbsp;and any others values from the kvm records.</STRONG></LI></UL><H5 id="toc-hId-609448879"><STRONG>ARCHITECT'S DEEP DIVE: WHY SUBDOMAIN SEGREGATION?</STRONG></H5><P><STRONG>Context: The KVM Scaling Challenge</STRONG></P><P>You might be wondering:</P><BLOCKQUOTE><P><EM>"If I store all my iFlows in a single KVM as a concatenated string like<SPAN>&nbsp;</SPAN><CODE>cpihttpPath:iflowName,</CODE>, won't this become a gigantic string?"</EM></P></BLOCKQUOTE><P><STRONG>Answer: Yes, exactly.</STRONG><SPAN>&nbsp;</SPAN>And this is<SPAN>&nbsp;</SPAN><STRONG>the core problem</STRONG><SPAN>&nbsp;</SPAN>that led to the architectural pivot.</P><P><STRONG>The Discovery: Storage ≠ Performance</STRONG></P><P><STRONG>Initial Assumption</STRONG></P><UL><LI><STRONG>Original design</STRONG>: 1 API Proxy per business domain (Sales, Finance, Logistics, Procurement)</LI><LI><STRONG>KVM strategy</STRONG>: Concatenated string with all iFlow routes in a single KVM entry</LI><LI><STRONG>Expected limit</STRONG>: SAP API Management documentation states<SPAN>&nbsp;</SPAN><STRONG>10 KB KVM value limit</STRONG></LI></UL><H5 id="" id="toc-hId-412935374"><STRONG>KVM Size Analysis (Theoretical, Not Production-Tested)</STRONG></H5><DIV class="">Scenario Size Entries Storage Runtime Concern <TABLE><TBODY><TR><TD><STRONG>Small Domain</STRONG></TD><TD>~5 KB</TD><TD>40 entries</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Within limits</TD><TD>Parsing overhead manageable</TD></TR><TR><TD><STRONG>Medium Domain</STRONG></TD><TD>~10 KB</TD><TD>53 entries</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>At documented limit</TD><TD>JavaScript performance degrades</TD></TR><TR><TD><STRONG>Large Domain</STRONG></TD><TD>~15-30 KB</TD><TD>100+ entries</TD><TD><span class="lia-unicode-emoji" title=":warning:">⚠️</span>Exceeds guideline</TD><TD><STRONG>Bottleneck: O(n) parsing, not storage</STRONG></TD></TR></TBODY></TABLE></DIV><P><STRONG>Key Finding:</STRONG><BR />Storage capacity is not the constraint—<STRONG>JavaScript parsing performance at scale is</STRONG>.</P><H5 id="toc-hId-216421869">3.5 - The Semantic Facade: One Proxy, Multiple Intentions</H5><P><SPAN>Instead of deploying separate proxies, all consumers use the SAME API Proxy. Differentiation handled via path suffixes.</SPAN></P><P><STRONG>Consumer View (Public API): </STRONG></P><UL><LI><SPAN>POST https:</SPAN><SPAN class="">//</SPAN><SPAN>apim</SPAN><SPAN class="">/sales/</SPAN><SPAN>orders/inbound </SPAN></LI><LI><SPAN>POST https:</SPAN><SPAN class="">//</SPAN><SPAN>apim</SPAN><SPAN class="">/sales/</SPAN><SPAN>orders/tracking </SPAN></LI></UL><P><STRONG>Backend Reality (CPI):&nbsp;</STRONG></P><UL><LI><SPAN>https:</SPAN><SPAN class="">//</SPAN><SPAN>cpi</SPAN><SPAN class="">/http/</SPAN><SPAN>orders/inbound</SPAN></LI><LI><SPAN>https:</SPAN><SPAN class="">//</SPAN><SPAN>cpi</SPAN><SPAN class="">/http/</SPAN><SPAN>orders/tracking</SPAN></LI></UL><P><STRONG>Key Benefits</STRONG>:</P><UL><LI><STRONG>Total Abstraction</STRONG>: Consumer contract unchanged if backend migrates</LI><LI><STRONG>End-to-End Monitoring</STRONG>: Unified analytics for entire Sales domain</LI><LI><STRONG>Centralized Security</STRONG>: One OAuth2 policy for all</LI><LI><STRONG>Unified Traffic Control</STRONG>: Spike Arrest and Quotas by domain</LI></UL><P class="lia-align-center" style="text-align: center;"><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Premium_slide_Tesla_style_White_background_Titl-1769935500992.png" style="width: 732px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368220iF02C723382ACB540/image-dimensions/732x409/is-moderation-mode/true?v=v2" width="732" height="409" role="button" title="Premium_slide_Tesla_style_White_background_Titl-1769935500992.png" alt="Premium_slide_Tesla_style_White_background_Titl-1769935500992.png" /></span><STRONG>&nbsp;Figure 12 - Public API paths mapped to technical CPI endpoints</STRONG></SPAN></P><H5 id="3.4---the-routing-engine%3A-execution-flow" id="toc-hId-19908364">3.6 - The Routing Engine: Execution Flow</H5><P>Every request passes through three stages:</P><P><STRONG>Stage 1: Proxy Endpoint Pre-Flow</STRONG></P><UL><LI>Security policies (OAuth2, API Key)</LI><LI>Hacking Thread java script</LI><LI>Request validation (payload size, content type)</LI><LI>Traffic control (Spike Arrest, Quotas)</LI><LI><span class="lia-unicode-emoji" title=":cross_mark:">❌</span>Immediate rejection if policies fail</LI></UL><P><STRONG>Stage 2: Routing Rules</STRONG></P><UL><LI>Evaluate:<SPAN>&nbsp;</SPAN><CODE>proxy.pathsuffix MatchesPath "/orders/**"</CODE></LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Match → forward to Target Endpoint</LI><LI><span class="lia-unicode-emoji" title=":cross_mark:">❌</span>No match → 404 error</LI></UL><P><STRONG>Stage 3: Target Endpoint Pre-Flow</STRONG></P><UL><LI><STRONG>DCRP Brain executes here</STRONG><SPAN>&nbsp;</SPAN>(last point to modify target.url)</LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_5-1770086206938.png" style="width: 695px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368368iDFFD4EFB0AE572A0/image-dimensions/695x441?v=v2" width="695" height="441" role="button" title="rhviana_5-1770086206938.png" alt="rhviana_5-1770086206938.png" /></span><STRONG>Figure 13 - Three-stage request processing with DCRP logic in Target Pre-Flow</STRONG></P><H5 id="toc-hId--8421450">3.7 - The DCRP Brain: Policy Stages</H5><P class="lia-align-justify" style="text-align : justify;">The routing engine executes through four policy stages Target Endpoint - PRE-Flow:</P><UL class="lia-align-justify" style="text-align : justify;"><LI><STRONG>Key Value Mapping</STRONG>: Retrieves httppath, iflowname, and sapprocess.</LI><LI><STRONG>JavaScript Routing:</STRONG> Performs variable verification, validation, and injection of headers.</LI><LI><STRONG>RaiseFaultException:</STRONG> Blocks the process in case of exceptions, missing variables, or KVM misconfigurations.</LI><LI><STRONG>Statistics Collection:</STRONG> Captures custom dimension variables for the SAP APIM Dashboard.</LI></UL><P class="lia-align-justify" style="text-align : justify;">The DCRP pattern transforms the gateway into a high-scale, programmable router by decoupling configuration from execution and moving routing logic into metadata.</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_7-1770052228084.png" style="width: 721px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368228i440000BF6FB49B7D/image-dimensions/721x415?v=v2" width="721" height="415" role="button" title="rhviana_7-1770052228084.png" alt="rhviana_7-1770052228084.png" /></span><STRONG>Figure 14 - KVM + Java Script</STRONG></P><H5 id="toc-hId--204934955">3.8 Scaling Model: Vertical vs. Horizontal</H5><P>Vertical Scaling (30 Seconds): Add new iFlows to an existing domain by updating the KVM string. No infrastructure changes are required.</P><P>Horizontal Scaling (2 Minutes): Onboard an entirely new business domain (e.g., Finance) by cloning the domain template and updating only the mapIdentifier.</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_8-1770052380096.png" style="width: 763px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368231iB31D46A762730B64/image-dimensions/763x406/is-moderation-mode/true?v=v2" width="763" height="406" role="button" title="rhviana_8-1770052380096.png" alt="rhviana_8-1770052380096.png" /></span><STRONG><SPAN>Figure 15 - Two-Level scaling strategy</SPAN></STRONG></P><H5 id="toc-hId--401448460">Real-World Validation: 4 Business Domains Deployed</H5><P class="lia-align-justify" style="text-align : justify;">The methodology was validated by deploying four business domains—Sales, Logistics, Finance, and Procurement—managing 8 total iFlows.</P><P class="lia-align-justify" style="text-align : justify;">Validation Metrics:</P><P class="lia-align-justify" style="text-align : justify;">API Proxies Deployed: 4.</P><UL class="lia-align-justify" style="text-align : justify;"><LI><STRONG>JavaScript Policies Reused:</STRONG> 1 universal routing engine.<BR /><STRONG>Total Deployment Time:</STRONG> Approximately 8 minutes (~2 minutes per domain).</LI><LI><STRONG>Resilience:</STRONG> While DCRP returns an HTTP 404 if a specific iFlow endpoint is missing, the routing logic itself remains correct and operational.</LI></UL><UL><LI>Business Domain API Proxy CPI Package iFlows Time</LI></UL><P>Business Domain API Proxy CPI Package iFlows Time</P><TABLE width="931px"><TBODY><TR><TD width="150.333px">Sales &amp; O2C</TD><TD width="304.681px">cpi-dcrp-proxy-domain-sales-o2c</TD><TD width="361.819px">cpipackage-nx.sales.domain.process</TD><TD width="46.0972px">2</TD><TD width="67.1806px">2 min</TD></TR><TR><TD width="150.333px">Logistics &amp; Shipping</TD><TD width="304.681px">cpi-dcrp-proxy-domain-logistics-scm</TD><TD width="361.819px">cpipackage-nx.logistics.domain.process</TD><TD width="46.0972px">2</TD><TD width="67.1806px">2 min</TD></TR><TR><TD width="150.333px">Finance &amp; Billing</TD><TD width="304.681px">cpi-dcrp-proxy-domain-finance-r2r</TD><TD width="361.819px">cpipackage-nx.finance.domain.process</TD><TD width="46.0972px">2</TD><TD width="67.1806px">2 min</TD></TR><TR><TD width="150.333px">Procurement</TD><TD width="304.681px">cpi-dcrp-proxy-domain-procurement-s2p</TD><TD width="361.819px">cpipackage-nx.procurement.domain.process</TD><TD width="46.0972px">2</TD><TD width="67.1806px">2 min</TD></TR></TBODY></TABLE><UL><LI>Results:</LI><LI>4 API Proxies managing 8 iFlows</LI><LI>JavaScript policies reused: 1 (universal routing engine)</LI><LI>Total deployment time: ~8 minutes</LI></UL><P class="lia-align-justify" style="text-align : justify;">Total Time = (N domains × 2 min) + (M iFlows × 30 sec)</P><H4 id="toc-hId--304558958"><STRONG>3.9 - The JavaScript "Brain" (Complete Code)</STRONG></H4><P class="lia-align-center" style="text-align: center;"><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_9-1770053486450.png" style="width: 764px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368235i458F4160DB54AA45/image-dimensions/764x510/is-moderation-mode/true?v=v2" width="764" height="510" role="button" title="rhviana_9-1770053486450.png" alt="rhviana_9-1770053486450.png" /></span></STRONG><STRONG><SPAN>Figure 16 - Java Script coding</SPAN></STRONG></P><P>The code of java script is into spoiler below -&nbsp;</P><P><STRONG><SPAN class="">TL;DR for Non-Developers:</SPAN></STRONG><SPAN>&nbsp;This JavaScript performs 4 tasks: </SPAN></P><UL><LI><SPAN>Extracts path segments (e.g., </SPAN><SPAN class="">`/inbound`</SPAN><SPAN> → httppath cpi</SPAN><SPAN>&nbsp;</SPAN><SPAN class="">`inbound`</SPAN><SPAN>)</SPAN></LI><LI>Looks up routing metadata from KVM</LI><LI><SPAN>Constructs final CPI URL dynamically </SPAN></LI><LI><SPAN>Injects governance headers (X-SenderId, X-CorrelationId) </SPAN></LI></UL><P><STRONG><SPAN class="">For Architects:</SPAN></STRONG><SPAN>&nbsp;Review sections 1-4 for logic flow </SPAN></P><P><STRONG><SPAN class="">For Developers:</SPAN></STRONG><SPAN>&nbsp;Full code below with inline comments</SPAN></P><HR /><H3 id="toc-hId--207669456"><span class="lia-unicode-emoji" title=":warning:">⚠️</span><SPAN>&nbsp;</SPAN><FONT color="#FF0000"><STRONG>IMPLEMENTATION NOTICE</STRONG></FONT></H3><HR /><P><STRONG><span class="lia-unicode-emoji" title=":warning:">⚠️</span>IMPORTANT: This code is a simplified reference implementation designed for Proof-of-Concept (PoC) scenarios and educational purposes.</STRONG><SPAN>&nbsp;</SPAN>While fully functional for demonstrating the core <STRONG>DCRP pattern</STRONG>, this routing engine assumes a basic KVM structure with simple, human-readable path identifiers like<SPAN>&nbsp;</SPAN><CODE>inbound</CODE>,<SPAN>&nbsp;</SPAN><CODE>outbound</CODE>,<SPAN>&nbsp;</SPAN><CODE>tracking</CODE>,<SPAN>&nbsp;</SPAN><CODE>status</CODE>, etc., as shown in the blog examples.</P><H3 id="kvm-format-used-in-this-blog%3A" id="toc-hId--404182961"><STRONG>KVM Format Used in This Blog:</STRONG></H3><pre class="lia-code-sample language-abap"><code>Format: &lt;httppath&gt;:&lt;iflowname&gt; Examples: inbound:iflow-salesforce-order-create outbound:iflow-sap-invoice-send tracking:iflow-fedex-shipment-track status:iflow-order-status-query</code></pre><P>This approach works well for PoC scenarios with<SPAN>&nbsp;</SPAN><STRONG>single iFlow per action</STRONG><SPAN>&nbsp;</SPAN>and straightforward naming conventions.</P><H3 id="%F0%9F%9A%A8-before-production-deployment%3A" id="toc-hId--600696466"><STRONG>Before Production Deployment:</STRONG></H3><P class="lia-align-justify" style="text-align : justify;"><STRONG>This code must be adapted based on your specific requirements:</STRONG></P><OL class="lia-align-justify" style="text-align : justify;"><LI><STRONG>KVM Structure Design</STRONG><SPAN>&nbsp;</SPAN>- The<SPAN>&nbsp;</SPAN><CODE>iflowname</CODE><SPAN>&nbsp;</SPAN>string format you choose will dictate the parsing logic</LI><LI><STRONG>Naming Conventions</STRONG><SPAN>&nbsp;</SPAN>- Adapt routing logic to match your organization's naming patterns</LI><LI><STRONG>Adapter Requirements</STRONG><SPAN>&nbsp;</SPAN>- HTTP-only vs. mixed HTTP/SOAP landscapes require different endpoint construction</LI><LI><STRONG>Multi-Vendor Scenarios</STRONG><SPAN>&nbsp;</SPAN>- Single-vendor vs. multi-vendor per process may need disambiguation logic</LI></OL><H3 id="" id="toc-hId--797209971"><FONT color="#99CC00"><STRONG>Production-Ready Code: DCRP Routing Engine (Part II &amp; III)</STRONG></FONT></H3><P>A comprehensive, production-grade routing engine covering all enterprise scenarios—multi-vendor disambiguation, PDCP naming compliance, HTTP/SOAP adapter support, conflict resolution (id09/id10), and global-scale architecture—is available in<SPAN>&nbsp;</SPAN><STRONG>Part II: Package Domain-Centric Pattern (PDCP)</STRONG><SPAN>&nbsp;</SPAN>and fully implemented in<SPAN>&nbsp;</SPAN><STRONG>Part III: Implementation &amp; Testing</STRONG>. The latest<SPAN>&nbsp;</SPAN><STRONG>v8.0 engine</STRONG><SPAN>&nbsp;</SPAN>is specifically designed for the combined DCRP + PDCP framework, generating CPI endpoints with the<SPAN>&nbsp;</SPAN><CODE>/dcrp/</CODE><SPAN>&nbsp;</SPAN>prefix and automatic adapter detection:<SPAN>&nbsp;</SPAN><CODE>/http/dcrp/</CODE><SPAN>&nbsp;</SPAN>(HTTP) or<SPAN>&nbsp;</SPAN><CODE>/cxf/dcrp/</CODE><SPAN>&nbsp;</SPAN>(SOAP). This evolution handles complex KVM structures, scales to 100+ integrations with zero-code deployment for new vendors, and includes smart vendor-aware routing with fallback logic for seamless multi-instance disambiguation.</P><div class="lia-spoiler-container"><a class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer">Spoiler</a><noscript> (Highlight to read)</noscript><div class="lia-spoiler-border"><div class="lia-spoiler-content"><pre class="lia-code-sample language-javascript"><code>/** * ═══════════════════════════════════════════════════════════════════════════ * * THE DCRP ROUTING ENGINE * * MISSION: Transform static gateway infrastructure into intelligent, * metadata-driven routing orchestration at enterprise scale. * * CAPABILITIES: * ✓ Dynamic iFlow resolution via Key-Value Map metadata * ✓ Path parameter preservation (single or multi-level IDs) * ✓ Query string integrity across gateway boundaries * ✓ Governance header injection (X-SenderId, X-CorrelationId) * ✓ Analytics variable collection for observability * ✓ Zero code deployment for new integrations (metadata-only scaling) * * AUTHOR: Viana - SAP BTP Integration Suite Expert * PATTERN: Domain-Centric Routing Pattern (DCRP) * VERSION: 1.0 - Production Ready * * ═══════════════════════════════════════════════════════════════════════════ */ function resolveDcrpRouting() { try { var cpiHost = context.getVariable("target.cpi.host"); var cpiBasepathRaw = context.getVariable("target.cpi.basepath"); var iflowname = context.getVariable("iflowname"); var pathSuffix = context.getVariable("proxy.pathsuffix"); var senderId = context.getVariable("request.header.X-SenderId"); var correlationId = context.getVariable("request.header.X-CorrelationId"); var queryParams = context.getVariable("request.querystring") || ""; if (!cpiHost || !cpiBasepathRaw || !iflowname || !pathSuffix) { context.setVariable("routing.failed", true); context.setVariable("routing.error", "MISSING_REQUIRED_VARIABLES"); throw new Error("DCRP: Missing required variables for routing"); } // ======================================== // SECTION 1.5: EXTRACT PATH SEGMENTS // ======================================== var cleanPathSuffix = pathSuffix.replace(/^\/+/, ''); var segments = cleanPathSuffix.split('/'); var firstSegment = segments[0]; // "orders" ou "fodase" var remainingPath = segments.slice(1).join('/'); // "inbound" // Build dynamic basepath: /http/{firstSegment} var cpiBasepath = "/http/" + firstSegment; // ======================================== // SECTION 2: FLEXIBLE DELIMITER DETECTION // ======================================== var supportedDelimiters = [',', ';', '|', '/', '\\', '[', ']', '(', ')', '-', '_']; var delimiter = null; for (var i = 0; i &lt; supportedDelimiters.length; i++) { if (iflowname.indexOf(supportedDelimiters[i]) !== -1) { delimiter = supportedDelimiters[i]; break; } } if (!delimiter) { context.setVariable("routing.failed", true); context.setVariable("routing.error", "NO_DELIMITER_FOUND"); throw new Error("DCRP: No valid delimiter found in KVM value"); } // ======================================== // SECTION 3: KVM PARSING &amp; PATH MATCHING // ======================================== var entries = iflowname.split(delimiter); var routes = []; for (var j = 0; j &lt; entries.length; j++) { var entry = entries[j].trim(); if (entry.length === 0) continue; var parts = entry.split(':'); if (parts.length !== 2) { context.setVariable("routing.failed", true); context.setVariable("routing.error", "INVALID_KVM_FORMAT"); throw new Error("DCRP: Invalid KVM format - expected 'path:iflowname', got: " + entry); } routes.push({ path: parts[0].trim(), iflow: parts[1].trim() }); } routes.sort(function(a, b) { return b.path.length - a.path.length; }); var matchedRoute = null; for (var k = 0; k &lt; routes.length; k++) { var routePath = routes[k].path.replace(/^\/+/, ''); if (remainingPath === routePath || remainingPath.indexOf(routePath + '/') === 0) { matchedRoute = routes[k]; break; } } if (!matchedRoute) { context.setVariable("routing.failed", true); context.setVariable("routing.error", "ROUTE_NOT_FOUND"); context.setVariable("routing.pathsuffix", pathSuffix); throw new Error("DCRP: No matching route found for path: " + pathSuffix); } // ======================================== // SECTION 4: GOVERNANCE HEADER INJECTION // ======================================== if (senderId) { context.setVariable("request.header.X-SenderId", senderId); } if (correlationId) { context.setVariable("request.header.X-CorrelationId", correlationId); } // ======================================== // SECTION 5: DYNAMIC URL CONSTRUCTION // ======================================== var targetUrl = cpiHost + cpiBasepath + "/" + matchedRoute.path; if (queryParams &amp;&amp; queryParams.length &gt; 0) { targetUrl += "?" + queryParams; } context.setVariable("target.url", targetUrl); context.setVariable("target.copy.pathsuffix", false); context.setVariable("target.copy.queryparams", false); // ======================================== // SUCCESS: SET ROUTING METADATA // ======================================== context.setVariable("routing.success", true); context.setVariable("routing.matched.path", matchedRoute.path); context.setVariable("routing.matched.iflow", matchedRoute.iflow); context.setVariable("routing.target.url", targetUrl); context.setVariable("routing.selected.basepath", cpiBasepath); context.setVariable("idiflow", matchedRoute.iflow); context.setVariable("idcorrelation", context.getVariable("request.header.X-CorrelationId")); context.setVariable("idsender", senderId || "UNKNOWN"); } catch (error) { context.setVariable("routing.failed", true); context.setVariable("routing.exception", error.message || error.toString()); print("DCRP Routing Error: " + error.message); print("PathSuffix: " + pathSuffix); print("KVM Value: " + iflowname); } }</code></pre></div><noscript><div class="lia-spoiler-noscript-container"><div class="lia-spoiler-noscript-content">/** * ═══════════════════════════════════════════════════════════════════════════ * * THE DCRP ROUTING ENGINE * * MISSION: Transform static gateway infrastructure into intelligent, * metadata-driven routing orchestration at enterprise scale. * * CAPABILITIES: * ✓ Dynamic iFlow resolution via Key-Value Map metadata * ✓ Path parameter preservation (single or multi-level IDs) * ✓ Query string integrity across gateway boundaries * ✓ Governance header injection (X-SenderId, X-CorrelationId) * ✓ Analytics variable collection for observability * ✓ Zero code deployment for new integrations (metadata-only scaling) * * AUTHOR: Viana - SAP BTP Integration Suite Expert * PATTERN: Domain-Centric Routing Pattern (DCRP) * VERSION: 1.0 - Production Ready * * ═══════════════════════════════════════════════════════════════════════════ */ function resolveDcrpRouting() { try { var cpiHost = context.getVariable("target.cpi.host"); var cpiBasepathRaw = context.getVariable("target.cpi.basepath"); var iflowname = context.getVariable("iflowname"); var pathSuffix = context.getVariable("proxy.pathsuffix"); var senderId = context.getVariable("request.header.X-SenderId"); var correlationId = context.getVariable("request.header.X-CorrelationId"); var queryParams = context.getVariable("request.querystring") || ""; if (!cpiHost || !cpiBasepathRaw || !iflowname || !pathSuffix) { context.setVariable("routing.failed", true); context.setVariable("routing.error", "MISSING_REQUIRED_VARIABLES"); throw new Error("DCRP: Missing required variables for routing"); } // ======================================== // SECTION 1.5: EXTRACT PATH SEGMENTS // ======================================== var cleanPathSuffix = pathSuffix.replace(/^\/+/, ''); var segments = cleanPathSuffix.split('/'); var firstSegment = segments[0]; // "orders" ou "fodase" var remainingPath = segments.slice(1).join('/'); // "inbound" // Build dynamic basepath: /http/{firstSegment} var cpiBasepath = "/http/" + firstSegment; // ======================================== // SECTION 2: FLEXIBLE DELIMITER DETECTION // ======================================== var supportedDelimiters = [',', ';', '|', '/', '\\', '[', ']', '(', ')', '-', '_']; var delimiter = null; for (var i = 0; i &lt; supportedDelimiters.length; i++) { if (iflowname.indexOf(supportedDelimiters[i]) !== -1) { delimiter = supportedDelimiters[i]; break; } } if (!delimiter) { context.setVariable("routing.failed", true); context.setVariable("routing.error", "NO_DELIMITER_FOUND"); throw new Error("DCRP: No valid delimiter found in KVM value"); } // ======================================== // SECTION 3: KVM PARSING &amp; PATH MATCHING // ======================================== var entries = iflowname.split(delimiter); var routes = []; for (var j = 0; j &lt; entries.length; j++) { var entry = entries[j].trim(); if (entry.length === 0) continue; var parts = entry.split(':'); if (parts.length !== 2) { context.setVariable("routing.failed", true); context.setVariable("routing.error", "INVALID_KVM_FORMAT"); throw new Error("DCRP: Invalid KVM format - expected 'path:iflowname', got: " + entry); } routes.push({ path: parts[0].trim(), iflow: parts[1].trim() }); } routes.sort(function(a, b) { return b.path.length - a.path.length; }); var matchedRoute = null; for (var k = 0; k &lt; routes.length; k++) { var routePath = routes[k].path.replace(/^\/+/, ''); if (remainingPath === routePath || remainingPath.indexOf(routePath + '/') === 0) { matchedRoute = routes[k]; break; } } if (!matchedRoute) { context.setVariable("routing.failed", true); context.setVariable("routing.error", "ROUTE_NOT_FOUND"); context.setVariable("routing.pathsuffix", pathSuffix); throw new Error("DCRP: No matching route found for path: " + pathSuffix); } // ======================================== // SECTION 4: GOVERNANCE HEADER INJECTION // ======================================== if (senderId) { context.setVariable("request.header.X-SenderId", senderId); } if (correlationId) { context.setVariable("request.header.X-CorrelationId", correlationId); } // ======================================== // SECTION 5: DYNAMIC URL CONSTRUCTION // ======================================== var targetUrl = cpiHost + cpiBasepath + "/" + matchedRoute.path; if (queryParams &amp;&amp; queryParams.length &gt; 0) { targetUrl += "?" + queryParams; } context.setVariable("target.url", targetUrl); context.setVariable("target.copy.pathsuffix", false); context.setVariable("target.copy.queryparams", false); // ======================================== // SUCCESS: SET ROUTING METADATA // ======================================== context.setVariable("routing.success", true); context.setVariable("routing.matched.path", matchedRoute.path); context.setVariable("routing.matched.iflow", matchedRoute.iflow); context.setVariable("routing.target.url", targetUrl); context.setVariable("routing.selected.basepath", cpiBasepath); context.setVariable("idiflow", matchedRoute.iflow); context.setVariable("idcorrelation", context.getVariable("request.header.X-CorrelationId")); context.setVariable("idsender", senderId || "UNKNOWN"); } catch (error) { context.setVariable("routing.failed", true); context.setVariable("routing.exception", error.message || error.toString()); print("DCRP Routing Error: " + error.message); print("PathSuffix: " + pathSuffix); print("KVM Value: " + iflowname); } }</div></div></noscript></div></div><P class="lia-align-left" style="text-align : left;"><STRONG><SPAN>Add in seguency in the Pre-Flow TargetEndpoint - Raise Fault Routing:</SPAN></STRONG></P><P class="lia-align-left" style="text-align : left;"><STRONG><SPAN>condition: routing.failed = "true"</SPAN></STRONG></P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1770105234756.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368413i42C3637DA2FE838D/image-size/medium?v=v2&amp;px=400" role="button" title="rhviana_0-1770105234756.png" alt="rhviana_0-1770105234756.png" /></span><STRONG>Figure 17 - Raise Fault in case of failure in the "Brain Java Script Routing"</STRONG></P><div class="lia-spoiler-container"><a class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer">Spoiler</a><noscript> (Highlight to read)</noscript><div class="lia-spoiler-border"><div class="lia-spoiler-content"><pre class="lia-code-sample language-markup"><code>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;RaiseFault async="false" continueOnError="false" enabled="true" xmlns="http://www.sap.com/apimgmt"&gt; &lt;FaultResponse&gt; &lt;Set&gt; &lt;StatusCode&gt;404&lt;/StatusCode&gt; &lt;ReasonPhrase&gt;Route Not Found&lt;/ReasonPhrase&gt; &lt;/Set&gt; &lt;Set&gt; &lt;Payload contentType="application/json"&gt;{ "error": "ROUTE_NOT_FOUND", "message": "{routing.error.message}", "details": { "error_code": "{routing.error}", "blocked_segment": "{routing.blocked.segment}", "blocked_path": "{routing.blocked.path}", "available_paths": "{routing.available.paths}", "timestamp": "{system.timestamp}", "correlation_id": "{request.header.X-CorrelationId}" } }&lt;/Payload&gt; &lt;/Set&gt; &lt;Add&gt; &lt;Headers&gt; &lt;Header name="Content-Type"&gt;application/json&lt;/Header&gt; &lt;Header name="X-Routing-Error"&gt;{routing.error}&lt;/Header&gt; &lt;Header name="X-Correlation-Id"&gt;{request.header.X-CorrelationId}&lt;/Header&gt; &lt;/Headers&gt; &lt;/Add&gt; &lt;/FaultResponse&gt; &lt;IgnoreUnresolvedVariables&gt;true&lt;/IgnoreUnresolvedVariables&gt; &lt;/RaiseFault&gt;</code></pre></div><noscript><div class="lia-spoiler-noscript-container"><div class="lia-spoiler-noscript-content">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;RaiseFault async="false" continueOnError="false" enabled="true" xmlns="http://www.sap.com/apimgmt"&gt; &lt;FaultResponse&gt; &lt;Set&gt; &lt;StatusCode&gt;404&lt;/StatusCode&gt; &lt;ReasonPhrase&gt;Route Not Found&lt;/ReasonPhrase&gt; &lt;/Set&gt; &lt;Set&gt; &lt;Payload contentType="application/json"&gt;{ "error": "ROUTE_NOT_FOUND", "message": "{routing.error.message}", "details": { "error_code": "{routing.error}", "blocked_segment": "{routing.blocked.segment}", "blocked_path": "{routing.blocked.path}", "available_paths": "{routing.available.paths}", "timestamp": "{system.timestamp}", "correlation_id": "{request.header.X-CorrelationId}" } }&lt;/Payload&gt; &lt;/Set&gt; &lt;Add&gt; &lt;Headers&gt; &lt;Header name="Content-Type"&gt;application/json&lt;/Header&gt; &lt;Header name="X-Routing-Error"&gt;{routing.error}&lt;/Header&gt; &lt;Header name="X-Correlation-Id"&gt;{request.header.X-CorrelationId}&lt;/Header&gt; &lt;/Headers&gt; &lt;/Add&gt; &lt;/FaultResponse&gt; &lt;IgnoreUnresolvedVariables&gt;true&lt;/IgnoreUnresolvedVariables&gt; &lt;/RaiseFault&gt;</div></div></noscript></div></div><HR /><H3 id="toc-hId--993723476">4 - Operational Simulation and Architectural Flow</H3><HR /><P class="lia-align-justify" style="text-align : justify;">This section demonstrates the practical execution of the <STRONG>DCRP (Domain-Centric Routing Pattern)</STRONG> framework by simulating how the routing engine processes a request through the landscape.</P><H3 id="toc-hId--1190236981"><STRONG>Architectural Flow Simulation</STRONG></H3><P>Based on the provided technical diagram, the process follows a structured path from the initiating system to the final integration endpoint:</P><UL><LI><STRONG>Request Initiation</STRONG>: External systems such as<UL><LI><STRONG>Salesforce -&nbsp;</STRONG>&nbsp;http://&lt;apim&gt;/sales/orders/inbound</LI><LI><STRONG>Dynamics 365 -&nbsp;</STRONG>http://&lt;apim&gt;/sales/orders/status</LI><LI><STRONG>Vendor CRMs</STRONG>&nbsp; -&nbsp;http://&lt;apim&gt;/sales/orders/tracking</LI></UL></LI><LI><STRONG>The DCRP Engine</STRONG>: Upon reaching the <STRONG>SAP API Management Gateway</STRONG>, the <STRONG>DCRP Enginne</STRONG>&nbsp;is triggered to manage the transaction logic.<UL><LI><STRONG>Metadata Retrieval (KVM Lookup)</STRONG>:&nbsp;<UL><LI><STRONG>Inbound:</STRONG>iflowname | sapprocess | cpipackage</LI><LI><STRONG>Tracking:</STRONG>iflowname&nbsp;| sapprocess | cpipackage</LI><LI><STRONG>Status:</STRONG> iflowname&nbsp;| sapprocess | cpipackage</LI></UL></LI><LI><STRONG>Logical Resolution (JavaScript)</STRONG>: The <STRONG>JavaScript</STRONG> component processes the <CODE>proxy.pathsuffix</CODE> against the metadata retrieved from the KVM to determine the correct technical path.<UL><LI><STRONG>http;//&lt;cpi&gt;/orders</STRONG>/inbound</LI><LI><STRONG>http;//&lt;cpi&gt;/orders</STRONG>/tracking</LI><LI><STRONG>http://&lt;cpi&gt;/orders</STRONG>/status</LI><LI><STRONG>Header</STRONG> <STRONG>detail</STRONG><STRONG>s</STRONG></LI></UL></LI><LI><STRONG>Dynamic Routing</STRONG>: The engine resolves the target and dynamically routes the traffic to the corresponding SAP BTP Integration Suite iFlow.</LI></UL></LI></UL><P class="lia-align-justify" style="text-align : justify;"><STRONG>Architect's Note</STRONG>: This simulation highlights the decoupling of the consumer from the technical backend. The source systems interact only with a standardized semantic layer, while the routing engine manages all technical complexities internally.</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_4-1770086031322.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368367iCA10992A236F2EC9/image-size/large?v=v2&amp;px=999" role="button" title="rhviana_4-1770086031322.png" alt="rhviana_4-1770086031322.png" /></span><STRONG><SPAN>Figure 18 - Clear orientation how works the solution from the sender to SAP APIM.</SPAN></STRONG></P><HR /><H3 id="toc-hId--1218566795"><SPAN>5 - Scaling Strategies: Manual vs Dynamic Routing</SPAN></H3><HR /><P>Scaling DCRP effectively requires choosing between two distinct deployment approaches, depending on the complexity and regional requirements of the enterprise.</P><P>Two Strategic Approaches:</P><H5 id="toc-hId--2001886314">5.1 - Approach 1: Single Global Template:</H5><UL><LI><STRONG><SPAN class="">How it works</SPAN></STRONG><SPAN><STRONG>: Create</STRONG> 1 Routing Rule per path<STRONG> (</STRONG></SPAN><STRONG><SPAN class="">`/orders/**`</SPAN>, <SPAN class="">`/customers/**`</SPAN>) </STRONG></LI><LI><STRONG><SPAN class="">Configuration</SPAN></STRONG><SPAN><STRONG>:</STRONG> </SPAN><SPAN class="">-</SPAN><SPAN> 1 proxy per domain </SPAN><SPAN class="">-</SPAN><SPAN> N routing rules (1 per path) </SPAN><SPAN class="">-</SPAN></LI><LI><STRONG>Fixed:</STRONG><SPAN class="">`cpi.basepath`</SPAN> <SPAN>per rule </SPAN></LI><LI><STRONG><SPAN class="">Time per new path</SPAN></STRONG><SPAN><STRONG>:</STRONG> ~2 minutes (add routing rule + KVM entry) </SPAN></LI><LI><STRONG><SPAN class="">Best for</SPAN></STRONG><SPAN><STRONG>: Small domains</STRONG> (&lt;5 paths), stable environments</SPAN></LI></UL><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_12-1770088065117.png" style="width: 735px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368377iE8A044020B9DDC26/image-dimensions/735x336?v=v2" width="735" height="336" role="button" title="rhviana_12-1770088065117.png" alt="rhviana_12-1770088065117.png" /></span><STRONG>Figure 19 - Template part 1</STRONG></P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_13-1770088110322.png" style="width: 719px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368378iA084CF6B3D0FCD30/image-dimensions/719x407?v=v2" width="719" height="407" role="button" title="rhviana_13-1770088110322.png" alt="rhviana_13-1770088110322.png" /></span><STRONG>Figure 20 - Template part 2</STRONG></P><P>Most importantly, you must ensure the Target Endpoint PRE-Flow is ready with the DCRP logic. While this approach provides explicit routing visibility, any additional requirements—such as specific security methods, quotas, or spike control—must be adjusted accordingly.</P><P><STRONG>Required Policies</STRONG><SPAN>&nbsp;</SPAN>(Target Endpoint PreFlow):</P><UL><LI>Key Value Mapping</LI><LI>JavaScript Routing</LI><LI>Raise Fault</LI><LI>Statistics Collector</LI></UL><P>Once this setup is finalized, it takes approximately<SPAN>&nbsp;</SPAN><STRONG>2 to 3 minutes</STRONG><SPAN>&nbsp;</SPAN>to have a fully functional API Proxy ready for operation, and<SPAN>&nbsp;</SPAN><STRONG>less than 30 seconds</STRONG><SPAN>&nbsp;</SPAN>to update metadata in the Key Value Mapping.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_15-1770088301427.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368380i5BED34E49CF2E2FD/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="rhviana_15-1770088301427.png" alt="rhviana_15-1770088301427.png" /></span></P><P class="lia-align-center" style="text-align: center;"><STRONG>Figure 21 - Pre-Flow setup - DCRP brain</STRONG></P><H5 id="toc-hId-2096567477">5.2 - Approach 2: Dynamic Multi-Path Routing</H5><P><STRONG>How it works</STRONG>:</P><UL><LI><STRONG>Single catch-all route</STRONG><SPAN>&nbsp;</SPAN>(<CODE>/**</CODE>)</LI><LI><STRONG>JavaScript extracts first segment</STRONG><SPAN>&nbsp;</SPAN>dynamically</LI><LI><STRONG><CODE>cpi.basepath</CODE><SPAN>&nbsp;</SPAN>is comma-delimited string</STRONG><SPAN>&nbsp;</SPAN>of all paths</LI></UL><P><STRONG>Configuration</STRONG>:</P><UL><LI>1 proxy per domain</LI><LI>1 catch-all routing rule</LI><LI>Security Shield validates domain whitelist</LI></UL><P><STRONG>Time per new path</STRONG>: ~30 seconds (update<SPAN>&nbsp;</SPAN><CODE>cpi.basepath</CODE><SPAN>&nbsp;</SPAN>string + KVM + Security whitelist)</P><P><STRONG>Best for</STRONG>: Enterprise scale, frequent changes</P><H4 id="example-configuration" id="toc-hId--2101510317">Example Configuration</H4><P><STRONG>Target Endpoint Property</STRONG>:<SPAN>&nbsp;</SPAN><CODE>cpi.basepath</CODE></P><P><STRONG>Initial Value</STRONG>:</P><PRE><CODE><SPAN class="">/http/</SPAN>orders,<SPAN class="">/http/</SPAN>customers,<SPAN class="">/http/i</SPAN>nvoices,<SPAN class="">/http/</SPAN>prices</CODE></PRE><P><STRONG>Adding new path</STRONG><SPAN>&nbsp;</SPAN>(payments):</P><PRE><CODE><SPAN class="">/http/</SPAN>orders,<SPAN class="">/http/</SPAN>customers,<SPAN class="">/http/i</SPAN>nvoices,<SPAN class="">/http/</SPAN>prices,<SPAN class="">/http/</SPAN>payments</CODE></PRE><H2 id="toc-hId--1711217808"><STRONG>Request Flow</STRONG></H2><DIV class="">Request Path First Segment Dynamic Basepath KVM Match Final CPI URL <TABLE><TBODY><TR><TD><CODE>/sales/customers</CODE></TD><TD><CODE>customers</CODE></TD><TD><CODE>/http/customers</CODE></TD><TD><CODE>SO.01.Customer.MasterData</CODE></TD><TD><CODE><A href="https://cpi/http/customers" target="_blank" rel="noopener nofollow noreferrer">https://cpi/http/customers</A></CODE></TD></TR><TR><TD><CODE>/sales/orders</CODE></TD><TD><CODE>orders</CODE></TD><TD><CODE>/http/orders</CODE></TD><TD><CODE>SO.02.Order.Process</CODE></TD><TD><CODE><A href="https://cpi/http/orders" target="_blank" rel="noopener nofollow noreferrer">https://cpi/http/orders</A></CODE></TD></TR><TR><TD><CODE>/sales/invoices</CODE></TD><TD><CODE>invoices</CODE></TD><TD><CODE>/http/invoices</CODE></TD><TD><CODE>SO.03.Invoice.Billing</CODE></TD><TD><CODE><A href="https://cpi/http/invoices" target="_blank" rel="noopener nofollow noreferrer">https://cpi/http/invoices</A></CODE></TD></TR></TBODY></TABLE></DIV><P><STRONG>Mechanism:</STRONG><SPAN>&nbsp;</SPAN>JavaScript extracts first segment → builds<SPAN>&nbsp;</SPAN><CODE>/http/{firstSegment}</CODE><SPAN>&nbsp;</SPAN>→ KVM lookup → routes to CPI.</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1770096689710.png" style="width: 747px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368393i2A1148F51860A932/image-dimensions/747x363/is-moderation-mode/true?v=v2" width="747" height="363" role="button" title="rhviana_0-1770096689710.png" alt="rhviana_0-1770096689710.png" /></span><STRONG>Figure 22 - Scalation mode hard</STRONG></P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Architect's Note&nbsp;Dynamic Multi-Path Routing<SPAN>:</SPAN></STRONG> This simulation highlights the decoupling of the consumer from the technical backend. The source systems interact only with a standardized semantic layer, while the routing engine manages all technical complexities internally.</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1770106440056.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368421i6C3014F3E4EBC671/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_0-1770106440056.png" alt="rhviana_0-1770106440056.png" /></span><STRONG><SPAN>Figure 23 - Clear orientation how works the solution with&nbsp;Dynamic Multi-Path Routing from the sender to SAP APIM.</SPAN></STRONG></P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_1-1770097079230.png" style="width: 727px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368394i247F037226C483D9/image-dimensions/727x384?v=v2" width="727" height="384" role="button" title="rhviana_1-1770097079230.png" alt="rhviana_1-1770097079230.png" /></span><STRONG>Figure 24 - Setup of cpi.basepath variable in the target endpoint with full string or new incomming process.</STRONG></P><H2 id="toc-hId--1907731313"><FONT color="#FF0000"><STRONG>To do this setup this takes me 1 minute.</STRONG></FONT></H2><H5 id="toc-hId-1310513457">5.3 — Security Shield: Critical for Dynamic Routing</H5><P><STRONG>Why It's Required</STRONG></P><P><STRONG>Catch-all route (/</STRONG>)** = every request reaches routing engine.</P><DIV class="">Without Shield With Shield <TABLE><TBODY><TR><TD><span class="lia-unicode-emoji" title=":cross_mark:">❌</span>Path traversal reaches KVM/JS</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Blocked at PreFlow (403)</TD></TR><TR><TD><span class="lia-unicode-emoji" title=":cross_mark:">❌</span>SQL injection processed</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Saves ~100ms per blocked request</TD></TR><TR><TD><span class="lia-unicode-emoji" title=":cross_mark:">❌</span>Resource waste</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Audit compliance (SOC 2/ISO 27001)</TD></TR></TBODY></TABLE></DIV><P><STRONG>Attack Scenarios</STRONG></P><DIV class="">Attack Type Example Without Shield With Shield <TABLE><TBODY><TR><TD><STRONG>Path Traversal</STRONG></TD><TD><CODE>/sales/../admin/delete</CODE></TD><TD><span class="lia-unicode-emoji" title=":cross_mark:">❌</span>Reaches KVM/JS</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Blocked (403)</TD></TR><TR><TD><STRONG>SQL Injection</STRONG></TD><TD><CODE>/orders?id=1 OR 1=1</CODE></TD><TD><span class="lia-unicode-emoji" title=":cross_mark:">❌</span>Reaches KVM/JS</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Blocked (403)</TD></TR><TR><TD><STRONG>Domain Hijacking</STRONG></TD><TD><CODE>/hacker-domain/exploit</CODE></TD><TD><span class="lia-unicode-emoji" title=":cross_mark:">❌</span>Reaches KVM/JS</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Blocked (403)</TD></TR><TR><TD><STRONG>Command Injection</STRONG></TD><TD><CODE>/orders?cmd=;cat /etc/passwd</CODE></TD><TD><span class="lia-unicode-emoji" title=":cross_mark:">❌</span>Reaches KVM/JS</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Blocked (403)</TD></TR></TBODY></TABLE></DIV><P><STRONG>Configuration (30 seconds per path)</STRONG></P><P>Add new path (e.g.,<SPAN>&nbsp;</SPAN><CODE>/payments</CODE>) in<SPAN>&nbsp;</SPAN><STRONG>3 locations</STRONG>:</P><P><STRONG>1. Target Endpoint (<CODE>cpi.basepath</CODE>)</STRONG></P><pre class="lia-code-sample language-abap"><code>/http/orders,/http/customers,/http/payments</code></pre><P><STRONG>2. Security Whitelist (<CODE>JS-Security-Shield.js</CODE>) - Inside javascript code</STRONG></P><pre class="lia-code-sample language-abap"><code>var allowedDomains = ["sales", "orders", "customers", "invoices", "payments"]; &lt;-- add here new path</code></pre><P><STRONG>3. KVM Entry (<CODE>iflowname</CODE>)</STRONG></P><pre class="lia-code-sample language-abap"><code>orders:SO.01...,customers:SO.02...,payments:SO.03...</code></pre><P><STRONG>Execution Api-proxy flow steps:</STRONG></P><pre class="lia-code-sample language-abap"><code>ProxyEndpoint PreFlow: 1. JS-Security-Shield → Validates whitelist, blocks attacks 2. RF-SecurityThreat → Returns 403 if threat 3. Quota + Spike Arrest → Rate limiting ↓ TargetEndpoint PreFlow: 4. KVM Lookup + Routing → Only if security passed</code></pre><P><STRONG>Performance (Telemetry)</STRONG></P><DIV class="">Scenario Time Impact <TABLE><TBODY><TR><TD>Valid request</TD><TD>+10ms</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Acceptable (8% total)</TD></TR><TR><TD>Blocked attack</TD><TD>10ms (no KVM/JS)</TD><TD><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span><SPAN>&nbsp;</SPAN><STRONG>Saves 100ms</STRONG></TD></TR></TBODY></TABLE></DIV><P><STRONG>Key Insight:</STRONG><SPAN>&nbsp;</SPAN>Security Shield prevents resource waste on malicious requests.</P><H5 id="toc-hId-1113999952"><STRONG>Why <FONT color="#FF0000">Not</FONT> Rely on KVM for 404?</STRONG></H5><P><STRONG>Defense-in-depth principle:</STRONG></P><UL><LI><STRONG>Resource Efficiency:</STRONG><SPAN>&nbsp;</SPAN>Blocks at PreFlow (saves KVM + JS overhead)</LI><LI><STRONG>Attack Intelligence:</STRONG><SPAN>&nbsp;</SPAN>Logs threats for SIEM</LI><LI><STRONG>Blast Radius:</STRONG><SPAN>&nbsp;</SPAN>KVM misconfiguration doesn't expose all paths</LI><LI><STRONG>Compliance:</STRONG><SPAN>&nbsp;</SPAN>SOC 2/ISO 27001 require gateway validation</LI></UL><H5 id="toc-hId-917486447">Java Script Thread Hacking protection - ( Complete Code )</H5><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_2-1770097161609.png" style="width: 718px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368395i37AB791955ABA14D/image-dimensions/718x478/is-moderation-mode/true?v=v2" width="718" height="478" role="button" title="rhviana_2-1770097161609.png" alt="rhviana_2-1770097161609.png" /></span><STRONG>Figure 25 - Java Script Policy - Hacking thread protection&nbsp;Domain-Specific Templates</STRONG></P><P>In this case you need to add this java script in the Proxy End-point - Pre-Flow to stop imidiatly any hacking or sql injection, because now the routing mechanism is not based on path, is start -&nbsp;<SPAN><STRONG>proxy.pathsuffix MatchesPath "/**"</STRONG></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_3-1770097307702.png" style="width: 506px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368396iCB8B5E9EAA9C6A08/image-dimensions/506x162?v=v2" width="506" height="162" role="button" title="rhviana_3-1770097307702.png" alt="rhviana_3-1770097307702.png" /></span></P><P class="lia-align-center" style="text-align: center;"><STRONG>Figure 23 - Java Script Thread Protection - ProxyEndpoint - Preflow</STRONG></P><P class="lia-align-left" style="text-align : left;"><STRONG>Add in seguency - RaiseFault Hacking thead:</STRONG></P><P class="lia-align-left" style="text-align : left;"><STRONG>condition:&nbsp;security.raise.fault = "true"</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_1-1770105359594.png" style="width: 553px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368414i14601355D9E3E962/image-dimensions/553x183?v=v2" width="553" height="183" role="button" title="rhviana_1-1770105359594.png" alt="rhviana_1-1770105359594.png" /></span></P><P class="lia-align-center" style="text-align: center;"><STRONG>Figure 24 - Raise Fault Thread of Hacking, sql injection and others.</STRONG></P><div class="lia-spoiler-container"><a class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer">Spoiler</a><noscript> (Highlight to read)</noscript><div class="lia-spoiler-border"><div class="lia-spoiler-content"><pre class="lia-code-sample language-abap"><code>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;RaiseFault async="false" continueOnError="false" enabled="true" xmlns="http://www.sap.com/apimgmt"&gt; &lt;FaultResponse&gt; &lt;Set&gt; &lt;StatusCode&gt;403&lt;/StatusCode&gt; &lt;ReasonPhrase&gt;Forbidden - Security Threat Detected&lt;/ReasonPhrase&gt; &lt;/Set&gt; &lt;Set&gt; &lt;Payload contentType="application/json"&gt;{ "error": "SECURITY_THREAT_DETECTED", "message": "Request blocked by security policies", "details": { "threat_type": "{security.threat.type}", "blocked_path": "{security.blocked.path}", "client_ip": "{client.ip}", "user_agent": "{request.header.User-Agent}", "timestamp": "{system.timestamp}", "correlation_id": "{request.header.X-CorrelationId}", "request_id": "{messageid}" } } &lt;/Payload&gt; &lt;/Set&gt; &lt;Add&gt; &lt;Headers&gt; &lt;Header name="Content-Type"&gt;application/json&lt;/Header&gt; &lt;Header name="X-Security-Status"&gt;BLOCKED&lt;/Header&gt; &lt;Header name="X-Threat-Type"&gt;{security.threat.type}&lt;/Header&gt; &lt;Header name="X-Correlation-Id"&gt;{request.header.X-CorrelationId}&lt;/Header&gt; &lt;/Headers&gt; &lt;/Add&gt; &lt;/FaultResponse&gt; &lt;IgnoreUnresolvedVariables&gt;true&lt;/IgnoreUnresolvedVariables&gt; &lt;/RaiseFault&gt;</code></pre></div><noscript><div class="lia-spoiler-noscript-container"><div class="lia-spoiler-noscript-content">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;RaiseFault async="false" continueOnError="false" enabled="true" xmlns="http://www.sap.com/apimgmt"&gt; &lt;FaultResponse&gt; &lt;Set&gt; &lt;StatusCode&gt;403&lt;/StatusCode&gt; &lt;ReasonPhrase&gt;Forbidden - Security Threat Detected&lt;/ReasonPhrase&gt; &lt;/Set&gt; &lt;Set&gt; &lt;Payload contentType="application/json"&gt;{ "error": "SECURITY_THREAT_DETECTED", "message": "Request blocked by security policies", "details": { "threat_type": "{security.threat.type}", "blocked_path": "{security.blocked.path}", "client_ip": "{client.ip}", "user_agent": "{request.header.User-Agent}", "timestamp": "{system.timestamp}", "correlation_id": "{request.header.X-CorrelationId}", "request_id": "{messageid}" } } &lt;/Payload&gt; &lt;/Set&gt; &lt;Add&gt; &lt;Headers&gt; &lt;Header name="Content-Type"&gt;application/json&lt;/Header&gt; &lt;Header name="X-Security-Status"&gt;BLOCKED&lt;/Header&gt; &lt;Header name="X-Threat-Type"&gt;{security.threat.type}&lt;/Header&gt; &lt;Header name="X-Correlation-Id"&gt;{request.header.X-CorrelationId}&lt;/Header&gt; &lt;/Headers&gt; &lt;/Add&gt; &lt;/FaultResponse&gt; &lt;IgnoreUnresolvedVariables&gt;true&lt;/IgnoreUnresolvedVariables&gt; &lt;/RaiseFault&gt;</div></div></noscript></div></div><H5 id="toc-hId-720972942"><STRONG>DCRP Security Shield v1.0</STRONG></H5><H5 id="toc-hId-692643128"><STRONG>Purpose</STRONG></H5><P>Protects catch-all route (<CODE>/**</CODE>) from malicious requests<SPAN>&nbsp;</SPAN><STRONG>before</STRONG><SPAN>&nbsp;</SPAN>JS-Routing executes - code in the spoiler below</P><div class="lia-spoiler-container"><a class="lia-spoiler-link" href="#" rel="nofollow noopener noreferrer">Spoiler</a><noscript> (Highlight to read)</noscript><div class="lia-spoiler-border"><div class="lia-spoiler-content"><pre class="lia-code-sample language-javascript"><code>/** * ============================================ * DCRP SECURITY SHIELD v1.0 * ============================================ * PURPOSE: Protect /** catch-all route from malicious requests * AUTHOR: Ricardo Viana * RUNS: BEFORE JS-Routing in Proxy PreFlow * * FEATURES: * - Path Traversal Protection * - SQL Injection Detection * - XSS Protection * - Domain Whitelist Enforcement * - Header Validation * - Bot Protection * ============================================ */ try { // ============================================ // CONTEXT EXTRACTION // ============================================ var pathSuffix = context.getVariable("proxy.pathsuffix") || ""; var queryString = context.getVariable("request.querystring") || ""; var userAgent = context.getVariable("request.header.User-Agent") || ""; var contentType = context.getVariable("request.header.Content-Type") || ""; var method = context.getVariable("request.verb") || ""; var clientIp = context.getVariable("client.ip") || ""; // ============================================ // SECTION 1: PATH TRAVERSAL PROTECTION // ============================================ var pathTraversalPatterns = [ /\.\./, // ../ /%2e%2e/i, // URL-encoded .. /%252e/i, // Double URL-encoded . /\.\\/, // .\ (Windows path) /%5c/i, // URL-encoded backslash /\/\//, // Double slashes /etc\/passwd/i, // Linux system files /windows\/system/i, // Windows system paths /proc\/self/i, // Linux proc filesystem /\.\.%2f/i, // Mixed encoding /\.\.;/i // Semicolon bypass attempt ]; for (var i = 0; i &lt; pathTraversalPatterns.length; i++) { if (pathTraversalPatterns[i].test(pathSuffix)) { context.setVariable("security.threat.detected", "PATH_TRAVERSAL"); context.setVariable("security.threat.pattern", pathTraversalPatterns[i].toString()); context.setVariable("security.threat.path", pathSuffix); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Path Traversal attempt detected"); } } // ============================================ // SECTION 2: DOMAIN WHITELIST VALIDATION // ============================================ var allowedDomains = [ "sales", "orders", "customers", "invoices", "prices", "quotations", "finance", "accounts", "journals", "payments", "reconciliations", "reports", "closings", "taxes", "budgets", "logistics", "shipments", "inventory", "deliveries", "warehouses", "tracking", "carriers", "returns", "pickpack", "procurement", "requisitions", "suppliers", "contracts", "buyers", "approvals", "receipts", "catalogs" ]; var segments = pathSuffix.split("/").filter(function(s) { return s.length &gt; 0; }); var firstSegment = segments.length &gt; 0 ? segments[0].toLowerCase() : ""; var isDomainAllowed = false; for (var j = 0; j &lt; allowedDomains.length; j++) { if (firstSegment === allowedDomains[j]) { isDomainAllowed = true; break; } } if (!isDomainAllowed &amp;&amp; firstSegment !== "") { context.setVariable("security.threat.detected", "INVALID_DOMAIN"); context.setVariable("security.threat.path", pathSuffix); context.setVariable("security.threat.segment", firstSegment); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Invalid domain '" + firstSegment + "' not in whitelist"); } // ============================================ // SECTION 3: SQL INJECTION DETECTION // ============================================ var sqlPatterns = [ /(\bOR\b|\bAND\b)\s+[\w\d]+\s*=\s*[\w\d]+/i, /UNION\s+(ALL\s+)?SELECT/i, /DROP\s+(TABLE|DATABASE)/i, /INSERT\s+INTO/i, /DELETE\s+FROM/i, /UPDATE\s+\w+\s+SET/i, /--/, /\/\*/, /;\s*DROP/i, /xp_cmdshell/i, /exec(\s|\+)+(s|x)p\w+/i ]; var fullUrl = pathSuffix + (queryString ? "?" + queryString : ""); for (var k = 0; k &lt; sqlPatterns.length; k++) { if (sqlPatterns[k].test(fullUrl)) { context.setVariable("security.threat.detected", "SQL_INJECTION"); context.setVariable("security.threat.pattern", sqlPatterns[k].toString()); context.setVariable("security.threat.url", fullUrl); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: SQL Injection attempt detected"); } } // ============================================ // SECTION 4: XSS PROTECTION // ============================================ var xssPatterns = [ /&lt;script[\s\S]*?&gt;/i, /javascript&amp;colon;/i, /onerror\s*=/i, /onload\s*=/i, /onclick\s*=/i, /&lt;iframe[\s\S]*?&gt;/i, /&lt;embed[\s\S]*?&gt;/i, /&lt;object[\s\S]*?&gt;/i, /eval\s*\(/i, /expression\s*\(/i, /vbscript&amp;colon;/i, /&lt;img[\s\S]*?onerror/i ]; for (var m = 0; m &lt; xssPatterns.length; m++) { if (xssPatterns[m].test(fullUrl)) { context.setVariable("security.threat.detected", "XSS_ATTEMPT"); context.setVariable("security.threat.pattern", xssPatterns[m].toString()); context.setVariable("security.threat.url", fullUrl); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: XSS attempt detected"); } } // ============================================ // SECTION 5: COMMAND INJECTION PROTECTION // ============================================ var commandInjectionPatterns = [ /;\s*cat\s+/i, /\|\s*ls\s+/i, /`.*`/, /\$\(.*\)/, /&amp;&amp;/, /\|\|/, /&gt;\s*\/dev\/null/i, /curl\s+/i, /wget\s+/i, /nc\s+/i ]; for (var n = 0; n &lt; commandInjectionPatterns.length; n++) { if (commandInjectionPatterns[n].test(fullUrl)) { context.setVariable("security.threat.detected", "COMMAND_INJECTION"); context.setVariable("security.threat.pattern", commandInjectionPatterns[n].toString()); context.setVariable("security.threat.url", fullUrl); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Command Injection attempt detected"); } } // ============================================ // SECTION 6: HEADER VALIDATION // ============================================ if (!userAgent || userAgent.length &lt; 5) { context.setVariable("security.threat.detected", "MISSING_USER_AGENT"); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Invalid or missing User-Agent header"); } if ((method === "POST" || method === "PUT")) { if (!contentType || contentType.length === 0) { context.setVariable("security.threat.detected", "MISSING_CONTENT_TYPE"); context.setVariable("security.threat.method", method); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Missing Content-Type header for " + method + " request"); } } var suspiciousUAPatterns = [ /sqlmap/i, /nikto/i, /nmap/i, /masscan/i, /acunetix/i, /nessus/i, /burpsuite/i, /metasploit/i, /havij/i ]; for (var p = 0; p &lt; suspiciousUAPatterns.length; p++) { if (suspiciousUAPatterns[p].test(userAgent)) { context.setVariable("security.threat.detected", "SUSPICIOUS_USER_AGENT"); context.setVariable("security.threat.user_agent", userAgent); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Suspicious User-Agent detected"); } } // ============================================ // SECTION 7: PATH LENGTH VALIDATION // ============================================ var maxPathLength = 2048; if (pathSuffix.length &gt; maxPathLength) { context.setVariable("security.threat.detected", "PATH_TOO_LONG"); context.setVariable("security.threat.path_length", pathSuffix.length.toString()); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Path length exceeds maximum allowed (" + maxPathLength + " chars)"); } // ============================================ // SECTION 8: SUSPICIOUS PATTERNS // ============================================ var suspiciousPatterns = [ /admin/i, /config/i, /\.xml$/i, /\.json$/i, /\.env$/i, /\.git/i, /\.svn/i, /backup/i, /phpinfo/i, /test/i, /debug/i ]; for (var q = 0; q &lt; suspiciousPatterns.length; q++) { if (suspiciousPatterns[q].test(pathSuffix)) { context.setVariable("security.threat.detected", "SUSPICIOUS_PATH"); context.setVariable("security.threat.pattern", suspiciousPatterns[q].toString()); context.setVariable("security.threat.path", pathSuffix); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Suspicious path pattern detected"); } } // ============================================ // SECTION 9: SUCCESS // ============================================ context.setVariable("security.validated", "true"); context.setVariable("security.validated.timestamp", Date.now().toString()); context.setVariable("security.status", "PASSED"); context.setVariable("security.domain", firstSegment); context.setVariable("custom.security.status", "PASSED"); context.setVariable("custom.security.domain", firstSegment); } catch (error) { // ============================================ // SECURITY THREAT DETECTED // ============================================ context.setVariable("security.failed", "true"); context.setVariable("security.error", error.message); context.setVariable("security.raise.fault", "true"); context.setVariable("custom.security.status", "BLOCKED"); context.setVariable("custom.security.threat", context.getVariable("security.threat.detected") || "UNKNOWN"); context.setVariable("custom.security.path", pathSuffix); context.setVariable("custom.security.ip", clientIp); context.setVariable("custom.security.method", method); context.setVariable("custom.security.user_agent", userAgent); }</code></pre></div><noscript><div class="lia-spoiler-noscript-container"><div class="lia-spoiler-noscript-content">/** * ============================================ * DCRP SECURITY SHIELD v1.0 * ============================================ * PURPOSE: Protect /** catch-all route from malicious requests * AUTHOR: Ricardo Viana * RUNS: BEFORE JS-Routing in Proxy PreFlow * * FEATURES: * - Path Traversal Protection * - SQL Injection Detection * - XSS Protection * - Domain Whitelist Enforcement * - Header Validation * - Bot Protection * ============================================ */ try { // ============================================ // CONTEXT EXTRACTION // ============================================ var pathSuffix = context.getVariable("proxy.pathsuffix") || ""; var queryString = context.getVariable("request.querystring") || ""; var userAgent = context.getVariable("request.header.User-Agent") || ""; var contentType = context.getVariable("request.header.Content-Type") || ""; var method = context.getVariable("request.verb") || ""; var clientIp = context.getVariable("client.ip") || ""; // ============================================ // SECTION 1: PATH TRAVERSAL PROTECTION // ============================================ var pathTraversalPatterns = [ /\.\./, // ../ /%2e%2e/i, // URL-encoded .. /%252e/i, // Double URL-encoded . /\.\\/, // .\ (Windows path) /%5c/i, // URL-encoded backslash /\/\//, // Double slashes /etc\/passwd/i, // Linux system files /windows\/system/i, // Windows system paths /proc\/self/i, // Linux proc filesystem /\.\.%2f/i, // Mixed encoding /\.\.;/i // Semicolon bypass attempt ]; for (var i = 0; i &lt; pathTraversalPatterns.length; i++) { if (pathTraversalPatterns[i].test(pathSuffix)) { context.setVariable("security.threat.detected", "PATH_TRAVERSAL"); context.setVariable("security.threat.pattern", pathTraversalPatterns[i].toString()); context.setVariable("security.threat.path", pathSuffix); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Path Traversal attempt detected"); } } // ============================================ // SECTION 2: DOMAIN WHITELIST VALIDATION // ============================================ var allowedDomains = [ "sales", "orders", "customers", "invoices", "prices", "quotations", "finance", "accounts", "journals", "payments", "reconciliations", "reports", "closings", "taxes", "budgets", "logistics", "shipments", "inventory", "deliveries", "warehouses", "tracking", "carriers", "returns", "pickpack", "procurement", "requisitions", "suppliers", "contracts", "buyers", "approvals", "receipts", "catalogs" ]; var segments = pathSuffix.split("/").filter(function(s) { return s.length &gt; 0; }); var firstSegment = segments.length &gt; 0 ? segments[0].toLowerCase() : ""; var isDomainAllowed = false; for (var j = 0; j &lt; allowedDomains.length; j++) { if (firstSegment === allowedDomains[j]) { isDomainAllowed = true; break; } } if (!isDomainAllowed &amp;&amp; firstSegment !== "") { context.setVariable("security.threat.detected", "INVALID_DOMAIN"); context.setVariable("security.threat.path", pathSuffix); context.setVariable("security.threat.segment", firstSegment); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Invalid domain '" + firstSegment + "' not in whitelist"); } // ============================================ // SECTION 3: SQL INJECTION DETECTION // ============================================ var sqlPatterns = [ /(\bOR\b|\bAND\b)\s+[\w\d]+\s*=\s*[\w\d]+/i, /UNION\s+(ALL\s+)?SELECT/i, /DROP\s+(TABLE|DATABASE)/i, /INSERT\s+INTO/i, /DELETE\s+FROM/i, /UPDATE\s+\w+\s+SET/i, /--/, /\/\*/, /;\s*DROP/i, /xp_cmdshell/i, /exec(\s|\+)+(s|x)p\w+/i ]; var fullUrl = pathSuffix + (queryString ? "?" + queryString : ""); for (var k = 0; k &lt; sqlPatterns.length; k++) { if (sqlPatterns[k].test(fullUrl)) { context.setVariable("security.threat.detected", "SQL_INJECTION"); context.setVariable("security.threat.pattern", sqlPatterns[k].toString()); context.setVariable("security.threat.url", fullUrl); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: SQL Injection attempt detected"); } } // ============================================ // SECTION 4: XSS PROTECTION // ============================================ var xssPatterns = [ /&lt;script[\s\S]*?&gt;/i, /javascript&amp;colon;/i, /onerror\s*=/i, /onload\s*=/i, /onclick\s*=/i, /&lt;iframe[\s\S]*?&gt;/i, /&lt;embed[\s\S]*?&gt;/i, /&lt;object[\s\S]*?&gt;/i, /eval\s*\(/i, /expression\s*\(/i, /vbscript&amp;colon;/i, /&lt;img[\s\S]*?onerror/i ]; for (var m = 0; m &lt; xssPatterns.length; m++) { if (xssPatterns[m].test(fullUrl)) { context.setVariable("security.threat.detected", "XSS_ATTEMPT"); context.setVariable("security.threat.pattern", xssPatterns[m].toString()); context.setVariable("security.threat.url", fullUrl); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: XSS attempt detected"); } } // ============================================ // SECTION 5: COMMAND INJECTION PROTECTION // ============================================ var commandInjectionPatterns = [ /;\s*cat\s+/i, /\|\s*ls\s+/i, /`.*`/, /\$\(.*\)/, /&amp;&amp;/, /\|\|/, /&gt;\s*\/dev\/null/i, /curl\s+/i, /wget\s+/i, /nc\s+/i ]; for (var n = 0; n &lt; commandInjectionPatterns.length; n++) { if (commandInjectionPatterns[n].test(fullUrl)) { context.setVariable("security.threat.detected", "COMMAND_INJECTION"); context.setVariable("security.threat.pattern", commandInjectionPatterns[n].toString()); context.setVariable("security.threat.url", fullUrl); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Command Injection attempt detected"); } } // ============================================ // SECTION 6: HEADER VALIDATION // ============================================ if (!userAgent || userAgent.length &lt; 5) { context.setVariable("security.threat.detected", "MISSING_USER_AGENT"); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Invalid or missing User-Agent header"); } if ((method === "POST" || method === "PUT")) { if (!contentType || contentType.length === 0) { context.setVariable("security.threat.detected", "MISSING_CONTENT_TYPE"); context.setVariable("security.threat.method", method); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Missing Content-Type header for " + method + " request"); } } var suspiciousUAPatterns = [ /sqlmap/i, /nikto/i, /nmap/i, /masscan/i, /acunetix/i, /nessus/i, /burpsuite/i, /metasploit/i, /havij/i ]; for (var p = 0; p &lt; suspiciousUAPatterns.length; p++) { if (suspiciousUAPatterns[p].test(userAgent)) { context.setVariable("security.threat.detected", "SUSPICIOUS_USER_AGENT"); context.setVariable("security.threat.user_agent", userAgent); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Suspicious User-Agent detected"); } } // ============================================ // SECTION 7: PATH LENGTH VALIDATION // ============================================ var maxPathLength = 2048; if (pathSuffix.length &gt; maxPathLength) { context.setVariable("security.threat.detected", "PATH_TOO_LONG"); context.setVariable("security.threat.path_length", pathSuffix.length.toString()); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Path length exceeds maximum allowed (" + maxPathLength + " chars)"); } // ============================================ // SECTION 8: SUSPICIOUS PATTERNS // ============================================ var suspiciousPatterns = [ /admin/i, /config/i, /\.xml$/i, /\.json$/i, /\.env$/i, /\.git/i, /\.svn/i, /backup/i, /phpinfo/i, /test/i, /debug/i ]; for (var q = 0; q &lt; suspiciousPatterns.length; q++) { if (suspiciousPatterns[q].test(pathSuffix)) { context.setVariable("security.threat.detected", "SUSPICIOUS_PATH"); context.setVariable("security.threat.pattern", suspiciousPatterns[q].toString()); context.setVariable("security.threat.path", pathSuffix); context.setVariable("security.threat.ip", clientIp); throw new Error("SECURITY: Suspicious path pattern detected"); } } // ============================================ // SECTION 9: SUCCESS // ============================================ context.setVariable("security.validated", "true"); context.setVariable("security.validated.timestamp", Date.now().toString()); context.setVariable("security.status", "PASSED"); context.setVariable("security.domain", firstSegment); context.setVariable("custom.security.status", "PASSED"); context.setVariable("custom.security.domain", firstSegment); } catch (error) { // ============================================ // SECURITY THREAT DETECTED // ============================================ context.setVariable("security.failed", "true"); context.setVariable("security.error", error.message); context.setVariable("security.raise.fault", "true"); context.setVariable("custom.security.status", "BLOCKED"); context.setVariable("custom.security.threat", context.getVariable("security.threat.detected") || "UNKNOWN"); context.setVariable("custom.security.path", pathSuffix); context.setVariable("custom.security.ip", clientIp); context.setVariable("custom.security.method", method); context.setVariable("custom.security.user_agent", userAgent); }</div></div></noscript></div></div><H5 id="when-to-use-each-approach" id="toc-hId-496129623">When to Use Each Approach</H5><P><STRONG>Use Approach 1 (Manual)</STRONG><SPAN>&nbsp;</SPAN>when:</P><UL><LI>Domain has &lt;5 paths and rarely changes</LI><LI>Team prefers explicit routing rules for visibility</LI><LI>Legacy environment with existing path-based architecture</LI></UL><P><STRONG>Use Approach 2 (Dynamic)</STRONG><SPAN>&nbsp;</SPAN>when:</P><UL><LI>Domain has &gt;5 paths OR frequent changes expected</LI><LI>Enterprise scale with multiple regional deployments</LI><LI>Need maximum deployment velocity (30s per new path)</LI></UL><H5 id="comparison-table" id="toc-hId-299616118">Comparison Table</H5><DIV class="">Feature Approach 1 (Manual) Approach 2 (Dynamic) <TABLE><TBODY><TR><TD><STRONG>Routing Rule</STRONG></TD><TD>N rules (1 per path)</TD><TD>1 catch-all (<CODE>/**</CODE>)</TD></TR><TR><TD><STRONG>cpi.basepath</STRONG></TD><TD>Fixed per rule</TD><TD>Comma-delimited string</TD></TR><TR><TD><STRONG>JavaScript</STRONG></TD><TD>Matches KVM only</TD><TD>Extracts segment + matches KVM</TD></TR><TR><TD><STRONG>Security</STRONG></TD><TD>Rule-based</TD><TD>Whitelist validation required</TD></TR><TR><TD><STRONG>Time per new path</STRONG></TD><TD>~2 min (add rule)</TD><TD>~30 sec (update string)</TD></TR><TR><TD><STRONG>Best for</STRONG></TD><TD>&lt;5 paths, stable</TD><TD>Enterprise, high-change</TD></TR></TBODY></TABLE></DIV><H5 id="toc-hId-103102613">ROI Calculation (Approach 2)</H5><P>Scaling 4 domains with 8 paths each:</P><P><STRONG>Approach 1 (Manual)</STRONG>:<BR />4 domains × 8 paths × 2 min =<SPAN>&nbsp;</SPAN><STRONG>64 minutes</STRONG></P><P><STRONG>Approach 2 (Dynamic)</STRONG>:<BR />4 domains × 1 setup (2 min) + 32 paths × 30 sec =<SPAN>&nbsp;</SPAN><STRONG>8 min + 16 min = 24 minutes</STRONG></P><P><STRONG>Savings</STRONG>: 40 minutes (62% faster)</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1770100201129.png" style="width: 681px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368400i110B19164C8EC693/image-dimensions/681x392/is-moderation-mode/true?v=v2" width="681" height="392" role="button" title="rhviana_0-1770100201129.png" alt="rhviana_0-1770100201129.png" /></span><STRONG>Figure 26 - Scaling Strategies: Manual vs Dynamic Multi-Path Routing</STRONG></P><HR /><H3 id="toc-hId-493395122">6 - API Contracts, Versioning &amp; Openapi Management</H3><HR /><H5 id="toc-hId--289924397">Why DCRP Proxies Don't Need Versioning</H5><P>In traditional API management, versioning is a primary driver of Infrastructure Sprawl. Every new version typically spawns a new proxy (e.g., v1-api, v2-api), forcing architects to manage multiple redundant infrastructures.</P><P>DCRP eliminates this proliferation by recognizing that the proxy is a stateless router with an immutable base path, not the owner of the API contract.</P><P>Fixed Entry Point:</P><UL><UL><UL><LI>The proxy base path remains constant (e.g., /sales/orders/**).</LI><LI>Versioned Routing: API versions live in the path suffix (e.g., /v1/, /v2/).</LI><LI>Decoupled Logic: These versions are mapped to specific iFlows via KVM metadata, keeping the proxy itself singular and unchanged.</LI></UL></UL></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1770055217713.png" style="width: 689px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368241iBD63B34A1CC60723/image-dimensions/689x377/is-moderation-mode/true?v=v2" width="689" height="377" role="button" title="rhviana_0-1770055217713.png" alt="rhviana_0-1770055217713.png" /></span></P><P class="lia-align-center" style="text-align: center;">&nbsp;<STRONG>Figure 27 - Contracts &amp; Governance</STRONG></P><P><STRONG>Step Traditional 1:1 Proxy Model DCRP Model</STRONG></P><UL><UL><UL><LI>Action Create new proxy, configure security, routing, and targets, then redeploy.</LI><LI>Deploy new iFlow and update a single KVM metadata entry.</LI><LI>Time Effort ~15 minutes ~30 seconds</LI><LI>Outcome Managing 4 separate proxy infrastructures. Still managing 1 proxy infrastructure.</LI></UL></UL></UL><P><STRONG>Client Interaction Examples:</STRONG></P><UL><UL><UL><LI>Legacy: POST /sales/orders/v1/inbound → Routes to v1 iFlow.</LI><LI>Current: POST /sales/orders/v2/inbound → Routes to v2 iFlow.</LI><LI>New: POST /sales/orders/v4/inbound → Routes to v4 iFlow.</LI><LI>Latest (Default): POST /sales/orders/inbound → Dynamically routes to v4 via KVM.</LI></UL></UL></UL><P>The proxy base path /sales/orders/** never changed., providing a stable, governed interface for consumers regardless of backend evolution.</P><H5 id="toc-hId--486437902">6.1 - OpenAPI Management: The Hybrid Approach</H5><P>In the DCRP model, API contracts (OpenAPI specifications) are decoupled from both the proxy and the iFlow, residing in a central API Portal or repository. This hybrid model ensures a clean separation of concerns:</P><P>KVM: Stores runtime routing metadata (path → endpoint).</P><P>OpenAPI: Stores design-time contract metadata (request/response schemas).</P><P>API Portal: Provides discovery, documentation, and governance.</P><P>The Execution Flow:<BR />When a developer needs to integrate, they download the spec (e.g., sales-orders-v2.yaml) from the Portal and generate their client code. When they call the DCRP proxy at /sales/orders/v2, the proxy consults the KVM and routes the request to the corresponding v2 iFlow.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Premium_slide_TeslaElon_Musk_style_White_backgr-1769935301186.png" style="width: 749px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368238iF6FE3F7571E76694/image-dimensions/749x419/is-moderation-mode/true?v=v2" width="749" height="419" role="button" title="Premium_slide_TeslaElon_Musk_style_White_backgr-1769935301186.png" alt="Premium_slide_TeslaElon_Musk_style_White_backgr-1769935301186.png" /></span></P><P class="lia-align-center" style="text-align: center;"><STRONG><SPAN>Figure 28 - Template prespective</SPAN></STRONG></P><H5 id="toc-hId--682951407">6.2 - KVM vs OpenAPI: Complementary, Not Redundant</H5><P class="lia-align-justify" style="text-align : justify;">At first glance, KVM and OpenAPI might seem to overlap. Both describe APIs. But they serve distinct purposes:</P><P class="lia-align-justify" style="text-align : justify;">KVM answers: "Where should I route this request?"</P><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;"><STRONG>Input:</STRONG> /sales/orders/v2<BR />Output:&nbsp;<BR /><STRONG>OpenAPI answers: "What schema should this request/response have?"</STRONG></P><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;"><STRONG>Input:</STRONG> POST /sales/orders/v2<BR />Output: Request body must include {orderId, customerId, items[]}, returns {status, orderNumber}</P><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;">Both are necessary for complete governance:</P><UL><UL><UL><LI><STRONG>Without KVM:</STRONG> No dynamic routing (back to static proxy-per-integration)</LI><LI><STRONG>Without OpenAPI:</STRONG> No contract validation (clients and servers drift out of sync)</LI></UL></UL></UL><P class="lia-align-justify" style="text-align : justify;">DCRP uses KVM for runtime routing decisions and OpenAPI for design-time contract definition and optional runtime validation.</P><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Premium_comparison_slide_TeslaElon_Musk_style_W-1769935555266.png" style="width: 706px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368239i20792E3C6081305E/image-dimensions/706x395/is-moderation-mode/true?v=v2" width="706" height="395" role="button" title="Premium_comparison_slide_TeslaElon_Musk_style_W-1769935555266.png" alt="Premium_comparison_slide_TeslaElon_Musk_style_W-1769935555266.png" /></span><STRONG>Figure 29 - Complementary - DCRP and OpenAPI</STRONG></P><HR /><H3 id="toc-hId--292658898">7 - Statistics Collector – Capturing Business Intelligence</H3><HR /><DIV class="lia-align-justify" style="text-align : justify;">While the JavaScript "Brain" handles routing, the Statistics Collector provides the visibility necessary for production management. This policy captures technical metadata and transforms it into actionable business intelligence within the SAP API Management analytics database.</DIV><DIV class="lia-align-justify" style="text-align : justify;">Purpose: Records routing metadata such as iFlow name, package name, domain process, and tracking IDs.</DIV><DIV class="lia-align-justify" style="text-align : justify;">Utility: Enables real-time monitoring, trend analysis, and data-driven capacity planning.</DIV><DIV class="lia-align-justify" style="text-align : justify;">&nbsp;</DIV><DIV class="lia-align-justify" style="text-align : justify;">Policy Configuration Snippet:</DIV><pre class="lia-code-sample language-markup"><code>&lt;StatisticsCollector async='false' continueOnError='false' enabled='true'&gt; &lt;Statistics&gt; &lt;Statistic name='custom_idcorrelation' ref='idcorrelation' type='string'&gt;0&lt;/Statistic&gt; &lt;Statistic name='custom_idflow' ref='idiflow' type='string'&gt;0&lt;/Statistic&gt; &lt;Statistic name='custom_idpackage' ref='idpackage' type='string'&gt;0&lt;/Statistic&gt; &lt;Statistic name='custom_idsapprocess' ref='idsapprocess' type='string'&gt;0&lt;/Statistic&gt; &lt;Statistic name='custom_idsender' ref='idsender' type='string'&gt;0&lt;/Statistic&gt; &lt;/Statistics&gt; &lt;/StatisticsCollector&gt;</code></pre><HR /><H3 id="toc-hId--489172403">8 - Troubleshooting: Common Issues &amp; Solutions</H3><HR /><H5 id="toc-hId--1104308231">8.1 - Runtime Errors</H5><P><STRONG>404 Not Found</STRONG></P><UL><LI><STRONG>Cause:</STRONG><SPAN>&nbsp;</SPAN>KVM<SPAN>&nbsp;</SPAN><CODE>iflowname</CODE><SPAN>&nbsp;</SPAN>delimiter mismatch</LI><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Verify<SPAN>&nbsp;</SPAN><CODE>iflowname</CODE><SPAN>&nbsp;</SPAN>uses<SPAN>&nbsp;</SPAN><CODE>:</CODE><SPAN>&nbsp;</SPAN>separator (e.g.,<SPAN>&nbsp;</SPAN><CODE>inbound:SO.01...</CODE>)</LI></UL><P><STRONG>500 Internal Server Error</STRONG></P><UL><LI><STRONG>Cause:</STRONG><SPAN>&nbsp;</SPAN>Missing KVM entry or wrong<SPAN>&nbsp;</SPAN><CODE>mapIdentifier</CODE></LI><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Check KVM map exists:<SPAN>&nbsp;</SPAN><CODE>cpipackage-nx.[domain].[subprocess]</CODE></LI></UL><P><STRONG>403 Forbidden (Valid Request)</STRONG></P><UL><LI><STRONG>Cause:</STRONG><SPAN>&nbsp;</SPAN>Domain not in Security Shield whitelist</LI><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Add domain to<SPAN>&nbsp;</SPAN><CODE>allowedDomains[]</CODE><SPAN>&nbsp;</SPAN>in<SPAN>&nbsp;</SPAN><CODE>JS-Security-Shield.js</CODE></LI></UL><P><STRONG>Gateway Timeout</STRONG></P><UL><LI><STRONG>Cause:</STRONG><SPAN>&nbsp;</SPAN>Wrong<SPAN>&nbsp;</SPAN><CODE>cpi.host</CODE><SPAN>&nbsp;</SPAN>or<SPAN>&nbsp;</SPAN><CODE>cpi.basepath</CODE></LI><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Verify Target Endpoint properties, test CPI endpoint directly</LI></UL><H5 id="toc-hId--1300821736">8.2 - Configuration Issues</H5><P><STRONG>KVM Lookup Returns Null</STRONG></P><UL><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Deploy KVM to same environment as API Proxy (both<SPAN>&nbsp;</SPAN><CODE>dev</CODE><SPAN>&nbsp;</SPAN>or both<SPAN>&nbsp;</SPAN><CODE>prod</CODE>)</LI></UL><P><STRONG>JavaScript Execution Error</STRONG></P><UL><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Add error handling:<SPAN>&nbsp;</SPAN><CODE>var x = context.getVariable("y") || "default";</CODE></LI></UL><P><STRONG>Routing Rule Doesn't Match</STRONG></P><UL><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Change to<SPAN>&nbsp;</SPAN><CODE>MatchesPath "/**"</CODE><SPAN>&nbsp;</SPAN>for dynamic routing (Approach 2)</LI></UL><P><STRONG>Statistics Collector Not Logging</STRONG></P><UL><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Match variable names exactly in<SPAN>&nbsp;</SPAN><CODE>&lt;Statistic ref='idiflow' /&gt;</CODE></LI></UL><H5 id="toc-hId--1497335241">8.3 - Security Shield Issues</H5><P><STRONG>All Requests Blocked (403)</STRONG></P><UL><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Verify<SPAN>&nbsp;</SPAN><CODE>allowedDomains = ["sales", "finance"]</CODE><SPAN>&nbsp;</SPAN>(lowercase)</LI></UL><P><STRONG>SQL Injection False Positive</STRONG></P><UL><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Refine regex to exclude valid patterns (e.g., hyphens in IDs)</LI></UL><H5 id="toc-hId--1693848746">8.4 - Performance Issues</H5><P><STRONG>High Latency (&gt;80ms)</STRONG></P><UL><LI><STRONG>Cause:</STRONG><SPAN>&nbsp;</SPAN>JavaScript overhead or network latency to CPI</LI><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Profile with APIM trace logs, check network latency</LI></UL><P><STRONG>Note:</STRONG><SPAN>&nbsp;</SPAN>Detailed performance benchmarking with 30,000+ messages will be covered in<SPAN>&nbsp;<STRONG>Part III&nbsp;</STRONG></SPAN><STRONG>: Monitoring &amp; Governance</STRONG>.</P><P><STRONG>Gateway Timeout (504)</STRONG></P><UL><LI><STRONG>Cause:</STRONG><SPAN>&nbsp;</SPAN>Slow CPI iFlow</LI><LI><STRONG>Fix:</STRONG><SPAN>&nbsp;</SPAN>Increase timeout in Target Endpoint, optimize iFlow</LI></UL><P><STRONG>8.6 - When to Escalate</STRONG></P><P>Escalate to SAP Support if:</P><UL><LI>Issue reproducible in isolated test proxy</LI><LI>KVM API returns 500 errors despite correct configuration</LI></UL><P><STRONG>Collect before opening ticket:</STRONG><SPAN>&nbsp;</SPAN>Proxy bundle, KVM config, trace logs, network capture.</P><HR /><H3 id="toc-hId--1303556237"><SPAN>Conclusion: Discipline Over Chaos</SPAN></H3><HR /><H4 id="toc-hId--1793472749"><SPAN>The Domain-Centric Routing Pattern provides the governance layerSAP API Management needs but doesn't offer out-of-the-box.</SPAN></H4><P class="lia-align-justify" style="text-align : justify;">Benefits Recap:</P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Infrastructure:</STRONG><BR />- 96% reduction in proxies (20 → 4)<BR />- Deployment: 15 min → 30 seconds - KVM<BR />- Template-driven: 4× faster at scale</P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Governance:</STRONG><BR />- Centralized security policies<BR />- Unified analytics per domain<BR />- End-to-end traceability (SAP ALM ready)</P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Business Impact:</STRONG><BR />- Faster time-to-market for new integrations<BR />- Reduced operational overhead<BR />- Future-proof: Consumer contracts unchanged during backend migrations</P><HR /><H3 id="the-roadmap-ahead" id="toc-hId--1696583247">The Roadmap Ahead</H3><HR /><P class="lia-align-left" style="text-align : left;">This is only the first step in mastering enterprise-scale integration:</P><UL><LI><STRONG>Part I: DCRP – Domain-Centric Routing Pattern (Gateway Layer)</STRONG><BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span><SPAN>&nbsp;</SPAN><STRONG>YOU ARE HERE</STRONG></LI><LI><STRONG>Part II: PDCP – Package-Domain-Centric Pattern (Orchestration Layer)</STRONG><BR />Solving CPI Package and User Sprawl | Domain consolidation + iFlow DNA naming + tiered technical users<BR /><span class="lia-unicode-emoji" title=":link:">🔗</span><SPAN>&nbsp;</SPAN><STRONG>[</STRONG><SPAN>&nbsp;</SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-btp-cpi-package-domain-centric-pattern-pdcp-solving-package-sprawl-at/ba-p/14318864" target="_self"><STRONG>Part II</STRONG></A><STRONG>]</STRONG></LI><LI><STRONG>Part III: DCRP + PDCP Implementation &amp; Testing</STRONG><BR />Hands-on guide | JavaScript v8.0 routing engine | Multi-vendor disambiguation | Conflict resolution (id09/id10) | Postman collections | Production deployment | GitHub repository with full source code - <span class="lia-unicode-emoji" title=":hourglass_not_done:">⏳</span><SPAN>&nbsp;</SPAN><STRONG>COMING SOON</STRONG></LI><LI><STRONG>Part IV: End-to-End Monitoring with SAP Cloud ALM</STRONG><BR />DCRP + PDCP integration with SAP Cloud ALM | MPL filtering via X-IFlow-Id headers | Automated dashboards | Real-time alerting &amp; SLA tracking | Performance analytics - <span class="lia-unicode-emoji" title=":hourglass_not_done:">⏳</span><SPAN>&nbsp;</SPAN><STRONG>COMING SOON</STRONG></LI></UL><HR /><P class="lia-align-center" style="text-align: center;"><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="rhviana_0-1770056956763.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368250i80F0011FC5BE039F/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="rhviana_0-1770056956763.png" alt="rhviana_0-1770056956763.png" /></span><STRONG>Figure 30 - Implementing DCRP transforms your gateway into ascalable, semantic, governed ecosystem</STRONG></P><HR /><P class="lia-align-left" style="text-align : left;"><STRONG>Before You Scale: Pre-Flight Checklist</STRONG></P><P class="lia-align-justify lia-indent-padding-left-30px" style="text-align : justify; padding-left : 30px;"><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Team Alignment: Ensure developers understand 1:1 → domain-centric shift<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Stakeholder Education: Business sponsors grasp consolidation benefits<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Establish Governance: Define KVM update approval workflows<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Enforce Standards: Naming convention&nbsp;<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Sandbox PoC: Validate with 2-3 iFlows before production rollout</P><P class="lia-align-left" style="text-align : left;">This is only the first step in mastering enterprise-scale integration.</P><HR /><H2 id="toc-hId--1599693745"><span class="lia-unicode-emoji" title=":books:">📚</span>How to Reference This Work</H2><P>When referencing or building upon these architectural patterns, please use the following formal citations:</P><UL><LI><P><STRONG>DCRP (Domain-Centric Routing Pattern)</STRONG>, introduced by <EM>Ricardo Luz Holanda Viana</EM>, 2026.</P></LI><LI><P><STRONG>PDCP (Package Domain-Centric Pattern)</STRONG>, introduced by <EM>Ricardo Luz Holanda Viana</EM>, 2026.</P></LI></UL><HR /><H2 id="toc-hId--1796207250"><span class="lia-unicode-emoji" title=":shield:">🛡</span>️ Intellectual Property &amp; Copyright Notice</H2><P class="lia-align-justify" style="text-align : justify;">© 2026 Ricardo Luz Holanda Viana<BR />First published: February 6, 2026<BR />All rights reserved.</P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Legal Notice:</STRONG><BR />The public disclosure of the architectural patterns described herein constitutes <STRONG>prior art (state of the art)</STRONG> within the global intellectual property framework. This publication establishes documented evidence of authorship and original contribution as of the stated publication date.</P><HR /><H2 id="toc-hId--1992720755"><span class="lia-unicode-emoji" title=":scroll:">📜</span>Usage Terms</H2><UL class="lia-align-justify" style="text-align : justify;"><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span><STRONG>Free to use</STRONG> for educational, research, and non-commercial purposes</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span><STRONG>Attribution required</STRONG> when referencing or building upon these architectural patterns</LI><LI><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span><STRONG>Commercial implementations are permitted</STRONG>, provided proper attribution is given</LI><LI><span class="lia-unicode-emoji" title=":warning:">⚠️</span><STRONG>Use of the names “DCRP™” or “PDCP™”</STRONG> in commercial branding, offerings, or marketing materials requires prior written licensing from the author</LI></UL><P><SPAN>This restriction applies solely to the use of the names and trademarks, not to independent implementations of similar architectural concepts.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><STRONG>No Implied License:</STRONG><BR />Nothing in this publication shall be construed as granting any license, implied or otherwise, to use the described methodologies <STRONG>as branded commercial products or services</STRONG> without explicit authorization.</P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Disclaimer:</STRONG> This article reflects the author’s personal architectural perspective and does not represent an official SAP position or recommendation.</P><HR /><P class="lia-align-justify" style="text-align : justify;"><STRONG>Kind Regards,</STRONG></P><P class="lia-align-justify" style="text-align : justify;"><STRONG>Viana | SAP BTP Integration Suite Expert</STRONG></P> 2026-01-30T17:58:18.353000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/integration-suite-in-2025-amp-2026/ba-p/14320912 Integration Suite in 2025 & 2026 2026-02-03T18:16:06.981000+01:00 Sookriti_Mishra https://community.sap.com/t5/user/viewprofilepage/user-id/173946 <P><SPAN>Watched this beautiful session by<STRONG>&nbsp;</STRONG><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/8446">@UdoPaltzer</a>:&nbsp;<A href="https://www.youtube.com/watch?v=kFynsigf99o" target="_blank" rel="noopener nofollow noreferrer">https://www.youtube.com/watch?v=kFynsigf99o</A></SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-03 at 10.44.47 PM.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368644i925C54038A8D0FFF/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-03 at 10.44.47 PM.png" alt="Screenshot 2026-02-03 at 10.44.47 PM.png" /></span></P><P>In case you wanted a quick summary, here you go:</P><P><STRONG>Modernize Integrations:</STRONG></P><UL><LI><SPAN>Use standard content as much as you can</SPAN></LI><LI><SPAN>Try to replace your RFCs and IDOCs with OData, Rest, and SOAP.</SPAN></LI><LI><SPAN>Leverage Event-driven Integration pattern (for real-time scenarios)</SPAN></LI><LI><SPAN>Use Side-by-side extensions to leverage API-centric integrations (with Build)</SPAN></LI><LI>Leverage monitoring and error resolution&nbsp;capabilities by using SAP AIF (for Business Users), and Cloud ALM (for technical users)</LI></UL><P>&nbsp;</P><P><STRONG>End of maintenance. Time is ticking!</STRONG></P><UL><LI><SPAN>2027 - SAP PO | Standard Maintenance sunset</SPAN></LI><LI><SPAN>2030 - SAP PO | Extended maintenance sunset</SPAN></LI><LI><SPAN>2028 - Cloud Platform Integration Neo | Services sunset</SPAN></LI></UL><P><SPAN>As far as your migration support is concerned, SAP provides Migration guides, documentation, and community content, which you are already aware of. What is additionally provided is:</SPAN></P><UL><LI><SPAN>SAP Migration Factory | a free 2-3 weeks program to help you assess and plan your migration from PI/PO to Integration Suite</SPAN></LI><LI><SPAN>Evolve Neo Program | free access to SAP experts who will help you plan and prepare your migration to Cloud Foundry</SPAN></LI><LI><SPAN>SAP Service and Support | quick migration assistance with short duration, low cost engagements</SPAN></LI></UL><P><STRONG>Edge Integration Cell&nbsp;</STRONG></P><UL><LI><SPAN>The latest kid in the block is now flexible to run hybrid integration runtime, which is offered as an optional extension to Integration Suite, which will help customer-managed private landscape to leverage the capabilities of Integration Suite.&nbsp;</SPAN></LI><LI><SPAN>The landscapes it supports are: Microsoft AKS, Amazon EKS, Red Hat OpenShift, SUSE Rancher, Google GKE.&nbsp;</SPAN></LI></UL><P><STRONG>Cloud ALM<BR /></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sookriti_Mishra_0-1770190773748.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368816iADE0F96757DC6FD8/image-size/medium?v=v2&amp;px=400" role="button" title="Sookriti_Mishra_0-1770190773748.png" alt="Sookriti_Mishra_0-1770190773748.png" /></span></P><UL><LI><SPAN>Your one stop for end-to-end </SPAN><STRONG>technical </STRONG><SPAN>health monitoring for: SAP BTP, S/4HANA, S/4HANA Cloud, SuccessFactors, Integration Suite, Customer Experience, Business Network, Concur, Fieldglass.</SPAN></LI><LI><SPAN>You can configure the Oubound Channels like: email alerts, on chat-based apps like MS Teams/ Slack, Ticketing System like Service Now, Tasks like JIRA, APIs like SAP Analytics Cloud/ Grafana, and Operation Automations like&nbsp; Build Process Automation, and SAP iRPA, etc.</SPAN></LI><LI><SPAN>For us Integration Suite guys, you can use it for Cloud Integratio, API Management and Event Mesh as well.</SPAN></LI><LI><SPAN>Specifically for Integration Suite, you can now monitor Tenant Availability, Certificate Validity, Database and Resource consumption, Content, Exhaustion status of JMS queue. So, no more building custom iflows to trigger alerts. Please know that CALM pulls data every 5 mins, and persists data for 30 days. I wonder if they have a feature to display the trace only for failed messages. SAP, are you listening?</SPAN></LI></UL><P><STRONG>Innovations in 2025</STRONG></P><UL><LI><STRONG>Artificial Intelligence<BR /></STRONG><SPAN><SPAN>- </SPAN>Joule copilot-based discovery and reuse of artifacts were made available in Business Accelerator Hub<BR /></SPAN><SPAN>- Generation of Integration flow steps&nbsp;<BR /></SPAN><SPAN>- Groovy script optimization<BR /></SPAN><SPAN>- API anomaly detection<BR /></SPAN><SPAN>- API traffic prediction for usage and trend<BR /></SPAN><SPAN>- AI adapter</SPAN></LI><LI><STRONG>Business Accelerators<BR /></STRONG><SPAN><SPAN>- </SPAN>Additional non-SAP adaptors like, AI, Google, BigQuery, IBM MQ (JMS), BigQuery, Microsoft Azure Service Bus, Microsoft OneNote, Mongo DB, Salesforce Pub/ Sub, Shopify, etc<BR /></SPAN><SPAN>- New design guidelines to ensure upgrade readiness of Groovy Scripts (Camel 3 to Camel 4)</SPAN></LI><LI><STRONG>Migration &amp; Modernization<BR /></STRONG><SPAN><SPAN>- </SPAN>Generate ABAP proxy in the backend without any dependency on PI<BR /></SPAN><SPAN>- Edge Integration Cell: Local OData API access, HANA DB, Shared Kubernetes, Basis Authentication during offline mode&nbsp;<BR /></SPAN><SPAN>- Alerting of failed B2B messages in CALM<BR /></SPAN><SPAN>- Automatic B2B interface creation based on Payload</SPAN></LI><LI><STRONG>API-centric &amp; Event-driven integration<BR /></STRONG><SPAN><SPAN>- </SPAN>Lightweight adapter in the context of Advanced Event Mesh for small, light-weight, event-driven integration with non-SAP applications<BR /></SPAN><SPAN>- Migration support from EM to AEM</SPAN></LI></UL><P><STRONG>Agent-ready Application: IPaaS &amp; AI Market Evolution &amp; Trends</STRONG></P><UL><LI><SPAN>Agent iPaaS</SPAN></LI><LI><SPAN>Agent Integrations</SPAN></LI><LI><SPAN>Agent Orchestration</SPAN></LI><LI><SPAN>AI TRiSm (trusted relationship governance of the AI agents</SPAN></LI></UL><P><STRONG>SAP Integration Suite to become the trusted AI Integration Fabric: </STRONG><SPAN>IS is evolving to become a trusted AI Integration fabric</SPAN></P><P><STRONG>Some of the use cases are:</STRONG></P><UL><LI><SPAN><STRONG>Integration for AI</STRONG> (to make agentic interactions &amp; orchestration to make applications agent-ready)</SPAN></LI><UL><LI><SPAN>MCP Gateway</SPAN></LI><LI><SPAN>Agent Orchestration</SPAN></LI><LI><SPAN>AI Gateway</SPAN></LI><LI><SPAN>Agent Identity Verification</SPAN></LI><LI><SPAN>LLM connector</SPAN></LI></UL><LI><SPAN><STRONG>AI for Integration</STRONG> (features in IS)</SPAN></LI><UL><LI><SPAN>Joule</SPAN></LI><LI><SPAN>Anomaly detection</SPAN></LI><LI><SPAN>API traffic predictions</SPAN></LI><LI><SPAN>Script Optimization</SPAN></LI><LI><SPAN>Configuration Agent</SPAN></LI></UL></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sookriti_Mishra_1-1770190833178.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368817i3AB2BA3AD00E953F/image-size/medium?v=v2&amp;px=400" role="button" title="Sookriti_Mishra_1-1770190833178.png" alt="Sookriti_Mishra_1-1770190833178.png" /></span></P><P>&nbsp;</P><P><STRONG>2026 SAP Integration Suite Strategic Outlook:</STRONG></P><UL><LI><SPAN>Leveraging Joule for building Integration flows</SPAN></LI><LI><SPAN>MCP enablement for APIs</SPAN></LI><LI><SPAN>Migration Agents for Java Mappings &amp; adapter modules</SPAN></LI><LI><SPAN>AEM events in developer hub</SPAN></LI><LI><SPAN>15+ new third-party adapters including Adobe Sign, Google Suite, Oracle, OFTP2, Salesforce Service &amp; Marketing, Cloud, Oracle Eloqua</SPAN></LI><LI><SPAN>Joule Skills &amp; AI Agents in SAP Business Accelerator Hub</SPAN></LI><LI><SPAN>B2B capabilities in Edge Integration Cell</SPAN></LI></UL><P><STRONG>Roadmap for SAP Integration Suite:</STRONG></P><UL><LI><STRONG>Artificial Intelligence<BR /></STRONG><SPAN>- Integration flow design validation<BR /></SPAN><SPAN>- Joule based generation of iflows<BR /></SPAN><SPAN>- MCP for agentic AI<BR /></SPAN><SPAN>- Migration agent for adapter modules, Java mapping<BR /></SPAN><SPAN>- Configuration Agent<BR /></SPAN><SPAN>- Payload-size anomaly detection</SPAN></LI><LI><STRONG>Business Accelerators<BR /></STRONG><SPAN>- More connectivity options, meaning, more adapters like Google Drive &amp; Sheets Microsoft Excel &amp; Outlook, OFTP2, RosettaNet, Salesforce Service Cloud, etc<BR /></SPAN><SPAN>- Support for publications of Joule Skills &amp; Agents in Business Accelerator Hub<BR />- </SPAN><SPAN>Commercial module for Partner Content. Consumers/Customers with&nbsp;a licence to Partner Content can now use it. Currently, customers&nbsp;can&nbsp;copy and use it for free, but from&nbsp;now on, the IP rights are protected, so you can use it only if you have a&nbsp;licence.</SPAN></LI><LI><STRONG>Migration &amp; Modernization<BR /><SPAN>- </SPAN></STRONG><SPAN>Mass migration from PO to IS<BR /><SPAN>- </SPAN></SPAN><SPAN>Edge Integration Cell: customer-managed cloud connectors, offline mode support for 48 hours, B2B capabilities, multiple instances of EIC per Kubernetes Cluster<BR />- </SPAN><SPAN>SAP IS data centers in Australia, Germany, India, Japan, US.</SPAN></LI><LI><STRONG>API-Centric &amp; Event-driven integrations<BR /><SPAN>- </SPAN></STRONG><SPAN>AEM health monitoring in SAP Cloud ALM<BR /><SPAN>- </SPAN></SPAN><SPAN>Auto discovery and publications of events from AEM to Developer Hub as single catalog for APIs and Events<BR />- </SPAN><SPAN>Consumption of events through Developer Hub</SPAN></LI></UL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sookriti_Mishra_3-1770191000785.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/368818iE7540309A7D5036B/image-size/large?v=v2&amp;px=999" role="button" title="Sookriti_Mishra_3-1770191000785.png" alt="Sookriti_Mishra_3-1770191000785.png" /></span></P><P>&nbsp;</P><P><BR /><BR /></P><P>&nbsp;</P> 2026-02-03T18:16:06.981000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/when-synchronous-odata-failed-for-bulk-data-processing-how-i-solved-problem/ba-p/14322933 When Synchronous OData Failed for bulk data processing: How I Solved Problem Using OData V4 Async : 2026-02-09T07:33:18.454000+01:00 pavanKolla https://community.sap.com/t5/user/viewprofilepage/user-id/2108029 <P><STRONG>The Business Context:</STRONG></P><UL><LI>BlueYonder sends planning and operational data</LI><LI>The data volume is large</LI><LI>Data needs to be posted into SAP S/4HANA Public Cloud</LI><LI>SAP exposes this functionality via OData V2 and V4 APIs</LI></UL><P>The expectation was simple: “Send data from BlueYonder and create/update records in S/4HANA.” But in reality, it was not that easy.</P><P><STRONG>Introduction:</STRONG></P><P>In real projects, integrations look simple on paper but behave very differently in production.</P><P>This blog is about a real-time problem I faced while integrating BlueYonder planning data into SAP S/4HANA Public Cloud using OData V2 Inbound.</P><P>The solution was understanding how OData V4 async processing works and using one small but powerful HTTP header.</P><P>In this blog, I will explain:</P><UL><LI>What problem I faced</LI><LI>Why synchronous processing failed</LI><LI>How I implemented async OData V4 processing with API proxy(through URL).</LI><LI>What changed after enabling async</LI></UL><P>&nbsp;</P><P><STRONG>The Actual Problem</STRONG></P><P>Initially, I implemented the integration in a synchronous way.</P><P><STRONG>What Happened</STRONG></P><UL><LI>CPI sent data to S/4HANA public cloud using standard OData V2 synchronous Api</LI><LI>The backend took time to process the payload</LI><LI>CPI waited for the response</LI><LI>Requests started failing due to:</LI><UL><LI>Timeouts</LI><LI>Long-running backend processing</LI><LI>Unstable behaviour during peak loads</LI></UL></UL><P><STRONG>The Key Issue</STRONG></P><P>OData V2 APIs are synchronous by default. This means:</P><UL><LI>CPI waits until S/4HANA public cloud finishes posting</LI><LI>Large payloads increase risk</LI><LI>One slow request can block the entire flow This was not acceptable for a production-grade integration.</LI><LI>Chunking the payload using General splitter and streaming could increase the number of API Calls and may increase the load on Public cloud.</LI></UL><P><STRONG>Design:</STRONG></P><P>While analysing SAP documentation, I came across the asynchronous processing capability of OData V4. SAP provides a standard way to tell the backend: “Accept the request, process it in the background, and do not keep the connection open.”<BR />This is done using the HTTP header:&nbsp;<STRONG>Prefer = respond-async<BR /><BR /></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pavanKolla_0-1770374072960.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369530i2E4E8CCAF4947A46/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="pavanKolla_0-1770374072960.png" alt="pavanKolla_0-1770374072960.png" /></span></P><P><STRONG>Step-by-Step Implementation :</STRONG></P><P><STRONG>Step 1: Receiving HighRadiusData in CPI</STRONG></P><UL><LI>BlueYonder sends data in Flatten File.</LI><LI>CPI receives the data and prepares it for S/4HANA public cloud.</LI></UL><P>Data structure is aligned to OData V4 expectations At this point, the flow is still normal.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pavanKolla_1-1770374153452.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369531iA175F35EB2526E64/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="pavanKolla_1-1770374153452.png" alt="pavanKolla_1-1770374153452.png" /></span></P><P>&nbsp;</P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pavanKolla_2-1770374153460.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369532iE3F7F3E059F819E8/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="pavanKolla_2-1770374153460.png" alt="pavanKolla_2-1770374153460.png" /></span></P><P>&nbsp;</P><UL><LI>*Here I had implemented the Retry mechanism using JMS Queues which is the best practice for the SAP integrations ,If you like you implement it do check out my previous Blog that I had posted in the SAP Community.<BR />Blog URL – {<A href="https://community.sap.com/t5/technology-blog-posts-by-members/handling-connectivity-and-recoverable-errors-in-sap-cpi-with-jms-queues/ba-p/14137974" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-members/handling-connectivity-and-recoverable-errors-in-sap-cpi-with-jms-queues/ba-p/14137974</A>}</LI></UL><P><STRONG>Step 2: Setting the Async Header (Most Important Step)</STRONG></P><P>In CPI, I used a Content Modifier to add HTTP headers.</P><P><STRONG>Header : Prefer Header</STRONG>&nbsp;<STRONG>Prefer = respond-async</STRONG>&nbsp;This header completely changes how the request is handled.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pavanKolla_3-1770374217703.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369533i85DDC82758842987/image-size/large?v=v2&amp;px=999" role="button" title="pavanKolla_3-1770374217703.png" alt="pavanKolla_3-1770374217703.png" /></span></P><P>&nbsp;</P><P><STRONG>What Happens After Adding respond-async</STRONG></P><P>Once this header is added:</P><UL><LI>CPI sends the request</LI><LI>S/4HANA immediately responds with HTTP 202 – Accepted</LI><LI>Backend processing continues asynchronously</LI><LI>CPI does not wait for the final processing result This single header removed timeout risks completely.</LI></UL><P><STRONG>Step 3: Posting Data via API Proxy<BR /><BR /></STRONG>* Here, I had used OAuth 2.0 Authentication between Integration suite to API Proxy and between API Proxy and S/4 Hana public cloud I had used Certificate Based Authentication.<STRONG><BR /><BR /></STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pavanKolla_4-1770374264097.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369534i7B9D79BD1A281884/image-size/large?v=v2&amp;px=999" role="button" title="pavanKolla_4-1770374264097.png" alt="pavanKolla_4-1770374264097.png" /></span></P><P>&nbsp;</P><UL><LI>CPI sends the request to an API Proxy</LI><LI>The proxy forwards the call to the OData V4 API from SAP Business Accelerator Hub</LI><LI>The proxy is created using the URL-based option</LI></UL><P><STRONG>Note : </STRONG><EM>OData V4 services do not appear in the API Provider’s service catalog in SAP API Management</EM>, so discovery isn’t possible — and that’s why I go with the URL method, so if you want to create proxy for OData V4 public cloud the correct approach is just go with the URL Option don’t fall for this pitfall.</P><P>If you want to leverage more on how to create API Proxy with URL option follow SAP Official Documentation.<BR />Official documentation: {<A href="https://help.sap.com/docs/sap-api-management/sap-api-management/create-api-proxy-by-providing-direct-target-endpoint-url" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/sap-api-management/sap-api-management/create-api-proxy-by-providing-direct-target-endpoint-url</A>}</P><P>From CPI’s perspective:</P><UL><LI>The request is completed successfully</LI></UL><P>No long-running connection is maintained</P><UL><LI><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pavanKolla_5-1770374298201.png"><img src="https://community.sap.com/skins/images/4EB0876075F7CA10B9C93C7DE0A148C5/responsive_peak/images/image_rejected.gif" alt="pavanKolla_5-1770374298201.png" /></span><P><STRONG>What Changed After This Implementation</STRONG></P><P><STRONG>Before Async</STRONG></P><UL><LI>Timeouts during high data volume</LI><LI>Unstable integration behaviour</LI><LI>Risk of message failures</LI></UL><P><STRONG>After Async</STRONG></P><UL><LI>Immediate response to CPI</LI><LI>Backend processing happens safely</LI><LI>No timeout issues</LI><LI>Integration became stable and predictable</LI></UL><P>This was a real production-grade improvement, not just a theoretical change, I hope this helps you folks that don’t fall for this pitfall in your production.</P><P>&nbsp;</P></LI></UL><P><BR /><BR /></P><P><BR /><BR /><BR /><BR /></P><P>&nbsp;</P><P><BR /><BR /></P> 2026-02-09T07:33:18.454000+01:00 https://community.sap.com/t5/integration-blog-posts/announcement-register-to-the-new-cei-project-for-sap-integration-suite-in/ba-p/14321718 Announcement: Register to the new CEI project for SAP Integration Suite in 2026 2026-02-09T08:33:34.010000+01:00 alex_bundschuh https://community.sap.com/t5/user/viewprofilepage/user-id/45178 <P>Like in the previous years, we will run a <STRONG>Global Customer Engagement Initiative (CEI) for SAP Integration Suite</STRONG> also in 2026.</P><P>Last year, we had 180+ registered customers and partners from over 20 countries worldwide. We ran multiple feedback sessions covering various capabilities and strategic investment topics of SAP Integration Suite such as "SAP Process Orchestration move" (ABAP proxy generation, mass migration, migration assessment, migration agent, etc.), AI &amp; gen AI in the context of SAP Integration Suite in general and for B2B in particular, monitoring and operations, new adapters and adapter enhancements, reusable APIs and governance of API key access, event driven architecture, etc.</P><P>In 2026, we will continue collaborating with our customers and partners to gather feedback on product improvements, enhancements and new developments to validate the planned enhancements at an early stage, and ensuring that what we build will meet your business needs.</P><P>This will include open discussion about our current product backlog from the <A href="https://roadmaps.sap.com/board?PRODUCT=000D3A47875C1EDB98A8A910864AC24B" target="_blank" rel="noopener noreferrer">roadmap explorer</A> as well as addressing pain points and topics that we collected in last year's CEI project such as more on Edge Integration Cell, AI, SAP PI/PO to SAP Integration Suite migration, Event Driven Architecture, ISA-M, best practices and guidelines, developer experience, etc.&nbsp;</P><P data-unlink="true">If you like to join the upcoming SAP Integration Suite influence project for providing feedback and&nbsp;shaping the SAP Integration Suite product, please<SPAN>&nbsp;</SPAN><A href="https://influence.sap.com/sap/ino/#campaign/4124" target="_blank" rel="noopener noreferrer">register here</A><SPAN>&nbsp;(link leads to the&nbsp;</SPAN>customer influence page).</P><P><STRONG>Registration is open from 9th of February 2026 until 13th of March 2026.</STRONG></P><P>Once, the registration closes, we will invite you for an initial call where we go through the scope and the prerequisites of the feedback project. This will be around end of March/ begin of April so that we are able to start the project latest in April this year.</P><P>We will run monthly feedback sessions through the end of the year and hold&nbsp;a closing call to summarize our learnings, review the feedback collected, and discuss next steps.</P><P>Register today to ensure you do not miss this opportunity to influence and contribute to shaping <STRONG>SAP Integration Suite</STRONG> to meet your business needs.&nbsp;</P><P>We look forward to your active participation and valuable feedback.</P><P>&nbsp;</P> 2026-02-09T08:33:34.010000+01:00